diff --git a/cmd/cosign/cli/attest.go b/cmd/cosign/cli/attest.go index cc1ae4b7b12..3de67774ec4 100644 --- a/cmd/cosign/cli/attest.go +++ b/cmd/cosign/cli/attest.go @@ -78,6 +78,6 @@ func addAttest(topLevel *cobra.Command) { return nil }, } - options.AddAttestOptions(cmd, o) + o.AddFlags(cmd) topLevel.AddCommand(cmd) } diff --git a/cmd/cosign/cli/commands.go b/cmd/cosign/cli/commands.go index 57dd2f960b3..82d9fbf2fb7 100644 --- a/cmd/cosign/cli/commands.go +++ b/cmd/cosign/cli/commands.go @@ -116,7 +116,7 @@ func New() *cobra.Command { return nil // TODO: use cobra to output help. }, } - options.AddRootOptions(cmd, ro) + ro.AddFlags(cmd) // Add sub-commands. addPublicKey(cmd) diff --git a/cmd/cosign/cli/generate.go b/cmd/cosign/cli/generate.go index 917f9d17349..0c3040440d4 100644 --- a/cmd/cosign/cli/generate.go +++ b/cmd/cosign/cli/generate.go @@ -55,6 +55,6 @@ to sign payloads with your own tooling or algorithms.`, }, } - options.AddGenerateOptions(cmd, o) + o.AddFlags(cmd) topLevel.AddCommand(cmd) } diff --git a/cmd/cosign/cli/generate_key_pair.go b/cmd/cosign/cli/generate_key_pair.go index 2bc2f67c8ae..c9bf7a5f03b 100644 --- a/cmd/cosign/cli/generate_key_pair.go +++ b/cmd/cosign/cli/generate_key_pair.go @@ -59,6 +59,6 @@ CAVEATS: }, } - options.AddGenerateKeyPairOptions(cmd, o) + o.AddFlags(cmd) topLevel.AddCommand(cmd) } diff --git a/cmd/cosign/cli/options/annotations.go b/cmd/cosign/cli/options/annotations.go index ae82cf081ce..e9a1bddb8dd 100644 --- a/cmd/cosign/cli/options/annotations.go +++ b/cmd/cosign/cli/options/annotations.go @@ -29,9 +29,11 @@ type AnnotationOptions struct { Annotations []string } -func (s *AnnotationOptions) AnnotationsMap() (sigs.AnnotationsMap, error) { +var _ Interface = (*AnnotationOptions)(nil) + +func (o *AnnotationOptions) AnnotationsMap() (sigs.AnnotationsMap, error) { ann := sigs.AnnotationsMap{} - for _, a := range s.Annotations { + for _, a := range o.Annotations { kv := strings.Split(a, "=") if len(kv) != 2 { return ann, fmt.Errorf("unable to parse annotation: %s", a) @@ -44,8 +46,8 @@ func (s *AnnotationOptions) AnnotationsMap() (sigs.AnnotationsMap, error) { return ann, nil } -// AddAnnotationOptions adds annotation options to cmd. -func AddAnnotationOptions(cmd *cobra.Command, o *AnnotationOptions) { +// AddFlags implements Inteface +func (o *AnnotationOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringSliceVarP(&o.Annotations, "annotations", "a", nil, "extra key=value pairs to sign") } diff --git a/cmd/cosign/cli/options/attest.go b/cmd/cosign/cli/options/attest.go index 5066e05a65d..b855ccfeb78 100644 --- a/cmd/cosign/cli/options/attest.go +++ b/cmd/cosign/cli/options/attest.go @@ -33,8 +33,15 @@ type AttestOptions struct { RegistryOpts RegistryOpts } -// AddAttestOptions adds the sign command options to cmd. -func AddAttestOptions(cmd *cobra.Command, o *AttestOptions) { +var _ Interface = (*AttestOptions)(nil) + +// AddFlags implements Interface +func (o *AttestOptions) AddFlags(cmd *cobra.Command) { + o.SecurityKey.AddFlags(cmd) + o.Predicate.AddFlags(cmd) + o.Fulcio.AddFlags(cmd) + // TODO(n3wscott): We need o.RegistryOpts.AddFlags(cmd) + cmd.Flags().StringVar(&o.Key, "key", "", "path to the private key file, KMS URI or Kubernetes Secret") @@ -52,10 +59,4 @@ func AddAttestOptions(cmd *cobra.Command, o *AttestOptions) { cmd.Flags().BoolVar(&o.RegistryOpts.AllowInsecure, "allow-insecure-registry", false, "whether to allow insecure connections to registries. Don't use this for anything but testing") - - AddSecurityKeyOptions(cmd, &o.SecurityKey) - - AddPredicateOptions(cmd, &o.Predicate) - - AddFulcioOptions(cmd, &o.Fulcio) } diff --git a/cmd/cosign/cli/options/fulcio.go b/cmd/cosign/cli/options/fulcio.go index c0b6cc69189..970ff1c677c 100644 --- a/cmd/cosign/cli/options/fulcio.go +++ b/cmd/cosign/cli/options/fulcio.go @@ -26,8 +26,10 @@ type FulcioOptions struct { IdentityToken string } -// AddFulcioOptions adds the Fulcio related options to cmd. -func AddFulcioOptions(cmd *cobra.Command, o *FulcioOptions) { +var _ Interface = (*FulcioOptions)(nil) + +// AddFlags implements Interface +func (o *FulcioOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&o.URL, "fulcio-url", fulcioclient.SigstorePublicServerURL, "[EXPERIMENTAL] address of sigstore PKI server") diff --git a/cmd/cosign/cli/options/generate.go b/cmd/cosign/cli/options/generate.go index 1f28573103a..baeb523a3a5 100644 --- a/cmd/cosign/cli/options/generate.go +++ b/cmd/cosign/cli/options/generate.go @@ -25,9 +25,11 @@ type GenerateOptions struct { RegistryOpts RegistryOpts } -// AddGenerateOptions adds the generate command options to cmd. -func AddGenerateOptions(cmd *cobra.Command, o *GenerateOptions) { - AddAnnotationOptions(cmd, &o.AnnotationOptions) +var _ Interface = (*GenerateOptions)(nil) + +// AddFlags implements Interface +func (o *GenerateOptions) AddFlags(cmd *cobra.Command) { + o.AnnotationOptions.AddFlags(cmd) cmd.Flags().BoolVar(&o.RegistryOpts.AllowInsecure, "allow-insecure-registry", false, "whether to allow insecure connections to registries. Don't use this for anything but testing") diff --git a/cmd/cosign/cli/options/generate_key_pair.go b/cmd/cosign/cli/options/generate_key_pair.go index d1f779c6570..4b7312d772a 100644 --- a/cmd/cosign/cli/options/generate_key_pair.go +++ b/cmd/cosign/cli/options/generate_key_pair.go @@ -25,8 +25,10 @@ type GenerateKeyPairOptions struct { KMS string } -// AddGenerateKeyPairOptions adds the generate-key-pair command options to cmd. -func AddGenerateKeyPairOptions(cmd *cobra.Command, o *GenerateKeyPairOptions) { +var _ Interface = (*GenerateKeyPairOptions)(nil) + +// AddFlags implements Interface +func (o *GenerateKeyPairOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&o.KMS, "kms", "", "create key pair in KMS service to use for signing") } diff --git a/cmd/cosign/cli/options/oidc.go b/cmd/cosign/cli/options/oidc.go index 0f1b4f80324..21c3bf8f13c 100644 --- a/cmd/cosign/cli/options/oidc.go +++ b/cmd/cosign/cli/options/oidc.go @@ -26,8 +26,10 @@ type OIDCOptions struct { ClientSecret string } -// AddOIDCOptions adds the OIDC related options to cmd. -func AddOIDCOptions(cmd *cobra.Command, o *OIDCOptions) { +var _ Interface = (*OIDCOptions)(nil) + +// AddFlags implements Interface +func (o *OIDCOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&o.Issuer, "oidc-issuer", "https://oauth2.sigstore.dev/auth", "[EXPERIMENTAL] OIDC provider to be used to issue ID token") diff --git a/cmd/cosign/cli/options/options.go b/cmd/cosign/cli/options/options.go new file mode 100644 index 00000000000..f69d8309e29 --- /dev/null +++ b/cmd/cosign/cli/options/options.go @@ -0,0 +1,23 @@ +// +// Copyright 2021 The Sigstore Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package options + +import "github.com/spf13/cobra" + +type Interface interface { + // AddFlags adds this options' flags to the cobra command. + AddFlags(cmd *cobra.Command) +} diff --git a/cmd/cosign/cli/options/predicate.go b/cmd/cosign/cli/options/predicate.go index aae7103d755..ec55d40b6ac 100644 --- a/cmd/cosign/cli/options/predicate.go +++ b/cmd/cosign/cli/options/predicate.go @@ -25,8 +25,10 @@ type PredicateOptions struct { Type string } -// AddPredicateOptions adds the predicate related options to cmd. -func AddPredicateOptions(cmd *cobra.Command, o *PredicateOptions) { +var _ Interface = (*PredicateOptions)(nil) + +// AddFlags implements Interface +func (o *PredicateOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&o.Path, "predicate", "", "path to the predicate file.") diff --git a/cmd/cosign/cli/options/public_key.go b/cmd/cosign/cli/options/public_key.go index fdce27ca4db..cbb0f0e3cc6 100644 --- a/cmd/cosign/cli/options/public_key.go +++ b/cmd/cosign/cli/options/public_key.go @@ -26,13 +26,15 @@ type PublicKeyOptions struct { OutFile string } -// AddPublicKeyOptions adds the public-key command options to cmd. -func AddPublicKeyOptions(cmd *cobra.Command, o *PublicKeyOptions) { +var _ Interface = (*PublicKeyOptions)(nil) + +// AddFlags implements Interface +func (o *PublicKeyOptions) AddFlags(cmd *cobra.Command) { + o.SecurityKey.AddFlags(cmd) + cmd.Flags().StringVar(&o.Key, "key", "", "path to the private key file, KMS URI or Kubernetes Secret") - AddSecurityKeyOptions(cmd, &o.SecurityKey) - cmd.Flags().StringVar(&o.OutFile, "outfile", "", "path to a payload file to use rather than generating one") } diff --git a/cmd/cosign/cli/options/rekor.go b/cmd/cosign/cli/options/rekor.go index 570744038bd..8a5bfeb11dd 100644 --- a/cmd/cosign/cli/options/rekor.go +++ b/cmd/cosign/cli/options/rekor.go @@ -24,8 +24,10 @@ type RekorOptions struct { URL string } -// AddRekorOptions adds the Rektor related options to cmd. -func AddRekorOptions(cmd *cobra.Command, o *RekorOptions) { +var _ Interface = (*RekorOptions)(nil) + +// AddFlags implements Interface +func (o *RekorOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&o.URL, "rekor-url", "https://rekor.sigstore.dev", "[EXPERIMENTAL] address of rekor STL server") } diff --git a/cmd/cosign/cli/options/root.go b/cmd/cosign/cli/options/root.go index ee64491e6d2..d0b51a6e744 100644 --- a/cmd/cosign/cli/options/root.go +++ b/cmd/cosign/cli/options/root.go @@ -25,7 +25,10 @@ type RootOptions struct { Verbose bool } -func AddRootOptions(cmd *cobra.Command, o *RootOptions) { +var _ Interface = (*RootOptions)(nil) + +// AddFlags implements Interface +func (o *RootOptions) AddFlags(cmd *cobra.Command) { cmd.PersistentFlags().StringVar(&o.OutputFile, "output-file", "", "log output to a file") diff --git a/cmd/cosign/cli/options/security_key.go b/cmd/cosign/cli/options/security_key.go index 8130b8024e3..6cf121b71a9 100644 --- a/cmd/cosign/cli/options/security_key.go +++ b/cmd/cosign/cli/options/security_key.go @@ -25,8 +25,10 @@ type SecurityKeyOptions struct { Slot string } -// AddSecurityKeyOptions adds the security key related options to cmd. -func AddSecurityKeyOptions(cmd *cobra.Command, o *SecurityKeyOptions) { +var _ Interface = (*SecurityKeyOptions)(nil) + +// AddFlags implements Interface +func (o *SecurityKeyOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().BoolVar(&o.Use, "sk", false, "whether to use a hardware security key") diff --git a/cmd/cosign/cli/options/sign.go b/cmd/cosign/cli/options/sign.go index 138886fffc9..cf76a9c7b17 100644 --- a/cmd/cosign/cli/options/sign.go +++ b/cmd/cosign/cli/options/sign.go @@ -39,8 +39,16 @@ type SignOptions struct { RegistryOpts RegistryOpts } -// AddSignOptions adds the sign command options to cmd. -func AddSignOptions(cmd *cobra.Command, o *SignOptions) { +var _ Interface = (*SignOptions)(nil) + +// AddFlags implements Interface +func (o *SignOptions) AddFlags(cmd *cobra.Command) { + o.Rektor.AddFlags(cmd) + o.Fulcio.AddFlags(cmd) + o.OIDC.AddFlags(cmd) + o.SecurityKey.AddFlags(cmd) + o.AnnotationOptions.AddFlags(cmd) + cmd.Flags().StringVar(&o.Key, "key", "", "path to the private key file, KMS URI or Kubernetes Secret") @@ -50,8 +58,6 @@ func AddSignOptions(cmd *cobra.Command, o *SignOptions) { cmd.Flags().BoolVar(&o.Upload, "upload", true, "whether to upload the signature") - AddSecurityKeyOptions(cmd, &o.SecurityKey) - cmd.Flags().StringVar(&o.PayloadPath, "payload", "", "path to a payload file to use rather than generating one") @@ -64,14 +70,6 @@ func AddSignOptions(cmd *cobra.Command, o *SignOptions) { cmd.Flags().StringVar(&o.Attachment, "attachment", "", "related image attachment to sign (sbom), default none") - AddAnnotationOptions(cmd, &o.AnnotationOptions) - cmd.Flags().BoolVar(&o.RegistryOpts.AllowInsecure, "allow-insecure-registry", false, "whether to allow insecure connections to registries. Don't use this for anything but testing") - - AddRekorOptions(cmd, &o.Rektor) - - AddFulcioOptions(cmd, &o.Fulcio) - - AddOIDCOptions(cmd, &o.OIDC) } diff --git a/cmd/cosign/cli/options/signblob.go b/cmd/cosign/cli/options/signblob.go index 78c2d9b2fac..6d77a43e394 100644 --- a/cmd/cosign/cli/options/signblob.go +++ b/cmd/cosign/cli/options/signblob.go @@ -31,8 +31,15 @@ type SignBlobOptions struct { RegistryOpts RegistryOpts } -// AddSignBlobOptions adds the sign-blob command options to cmd. -func AddSignBlobOptions(cmd *cobra.Command, o *SignBlobOptions) { +var _ Interface = (*SignBlobOptions)(nil) + +// AddFlags implements Interface +func (o *SignBlobOptions) AddFlags(cmd *cobra.Command) { + o.SecurityKey.AddFlags(cmd) + o.Fulcio.AddFlags(cmd) + o.Rektor.AddFlags(cmd) + o.OIDC.AddFlags(cmd) + cmd.Flags().StringVar(&o.Key, "key", "", "path to the private key file, KMS URI or Kubernetes Secret") @@ -44,12 +51,4 @@ func AddSignBlobOptions(cmd *cobra.Command, o *SignBlobOptions) { cmd.Flags().BoolVar(&o.RegistryOpts.AllowInsecure, "allow-insecure-registry", false, "whether to allow insecure connections to registries. Don't use this for anything but testing") - - AddSecurityKeyOptions(cmd, &o.SecurityKey) - - AddFulcioOptions(cmd, &o.Fulcio) - - AddRekorOptions(cmd, &o.Rektor) - - AddOIDCOptions(cmd, &o.OIDC) } diff --git a/cmd/cosign/cli/public_key.go b/cmd/cosign/cli/public_key.go index b90845dc1cf..c0fae35fd42 100644 --- a/cmd/cosign/cli/public_key.go +++ b/cmd/cosign/cli/public_key.go @@ -81,6 +81,6 @@ func addPublicKey(topLevel *cobra.Command) { }, } - options.AddPublicKeyOptions(cmd, o) + o.AddFlags(cmd) topLevel.AddCommand(cmd) } diff --git a/cmd/cosign/cli/sign.go b/cmd/cosign/cli/sign.go index 2ba9a3cdb58..fadd0373d59 100644 --- a/cmd/cosign/cli/sign.go +++ b/cmd/cosign/cli/sign.go @@ -101,6 +101,6 @@ func addSign(topLevel *cobra.Command) { }, } - options.AddSignOptions(cmd, o) + o.AddFlags(cmd) topLevel.AddCommand(cmd) } diff --git a/cmd/cosign/cli/signblob.go b/cmd/cosign/cli/signblob.go index 8c44d19ff14..11a1c69c283 100644 --- a/cmd/cosign/cli/signblob.go +++ b/cmd/cosign/cli/signblob.go @@ -85,6 +85,6 @@ func addSignBlob(topLevel *cobra.Command) { }, } - options.AddSignBlobOptions(cmd, o) + o.AddFlags(cmd) topLevel.AddCommand(cmd) } diff --git a/cmd/sget/cli/commands.go b/cmd/sget/cli/commands.go index 3a8ec8eced5..68410802a68 100644 --- a/cmd/sget/cli/commands.go +++ b/cmd/sget/cli/commands.go @@ -52,7 +52,7 @@ func New() *cobra.Command { return sget.New(ro.ImageRef, ro.PublicKey, wc).Do(context.Background()) }, } - options.AddRootArgs(cmd, ro) + ro.AddFlags(cmd) return cmd } diff --git a/cmd/sget/cli/options/root.go b/cmd/sget/cli/options/root.go index 953750d607a..c3a51ad894b 100644 --- a/cmd/sget/cli/options/root.go +++ b/cmd/sget/cli/options/root.go @@ -16,6 +16,7 @@ package options import ( + "github.com/sigstore/cosign/cmd/cosign/cli/options" "github.com/spf13/cobra" ) @@ -26,7 +27,10 @@ type RootOptions struct { ImageRef string } -func AddRootArgs(cmd *cobra.Command, o *RootOptions) { +var _ options.Interface = (*RootOptions)(nil) + +// AddFlags implements options.Interface +func (o *RootOptions) AddFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&o.OutputFile, "output", "o", "", "output file")