Skip to content

Commit 5b543cb

Browse files
authored
Merge pull request #209 from joe0BAB/fix/secret-patch-policies
Add "derive" command
2 parents e967992 + 4d64bd3 commit 5b543cb

File tree

8 files changed

+65
-22
lines changed

8 files changed

+65
-22
lines changed

src/extension/host-binary/api/schemas/secrets.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ paths:
5656
content:
5757
application/json:
5858
schema:
59-
$ref: '#/components/schemas/StoredSecret'
59+
$ref: '#/components/schemas/Secret'
6060
'404':
6161
description: secret not found
6262
delete:

src/extension/host-binary/cmd/main.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/spf13/cobra"
1111
"os"
1212
"os/signal"
13+
"slices"
1314
"syscall"
1415
)
1516

@@ -23,6 +24,7 @@ func main() {
2324
cmd.AddCommand(AuthorizeApp(ctx))
2425
cmd.AddCommand(UnauthorizeApp(ctx))
2526
cmd.AddCommand(ListOAuthApps(ctx))
27+
cmd.AddCommand(DeriveSecret(ctx))
2628
if err := cmd.Execute(); err != nil {
2729
fmt.Println(err)
2830
os.Exit(1)
@@ -238,3 +240,44 @@ func runDeleteSecret(ctx context.Context, opts deleteOptions) error {
238240
func assertMcpPolicyExists(ctx context.Context, apiClient client.ApiClient) error {
239241
return apiClient.SetPolicy(ctx, secretsapi.Policy{Name: mcpPolicyName, Images: []string{"*"}})
240242
}
243+
244+
type deriveOptions struct {
245+
Src string
246+
Dst string
247+
}
248+
249+
func DeriveSecret(ctx context.Context) *cobra.Command {
250+
opts := &deriveOptions{}
251+
cmd := &cobra.Command{
252+
Use: "derive",
253+
Short: "Derive a secret from another secret",
254+
Args: cobra.NoArgs,
255+
RunE: func(*cobra.Command, []string) error {
256+
return runDeriveSecret(ctx, *opts)
257+
},
258+
}
259+
flags := cmd.Flags()
260+
flags.StringVarP(&opts.Src, "src", "s", "", "Name of the source secret")
261+
_ = cmd.MarkFlagRequired("src")
262+
flags.StringVarP(&opts.Dst, "dst", "d", "", "Name of the destination secret")
263+
_ = cmd.MarkFlagRequired("dst")
264+
return cmd
265+
}
266+
267+
func runDeriveSecret(ctx context.Context, opts deriveOptions) error {
268+
c, err := newApiClient()
269+
if err != nil {
270+
return err
271+
}
272+
if err := assertMcpPolicyExists(ctx, c); err != nil {
273+
return err
274+
}
275+
s, err := c.GetSecret(ctx, opts.Src)
276+
if err != nil {
277+
return err
278+
}
279+
if !slices.Contains(s.Policies, mcpPolicyName) {
280+
s.Policies = append(s.Policies, mcpPolicyName)
281+
}
282+
return c.SetSecret(ctx, secretsapi.Secret{Name: opts.Dst, Value: s.Value, Policies: []string{mcpPolicyName}})
283+
}

src/extension/host-binary/pkg/client/client.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type ApiClient interface {
1313
// GetPolicy retrieves a policy
1414
GetPolicy(ctx context.Context, policy string) (secretsapi.Policy, error)
1515
// GetSecret checks if a secret exists
16-
GetSecret(ctx context.Context, secret string) (secretsapi.StoredSecret, error)
16+
GetSecret(ctx context.Context, secret string) (secretsapi.Secret, error)
1717
// ListPolicies lists all policies
1818
ListPolicies(ctx context.Context) ([]secretsapi.Policy, error)
1919
// ListSecrets lists all secrets
@@ -38,7 +38,8 @@ func NewApiClient(socketPath string) ApiClient {
3838

3939
func (d apiClientImpl) SetSecret(ctx context.Context, s secretsapi.Secret) error {
4040
apiReq := d.SecretsApi.SetJfsSecret(ctx)
41-
req := secretsapi.NewSecret(s.Name, s.Value, s.Policies)
41+
req := secretsapi.NewSecret(s.Name, s.Value)
42+
req.SetPolicies(s.Policies)
4243
_, err := apiReq.Secret(*req).Execute()
4344
return err
4445
}
@@ -55,11 +56,11 @@ func (d apiClientImpl) ListSecrets(ctx context.Context) ([]secretsapi.StoredSecr
5556
return res, err
5657
}
5758

58-
func (d apiClientImpl) GetSecret(ctx context.Context, secret string) (secretsapi.StoredSecret, error) {
59+
func (d apiClientImpl) GetSecret(ctx context.Context, secret string) (secretsapi.Secret, error) {
5960
apiReq := d.SecretsApi.GetJfsSecret(ctx, secret)
6061
res, _, err := apiReq.Execute()
6162
if err != nil {
62-
return secretsapi.StoredSecret{}, err
63+
return secretsapi.Secret{}, err
6364
}
6465
return *res, nil
6566
}

src/extension/host-binary/pkg/generated/go/client/secrets/api/openapi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ paths:
7777
content:
7878
application/json:
7979
schema:
80-
$ref: '#/components/schemas/StoredSecret'
80+
$ref: '#/components/schemas/Secret'
8181
description: success
8282
"404":
8383
description: secret not found

src/extension/host-binary/pkg/generated/go/client/secrets/api_secrets.go

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/extension/host-binary/pkg/generated/go/client/secrets/docs/SecretsApi.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ No authorization required
217217

218218
## GetJfsSecret
219219

220-
> StoredSecret GetJfsSecret(ctx, secret).Execute()
220+
> Secret GetJfsSecret(ctx, secret).Execute()
221221
222222
checks if a secret exists
223223

@@ -243,7 +243,7 @@ func main() {
243243
fmt.Fprintf(os.Stderr, "Error when calling `SecretsApi.GetJfsSecret``: %v\n", err)
244244
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
245245
}
246-
// response from `GetJfsSecret`: StoredSecret
246+
// response from `GetJfsSecret`: Secret
247247
fmt.Fprintf(os.Stdout, "Response from `SecretsApi.GetJfsSecret`: %v\n", resp)
248248
}
249249
```
@@ -267,7 +267,7 @@ Name | Type | Description | Notes
267267

268268
### Return type
269269

270-
[**StoredSecret**](StoredSecret.md)
270+
[**Secret**](Secret.md)
271271

272272
### Authorization
273273

src/extension/host-binary/pkg/generated/go/client/secrets/html/index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,7 +1998,7 @@ <h3>Usage and SDK Samples</h3>
19981998
String secret = secret_example; // String |
19991999

20002000
try {
2001-
StoredSecret result = apiInstance.getJfsSecret(secret);
2001+
Secret result = apiInstance.getJfsSecret(secret);
20022002
System.out.println(result);
20032003
} catch (ApiException e) {
20042004
System.err.println("Exception when calling SecretsApi#getJfsSecret");
@@ -2018,7 +2018,7 @@ <h3>Usage and SDK Samples</h3>
20182018
String secret = secret_example; // String |
20192019

20202020
try {
2021-
StoredSecret result = apiInstance.getJfsSecret(secret);
2021+
Secret result = apiInstance.getJfsSecret(secret);
20222022
System.out.println(result);
20232023
} catch (ApiException e) {
20242024
System.err.println("Exception when calling SecretsApi#getJfsSecret");
@@ -2040,7 +2040,7 @@ <h3>Usage and SDK Samples</h3>
20402040

20412041
// checks if a secret exists
20422042
[apiInstance getJfsSecretWith:secret
2043-
completionHandler: ^(StoredSecret output, NSError* error) {
2043+
completionHandler: ^(Secret output, NSError* error) {
20442044
if (output) {
20452045
NSLog(@"%@", output);
20462046
}
@@ -2092,7 +2092,7 @@ <h3>Usage and SDK Samples</h3>
20922092

20932093
try {
20942094
// checks if a secret exists
2095-
StoredSecret result = apiInstance.getJfsSecret(secret);
2095+
Secret result = apiInstance.getJfsSecret(secret);
20962096
Debug.WriteLine(result);
20972097
} catch (Exception e) {
20982098
Debug.Print("Exception when calling SecretsApi.getJfsSecret: " + e.Message );
@@ -2247,7 +2247,7 @@ <h3 id="examples-Secrets-getJfsSecret-title-200"></h3>
22472247
"content" : {
22482248
"application/json" : {
22492249
"schema" : {
2250-
"$ref" : "#/components/schemas/StoredSecret"
2250+
"$ref" : "#/components/schemas/Secret"
22512251
}
22522252
}
22532253
}

src/extension/host-binary/pkg/generated/go/client/secrets/model_secret.go

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)