@@ -19,6 +19,7 @@ package query
1919import (
2020 _ "embed"
2121 "fmt"
22+ "github.com/docker/index-cli-plugin/internal"
2223 "net/http"
2324 "strings"
2425
@@ -44,8 +45,11 @@ var enabledSkillsQuery string
4445//go:embed package_cves.edn
4546var packageCvesQuery string
4647
48+ //go:embed package_cve.edn
49+ var packageCveQuery string
50+
4751func CheckAuth (workspace string , apiKey string ) (bool , error ) {
48- resp , err := query (enabledSkillsQuery , workspace , apiKey )
52+ resp , err := query (enabledSkillsQuery , "auth_check" , workspace , apiKey )
4953 if err != nil {
5054 return false , errors .Wrap (err , "failed to check auth" )
5155 }
@@ -55,45 +59,45 @@ func CheckAuth(workspace string, apiKey string) (bool, error) {
5559 return true , nil
5660}
5761
58- func QueryCves (sb * sbom.Sbom , workspace string , apiKey string ) (* []sbom.Cve , error ) {
62+ func QueryCves (sb * sbom.Sbom , cve string , workspace string , apiKey string ) (* []sbom.Cve , error ) {
5963 pkgs := make ([]string , 0 )
6064 for _ , p := range sb .Artifacts {
6165 pkgs = append (pkgs , fmt .Sprintf (`["%s" "%s" "%s" "%s"]` , p .Purl , p .Type , p .Version , sbom .ToAdvisoryUrl (p )))
6266 }
6367
64- resp , err := query (fmt .Sprintf (packageCvesQuery , strings .Join (pkgs , " " )), workspace , apiKey )
65- if workspace == "" || apiKey == "" {
66- var result QueryResult
67- err = edn .NewDecoder (resp .Body ).Decode (& result )
68- if err != nil {
69- return nil , errors .Wrapf (err , "failed to unmarshal response" )
70- }
71- if len (result .Query .Data ) > 0 {
72- skill .Log .Infof ("Detected %d vulnerabilities" , len (result .Query .Data [0 ].Cves ))
73- return & result .Query .Data [0 ].Cves , nil
68+ var q , name string
69+ if cve == "" {
70+ q = fmt .Sprintf (packageCvesQuery , strings .Join (pkgs , " " ))
71+ name = "cves_query"
72+ } else {
73+ q = fmt .Sprintf (packageCveQuery , cve , strings .Join (pkgs , " " ))
74+ name = "cve_query"
75+ }
76+ resp , err := query (q , name , workspace , apiKey )
77+ var result QueryResult
78+ err = edn .NewDecoder (resp .Body ).Decode (& result )
79+ if err != nil {
80+ return nil , errors .Wrapf (err , "failed to unmarshal response" )
81+ }
82+ if len (result .Query .Data ) > 0 {
83+ if len (result .Query .Data ) == 1 {
84+ skill .Log .Infof ("Detected %d vulnerability" , len (result .Query .Data [0 ].Cves ))
7485 } else {
75- return nil , nil
86+ skill . Log . Infof ( "Detected %d vulnerabilities" , len ( result . Query . Data [ 0 ]. Cves ))
7687 }
88+ return & result .Query .Data [0 ].Cves , nil
7789 } else {
78- var cves []CveResult
79- err = edn .NewDecoder (resp .Body ).Decode (& cves )
80- if err != nil {
81- return nil , errors .Wrapf (err , "failed to unmarshal response" )
82- }
83- skill .Log .Infof ("Detected %d vulnerabilities" , len (cves [0 ].Cves ))
84- return & cves [0 ].Cves , nil
90+ return nil , nil
8591 }
8692}
8793
88- func query (query string , workspace string , apiKey string ) (* http.Response , error ) {
89- url := "https://api.dso.docker.com/datalog/team/" + workspace
94+ func query (query string , name string , workspace string , apiKey string ) (* http.Response , error ) {
95+ url := fmt . Sprintf ( "https://api.dso.docker.com/datalog/team/%s/queries" , workspace )
9096 if workspace == "" || apiKey == "" {
9197 url = "https://api.dso.docker.com/datalog/shared-vulnerability/queries"
92- query = fmt .Sprintf (`{:queries [{:name "query" :query %s}]}` , query )
93- } else {
94- query = fmt .Sprintf (`{:query %s}` , query )
95- }
9698
99+ }
100+ query = fmt .Sprintf (`{:queries [{:name "query" :query %s}]}` , query )
97101 client := & http.Client {}
98102 req , err := http .NewRequest (http .MethodPost , url , strings .NewReader (query ))
99103 if err != nil {
@@ -103,6 +107,8 @@ func query(query string, workspace string, apiKey string) (*http.Response, error
103107 req .Header .Set ("Authorization" , "Bearer " + apiKey )
104108 }
105109 req .Header .Set ("Content-Type" , "application/edn" )
110+ req .Header .Set ("X-Docker-Client" , fmt .Sprintf ("index-cli-plugin/%s" , internal .FromBuild ().Version ))
111+ req .Header .Set ("X-Docker-Query" , name )
106112 if err != nil {
107113 return nil , errors .Wrapf (err , "failed to create http client" )
108114 }
0 commit comments