[#28] Client: add method to calculate ObjectId
Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
parent
abd9b5d0d0
commit
543247e4d9
6 changed files with 55 additions and 13 deletions
|
@ -11,6 +11,20 @@ namespace FrostFS.SDK.Client;
|
|||
|
||||
internal static class ObjectTools
|
||||
{
|
||||
internal static FrostFsObjectId CalculateObjectId(
|
||||
FrostFsObjectHeader header,
|
||||
FrostFsOwner owner,
|
||||
FrostFsVersion version,
|
||||
ClientKey key)
|
||||
{
|
||||
var grpcHeader = CreateHeader(header, [], owner, version);
|
||||
|
||||
if (header.Split != null)
|
||||
SetSplitValues(grpcHeader, header.Split, owner, version, key);
|
||||
|
||||
return new ObjectID { Value = grpcHeader.Sha256() }.ToModel();
|
||||
}
|
||||
|
||||
internal static Object.Object CreateObject(FrostFsObject @object, ClientContext ctx)
|
||||
{
|
||||
@object.Header.OwnerId ??= ctx.Owner;
|
||||
|
@ -24,7 +38,7 @@ internal static class ObjectTools
|
|||
var split = @object.Header.Split;
|
||||
if (split != null)
|
||||
{
|
||||
SetSplitValues(grpcHeader, split, ctx);
|
||||
SetSplitValues(grpcHeader, split, ctx.Owner, ctx.Version, ctx.Key);
|
||||
}
|
||||
|
||||
var obj = new Object.Object
|
||||
|
@ -43,13 +57,17 @@ internal static class ObjectTools
|
|||
return obj;
|
||||
}
|
||||
|
||||
internal static void SetSplitValues(Header grpcHeader, FrostFsSplit split, ClientContext ctx)
|
||||
internal static void SetSplitValues(
|
||||
Header grpcHeader,
|
||||
FrostFsSplit split,
|
||||
FrostFsOwner owner, FrostFsVersion version,
|
||||
ClientKey key)
|
||||
{
|
||||
if (split == null)
|
||||
return;
|
||||
|
||||
if (ctx.Key == null)
|
||||
throw new FrostFsInvalidObjectException(nameof(ctx.Key));
|
||||
if (key == null)
|
||||
throw new FrostFsInvalidObjectException(nameof(key));
|
||||
|
||||
grpcHeader.Split = new Header.Types.Split
|
||||
{
|
||||
|
@ -61,24 +79,24 @@ internal static class ObjectTools
|
|||
|
||||
if (split.ParentHeader is not null)
|
||||
{
|
||||
var grpcParentHeader = CreateHeader(split.ParentHeader, [], ctx);
|
||||
var grpcParentHeader = CreateHeader(split.ParentHeader, [], owner, version);
|
||||
|
||||
grpcHeader.Split.Parent = new ObjectID { Value = grpcParentHeader.Sha256() };
|
||||
grpcHeader.Split.ParentHeader = grpcParentHeader;
|
||||
grpcHeader.Split.ParentSignature = new Signature
|
||||
{
|
||||
Key = ctx.Key.PublicKeyProto,
|
||||
Sign = ctx.Key.ECDsaKey.SignData(grpcHeader.Split.Parent.ToByteArray()),
|
||||
Key = key.PublicKeyProto,
|
||||
Sign = key.ECDsaKey.SignData(grpcHeader.Split.Parent.ToByteArray()),
|
||||
};
|
||||
}
|
||||
|
||||
grpcHeader.Split.Previous = split.Previous?.ToMessage();
|
||||
}
|
||||
|
||||
internal static Header CreateHeader(FrostFsObjectHeader header, byte[]? payload, ClientContext ctx)
|
||||
internal static Header CreateHeader(FrostFsObjectHeader header, byte[]? payload, FrostFsOwner owner, FrostFsVersion version)
|
||||
{
|
||||
header.OwnerId ??= ctx.Owner;
|
||||
header.Version ??= ctx.Version;
|
||||
header.OwnerId ??= owner;
|
||||
header.Version ??= version;
|
||||
|
||||
var grpcHeader = header.GetHeader();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue