[#28] Client: add method to calculate ObjectId

Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
Pavel Gross 2024-12-09 23:54:50 +03:00 committed by PavelGrossSpb
parent abd9b5d0d0
commit 543247e4d9
6 changed files with 55 additions and 13 deletions

View file

@ -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();