From 4abd71f99b1830b4f58f45e10daddf9f3538a1ad Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 14:38:34 +0300 Subject: [PATCH 1/7] object: Define RequestType for object service requests --- object/types.go | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/object/types.go b/object/types.go index de909a8..cde1f25 100644 --- a/object/types.go +++ b/object/types.go @@ -28,7 +28,10 @@ type ( PRead(ctx context.Context, addr refs.Address, rng Range) ([]byte, error) } - headerType int + // RequestType of the object service requests. + RequestType int + + headerType int ) const ( @@ -71,12 +74,52 @@ const ( PublicKeyHdr ) +const ( + _ RequestType = iota + // RequestPut is a type for object put request. + RequestPut + // RequestGet is a type for object get request. + RequestGet + // RequestHead is a type for object head request. + RequestHead + // RequestSearch is a type for object search request. + RequestSearch + // RequestRange is a type for object range request. + RequestRange + // RequestRangeHash is a type for object hash range request. + RequestRangeHash + // RequestDelete is a type for object delete request. + RequestDelete +) + var ( _ internal.Custom = (*Object)(nil) emptyObject = new(Object).Bytes() ) +// String returns printable name of the request type. +func (s RequestType) String() string { + switch s { + case RequestPut: + return "PUT" + case RequestGet: + return "GET" + case RequestHead: + return "HEAD" + case RequestSearch: + return "SEARCH" + case RequestRange: + return "RANGE" + case RequestRangeHash: + return "RANGE_HASH" + case RequestDelete: + return "DELETE" + default: + return "UNKNOWN" + } +} + // Bytes returns marshaled object in a binary format. func (m Object) Bytes() []byte { data, _ := m.Marshal(); return data } From 1e513625f1564c1c0d21878057cabcd46b154207 Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 14:52:08 +0300 Subject: [PATCH 2/7] object: Add `Type()` in `Request` interface BasicACL have set of rules for every request type. ACL will be processed before any request specific handlers. Therefore we need to determine request type in generic request interface, which is used in pre-processors of object service implementation. --- object/service.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/object/service.go b/object/service.go index 589bd95..3a2ca08 100644 --- a/object/service.go +++ b/object/service.go @@ -28,12 +28,13 @@ type ( Token = session.Token // Request defines object rpc requests. - // All object operations must have TTL, Epoch, Container ID and + // All object operations must have TTL, Epoch, Type, Container ID and // permission of usage previous network map. Request interface { service.MetaHeader CID() CID + Type() RequestType AllowPreviousNetMap() bool } ) @@ -169,3 +170,24 @@ func (m *GetRangeRequest) AllowPreviousNetMap() bool { return false } // AllowPreviousNetMap returns permission to use previous network map in object get range hash request. func (m *GetRangeHashRequest) AllowPreviousNetMap() bool { return false } + +// Type returns type of the object put request. +func (m *PutRequest) Type() RequestType { return RequestPut } + +// Type returns type of the object get request. +func (m *GetRequest) Type() RequestType { return RequestGet } + +// Type returns type of the object head request. +func (m *HeadRequest) Type() RequestType { return RequestHead } + +// Type returns type of the object search request. +func (m *SearchRequest) Type() RequestType { return RequestSearch } + +// Type returns type of the object delete request. +func (m *DeleteRequest) Type() RequestType { return RequestDelete } + +// Type returns type of the object get range request. +func (m *GetRangeRequest) Type() RequestType { return RequestRange } + +// Type returns type of the object get range hash request. +func (m *GetRangeHashRequest) Type() RequestType { return RequestRangeHash } From 55b75a0dae7dfa1ab610b1f9af70d5ec0db8d324 Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 15:05:48 +0300 Subject: [PATCH 3/7] object: Add test for object request type --- object/service_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/object/service_test.go b/object/service_test.go index f06e557..46213e2 100644 --- a/object/service_test.go +++ b/object/service_test.go @@ -18,11 +18,22 @@ func TestRequest(t *testing.T) { &GetRangeHashRequest{}, } + types := []RequestType{ + RequestPut, + RequestGet, + RequestHead, + RequestSearch, + RequestDelete, + RequestRange, + RequestRangeHash, + } + for i := range cases { v := cases[i] t.Run(fmt.Sprintf("%T", v), func(t *testing.T) { require.NotPanics(t, func() { v.CID() }) + require.Equal(t, types[i], v.Type()) }) } } From 48c55886509ced36c53916ebf29eb32c47b07ea6 Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 15:15:59 +0300 Subject: [PATCH 4/7] proto: Update proto library to v0.6.0 --- Makefile | 2 +- acl/types.pb.go | Bin 0 -> 3241 bytes acl/types.proto | 27 +++++++++++++++++++++++++++ container/service.pb.go | Bin 61145 -> 60767 bytes container/service.proto | 4 ++-- container/types.pb.go | Bin 23558 -> 13077 bytes container/types.proto | 17 +++-------------- 7 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 acl/types.pb.go create mode 100644 acl/types.proto diff --git a/Makefile b/Makefile index 84583ff..9b02a6e 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PROTO_VERSION=v0.5.0 +PROTO_VERSION=v0.6.0 PROTO_URL=https://github.com/nspcc-dev/neofs-api/archive/$(PROTO_VERSION).tar.gz B=\033[0;1m diff --git a/acl/types.pb.go b/acl/types.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..bcbd1998e272c6b48d814cc10e11139b235079c4 GIT binary patch literal 3241 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 Date: Thu, 2 Apr 2020 15:16:52 +0300 Subject: [PATCH 5/7] docs: Update docs for neofs-api v0.6.0 --- docs/acl.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++ docs/container.md | 29 ++-------------------- 2 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 docs/acl.md diff --git a/docs/acl.md b/docs/acl.md new file mode 100644 index 0000000..38f328b --- /dev/null +++ b/docs/acl.md @@ -0,0 +1,62 @@ +# Protocol Documentation + + +## Table of Contents + +- [acl/types.proto](#acl/types.proto) + + + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## acl/types.proto + + + + + + + + + +### Target +Target of the access control rule in access control list. + +| Name | Number | Description | +| ---- | ------ | ----------- | +| Unknown | 0 | Unknown target, default value. | +| User | 1 | User target rule is applied if sender is the owner of the container. | +| System | 2 | System target rule is applied if sender is the storage node within the container or inner ring node. | +| Others | 3 | Others target rule is applied if sender is not user or system target. | +| PubKey | 4 | PubKey target rule is applied if sender has public key provided in extended ACL. | + + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +| double | | double | double | float | +| float | | float | float | float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | +| sfixed32 | Always four bytes. | int32 | int | int | +| sfixed64 | Always eight bytes. | int64 | long | int/long | +| bool | | bool | boolean | boolean | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/docs/container.md b/docs/container.md index 6693980..f0188ca 100644 --- a/docs/container.md +++ b/docs/container.md @@ -21,8 +21,6 @@ - [container/types.proto](#container/types.proto) - Messages - - [AccessControlList](#container.AccessControlList) - - [AccessGroup](#container.AccessGroup) - [Container](#container.Container) @@ -166,7 +164,7 @@ via consensus in inner ring nodes | Capacity | [uint64](#uint64) | | Capacity defines amount of data that can be stored in the container (doesn't used for now). | | OwnerID | [bytes](#bytes) | | OwnerID is a wallet address | | rules | [netmap.PlacementRule](#netmap.PlacementRule) | | Rules define storage policy for the object inside the container. | -| Group | [AccessGroup](#container.AccessGroup) | | Container ACL. | +| BasicACL | [uint32](#uint32) | | BasicACL of the container. | | Meta | [service.RequestMetaHeader](#service.RequestMetaHeader) | | RequestMetaHeader contains information about request meta headers (should be embedded into message) | | Verify | [service.RequestVerificationHeader](#service.RequestVerificationHeader) | | RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) | @@ -196,29 +194,6 @@ via consensus in inner ring nodes - - -### Message AccessControlList - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| List | [AccessGroup](#container.AccessGroup) | repeated | List of access groups. | - - - - -### Message AccessGroup - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| AccessMode | [uint32](#uint32) | | Group access mode. | -| UserGroup | [bytes](#bytes) | repeated | Group members. | - - ### Message Container @@ -231,7 +206,7 @@ The Container service definition. | Salt | [bytes](#bytes) | | Salt is a nonce for unique container id calculation. | | Capacity | [uint64](#uint64) | | Capacity defines amount of data that can be stored in the container (doesn't used for now). | | Rules | [netmap.PlacementRule](#netmap.PlacementRule) | | Rules define storage policy for the object inside the container. | -| List | [AccessControlList](#container.AccessControlList) | | Container ACL. | +| BasicACL | [uint32](#uint32) | | BasicACL with access control rules for owner, system, others and permission bits for bearer token and extended ACL. | From 2fb36f85887cd8e2b9036c150813c43a913fc18f Mon Sep 17 00:00:00 2001 From: alexvanin Date: Thu, 2 Apr 2020 15:44:18 +0300 Subject: [PATCH 6/7] container: Support new `BasicACL` field --- container/service.go | 4 ++++ container/types.go | 20 ++++---------------- container/types_test.go | 22 +--------------------- 3 files changed, 9 insertions(+), 37 deletions(-) diff --git a/container/service.go b/container/service.go index 8eb9ba6..2f36dc1 100644 --- a/container/service.go +++ b/container/service.go @@ -31,9 +31,11 @@ func (m *PutRequest) PrepareData() ([]byte, error) { err error buf = new(bytes.Buffer) capBytes = make([]byte, 8) + aclBytes = make([]byte, 4) ) binary.BigEndian.PutUint64(capBytes, m.Capacity) + binary.BigEndian.PutUint32(capBytes, m.BasicACL) if _, err = buf.Write(m.MessageID.Bytes()); err != nil { return nil, errors.Wrap(err, "could not write message id") @@ -45,6 +47,8 @@ func (m *PutRequest) PrepareData() ([]byte, error) { return nil, errors.Wrap(err, "could not marshal placement") } else if _, err = buf.Write(data); err != nil { return nil, errors.Wrap(err, "could not write placement") + } else if _, err = buf.Write(aclBytes); err != nil { + return nil, errors.Wrap(err, "could not write basic acl") } return buf.Bytes(), nil diff --git a/container/types.go b/container/types.go index 21fc0d1..e358e6d 100644 --- a/container/types.go +++ b/container/types.go @@ -11,19 +11,6 @@ import ( "github.com/pkg/errors" ) -// AccessMode is a container access mode type. -type AccessMode uint32 - -const ( - // AccessModeRead is a read access mode. - AccessModeRead AccessMode = 1 << iota - // AccessModeWrite is a write access mode. - AccessModeWrite -) - -// AccessModeReadWrite is a read/write container access mode. -const AccessModeReadWrite = AccessModeRead | AccessModeWrite - var ( _ internal.Custom = (*Container)(nil) @@ -31,8 +18,8 @@ var ( emptyOwner = (OwnerID{}).Bytes() ) -// New creates new user container based on capacity, OwnerID and PlacementRules. -func New(cap uint64, owner OwnerID, rules netmap.PlacementRule) (*Container, error) { +// New creates new user container based on capacity, OwnerID, ACL and PlacementRules. +func New(cap uint64, owner OwnerID, acl uint32, rules netmap.PlacementRule) (*Container, error) { if bytes.Equal(owner[:], emptyOwner) { return nil, refs.ErrEmptyOwner } else if cap == 0 { @@ -49,6 +36,7 @@ func New(cap uint64, owner OwnerID, rules netmap.PlacementRule) (*Container, err Salt: UUID(salt), Capacity: cap, Rules: rules, + BasicACL: acl, }, nil } @@ -90,7 +78,7 @@ func NewTestContainer() (*Container, error) { if err != nil { return nil, err } - return New(100, owner, netmap.PlacementRule{ + return New(100, owner, 0xFFFFFFFF, netmap.PlacementRule{ ReplFactor: 2, SFGroups: []netmap.SFGroup{ { diff --git a/container/types_test.go b/container/types_test.go index 1ccc00b..fddccb3 100644 --- a/container/types_test.go +++ b/container/types_test.go @@ -36,7 +36,7 @@ func TestCID(t *testing.T) { owner, err := refs.NewOwnerID(&key.PublicKey) require.NoError(t, err) - c1, err := New(10, owner, rules) + c1, err := New(10, owner, 0xDEADBEEF, rules) require.NoError(t, err) data, err := proto.Marshal(c1) @@ -55,23 +55,3 @@ func TestCID(t *testing.T) { require.Equal(t, cid1, cid2) }) } - -func TestAccessMode(t *testing.T) { - t.Run("read access to read/write mode", func(t *testing.T) { - require.Equal(t, AccessModeRead, AccessModeReadWrite&AccessModeRead) - }) - - t.Run("write access to read/write mode", func(t *testing.T) { - require.Equal(t, AccessModeWrite, AccessModeReadWrite&AccessModeWrite) - }) - - t.Run("read(write) access to write(read) mode", func(t *testing.T) { - require.Zero(t, AccessModeRead&AccessModeWrite) - }) - - t.Run("access to same mode", func(t *testing.T) { - require.Equal(t, AccessModeWrite, AccessModeWrite&AccessModeWrite) - require.Equal(t, AccessModeRead, AccessModeRead&AccessModeRead) - require.Equal(t, AccessModeReadWrite, AccessModeReadWrite&AccessModeReadWrite) - }) -} From 72c61002aa6effd0c1c3cb1a6b7b4fe00629f3e7 Mon Sep 17 00:00:00 2001 From: alexvanin Date: Fri, 3 Apr 2020 10:30:48 +0300 Subject: [PATCH 7/7] Update changelog for v0.6.0 --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02254ab..1e9d098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog -This is the changelog for NeoFS API +This is the changelog for NeoFS-API-Go + +## [0.6.0] - 2020-04-03 + +### Added + +- `RequestType` for object service requests +- `Type()` function in `Request` interface + +### Changed + +- Synced proto files with `neofs-api v0.6.0` ## [0.5.0] - 2020-03-31 @@ -217,3 +228,4 @@ Initial public release [0.4.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.4.0...v0.4.1 [0.4.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.4.1...v0.4.2 [0.5.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.4.2...v0.5.0 +[0.6.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.5.0...v0.6.0