57c5fccc8c
Not all the NeoFS requests must contain OID in their bodies (or must NOT contain them at all). Do not pass object address in helper functions, pass CID and OID separately instead. Also, fixed NPE in the ACL service: updated SDK library brought errors when working with `Put` and `Search` requests without OID fields. Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
92 lines
1.8 KiB
Go
92 lines
1.8 KiB
Go
package v2
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
|
cidSDK "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
|
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
|
|
"github.com/nspcc-dev/neofs-sdk-go/object"
|
|
oidSDK "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
|
)
|
|
|
|
type sysObjHdr struct {
|
|
k, v string
|
|
}
|
|
|
|
func (s sysObjHdr) Key() string {
|
|
return s.k
|
|
}
|
|
|
|
func (s sysObjHdr) Value() string {
|
|
return s.v
|
|
}
|
|
|
|
func u64Value(v uint64) string {
|
|
return strconv.FormatUint(v, 10)
|
|
}
|
|
|
|
func headersFromObject(obj *object.Object, cid cidSDK.ID, oid *oidSDK.ID) []eaclSDK.Header {
|
|
var count int
|
|
for obj := obj; obj != nil; obj = obj.Parent() {
|
|
count += 9 + len(obj.Attributes())
|
|
}
|
|
|
|
res := make([]eaclSDK.Header, 0, count)
|
|
for ; obj != nil; obj = obj.Parent() {
|
|
res = append(res,
|
|
cidHeader(cid),
|
|
// creation epoch
|
|
sysObjHdr{
|
|
k: acl.FilterObjectCreationEpoch,
|
|
v: u64Value(obj.CreationEpoch()),
|
|
},
|
|
// payload size
|
|
sysObjHdr{
|
|
k: acl.FilterObjectPayloadLength,
|
|
v: u64Value(obj.PayloadSize()),
|
|
},
|
|
// object version
|
|
sysObjHdr{
|
|
k: acl.FilterObjectVersion,
|
|
v: obj.Version().String(),
|
|
},
|
|
// object type
|
|
sysObjHdr{
|
|
k: acl.FilterObjectType,
|
|
v: obj.Type().String(),
|
|
},
|
|
)
|
|
|
|
if oid != nil {
|
|
res = append(res, oidHeader(*oid))
|
|
}
|
|
|
|
if idOwner := obj.OwnerID(); idOwner != nil {
|
|
res = append(res, ownerIDHeader(*idOwner))
|
|
}
|
|
|
|
cs, ok := obj.PayloadChecksum()
|
|
if ok {
|
|
res = append(res, sysObjHdr{
|
|
k: acl.FilterObjectPayloadHash,
|
|
v: cs.String(),
|
|
})
|
|
}
|
|
|
|
cs, ok = obj.PayloadHomomorphicHash()
|
|
if ok {
|
|
res = append(res, sysObjHdr{
|
|
k: acl.FilterObjectHomomorphicHash,
|
|
v: cs.String(),
|
|
})
|
|
}
|
|
|
|
attrs := obj.Attributes()
|
|
for i := range attrs {
|
|
res = append(res, &attrs[i]) // only pointer attrs can implement eaclSDK.Header interface
|
|
}
|
|
}
|
|
|
|
return res
|
|
}
|