Skip to content
Snippets Groups Projects
Commit 96bff7c1 authored by Bob Callaway's avatar Bob Callaway
Browse files

rekor server validation via custom type

This retargets #67 at main instead of openapi branch
parent 14122a7a
No related branches found
No related tags found
No related merge requests found
......@@ -55,7 +55,7 @@ func init() {
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.rekor.yaml)")
rootCmd.PersistentFlags().String("rekor_server", "http://localhost:3000", "Server address:port")
rootCmd.PersistentFlags().Var(&UrlFlag{url: "http://localhost:3000"}, "rekor_server", "Server address:port")
// these are bound here and not in PreRun so that all child commands can use them
if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil {
......@@ -212,22 +212,33 @@ func buildRekorEntryFromPFlags() (*types.RekorEntry, error) {
return &rekorEntry, nil
}
func validateRekorServerURL() error {
rekorServerURL := viper.GetString("rekor_server")
if rekorServerURL != "" {
url, err := url.Parse(rekorServerURL)
if err != nil {
return fmt.Errorf("malformed rekor_server URL: %w", err)
}
if !url.IsAbs() {
return errors.New("rekor_server URL must be absolute")
}
lowercaseScheme := strings.ToLower(url.Scheme)
if lowercaseScheme != "http" && lowercaseScheme != "https" {
return errors.New("rekor_server must be a valid HTTP or HTTPS URL")
}
} else {
return errors.New("rekor_server must be specified")
type UrlFlag struct {
url string
}
func (u *UrlFlag) String() string {
return u.url
}
func (u *UrlFlag) Set(s string) error {
if s == "" {
return errors.New("flag must be specified")
}
url, err := url.Parse(s)
if err != nil {
return fmt.Errorf("malformed URL: %w", err)
}
if !url.IsAbs() {
return fmt.Errorf("URL must be absolute, got %s", s)
}
lowercaseScheme := strings.ToLower(url.Scheme)
if lowercaseScheme != "http" && lowercaseScheme != "https" {
return fmt.Errorf("URL must be a valid HTTP or HTTPS URL, got %s", s)
}
u.url = s
return nil
}
func (u *UrlFlag) Type() string {
return "url"
}
......@@ -198,9 +198,7 @@ func TestValidateRekorServerURL(t *testing.T) {
}
for _, tc := range tests {
viper.Reset()
viper.Set("rekor_server", tc.rekorServer)
if err := validateRekorServerURL(); (err == nil) != tc.expectSuccess {
if err := rootCmd.PersistentFlags().Set("rekor_server", tc.rekorServer); (err == nil) != tc.expectSuccess {
t.Errorf("unexpected result in '%v': %v", tc.caseDesc, err)
}
}
......
......@@ -49,11 +49,6 @@ var uploadCmd = &cobra.Command{
if err := viper.BindPFlags(cmd.Flags()); err != nil {
log.Logger.Fatal("Error initializing cmd line args: ", err)
}
if err := validateRekorServerURL(); err != nil {
log.Logger.Error(err)
_ = cmd.Help()
os.Exit(1)
}
if err := validateArtifactPFlags(); err != nil {
log.Logger.Error(err)
_ = cmd.Help()
......
......@@ -55,11 +55,6 @@ var verifyCmd = &cobra.Command{
if err := viper.BindPFlags(cmd.Flags()); err != nil {
log.Logger.Fatal("Error initializing cmd line args: ", err)
}
if err := validateRekorServerURL(); err != nil {
log.Logger.Error(err)
_ = cmd.Help()
os.Exit(1)
}
if err := validateArtifactPFlags(); err != nil {
log.Logger.Error(err)
_ = cmd.Help()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment