Skip to content

Commit 6386950

Browse files
authored
Merge pull request #1490 from smallstep/mariano/gcp-organization-id
Add remote configuration of the GCP organization id
2 parents 57a60ca + 5c85efa commit 6386950

File tree

6 files changed

+77
-38
lines changed

6 files changed

+77
-38
lines changed

Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ CGO_OVERRIDE?=CGO_ENABLED=0
2525
GORELEASER_BUILD_ID?=default
2626

2727
# all go files
28-
SRC=$(shell find . -type f -name '*.go')
28+
SRC=$(shell find . -type f -name '*.go' -or -name go.mod -or -name go.sum)
2929

3030
all: lint test build
3131

@@ -71,7 +71,6 @@ else
7171
endif
7272

7373
Q=$(if $V,,@)
74-
SRC=$(shell find . -type f -name '*.go')
7574
OUTPUT_ROOT=output/
7675

7776
ifeq ($(OS),Windows_NT)

command/ca/provisioner/add.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ K8SSA (Kubernetes Service Account)
9696
IID (AWS/GCP/Azure)
9797
9898
**step ca provisioner add** <name> **--type**=[AWS|Azure|GCP]
99-
[**--aws-account**=<id>] [**--gcp-service-account**=<name>] [**--gcp-project**=<name>]
99+
[**--aws-account**=<id>]
100+
[**--gcp-service-account**=<name>] [**--gcp-project**=<name>] [**--gcp-organization**=<id>]
100101
[**--azure-tenant**=<id>] [**--azure-resource-group**=<name>]
101102
[**--azure-audience**=<name>] [**--azure-subscription-id**=<id>]
102103
[**--azure-object-id**=<id>] [**--instance-age**=<duration>] [**--iid-roots**=<file>]
@@ -171,6 +172,7 @@ SCEP
171172
azureObjectIDFlag,
172173
gcpServiceAccountFlag,
173174
gcpProjectFlag,
175+
gcpOrganizationFlag,
174176
instanceAgeFlag,
175177
disableCustomSANsFlag,
176178
disableTOFUFlag,
@@ -289,12 +291,17 @@ $ step ca provisioner add Azure --type Azure \
289291
--azure-object-id f50926c7-abbf-4c28-87dc-9adc7eaf3ba7
290292
'''
291293
292-
Create an GCP provisioner that will only accept the SANs provided in the identity token:
294+
Create a GCP provisioner that will only accept the SANs provided in the identity token:
293295
'''
294296
$ step ca provisioner add Google --type GCP \
295297
--disable-custom-sans --gcp-project internal
296298
'''
297299
300+
Create a GCP provisioner that can be used across all projects within an organization:
301+
'''
302+
$ step ca provisioner add Google --type GCP --gcp-organization 123456789
303+
'''
304+
298305
Create an AWS provisioner that will only accept the SANs provided in the identity
299306
document and will allow multiple certificates from the same instance:
300307
'''
@@ -803,6 +810,10 @@ func createAzureDetails(ctx *cli.Context) (*linkedca.ProvisionerDetails, error)
803810
}
804811

