diff --git a/netmap/grpc/types.pb.go b/netmap/grpc/types.pb.go index 265bc24..c34f6bb 100644 Binary files a/netmap/grpc/types.pb.go and b/netmap/grpc/types.pb.go differ diff --git a/object/grpc/service_grpc.pb.go b/object/grpc/service_grpc.pb.go index 93e5f22..6371473 100644 Binary files a/object/grpc/service_grpc.pb.go and b/object/grpc/service_grpc.pb.go differ diff --git a/session/convert.go b/session/convert.go index d7662b4..b9a93e6 100644 --- a/session/convert.go +++ b/session/convert.go @@ -674,7 +674,7 @@ func (c *ObjectSessionContext) ToGRPCMessage() grpc.Message { m = new(session.ObjectSessionContext) m.SetVerb(ObjectSessionVerbToGRPCField(c.verb)) - m.SetAddress(c.addr.ToGRPCMessage().(*refsGRPC.Address)) + m.SetTarget(c.cnr.ToGRPCMessage().(*refsGRPC.ContainerID), refs.ObjectIDListToGRPCMessage(c.objs)) } return m @@ -688,20 +688,25 @@ func (c *ObjectSessionContext) FromGRPCMessage(m grpc.Message) error { var err error - addr := v.GetAddress() - if addr == nil { - c.addr = nil + cnr := v.GetTarget().GetContainer() + if cnr == nil { + c.cnr = nil } else { - if c.addr == nil { - c.addr = new(refs.Address) + if c.cnr == nil { + c.cnr = new(refs.ContainerID) } - err = c.addr.FromGRPCMessage(addr) + err = c.cnr.FromGRPCMessage(cnr) if err != nil { return err } } + c.objs, err = refs.ObjectIDListFromGRPCMessage(v.GetTarget().GetObjects()) + if err != nil { + return err + } + c.verb = ObjectSessionVerbFromGRPCField(v.GetVerb()) return nil diff --git a/session/grpc/types.go b/session/grpc/types.go index 64133a8..7cdb7d5 100644 --- a/session/grpc/types.go +++ b/session/grpc/types.go @@ -65,9 +65,12 @@ func (m *SessionToken_Body) SetContainerSessionContext(v *ContainerSessionContex } } -// SetAddress sets address of the object related to the session. -func (m *ObjectSessionContext) SetAddress(v *refs.Address) { - m.Address = v +// SetTarget specifies objects involved in the object session. +func (m *ObjectSessionContext) SetTarget(cnr *refs.ContainerID, objs []*refs.ObjectID) { + m.Target = &ObjectSessionContext_Target{ + Container: cnr, + Objects: objs, + } } // SetVerb sets type of request for which the token is issued. diff --git a/session/grpc/types.pb.go b/session/grpc/types.pb.go index 81b3f04..c964738 100644 Binary files a/session/grpc/types.pb.go and b/session/grpc/types.pb.go differ diff --git a/session/marshal.go b/session/marshal.go index d7db4d2..2c82179 100644 --- a/session/marshal.go +++ b/session/marshal.go @@ -21,8 +21,8 @@ const ( lifetimeNotValidBeforeField = 2 lifetimeIssuedAtField = 3 - objectCtxVerbField = 1 - objectCtxAddressField = 2 + objectCtxVerbField = 1 + objectCtxTargetField = 2 sessionTokenBodyIDField = 1 sessionTokenBodyOwnerField = 2 @@ -210,10 +210,11 @@ func (c *ObjectSessionContext) StableMarshal(buf []byte) []byte { buf = make([]byte, c.StableSize()) } - var offset int - - offset += proto.EnumMarshal(objectCtxVerbField, buf[offset:], int32(c.verb)) - proto.NestedStructureMarshal(objectCtxAddressField, buf[offset:], c.addr) + offset := proto.EnumMarshal(objectCtxVerbField, buf, int32(c.verb)) + proto.NestedStructureMarshal(objectCtxTargetField, buf[offset:], &objectSessionContextTarget{ + cnr: c.cnr, + objs: c.objs, + }) return buf } @@ -224,7 +225,10 @@ func (c *ObjectSessionContext) StableSize() (size int) { } size += proto.EnumSize(objectCtxVerbField, int32(c.verb)) - size += proto.NestedStructureSize(objectCtxAddressField, c.addr) + size += proto.NestedStructureSize(objectCtxTargetField, &objectSessionContextTarget{ + cnr: c.cnr, + objs: c.objs, + }) return size } diff --git a/session/test/generate.go b/session/test/generate.go index 25976bc..8bb2c82 100644 --- a/session/test/generate.go +++ b/session/test/generate.go @@ -195,7 +195,7 @@ func GenerateObjectSessionContext(empty bool) *session.ObjectSessionContext { if !empty { m.SetVerb(session.ObjectVerbHead) - m.SetAddress(refstest.GenerateAddress(false)) + m.SetTarget(refstest.GenerateContainerID(false), refstest.GenerateObjectIDs(false)...) } return m diff --git a/session/types.go b/session/types.go index dfa8c5e..cb14825 100644 --- a/session/types.go +++ b/session/types.go @@ -4,6 +4,7 @@ import ( "github.com/nspcc-dev/neofs-api-go/v2/acl" "github.com/nspcc-dev/neofs-api-go/v2/refs" "github.com/nspcc-dev/neofs-api-go/v2/status" + "github.com/nspcc-dev/neofs-api-go/v2/util/proto" ) type CreateRequestBody struct { @@ -40,10 +41,48 @@ type TokenLifetime struct { type ObjectSessionVerb uint32 +type objectSessionContextTarget struct { + cnr *refs.ContainerID + + objs []refs.ObjectID +} + +const ( + _ = iota + fNumObjectTargetContainer + fNumObjectTargetObjects +) + +func (x objectSessionContextTarget) StableMarshal(buf []byte) []byte { + if buf == nil { + buf = make([]byte, x.StableSize()) + } + + offset := proto.NestedStructureMarshal(fNumObjectTargetContainer, buf, x.cnr) + + for i := range x.objs { + offset += proto.NestedStructureMarshal(fNumObjectTargetObjects, buf[offset:], &x.objs[i]) + } + + return buf +} + +func (x objectSessionContextTarget) StableSize() (size int) { + size += proto.NestedStructureSize(fNumObjectTargetContainer, x.cnr) + + for i := range x.objs { + size += proto.NestedStructureSize(fNumObjectTargetObjects, &x.objs[i]) + } + + return size +} + type ObjectSessionContext struct { verb ObjectSessionVerb - addr *refs.Address + cnr *refs.ContainerID + + objs []refs.ObjectID } type TokenContext interface { @@ -617,16 +656,25 @@ func (c *ObjectSessionContext) SetVerb(v ObjectSessionVerb) { c.verb = v } -func (c *ObjectSessionContext) GetAddress() *refs.Address { +func (c *ObjectSessionContext) GetContainer() *refs.ContainerID { if c != nil { - return c.addr + return c.cnr } return nil } -func (c *ObjectSessionContext) SetAddress(v *refs.Address) { - c.addr = v +func (c *ObjectSessionContext) GetObjects() []refs.ObjectID { + if c != nil { + return c.objs + } + + return nil +} + +func (c *ObjectSessionContext) SetTarget(cnr *refs.ContainerID, objs ...refs.ObjectID) { + c.cnr = cnr + c.objs = objs } func (t *TokenBody) GetID() []byte {