package container import ( "context" "crypto/ecdsa" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/util" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/container" ) type signService struct { sigSvc *util.SignService svc Server } func NewSignService(key *ecdsa.PrivateKey, svc Server) Server { return &signService{ sigSvc: util.NewUnarySignService(key), svc: svc, } } func (s *signService) Put(ctx context.Context, req *container.PutRequest) (*container.PutResponse, error) { if err := s.sigSvc.VerifyRequest(req); err != nil { resp := new(container.PutResponse) return resp, s.sigSvc.SignResponse(resp, err) } resp, err := util.EnsureNonNilResponse(s.svc.Put(ctx, req)) return resp, s.sigSvc.SignResponse(resp, err) } func (s *signService) Delete(ctx context.Context, req *container.DeleteRequest) (*container.DeleteResponse, error) { if err := s.sigSvc.VerifyRequest(req); err != nil { resp := new(container.DeleteResponse) return resp, s.sigSvc.SignResponse(resp, err) } resp, err := util.EnsureNonNilResponse(s.svc.Delete(ctx, req)) return resp, s.sigSvc.SignResponse(resp, err) } func (s *signService) Get(ctx context.Context, req *container.GetRequest) (*container.GetResponse, error) { if err := s.sigSvc.VerifyRequest(req); err != nil { resp := new(container.GetResponse) return resp, s.sigSvc.SignResponse(resp, err) } resp, err := util.EnsureNonNilResponse(s.svc.Get(ctx, req)) return resp, s.sigSvc.SignResponse(resp, err) } func (s *signService) List(ctx context.Context, req *container.ListRequest) (*container.ListResponse, error) { if err := s.sigSvc.VerifyRequest(req); err != nil { resp := new(container.ListResponse) return resp, s.sigSvc.SignResponse(resp, err) } resp, err := util.EnsureNonNilResponse(s.svc.List(ctx, req)) return resp, s.sigSvc.SignResponse(resp, err) } func (s *signService) ListStream(req *container.ListStreamRequest, stream ListStream) error { if err := s.sigSvc.VerifyRequest(req); err != nil { resp := new(container.ListStreamResponse) _ = s.sigSvc.SignResponse(resp, err) return stream.Send(resp) } ss := &listStreamSigner{ ListStream: stream, sigSvc: s.sigSvc, } err := s.svc.ListStream(req, ss) if err != nil || !ss.nonEmptyResp { return ss.send(new(container.ListStreamResponse), err) } return nil } type listStreamSigner struct { ListStream sigSvc *util.SignService nonEmptyResp bool // set on first Send call } func (s *listStreamSigner) Send(resp *container.ListStreamResponse) error { s.nonEmptyResp = true return s.send(resp, nil) } func (s *listStreamSigner) send(resp *container.ListStreamResponse, err error) error { if err := s.sigSvc.SignResponse(resp, err); err != nil { return err } return s.ListStream.Send(resp) }