805812
func createGCPDetails(ctx *cli.Context) (*linkedca.ProvisionerDetails, error) {
813+
if ctx.String("gcp-organization") != "" && len(ctx.StringSlice("gcp-project")) > 0 {
814+
return nil, errs.IncompatibleFlagWithFlag(ctx, "gcp-organization", "gcp-project")
815+
}
816+
806817
d, err := parseInstanceAge(ctx)
807818
if err != nil {
808819
return nil, err
@@ -827,6 +838,7 @@ func createGCPDetails(ctx *cli.Context) (*linkedca.ProvisionerDetails, error) {
827838
GCP: &linkedca.GCPProvisioner{
828839
ServiceAccounts: ctx.StringSlice("gcp-service-account"),
829840
ProjectIds: ctx.StringSlice("gcp-project"),
841+
OrganizationId: ctx.String("gcp-organization"),
830842
DisableCustomSans: ctx.Bool("disable-custom-sans"),
831843
DisableTrustOnFirstUse: ctx.Bool("disable-trust-on-first-use"),
832844
DisableSshCaUser: disableSSHCAUser,

command/ca/provisioner/provisioner.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,10 @@ Use the flag multiple times to configure multiple projects`,
516516
Usage: `Remove a Google project <id> used to validate the identity tokens.
517517
Use the flag multiple times to remove multiple projects`,
518518
}
519+
gcpOrganizationFlag = cli.StringFlag{
520+
Name: "gcp-organization",
521+
Usage: `The Google organization <id> used to validate the project in the identity tokens.`,
522+
}
519523
instanceAgeFlag = cli.DurationFlag{
520524
Name: "instance-age",
521525
Usage: `The maximum <duration> to grant a certificate in AWS and GCP provisioners.

command/ca/provisioner/update.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ IID (AWS/GCP/Azure)
8989
[**--aws-account**=<id>]... [**--remove-aws-account**=<id>]...
9090
[**--gcp-service-account**=<name>]... [**--remove-gcp-service-account**=<name>]...
9191
[**--gcp-project**=<name>]... [**--remove-gcp-project**=<name>]...
92+
[**--gcp-organization**=<id>]
9293
[**--azure-tenant**=<id>] [**--azure-resource-group**=<name>]
9394
[**--azure-audience**=<name>] [**--azure-subscription-id**=<id>]
9495
[**--azure-object-id**=<id>] [**--instance-age**=<duration>]
@@ -175,6 +176,7 @@ SCEP
175176
removeGCPServiceAccountFlag,
176177
gcpProjectFlag,
177178
removeGCPProjectFlag,
179+
gcpOrganizationFlag,
178180
instanceAgeFlag,
179181
disableCustomSANsFlag,
180182
disableTOFUFlag,
@@ -289,6 +291,18 @@ $ step ca provisioner update Google \
289291
--disable-custom-sans --gcp-project internal --remove-gcp-project public
290292
'''
291293
294+
Remove the GCP project and use an organization id:
295+
'''
296+
$ step ca provisioner update Google \
297+
--gpc-organization 123456789 --remove-gcp-project internal
298+
'''
299+
300+
Remove the GCP organization and use a project:
301+
'''
302+
$ step ca provisioner update Google \
303+
--gpc-organization="" --gcp-project internal
304+
'''
305+
292306
Update an AWS provisioner:
293307
'''
294308
$ step ca provisioner update Amazon --disable-custom-sans --disable-trust-on-first-use
@@ -946,13 +960,21 @@ func updateGCPDetails(ctx *cli.Context, p *linkedca.Provisioner) error {
946960
if ctx.IsSet("gcp-service-account") {
947961
details.ServiceAccounts = append(details.ServiceAccounts, ctx.StringSlice("gcp-service-account")...)
948962
}
963+
if ctx.IsSet("gcp-organization") {
964+
details.OrganizationId = ctx.String("gcp-organization")
965+
}
949966
if ctx.IsSet("remove-gcp-project") {
950967
details.ProjectIds = removeElements(details.ProjectIds, ctx.StringSlice("remove-gcp-project"))
951968
}
952969
if ctx.IsSet("gcp-project") {
953970
details.ProjectIds = append(details.ProjectIds, ctx.StringSlice("gcp-project")...)
954971
}
955972

973+
// Validate configuration
974+
if details.OrganizationId != "" && len(details.ProjectIds) > 0 {
975+
return errs.IncompatibleFlagWithFlag(ctx, "gcp-organization", "gcp-project")
976+
}
977+
956978
return nil
957979
}
958980

go.mod

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ require (
2020
github.com/smallstep/certinfo v1.15.0
2121
github.com/smallstep/cli-utils v0.12.1
2222
github.com/smallstep/go-attestation v0.4.4-0.20241119153605-2306d5b464ca
23-
github.com/smallstep/linkedca v0.23.0
23+
github.com/smallstep/linkedca v0.24.0
2424
github.com/smallstep/truststore v0.13.0
2525
github.com/smallstep/zcrypto v0.0.0-20221001003018-1ab2364d2a91
2626
github.com/smallstep/zlint v0.0.0-20220930192201-67fb4aa21910
@@ -53,7 +53,7 @@ require (
5353
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 // indirect
5454
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
5555
github.com/Masterminds/goutils v1.1.1 // indirect
56-
github.com/Masterminds/semver/v3 v3.3.0 // indirect
56+
github.com/Masterminds/semver/v3 v3.3.1 // indirect
5757
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
5858
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
5959
github.com/beorn7/perks v1.0.1 // indirect
@@ -71,7 +71,7 @@ require (
7171
github.com/dustin/go-humanize v1.0.1 // indirect
7272
github.com/felixge/httpsnoop v1.0.4 // indirect
7373
github.com/go-chi/chi/v5 v5.2.2 // indirect
74-
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
74+
github.com/go-jose/go-jose/v4 v4.1.1 // indirect
7575
github.com/go-logr/logr v1.4.3 // indirect
7676
github.com/go-logr/stdr v1.2.2 // indirect
7777
github.com/go-sql-driver/mysql v1.9.2 // indirect
@@ -123,21 +123,21 @@ require (
123123
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
124124
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
125125
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
126-
go.opentelemetry.io/otel v1.36.0 // indirect
127-
go.opentelemetry.io/otel/metric v1.36.0 // indirect
128-
go.opentelemetry.io/otel/trace v1.36.0 // indirect
126+
go.opentelemetry.io/otel v1.37.0 // indirect
127+
go.opentelemetry.io/otel/metric v1.37.0 // indirect
128+
go.opentelemetry.io/otel/trace v1.37.0 // indirect
129129
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
130-
golang.org/x/net v0.43.0 // indirect
130+
golang.org/x/net v0.44.0 // indirect
131131
golang.org/x/oauth2 v0.30.0 // indirect
132132
golang.org/x/sync v0.17.0 // indirect
133133
golang.org/x/text v0.29.0 // indirect
134134
golang.org/x/time v0.12.0 // indirect
135-
golang.org/x/tools v0.36.0 // indirect
135+
golang.org/x/tools v0.37.0 // indirect
136136
google.golang.org/api v0.247.0 // indirect
137137
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect
138-
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
138+
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
139139
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect
140-
google.golang.org/grpc v1.74.2 // indirect
140+
google.golang.org/grpc v1.75.1 // indirect
141141
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect
142142
gopkg.in/yaml.v3 v3.0.1 // indirect
143143
howett.net/plist v1.0.0 // indirect

go.sum

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
4040
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
4141
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
4242
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
43-
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
44-
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
43+
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
44+
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
4545
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
4646
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
4747
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
@@ -137,8 +137,8 @@ github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
137137
github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
138138
github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
139139
github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
140-
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
141-
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
140+
github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI=
141+
github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA=
142142
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
143143
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
144144
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -286,8 +286,8 @@ github.com/smallstep/cli-utils v0.12.1 h1:D9QvfbFqiKq3snGZ2xDcXEFrdFJ1mQfPHZMq/l
286286
github.com/smallstep/cli-utils v0.12.1/go.mod h1:skV2Neg8qjiKPu2fphM89H9bIxNpKiiRTnX9Q6Lc+20=
287287
github.com/smallstep/go-attestation v0.4.4-0.20241119153605-2306d5b464ca h1:VX8L0r8vybH0bPeaIxh4NQzafKQiqvlOn8pmOXbFLO4=
288288
github.com/smallstep/go-attestation v0.4.4-0.20241119153605-2306d5b464ca/go.mod h1:vNAduivU014fubg6ewygkAvQC0IQVXqdc8vaGl/0er4=
289-
github.com/smallstep/linkedca v0.23.0 h1:5W/7EudlK1HcCIdZM68dJlZ7orqCCCyv6bm2l/0JmLU=
290-
github.com/smallstep/linkedca v0.23.0/go.mod h1:7cyRM9soAYySg9ag65QwytcgGOM+4gOlkJ/YA58A9E8=
289+
github.com/smallstep/linkedca v0.24.0 h1:7nQuHLrI7XQVbZUgvNsUiW35mskyK1itsZyboZxor3E=
290+
github.com/smallstep/linkedca v0.24.0/go.mod h1:7VovSkUuLpO4sJPUxp25aEo9+3XIcgEEMoj2noEQFcI=
291291
github.com/smallstep/nosql v0.7.0 h1:YiWC9ZAHcrLCrayfaF+QJUv16I2bZ7KdLC3RpJcnAnE=
292292
github.com/smallstep/nosql v0.7.0/go.mod h1:H5VnKMCbeq9QA6SRY5iqPylfxLfYcLwvUff3onQ8+HU=
293293
github.com/smallstep/pkcs7 v0.0.0-20240911091500-b1cae6277023/go.mod h1:CM5KrX7rxWgwDdMj9yef/pJB2OPgy/56z4IEx2UIbpc=
@@ -347,16 +347,16 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6
347347
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo=
348348
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
349349
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
350-
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
351-
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
352-
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
353-
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
354-
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
355-
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
356-
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
357-
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
358-
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
359-
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
350+
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
351+
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
352+
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
353+
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
354+
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
355+
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
356+
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
357+
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
358+
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
359+
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
360360
go.step.sm/crypto v0.70.0 h1:Q9Ft7N637mucyZcHZd1+0VVQJVwDCKqcb9CYcYi7cds=
361361
go.step.sm/crypto v0.70.0/go.mod h1:pzfUhS5/ue7ev64PLlEgXvhx1opwbhFCjkvlhsxVds0=
362362
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
@@ -389,8 +389,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
389389
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
390390
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
391391
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
392-
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
393-
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
392+
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
393+
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
394394
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
395395
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
396396
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -457,19 +457,21 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
457457
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
458458
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
459459
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
460-
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
461-
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
460+
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
461+
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
462462
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
463+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
464+
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
463465
google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc=
464466
google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM=
465467
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4=
466468
google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
467-
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
468-
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
469+
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU=
470+
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA=
469471
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8=
470472
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
471-
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
472-
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
473+
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
474+
google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
473475
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A=
474476
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA=
475477
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=

0 commit comments

Comments
 (0)