Skip to content

Commit d29116c

Browse files
committed
sn: Support unsigned responses by API server
Follow nspcc-dev/neofs-api#374. Refs #3396. Signed-off-by: Leonard Lyubich <leonard@morphbits.io>
1 parent 24a99c2 commit d29116c

8 files changed

Lines changed: 218 additions & 182 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Changelog for NeoFS Node
2121
- CLI `set-attribute` and `remove-attribute commands to `container` section (#3733)
2222
- Size-split object is now available even when LINK is unavailable in EC container (#3754)
2323
- `neofs-adm balance container-status` command (#3693)
24+
- SN returns unsigned responses to requests with API >= `v2.22` (#XXX)
2425

2526
### Fixed
2627
- IR panics at graceful shutdown (#3706)

cmd/neofs-node/reputation.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -263,17 +263,17 @@ func (s *reputationServer) makeResponseMetaHeader(st *protostatus.Status) *proto
263263
}
264264
}
265265

266-
func (s *reputationServer) makeLocalResponse(err error) (*protoreputation.AnnounceLocalTrustResponse, error) {
266+
func (s *reputationServer) makeLocalResponse(err error, req *protoreputation.AnnounceLocalTrustRequest) (*protoreputation.AnnounceLocalTrustResponse, error) {
267267
resp := &protoreputation.AnnounceLocalTrustResponse{
268268
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
269269
}
270-
resp.VerifyHeader = util.SignResponse(&s.key.PrivateKey, resp)
270+
resp.VerifyHeader = util.SignResponseIfNeeded(&s.key.PrivateKey, resp, req)
271271
return resp, nil
272272
}
273273

274274
func (s *reputationServer) AnnounceLocalTrust(ctx context.Context, req *protoreputation.AnnounceLocalTrustRequest) (*protoreputation.AnnounceLocalTrustResponse, error) {
275275
if err := icrypto.VerifyRequestSignatures(req); err != nil {
276-
return s.makeLocalResponse(err)
276+
return s.makeLocalResponse(err, req)
277277
}
278278

279279
passedRoute := reverseRoute(req.GetVerifyHeader())
@@ -288,30 +288,30 @@ func (s *reputationServer) AnnounceLocalTrust(ctx context.Context, req *protorep
288288

289289
w, err := s.localRouter.InitWriter(reputationrouter.NewRouteContext(eCtx, passedRoute))
290290
if err != nil {
291-
return s.makeLocalResponse(fmt.Errorf("could not initialize local trust writer: %w", err))
291+
return s.makeLocalResponse(fmt.Errorf("could not initialize local trust writer: %w", err), req)
292292
}
293293

294294
for _, trust := range body.GetTrusts() {
295295
err = s.processLocalTrust(body.GetEpoch(), apiToLocalTrust(trust, passedRoute[0].PublicKey()), passedRoute, w)
296296
if err != nil {
297-
return s.makeLocalResponse(fmt.Errorf("could not write one of local trusts: %w", err))
297+
return s.makeLocalResponse(fmt.Errorf("could not write one of local trusts: %w", err), req)
298298
}
299299
}
300300

301-
return s.makeLocalResponse(util.StatusOKErr)
301+
return s.makeLocalResponse(util.StatusOKErr, req)
302302
}
303303

304-
func (s *reputationServer) makeIntermediateResponse(err error) (*protoreputation.AnnounceIntermediateResultResponse, error) {
304+
func (s *reputationServer) makeIntermediateResponse(err error, req *protoreputation.AnnounceIntermediateResultRequest) (*protoreputation.AnnounceIntermediateResultResponse, error) {
305305
resp := &protoreputation.AnnounceIntermediateResultResponse{
306306
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
307307
}
308-
resp.VerifyHeader = util.SignResponse(&s.key.PrivateKey, resp)
308+
resp.VerifyHeader = util.SignResponseIfNeeded(&s.key.PrivateKey, resp, req)
309309
return resp, nil
310310
}
311311

312312
func (s *reputationServer) AnnounceIntermediateResult(ctx context.Context, req *protoreputation.AnnounceIntermediateResultRequest) (*protoreputation.AnnounceIntermediateResultResponse, error) {
313313
if err := icrypto.VerifyRequestSignatures(req); err != nil {
314-
return s.makeIntermediateResponse(err)
314+
return s.makeIntermediateResponse(err, req)
315315
}
316316

317317
passedRoute := reverseRoute(req.GetVerifyHeader())
@@ -323,7 +323,7 @@ func (s *reputationServer) AnnounceIntermediateResult(ctx context.Context, req *
323323

324324
w, err := s.intermediateRouter.InitWriter(reputationrouter.NewRouteContext(eiCtx, passedRoute))
325325
if err != nil {
326-
return s.makeIntermediateResponse(fmt.Errorf("could not initialize trust writer: %w", err))
326+
return s.makeIntermediateResponse(fmt.Errorf("could not initialize trust writer: %w", err), req)
327327
}
328328

329329
v2Trust := body.GetTrust()
@@ -332,10 +332,10 @@ func (s *reputationServer) AnnounceIntermediateResult(ctx context.Context, req *
332332

333333
err = w.Write(trust)
334334
if err != nil {
335-
return s.makeIntermediateResponse(fmt.Errorf("could not write trust: %w", err))
335+
return s.makeIntermediateResponse(fmt.Errorf("could not write trust: %w", err), req)
336336
}
337337

338-
return s.makeIntermediateResponse(util.StatusOKErr)
338+
return s.makeIntermediateResponse(util.StatusOKErr, req)
339339
}
340340

341341
func (s *reputationServer) processLocalTrust(epoch uint64, t reputation.Trust,

pkg/services/accounting/server.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func New(s *ecdsa.PrivateKey, net netmap.State, c BalanceContract) protoaccounti
4646
}
4747
}
4848

49-
func (s *server) makeBalanceResponse(body *protoaccounting.BalanceResponse_Body, st *protostatus.Status) (*protoaccounting.BalanceResponse, error) {
49+
func (s *server) makeBalanceResponse(body *protoaccounting.BalanceResponse_Body, st *protostatus.Status, req *protoaccounting.BalanceRequest) (*protoaccounting.BalanceResponse, error) {
5050
resp := &protoaccounting.BalanceResponse{
5151
Body: body,
5252
MetaHeader: &protosession.ResponseMetaHeader{
@@ -55,41 +55,41 @@ func (s *server) makeBalanceResponse(body *protoaccounting.BalanceResponse_Body,
5555
Status: st,
5656
},
5757
}
58-
resp.VerifyHeader = util.SignResponse(s.signer, resp)
58+
resp.VerifyHeader = util.SignResponseIfNeeded(s.signer, resp, req)
5959
return resp, nil
6060
}
6161

62-
func (s *server) makeFailedBalanceResponse(err error) (*protoaccounting.BalanceResponse, error) {
63-
return s.makeBalanceResponse(nil, util.ToStatus(err))
62+
func (s *server) makeFailedBalanceResponse(err error, req *protoaccounting.BalanceRequest) (*protoaccounting.BalanceResponse, error) {
63+
return s.makeBalanceResponse(nil, util.ToStatus(err), req)
6464
}
6565

6666
// Balance gets current balance of the requested user using underlying
6767
// [BalanceContract] and returns result in the response.
6868
func (s *server) Balance(_ context.Context, req *protoaccounting.BalanceRequest) (*protoaccounting.BalanceResponse, error) {
6969
if err := icrypto.VerifyRequestSignatures(req); err != nil {
70-
return s.makeFailedBalanceResponse(err)
70+
return s.makeFailedBalanceResponse(err, nil)
7171
}
7272

7373
mUsr := req.GetBody().GetOwnerId()
7474
if mUsr == nil {
75-
return s.makeFailedBalanceResponse(errors.New("missing account"))
75+
return s.makeFailedBalanceResponse(errors.New("missing account"), req)
7676
}
7777
var id user.ID
7878
if err := id.FromProtoMessage(mUsr); err != nil {
79-
return s.makeFailedBalanceResponse(fmt.Errorf("invalid account: %w", err))
79+
return s.makeFailedBalanceResponse(fmt.Errorf("invalid account: %w", err), req)
8080
}
8181

8282
bal, err := s.contract.BalanceOf(id)
8383
if err != nil {
84-
return s.makeFailedBalanceResponse(err)
84+
return s.makeFailedBalanceResponse(err, req)
8585
}
8686
ds, err := s.contract.Decimals()
8787
if err != nil {
88-
return s.makeFailedBalanceResponse(err)
88+
return s.makeFailedBalanceResponse(err, req)
8989
}
9090

9191
body := &protoaccounting.BalanceResponse_Body{
9292
Balance: &protoaccounting.Decimal{Value: bal.Int64(), Precision: ds},
9393
}
94-
return s.makeBalanceResponse(body, util.StatusOK)
94+
return s.makeBalanceResponse(body, util.StatusOK, req)
9595
}

0 commit comments

Comments
 (0)