From 3038c6cc5cf7aecdcf11150ca3500eb3af40a2c8 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Tue, 22 Sep 2020 17:10:01 +0300 Subject: [PATCH] [#37] Implement eACL related morph wrapper functions Signed-off-by: Alex Vanin --- pkg/morph/client/container/wrapper/eacl.go | 63 +++++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/pkg/morph/client/container/wrapper/eacl.go b/pkg/morph/client/container/wrapper/eacl.go index e0dbb8cc4..071138d59 100644 --- a/pkg/morph/client/container/wrapper/eacl.go +++ b/pkg/morph/client/container/wrapper/eacl.go @@ -1,19 +1,68 @@ package wrapper -// Table represents extended ACL rule table. -// FIXME: correct the definition. -type Table struct{} +import ( + "github.com/nspcc-dev/neofs-api-go/pkg/acl/eacl" + "github.com/nspcc-dev/neofs-api-go/pkg/container" + v2ACL "github.com/nspcc-dev/neofs-api-go/v2/acl" + msgACL "github.com/nspcc-dev/neofs-api-go/v2/acl/grpc" + client "github.com/nspcc-dev/neofs-node/pkg/morph/client/container" + "github.com/pkg/errors" +) // GetEACL reads the extended ACL table from NeoFS system // through Container contract call. -func (w *Wrapper) GetEACL(cid CID) (Table, error) { - panic("implement me") +func (w *Wrapper) GetEACL(cid *container.ID) (*eacl.Table, []byte, error) { + if cid == nil { + return nil, nil, errNilArgument + } + + args := client.EACLArgs{} + + if v2 := cid.ToV2(); v2 == nil { + return nil, nil, errUnsupported // use other major version if there any + } else { + args.SetCID(v2.GetValue()) + } + + rpcAnswer, err := w.client.EACL(args) + if err != nil { + return nil, nil, err + } + + grpcMsg := new(msgACL.EACLTable) + err = grpcMsg.Unmarshal(rpcAnswer.EACL()) + if err != nil { + // use other major version if there any + return nil, nil, err + } + + v2table := v2ACL.TableFromGRPCMessage(grpcMsg) + + return eacl.NewTableFromV2(v2table), rpcAnswer.Signature(), nil } // PutEACL saves the extended ACL table in NeoFS system // through Container contract call. // // Returns any error encountered that caused the saving to interrupt. -func (w *Wrapper) PutEACL(cid CID, table Table, sig []byte) error { - panic("implement me") +func (w *Wrapper) PutEACL(table *eacl.Table, signature []byte) error { + if table == nil || len(signature) == 0 { + return errNilArgument + } + + args := client.SetEACLArgs{} + args.SetSignature(signature) + + if v2 := table.ToV2(); v2 == nil { + return errUnsupported // use other major version if there any + } else { + data, err := v2.StableMarshal(nil) + if err != nil { + return errors.Wrap(err, "can't marshal eacl table") + } + + args.SetEACL(data) + } + + return w.client.SetEACL(args) }