zotregistry.io/zot@v1.4.4-0.20231124084042-02a8ed785457/pkg/cli/client/cves_sub_cmd.go (about)

     1  //go:build search
     2  // +build search
     3  
     4  package client
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  
    10  	"github.com/spf13/cobra"
    11  
    12  	zerr "zotregistry.io/zot/errors"
    13  	zcommon "zotregistry.io/zot/pkg/common"
    14  )
    15  
    16  const (
    17  	maxRetries = 20
    18  )
    19  
    20  func NewCveForImageCommand(searchService SearchService) *cobra.Command {
    21  	var (
    22  		searchedCVEID   string
    23  		cveListSortFlag = CVEListSortFlag(SortBySeverity)
    24  	)
    25  
    26  	cveForImageCmd := &cobra.Command{
    27  		Use:   "list [repo:tag]|[repo@digest]",
    28  		Short: "List CVEs by REPO:TAG or REPO@DIGEST",
    29  		Long:  `List CVEs by REPO:TAG or REPO@DIGEST`,
    30  		Args:  OneImageWithRefArg,
    31  		RunE: func(cmd *cobra.Command, args []string) error {
    32  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
    33  			if err != nil {
    34  				return err
    35  			}
    36  
    37  			err = CheckExtEndPointQuery(searchConfig, CVEListForImageQuery())
    38  			if err != nil {
    39  				return fmt.Errorf("%w: '%s'", err, CVEListForImageQuery().Name)
    40  			}
    41  
    42  			image := args[0]
    43  
    44  			return SearchCVEForImageGQL(searchConfig, image, searchedCVEID)
    45  		},
    46  	}
    47  
    48  	cveForImageCmd.Flags().StringVar(&searchedCVEID, SearchedCVEID, "", "Search for a specific CVE by name/id")
    49  	cveForImageCmd.Flags().Var(&cveListSortFlag, SortByFlag,
    50  		fmt.Sprintf("Options for sorting the output: [%s]", CVEListSortOptionsStr()))
    51  
    52  	return cveForImageCmd
    53  }
    54  
    55  func NewImagesByCVEIDCommand(searchService SearchService) *cobra.Command {
    56  	var (
    57  		repo              string
    58  		imageListSortFlag = ImageListSortFlag(SortByAlphabeticAsc)
    59  	)
    60  
    61  	imagesByCVEIDCmd := &cobra.Command{
    62  		Use:   "affected [cveId]",
    63  		Short: "List images affected by a CVE",
    64  		Long:  `List images affected by a CVE`,
    65  		Args: func(cmd *cobra.Command, args []string) error {
    66  			if err := cobra.ExactArgs(1)(cmd, args); err != nil {
    67  				return err
    68  			}
    69  
    70  			if !strings.HasPrefix(args[0], "CVE") {
    71  				return fmt.Errorf("%w: expected a cveid 'CVE-...' got '%s'", zerr.ErrInvalidCLIParameter, args[0])
    72  			}
    73  
    74  			return nil
    75  		},
    76  		RunE: func(cmd *cobra.Command, args []string) error {
    77  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
    78  			if err != nil {
    79  				return err
    80  			}
    81  
    82  			err = CheckExtEndPointQuery(searchConfig, ImageListForCVEQuery())
    83  			if err != nil {
    84  				return fmt.Errorf("%w: '%s'", err, ImageListForCVEQuery().Name)
    85  			}
    86  
    87  			searchedCVEID := args[0]
    88  
    89  			return SearchImagesByCVEIDGQL(searchConfig, repo, searchedCVEID)
    90  		},
    91  	}
    92  
    93  	imagesByCVEIDCmd.Flags().StringVar(&repo, "repo", "", "Search for a specific CVE by name/id")
    94  	imagesByCVEIDCmd.Flags().Var(&imageListSortFlag, SortByFlag,
    95  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
    96  
    97  	return imagesByCVEIDCmd
    98  }
    99  
   100  func NewFixedTagsCommand(searchService SearchService) *cobra.Command {
   101  	imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc)
   102  
   103  	fixedTagsCmd := &cobra.Command{
   104  		Use:   "fixed [repo] [cveId]",
   105  		Short: "List tags where a CVE is fixed",
   106  		Long:  `List tags where a CVE is fixed`,
   107  		Args: func(cmd *cobra.Command, args []string) error {
   108  			const argCount = 2
   109  
   110  			if err := cobra.ExactArgs(argCount)(cmd, args); err != nil {
   111  				return err
   112  			}
   113  
   114  			if !zcommon.CheckIsCorrectRepoNameFormat(args[0]) {
   115  				return fmt.Errorf("%w: expected a valid repo name for first argument '%s'", zerr.ErrInvalidCLIParameter, args[0])
   116  			}
   117  
   118  			return nil
   119  		},
   120  		RunE: func(cmd *cobra.Command, args []string) error {
   121  			searchConfig, err := GetSearchConfigFromFlags(cmd, searchService)
   122  			if err != nil {
   123  				return err
   124  			}
   125  
   126  			err = CheckExtEndPointQuery(searchConfig, ImageListWithCVEFixedQuery())
   127  			if err != nil {
   128  				return fmt.Errorf("%w: '%s'", err, ImageListWithCVEFixedQuery().Name)
   129  			}
   130  
   131  			repo := args[0]
   132  			searchedCVEID := args[1]
   133  
   134  			return SearchFixedTagsGQL(searchConfig, repo, searchedCVEID)
   135  		},
   136  	}
   137  
   138  	fixedTagsCmd.Flags().Var(&imageListSortFlag, SortByFlag,
   139  		fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr()))
   140  
   141  	return fixedTagsCmd
   142  }