@@ -3,10 +3,8 @@ package vault
33import (
44 "context"
55 "encoding/hex"
6- "encoding/json"
76 "errors"
87 "fmt"
9- "strconv"
108 "strings"
119 "time"
1210
@@ -17,7 +15,6 @@ import (
1715 "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
1816 vaultcommon "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault"
1917 "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/requests"
20- jsonrpc "github.com/smartcontractkit/chainlink-common/pkg/jsonrpc2"
2118 "github.com/smartcontractkit/chainlink-common/pkg/logger"
2219 "github.com/smartcontractkit/chainlink-common/pkg/settings/cresettings"
2320 "github.com/smartcontractkit/chainlink-common/pkg/settings/limits"
@@ -32,7 +29,6 @@ type Capability struct {
3229 clock clockwork.Clock
3330 expiresAfter time.Duration
3431 handler * requests.Handler [* vaulttypes.Request , * vaulttypes.Response ]
35- requestAuthorizer RequestAuthorizer
3632 capabilitiesRegistry core.CapabilitiesRegistry
3733 publicKey * LazyPublicKey
3834 * RequestValidator
@@ -167,24 +163,6 @@ func (s *Capability) CreateSecrets(ctx context.Context, request *vaultcommon.Cre
167163 s .lggr .Debugf ("RequestId: [%s] failed validation checks: %s" , request .RequestId , err .Error ())
168164 return nil , err
169165 }
170- authorized , owner , err := s .authorizeCreateSecrets (ctx , * request ) //nolint:govet // The mutex isn't used
171- if ! authorized || err != nil {
172- s .lggr .Debugf ("Request Id[%s] not authorized for owner: %s" , request .RequestId , owner )
173- return nil , errors .New ("request ID: " + request .RequestId + " not authorized: " + err .Error ())
174- }
175- if ! strings .HasPrefix (request .RequestId , owner ) {
176- // Gateway should ensure it prefixes request ids with the owner, to ensure request uniqueness
177- s .lggr .Debugf ("Request ID: [%s] must start with owner address: [%s]" , request .RequestId , owner )
178- return nil , errors .New ("request ID: " + request .RequestId + " must start with owner address: " + owner )
179- }
180- for idx , req := range request .EncryptedSecrets {
181- // Ensure that users cannot access secrets belonging to other owners
182- if req .Id .Owner != owner {
183- s .lggr .Debugf ("Secret ID owner: [%s] does not match authorized owner: [%s]" , req .Id .Owner , owner )
184- return nil , errors .New ("secret ID owner: " + req .Id .Owner + " does not match authorized owner: " + owner + " at index " + strconv .Itoa (idx ))
185- }
186- }
187- s .lggr .Debugf ("Processing authorized and normalized request [%s]" , request .String ())
188166 return s .handleRequest (ctx , request .RequestId , request )
189167}
190168
@@ -195,24 +173,6 @@ func (s *Capability) UpdateSecrets(ctx context.Context, request *vaultcommon.Upd
195173 s .lggr .Debugf ("RequestId: [%s] failed validation checks: %s" , request .RequestId , err .Error ())
196174 return nil , err
197175 }
198- authorized , owner , err := s .authorizeUpdateSecrets (ctx , * request ) //nolint:govet // The mutex isn't used
199- if ! authorized || err != nil {
200- s .lggr .Debugf ("Request Id[%s] not authorized for owner: %s" , request .RequestId , owner )
201- return nil , errors .New ("request ID: " + request .RequestId + " not authorized: " + err .Error ())
202- }
203- if ! strings .HasPrefix (request .RequestId , owner ) {
204- // Gateway should ensure it prefixes request ids with the owner, to ensure request uniqueness
205- s .lggr .Debugf ("Request ID: [%s] must start with owner address: [%s]" , request .RequestId , owner )
206- return nil , errors .New ("request ID: " + request .RequestId + " must start with owner address: " + owner )
207- }
208- for idx , req := range request .EncryptedSecrets {
209- // Ensure that users cannot access secrets belonging to other owners
210- if req .Id .Owner != owner {
211- s .lggr .Debugf ("Secret ID owner: [%s] does not match authorized owner: [%s]" , req .Id .Owner , owner )
212- return nil , errors .New ("secret ID owner: " + req .Id .Owner + " does not match authorized owner: " + owner + " at index " + strconv .Itoa (idx ))
213- }
214- }
215- s .lggr .Debugf ("Processing authorized and normalized request [%s]" , request .String ())
216176 return s .handleRequest (ctx , request .RequestId , request )
217177}
218178
@@ -223,25 +183,6 @@ func (s *Capability) DeleteSecrets(ctx context.Context, request *vaultcommon.Del
223183 s .lggr .Debugf ("Request: [%s] failed validation checks: %s" , request .String (), err .Error ())
224184 return nil , err
225185 }
226-
227- authorized , owner , err := s .authorizeDeleteSecrets (ctx , * request ) //nolint:govet // The mutex isn't used
228- if ! authorized || err != nil {
229- s .lggr .Debugf ("Request Id[%s] not authorized for owner: %s" , request .RequestId , owner )
230- return nil , errors .New ("request ID: " + request .RequestId + " not authorized: " + err .Error ())
231- }
232- if ! strings .HasPrefix (request .RequestId , owner ) {
233- // Gateway should ensure it prefixes request ids with the owner, to ensure request uniqueness
234- s .lggr .Debugf ("Request ID: [%s] must start with owner address: [%s]" , request .RequestId , owner )
235- return nil , errors .New ("request ID: " + request .RequestId + " must start with owner address: " + owner )
236- }
237- for idx , req := range request .Ids {
238- // Ensure that users cannot access secrets belonging to other owners
239- if req .Owner != owner {
240- s .lggr .Debugf ("Secret ID owner: [%s] does not match authorized owner: [%s]" , req .Owner , owner )
241- return nil , errors .New ("secret ID owner: " + req .Owner + " does not match authorized owner: " + owner + " at index " + strconv .Itoa (idx ))
242- }
243- }
244- s .lggr .Debugf ("Processing authorized and normalized request [%s]" , request .String ())
245186 return s .handleRequest (ctx , request .RequestId , request )
246187}
247188
@@ -263,25 +204,6 @@ func (s *Capability) ListSecretIdentifiers(ctx context.Context, request *vaultco
263204 s .lggr .Debugf ("Request: [%s] failed validation checks: %s" , request .String (), err .Error ())
264205 return nil , err
265206 }
266-
267- authorized , owner , err := s .authorizeListSecrets (ctx , * request ) //nolint:govet // The mutex isn't used
268- if ! authorized || err != nil {
269- s .lggr .Debugf ("Request ID[%s] not authorized for owner: %s" , request .RequestId , owner )
270- return nil , errors .New ("request ID: " + request .RequestId + " not authorized: " + err .Error ())
271- }
272- if ! strings .HasPrefix (request .RequestId , owner ) {
273- // Gateway should ensure it prefixes request ids with the owner, to ensure request uniqueness
274- s .lggr .Debugf ("Request ID: [%s] must start with owner address: [%s]" , request .RequestId , owner )
275- return nil , errors .New ("request ID: " + request .RequestId + " must start with owner address: " + owner )
276- }
277- // Ensures that users cannot access secrets belonging to other owners
278- request .Owner = owner
279- if request .Owner != owner {
280- s .lggr .Debugf ("Secret ID owner: [%s] does not match authorized owner: [%s]" , request .Owner , owner )
281- return nil , errors .New ("secret ID owner: " + request .Owner + " does not match authorized owner: " + owner )
282- }
283-
284- s .lggr .Debugf ("Processing authorized and normalized request [%s]" , request .String ())
285207 return s .handleRequest (ctx , request .RequestId , request )
286208}
287209
@@ -334,76 +256,11 @@ func (s *Capability) handleRequest(ctx context.Context, requestID string, reques
334256 }
335257}
336258
337- func (s * Capability ) getOriginalRequestID (transformedRequestID string ) (string , error ) {
338- // The transformed RequestID provided to Vault Nodes is of format <owner>::<user-provided-id>.
339- // However, the RequestAuthorizer expects just the <user-provided-id> as the JSONRequest's ID fields,
340- // since that's what was used by the caller when generating the request digest.
341- requestIDParts := strings .Split (transformedRequestID , vaulttypes .RequestIDSeparator )
342- if len (requestIDParts ) != 2 {
343- return "" , errors .New ("internal error: request ID must be in format <owner>::<user-provided-id>" )
344- }
345- return requestIDParts [1 ], nil
346- }
347-
348- func (s * Capability ) authorizeCreateSecrets (ctx context.Context , request vaultcommon.CreateSecretsRequest ) (bool , string , error ) { //nolint:govet // The mutex isn't used
349- originalRequestID , err := s .getOriginalRequestID (request .RequestId )
350- if err != nil {
351- return false , "" , err
352- }
353- request .RequestId = originalRequestID
354-
355- return s .isAuthorizedRequest (ctx , & request , originalRequestID , vaulttypes .MethodSecretsCreate )
356- }
357-
358- func (s * Capability ) authorizeUpdateSecrets (ctx context.Context , request vaultcommon.UpdateSecretsRequest ) (bool , string , error ) { //nolint:govet // The mutex isn't used
359- originalRequestID , err := s .getOriginalRequestID (request .RequestId )
360- if err != nil {
361- return false , "" , err
362- }
363- request .RequestId = originalRequestID
364- return s .isAuthorizedRequest (ctx , & request , originalRequestID , vaulttypes .MethodSecretsUpdate )
365- }
366-
367- func (s * Capability ) authorizeDeleteSecrets (ctx context.Context , request vaultcommon.DeleteSecretsRequest ) (bool , string , error ) { //nolint:govet // The mutex isn't used
368- originalRequestID , err := s .getOriginalRequestID (request .RequestId )
369- if err != nil {
370- return false , "" , err
371- }
372- request .RequestId = originalRequestID
373- return s .isAuthorizedRequest (ctx , & request , originalRequestID , vaulttypes .MethodSecretsDelete )
374- }
375-
376- func (s * Capability ) authorizeListSecrets (ctx context.Context , request vaultcommon.ListSecretIdentifiersRequest ) (bool , string , error ) { //nolint:govet // The mutex isn't used
377- originalRequestID , err := s .getOriginalRequestID (request .RequestId )
378- if err != nil {
379- return false , "" , err
380- }
381- request .RequestId = originalRequestID
382- return s .isAuthorizedRequest (ctx , & request , originalRequestID , vaulttypes .MethodSecretsList )
383- }
384-
385- func (s * Capability ) isAuthorizedRequest (ctx context.Context , request any , requestID , method string ) (bool , string , error ) {
386- var params json.RawMessage
387- params , err := json .Marshal (request )
388- if err != nil {
389- return false , "" , fmt .Errorf ("could not marshal CreateSecretsRequest: %w" , err )
390- }
391- s .lggr .Debugw ("Authorizing request" , "method" , method , "requestID" , requestID )
392- jsonRequest := jsonrpc.Request [json.RawMessage ]{
393- Version : jsonrpc .JsonRpcVersion ,
394- ID : requestID ,
395- Method : method ,
396- Params : & params ,
397- }
398- return s .requestAuthorizer .AuthorizeRequest (ctx , jsonRequest )
399- }
400-
401259func NewCapability (
402260 lggr logger.Logger ,
403261 clock clockwork.Clock ,
404262 expiresAfter time.Duration ,
405263 handler * requests.Handler [* vaulttypes.Request , * vaulttypes.Response ],
406- requestAuthorizer RequestAuthorizer ,
407264 capabilitiesRegistry core.CapabilitiesRegistry ,
408265 publicKey * LazyPublicKey ,
409266 limitsFactory limits.Factory ,
@@ -417,7 +274,6 @@ func NewCapability(
417274 clock : clock ,
418275 expiresAfter : expiresAfter ,
419276 handler : handler ,
420- requestAuthorizer : requestAuthorizer ,
421277 capabilitiesRegistry : capabilitiesRegistry ,
422278 publicKey : publicKey ,
423279 RequestValidator : NewRequestValidator (limiter ),
0 commit comments