@@ -68,12 +68,16 @@ func (p *PolicyProvider) Resolve(policyName, orgName, token string) (*schemaapi.
6868 if err != nil {
6969 return nil , nil , fmt .Errorf ("failed to resolve policy: %w" , err )
7070 }
71- ref , err := p .queryProvider (endpoint , digest , orgName , token , & policy )
71+ url , err := url .Parse (endpoint )
72+ if err != nil {
73+ return nil , nil , fmt .Errorf ("error parsing policy provider URL: %w" , err )
74+ }
75+ providerDigest , err := p .queryProvider (url , digest , orgName , token , & policy )
7276 if err != nil {
7377 return nil , nil , fmt .Errorf ("failed to resolve policy: %w" , err )
7478 }
7579
76- return & policy , ref , nil
80+ return & policy , createRef ( url , policyName , providerDigest , orgName ) , nil
7781}
7882
7983// ResolveGroup calls remote provider for retrieving a policy group definition
@@ -83,29 +87,27 @@ func (p *PolicyProvider) ResolveGroup(groupName, orgName, token string) (*schema
8387 }
8488
8589 // the policy name might include a digest in the form of <name>@sha256:<digest>
86- policyName , digest := policies .ExtractDigest (groupName )
90+ groupName , digest := policies .ExtractDigest (groupName )
8791
8892 var group schemaapi.PolicyGroup
89- endpoint , err := url .JoinPath (p .url , groupsEndpoint , policyName )
93+ endpoint , err := url .JoinPath (p .url , groupsEndpoint , groupName )
9094 if err != nil {
9195 return nil , nil , fmt .Errorf ("failed to resolve group: %w" , err )
9296 }
93- ref , err := p .queryProvider (endpoint , digest , orgName , token , & group )
97+ url , err := url .Parse (endpoint )
98+ if err != nil {
99+ return nil , nil , fmt .Errorf ("error parsing policy provider URL: %w" , err )
100+ }
101+ providerDigest , err := p .queryProvider (url , digest , orgName , token , & group )
94102 if err != nil {
95103 return nil , nil , fmt .Errorf ("failed to resolve group: %w" , err )
96104 }
97105
98- return & group , ref , nil
106+ return & group , createRef ( url , groupName , providerDigest , orgName ) , nil
99107}
100108
101- func (p * PolicyProvider ) queryProvider (path , digest , orgName , token string , out proto.Message ) (* PolicyReference , error ) {
102- // craft the URL
103- uri , err := url .Parse (path )
104- if err != nil {
105- return nil , fmt .Errorf ("error parsing policy provider URL: %w" , err )
106- }
107-
108- query := uri .Query ()
109+ func (p * PolicyProvider ) queryProvider (url * url.URL , digest , orgName , token string , out proto.Message ) (string , error ) {
110+ query := url .Query ()
109111 if digest != "" {
110112 query .Set (digestParam , digest )
111113 }
@@ -114,75 +116,60 @@ func (p *PolicyProvider) queryProvider(path, digest, orgName, token string, out
114116 query .Set (orgNameParam , orgName )
115117 }
116118
117- uri .RawQuery = query .Encode ()
119+ url .RawQuery = query .Encode ()
118120
119- req , err := http .NewRequest ("GET" , uri .String (), nil )
121+ req , err := http .NewRequest ("GET" , url .String (), nil )
120122 if err != nil {
121- return nil , fmt .Errorf ("error creating policy request: %w" , err )
123+ return "" , fmt .Errorf ("error creating policy request: %w" , err )
122124 }
123125
124126 req .Header .Set ("Authorization" , fmt .Sprintf ("Bearer %s" , token ))
125127
126128 // make the request
127129 resp , err := http .DefaultClient .Do (req )
128130 if err != nil {
129- return nil , fmt .Errorf ("error executing policy request: %w" , err )
131+ return "" , fmt .Errorf ("error executing policy request: %w" , err )
130132 }
131133
132134 if resp .StatusCode != http .StatusOK {
133135 if resp .StatusCode == http .StatusNotFound {
134- return nil , ErrNotFound
136+ return "" , ErrNotFound
135137 }
136138
137- return nil , fmt .Errorf ("expected status code 200 but got %d" , resp .StatusCode )
139+ return "" , fmt .Errorf ("expected status code 200 but got %d" , resp .StatusCode )
138140 }
139141
140142 resBytes , err := io .ReadAll (resp .Body )
141143 if err != nil {
142- return nil , fmt .Errorf ("error reading policy response: %w" , err )
144+ return "" , fmt .Errorf ("error reading policy response: %w" , err )
143145 }
144146
145147 // unmarshall response
146148 var response ProviderResponse
147149 if err := json .Unmarshal (resBytes , & response ); err != nil {
148- return nil , fmt .Errorf ("error unmarshalling policy response: %w" , err )
149- }
150-
151- ref , err := p .resolveRef (path , response .Digest )
152- if err != nil {
153- return nil , fmt .Errorf ("error resolving policy reference: %w" , err )
150+ return "" , fmt .Errorf ("error unmarshalling policy response: %w" , err )
154151 }
155152
156153 // extract the policy payload from the query response
157154 jsonPolicy , err := json .Marshal (response .Data )
158155 if err != nil {
159- return nil , fmt .Errorf ("error marshalling policy response: %w" , err )
156+ return "" , fmt .Errorf ("error marshalling policy response: %w" , err )
160157 }
161158
162159 if err := protojson .Unmarshal (jsonPolicy , out ); err != nil {
163- return nil , fmt .Errorf ("error unmarshalling policy response: %w" , err )
160+ return "" , fmt .Errorf ("error unmarshalling policy response: %w" , err )
164161 }
165162
166- return ref , nil
163+ return response . Digest , nil
167164}
168165
169- func (p * PolicyProvider ) resolveRef (path , digest string ) (* PolicyReference , error ) {
170- // Extract hostname from the policy provider URL
171- uri , err := url .Parse (p .url )
172- if err != nil {
173- return nil , fmt .Errorf ("error parsing policy provider URL: %w" , err )
174- }
175-
176- if uri .Host == "" {
177- return nil , fmt .Errorf ("invalid policy provider URL" )
178- }
179-
180- if path == "" || digest == "" {
181- return nil , fmt .Errorf ("both path and digest are mandatory" )
166+ func createRef (policyURL * url.URL , name , digest , orgName string ) * PolicyReference {
167+ refURL := fmt .Sprintf ("chainloop://%s/%s" , policyURL .Host , name )
168+ if orgName != "" {
169+ refURL = fmt .Sprintf ("%s?org=%s" , refURL , orgName )
182170 }
183-
184171 return & PolicyReference {
185- URL : fmt . Sprintf ( "chainloop://%s/%s" , uri . Host , path ) ,
172+ URL : refURL ,
186173 Digest : digest ,
187- }, nil
174+ }
188175}
0 commit comments