Skip to content

Commit 4a20436

Browse files
committed
Merge remote-tracking branch 'origin/develop' into codex/dx-3565-remove-unused-integrationtest-code
2 parents 6d31680 + 4144faa commit 4a20436

16 files changed

Lines changed: 436 additions & 173 deletions

File tree

core/capabilities/vault/gw_handler.go

Lines changed: 2 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ package vault
22

33
import (
44
"context"
5-
"encoding/hex"
65
"encoding/json"
76
"errors"
87
"fmt"
9-
"sort"
108

119
"go.opentelemetry.io/otel/attribute"
1210
"go.opentelemetry.io/otel/metric"
13-
"google.golang.org/protobuf/proto"
1411

1512
"github.com/smartcontractkit/chainlink-common/pkg/beholder"
1613
vaultcommon "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault"
@@ -62,21 +59,19 @@ type GatewayHandler struct {
6259
services.Service
6360
eng *services.Engine
6461

65-
capRegistry core.CapabilitiesRegistry
6662
secretsService vaulttypes.SecretsService
6763
gatewayConnector gatewayConnector
6864
lggr logger.Logger
6965
metrics *metrics
7066
}
7167

72-
func NewGatewayHandler(capabilitiesRegistry core.CapabilitiesRegistry, secretsService vaulttypes.SecretsService, connector gatewayConnector, lggr logger.Logger) (*GatewayHandler, error) {
68+
func NewGatewayHandler(secretsService vaulttypes.SecretsService, connector gatewayConnector, lggr logger.Logger) (*GatewayHandler, error) {
7369
metrics, err := newMetrics()
7470
if err != nil {
7571
return nil, fmt.Errorf("failed to create metrics: %w", err)
7672
}
7773

7874
gh := &GatewayHandler{
79-
capRegistry: capabilitiesRegistry,
8075
secretsService: secretsService,
8176
gatewayConnector: connector,
8277
lggr: lggr.Named(HandlerName),
@@ -109,7 +104,7 @@ func (h *GatewayHandler) ID(ctx context.Context) (string, error) {
109104
}
110105

111106
func (h *GatewayHandler) Methods() []string {
112-
return vaulttypes.GetSupportedMethods(h.lggr)
107+
return vaulttypes.Methods
113108
}
114109

115110
func (h *GatewayHandler) HandleGatewayMessage(ctx context.Context, gatewayID string, req *jsonrpc.Request[json.RawMessage]) (err error) {
@@ -119,8 +114,6 @@ func (h *GatewayHandler) HandleGatewayMessage(ctx context.Context, gatewayID str
119114
switch req.Method {
120115
case vaulttypes.MethodSecretsCreate:
121116
response = h.handleSecretsCreate(ctx, gatewayID, req)
122-
case vaulttypes.MethodSecretsGet:
123-
response = h.handleSecretsGet(ctx, gatewayID, req)
124117
case vaulttypes.MethodSecretsUpdate:
125118
response = h.handleSecretsUpdate(ctx, gatewayID, req)
126119
case vaulttypes.MethodSecretsDelete:
@@ -183,51 +176,6 @@ func (h *GatewayHandler) handleSecretsUpdate(ctx context.Context, gatewayID stri
183176
return jsonResponse
184177
}
185178

186-
func (h *GatewayHandler) handleSecretsGet(ctx context.Context, gatewayID string, req *jsonrpc.Request[json.RawMessage]) *jsonrpc.Response[json.RawMessage] {
187-
var request vaultcommon.GetSecretsRequest
188-
if err := json.Unmarshal(*req.Params, &request); err != nil {
189-
return h.errorResponse(ctx, gatewayID, req, api.UserMessageParseError, err)
190-
}
191-
encryptionKeys, err := h.getEncryptionKeys(ctx)
192-
if err != nil {
193-
return h.errorResponse(ctx, gatewayID, req, api.FatalError, err)
194-
}
195-
getSecretsRequest := vaultcommon.GetSecretsRequest{}
196-
for _, reqItem := range request.Requests {
197-
getSecretsRequest.Requests = append(getSecretsRequest.Requests, &vaultcommon.SecretRequest{
198-
Id: &vaultcommon.SecretIdentifier{
199-
Owner: reqItem.Id.Owner,
200-
Namespace: reqItem.Id.Namespace,
201-
Key: reqItem.Id.Key,
202-
},
203-
EncryptionKeys: encryptionKeys,
204-
})
205-
}
206-
vaultCapResponse, err := h.secretsService.GetSecrets(ctx, req.ID, &getSecretsRequest)
207-
if err != nil {
208-
return h.errorResponse(ctx, gatewayID, req, api.FatalError, err)
209-
}
210-
211-
vaultResponseProto := &vaultcommon.GetSecretsResponse{}
212-
err = proto.Unmarshal(vaultCapResponse.Payload, vaultResponseProto)
213-
if err != nil {
214-
h.lggr.Errorf("Debugging: handleSecretsCreate failed to unmarshal response: %s. Payload was: %s", err.Error(), string(vaultCapResponse.Payload))
215-
return h.errorResponse(ctx, gatewayID, req, api.NodeReponseEncodingError, err)
216-
}
217-
218-
vaultAPIResponseBytes, err := json.Marshal(vaultResponseProto)
219-
if err != nil {
220-
return h.errorResponse(ctx, gatewayID, req, api.NodeReponseEncodingError, err)
221-
}
222-
vaultAPIResponseJSON := json.RawMessage(vaultAPIResponseBytes)
223-
return &jsonrpc.Response[json.RawMessage]{
224-
Version: jsonrpc.JsonRpcVersion,
225-
ID: req.ID,
226-
Method: req.Method,
227-
Result: &vaultAPIResponseJSON,
228-
}
229-
}
230-
231179
func (h *GatewayHandler) handleSecretsDelete(ctx context.Context, gatewayID string, req *jsonrpc.Request[json.RawMessage]) *jsonrpc.Response[json.RawMessage] {
232180
r := &vaultcommon.DeleteSecretsRequest{}
233181
if err := json.Unmarshal(*req.Params, r); err != nil {
@@ -324,26 +272,6 @@ func (h *GatewayHandler) errorResponse(
324272
}
325273
}
326274

327-
// getEncryptionKeys retrieves the encryption keys of all members in the Workflow DON.
328-
func (h *GatewayHandler) getEncryptionKeys(ctx context.Context) ([]string, error) {
329-
myNode, err := h.capRegistry.LocalNode(ctx)
330-
if err != nil {
331-
return nil, errors.New("failed to get local node from registry" + err.Error())
332-
}
333-
334-
encryptionKeys := make([]string, 0, len(myNode.WorkflowDON.Members))
335-
for _, peerID := range myNode.WorkflowDON.Members {
336-
peerNode, err := h.capRegistry.NodeByPeerID(ctx, peerID)
337-
if err != nil {
338-
return nil, errors.New("failed to get node info for peerID: " + peerID.String() + " - " + err.Error())
339-
}
340-
encryptionKeys = append(encryptionKeys, hex.EncodeToString(peerNode.EncryptionPublicKey[:]))
341-
}
342-
// Sort the encryption keys to ensure consistent ordering across all nodes.
343-
sort.Strings(encryptionKeys)
344-
return encryptionKeys, nil
345-
}
346-
347275
func toJSONResponse(vaultCapResponse *vaulttypes.Response, method string) (*jsonrpc.Response[json.RawMessage], error) {
348276
vaultResponseBytes, err := vaultCapResponse.ToJSONRPCResult()
349277
if err != nil {

core/capabilities/vault/gw_handler_test.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111

1212
vaultcommon "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault"
1313
jsonrpc "github.com/smartcontractkit/chainlink-common/pkg/jsonrpc2"
14-
core_mocks "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks"
1514
vaultcap "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault"
1615
"github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes"
1716
vaulttypesmocks "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes/mocks"
@@ -167,11 +166,10 @@ func TestGatewayHandler_HandleGatewayMessage(t *testing.T) {
167166
t.Run(tt.name, func(t *testing.T) {
168167
secretsService := vaulttypesmocks.NewSecretsService(t)
169168
gwConnector := connector_mocks.NewGatewayConnector(t)
170-
capRegistry := core_mocks.NewCapabilitiesRegistry(t)
171169

172170
tt.setupMocks(secretsService, gwConnector)
173171

174-
handler, err := vaultcap.NewGatewayHandler(capRegistry, secretsService, gwConnector, lggr)
172+
handler, err := vaultcap.NewGatewayHandler(secretsService, gwConnector, lggr)
175173
require.NoError(t, err)
176174

177175
err = handler.HandleGatewayMessage(ctx, "gateway-1", tt.request)
@@ -191,19 +189,18 @@ func TestGatewayHandler_Lifecycle(t *testing.T) {
191189

192190
secretsService := vaulttypesmocks.NewSecretsService(t)
193191
gwConnector := connector_mocks.NewGatewayConnector(t)
194-
capRegistry := core_mocks.NewCapabilitiesRegistry(t)
195192

196-
handler, err := vaultcap.NewGatewayHandler(capRegistry, secretsService, gwConnector, lggr)
193+
handler, err := vaultcap.NewGatewayHandler(secretsService, gwConnector, lggr)
197194
require.NoError(t, err)
198195

199196
t.Run("start", func(t *testing.T) {
200-
gwConnector.On("AddHandler", mock.Anything, vaulttypes.GetSupportedMethods(lggr), handler).Return(nil).Once()
197+
gwConnector.On("AddHandler", mock.Anything, vaulttypes.Methods, handler).Return(nil).Once()
201198
err := handler.Start(ctx)
202199
require.NoError(t, err)
203200
})
204201

205202
t.Run("close", func(t *testing.T) {
206-
gwConnector.On("RemoveHandler", mock.Anything, vaulttypes.GetSupportedMethods(lggr)).Return(nil).Once()
203+
gwConnector.On("RemoveHandler", mock.Anything, vaulttypes.Methods).Return(nil).Once()
207204
err := handler.Close()
208205
require.NoError(t, err)
209206
})

core/capabilities/vault/vaulttypes/types.go

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/binary"
66
"encoding/json"
77
"fmt"
8-
"slices"
98
"time"
109

1110
"github.com/ethereum/go-ethereum/common"
@@ -15,8 +14,6 @@ import (
1514

1615
"github.com/smartcontractkit/chainlink-common/keystore/corekeys/ocr2key"
1716
vaultcommon "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault"
18-
"github.com/smartcontractkit/chainlink-common/pkg/logger"
19-
"github.com/smartcontractkit/chainlink/v2/core/build"
2017
)
2118

2219
var DefaultNamespace = "main"
@@ -38,27 +35,12 @@ const (
3835
MaxBatchSize = 10
3936
)
4037

41-
var (
42-
// MethodSecretsGet is intentionally omitted from this list, as it is not exposed
43-
// to external clients, but rather used internally by the Workflow DON.
44-
Methods = []string{
45-
MethodSecretsCreate,
46-
MethodSecretsUpdate,
47-
MethodSecretsDelete,
48-
MethodSecretsList,
49-
MethodPublicKeyGet,
50-
}
51-
)
52-
53-
func GetSupportedMethods(lggr logger.Logger) []string {
54-
methods := slices.Clone(Methods)
55-
if build.IsDev() {
56-
// Allow secrets get in non-prod environments for testing purposes
57-
// This should never be enabled in production
58-
methods = append(methods, MethodSecretsGet)
59-
lggr.Warnw("enabling vault.secrets.get method since it is not a production build", "build-mode", build.Mode())
60-
}
61-
return methods
38+
var Methods = []string{
39+
MethodSecretsCreate,
40+
MethodSecretsUpdate,
41+
MethodSecretsDelete,
42+
MethodSecretsList,
43+
MethodPublicKeyGet,
6244
}
6345

6446
// SignedOCRResponse is the response format for OCR signed reports, as returned by the Vault DON.

core/services/gateway/handlers/vault/aggregator.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,6 @@ func (a *baseAggregator) validateUsingSignatures(don capabilities.DON, nodes []c
139139
return nil, errors.New("response result and error both are is nil: cannot validate signatures")
140140
}
141141

142-
if resp.Method == vaulttypes.MethodSecretsGet {
143-
// SecretsGet responses are not signed.
144-
return resp, errors.New("cannot validate signatures for Get requests")
145-
}
146-
147142
r := &vaulttypes.SignedOCRResponse{}
148143
err := json.Unmarshal(*resp.Result, r)
149144
if err != nil {

core/services/gateway/handlers/vault/aggregator_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func newMessage(t *testing.T) *jsonrpc.Response[json.RawMessage] {
9999
return &jsonrpc.Response[json.RawMessage]{
100100
Version: jsonrpc.JsonRpcVersion,
101101
ID: "1",
102-
Method: vaulttypes.MethodSecretsGet,
102+
Method: vaulttypes.MethodSecretsCreate,
103103
Result: (*json.RawMessage)(&rawResp),
104104
}
105105
}
@@ -119,7 +119,7 @@ func TestAggregator_Valid_FallsBackToQuorum(t *testing.T) {
119119
currResp := jsonrpc.Response[json.RawMessage]{
120120
Version: jsonrpc.JsonRpcVersion,
121121
ID: "1",
122-
Method: vaulttypes.MethodSecretsGet,
122+
Method: vaulttypes.MethodSecretsCreate,
123123
Result: (*json.RawMessage)(nil),
124124
Error: &jsonrpc.WireError{
125125
Code: 123,
@@ -180,7 +180,7 @@ func TestAggregator_InsufficientResponses(t *testing.T) {
180180
currResp := jsonrpc.Response[json.RawMessage]{
181181
Version: jsonrpc.JsonRpcVersion,
182182
ID: "1",
183-
Method: vaulttypes.MethodSecretsGet,
183+
Method: vaulttypes.MethodSecretsCreate,
184184
Result: &rm,
185185
}
186186
responses := map[string]jsonrpc.Response[json.RawMessage]{
@@ -206,21 +206,21 @@ func TestAggregator_QuorumUnobtainable(t *testing.T) {
206206
resp1 := &jsonrpc.Response[json.RawMessage]{
207207
Version: jsonrpc.JsonRpcVersion,
208208
ID: "1",
209-
Method: vaulttypes.MethodSecretsGet,
209+
Method: vaulttypes.MethodSecretsCreate,
210210
Result: &rm1,
211211
}
212212
rm2 := json.RawMessage([]byte(`{"foo": "bar"}`))
213213
resp2 := &jsonrpc.Response[json.RawMessage]{
214214
Version: jsonrpc.JsonRpcVersion,
215215
ID: "1",
216-
Method: vaulttypes.MethodSecretsGet,
216+
Method: vaulttypes.MethodSecretsCreate,
217217
Result: &rm2,
218218
}
219219
rm3 := json.RawMessage([]byte(`{"baz": "qux"}`))
220220
resp3 := &jsonrpc.Response[json.RawMessage]{
221221
Version: jsonrpc.JsonRpcVersion,
222222
ID: "1",
223-
Method: vaulttypes.MethodSecretsGet,
223+
Method: vaulttypes.MethodSecretsCreate,
224224
Result: &rm3,
225225
}
226226
responses := map[string]jsonrpc.Response[json.RawMessage]{

core/services/gateway/handlers/vault/handler.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ func (h *handler) removeExpiredRequests(ctx context.Context) {
326326
}
327327

328328
func (h *handler) Methods() []string {
329-
return vaulttypes.GetSupportedMethods(h.lggr)
329+
return vaulttypes.Methods
330330
}
331331

332332
func (h *handler) HandleLegacyUserMessage(_ context.Context, _ *api.Message, _ gwhandlers.Callback) error {
@@ -361,9 +361,6 @@ func (h *handler) HandleJSONRPCUserMessage(ctx context.Context, req jsonrpc.Requ
361361
h.lggr.Debugw("returning cached public key response")
362362
return h.handlePublicKeyGetSynchronously(ctx, req, publicKeyResponseBytes, callback)
363363

364-
case vaulttypes.MethodSecretsGet:
365-
h.lggr.Errorw("Get requests not allowed", "requestID", req.ID)
366-
return errors.New("get request not allowed")
367364
}
368365

369366
isAuthorized, owner, err := h.requestAuthorizer.AuthorizeRequest(ctx, req)

core/services/ocr2/delegate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ func (d *Delegate) newServicesVaultPlugin(
726726
}
727727
srvs = append(srvs, vaultCapability)
728728

729-
handler, err := vaultcap.NewGatewayHandler(capabilitiesRegistry, vaultCapability, gwconnector, d.lggr)
729+
handler, err := vaultcap.NewGatewayHandler(vaultCapability, gwconnector, d.lggr)
730730
if err != nil {
731731
return nil, fmt.Errorf("failed to instantiate vault plugin: failed to create vault handler: %w", err)
732732
}

go.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ flowchart LR
486486
chainlink/system-tests/tests --> chainlink/system-tests/tests/smoke/cre/evmread
487487
chainlink/system-tests/tests --> chainlink/system-tests/tests/smoke/cre/httpaction
488488
chainlink/system-tests/tests --> chainlink/system-tests/tests/smoke/cre/solana/solwrite
489+
chainlink/system-tests/tests --> chainlink/system-tests/tests/smoke/cre/vaultsecret
489490
click chainlink/system-tests/tests href "https://github.com/smartcontractkit/chainlink"
490491
chainlink/system-tests/tests/regression/cre/consensus --> cre-sdk-go/capabilities/scheduler/cron
491492
click chainlink/system-tests/tests/regression/cre/consensus href "https://github.com/smartcontractkit/chainlink"
@@ -517,6 +518,8 @@ flowchart LR
517518
chainlink/system-tests/tests/smoke/cre/solana/solwrite --> cre-sdk-go/capabilities/blockchain/solana
518519
chainlink/system-tests/tests/smoke/cre/solana/solwrite --> cre-sdk-go/capabilities/scheduler/cron
519520
click chainlink/system-tests/tests/smoke/cre/solana/solwrite href "https://github.com/smartcontractkit/chainlink"
521+
chainlink/system-tests/tests/smoke/cre/vaultsecret --> cre-sdk-go/capabilities/scheduler/cron
522+
click chainlink/system-tests/tests/smoke/cre/vaultsecret href "https://github.com/smartcontractkit/chainlink"
520523
chainlink/v2 --> chainlink-automation
521524
chainlink/v2 --> chainlink-ccv
522525
chainlink/v2 --> chainlink-evm/contracts/cre/gobindings
@@ -590,6 +593,7 @@ flowchart LR
590593
chainlink/system-tests/tests/smoke/cre/evmread
591594
chainlink/system-tests/tests/smoke/cre/httpaction
592595
chainlink/system-tests/tests/smoke/cre/solana/solwrite
596+
chainlink/system-tests/tests/smoke/cre/vaultsecret
593597
chainlink/v2
594598
end
595599
click chainlink-repo href "https://github.com/smartcontractkit/chainlink"

system-tests/lib/cre/features/vault/vault.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/hex"
66
"fmt"
77
"strconv"
8+
"time"
89

910
"dario.cat/mergo"
1011
"github.com/Masterminds/semver/v3"
@@ -13,6 +14,7 @@ import (
1314
"github.com/pelletier/go-toml/v2"
1415
"github.com/pkg/errors"
1516
"github.com/rs/zerolog"
17+
"google.golang.org/protobuf/types/known/durationpb"
1618

1719
chainselectors "github.com/smartcontractkit/chain-selectors"
1820
"github.com/smartcontractkit/smdkg/dkgocr/dkgocrtypes"
@@ -105,7 +107,8 @@ func (o *Vault) PreEnvStartup(
105107
CapabilityType: 1, // ACTION
106108
},
107109
Config: &capabilitiespb.CapabilityConfig{
108-
LocalOnly: don.HasOnlyLocalCapabilities(),
110+
LocalOnly: don.HasOnlyLocalCapabilities(),
111+
MethodConfigs: vaultMethodConfigs(),
109112
},
110113
}}
111114

@@ -385,6 +388,20 @@ func reportingPluginConfigOverride(vaultDKGOCR3Addr *common.Address, creEnv *cre
385388
return cfgb, nil
386389
}
387390

391+
func vaultMethodConfigs() map[string]*capabilitiespb.CapabilityMethodConfig {
392+
return map[string]*capabilitiespb.CapabilityMethodConfig{
393+
vaultprotos.MethodGetSecrets: {
394+
RemoteConfig: &capabilitiespb.CapabilityMethodConfig_RemoteExecutableConfig{
395+
RemoteExecutableConfig: &capabilitiespb.RemoteExecutableConfig{
396+
RequestTimeout: durationpb.New(2 * time.Minute),
397+
ServerMaxParallelRequests: 10,
398+
RequestHasherType: capabilitiespb.RequestHasherType_Simple,
399+
},
400+
},
401+
},
402+
}
403+
}
404+
388405
func EncryptSecret(secret, masterPublicKeyStr string, owner common.Address) (string, error) {
389406
masterPublicKey := tdh2easy.PublicKey{}
390407
masterPublicKeyBytes, err := hex.DecodeString(masterPublicKeyStr)

0 commit comments

Comments
 (0)