103 lines
No EOL
3.3 KiB
C#
103 lines
No EOL
3.3 KiB
C#
using System.Linq;
|
|
|
|
using Google.Protobuf;
|
|
|
|
using FrostFS.Object;
|
|
using FrostFS.Refs;
|
|
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
|
using FrostFS.SDK.Cryptography;
|
|
using FrostFS.SDK.ModelsV2;
|
|
|
|
namespace FrostFS.SDK.ClientV2;
|
|
|
|
internal class ObjectTools(ClientEnvironment ctx) : ContextAccessor (ctx)
|
|
{
|
|
internal ObjectId CalculateObjectId(ObjectHeader header)
|
|
{
|
|
var grpcHeader = CreateHeader(header, []);
|
|
|
|
return new ObjectID { Value = grpcHeader.Sha256() }.ToModel();
|
|
}
|
|
|
|
internal Object.Object CreateObject(FrostFsObject @object)
|
|
{
|
|
var grpcHeader = @object.Header.ToGrpcMessage();
|
|
|
|
grpcHeader.OwnerId = Context.Owner.ToGrpcMessage();
|
|
grpcHeader.Version = Context.Version.ToGrpcMessage();
|
|
|
|
if (@object.Payload != null)
|
|
{
|
|
grpcHeader.PayloadLength = (ulong)@object.Payload.Length;
|
|
grpcHeader.PayloadHash = Sha256Checksum(@object.Payload);
|
|
}
|
|
|
|
var split = @object.Header.Split;
|
|
if (split != null)
|
|
{
|
|
grpcHeader.Split = new Header.Types.Split
|
|
{
|
|
SplitId = split.SplitId != null ? ByteString.CopyFrom(split.SplitId.ToBinary()) : null
|
|
};
|
|
|
|
if (split.Children != null && split.Children.Count != 0)
|
|
grpcHeader.Split.Children.AddRange(split.Children.Select(id => id.ToGrpcMessage()));
|
|
|
|
if (split.ParentHeader is not null)
|
|
{
|
|
var grpcParentHeader = CreateHeader(split.ParentHeader, []);
|
|
|
|
grpcHeader.Split.Parent = new ObjectID { Value = grpcParentHeader.Sha256() };
|
|
grpcHeader.Split.ParentHeader = grpcParentHeader;
|
|
grpcHeader.Split.ParentSignature = new Refs.Signature
|
|
{
|
|
Key = ByteString.CopyFrom(Context.Key.PublicKey()),
|
|
Sign = ByteString.CopyFrom(Context.Key.SignData(grpcHeader.Split.Parent.ToByteArray())),
|
|
};
|
|
|
|
split.Parent = grpcHeader.Split.Parent.ToModel();
|
|
}
|
|
|
|
grpcHeader.Split.Previous = split.Previous?.ToGrpcMessage();
|
|
}
|
|
|
|
var obj = new Object.Object
|
|
{
|
|
Header = grpcHeader,
|
|
ObjectId = new ObjectID { Value = grpcHeader.Sha256() },
|
|
Payload = ByteString.CopyFrom(@object.Payload)
|
|
};
|
|
|
|
obj.Signature = new Refs.Signature
|
|
{
|
|
Key = ByteString.CopyFrom(Context.Key.PublicKey()),
|
|
Sign = ByteString.CopyFrom(Context.Key.SignData(obj.ObjectId.ToByteArray())),
|
|
};
|
|
|
|
return obj;
|
|
}
|
|
|
|
internal Header CreateHeader(ObjectHeader header, byte[]? payload)
|
|
{
|
|
var grpcHeader = header.ToGrpcMessage();
|
|
|
|
grpcHeader.OwnerId = Context.Owner.ToGrpcMessage();
|
|
grpcHeader.Version = Context.Version.ToGrpcMessage();
|
|
|
|
if (header.PayloadCheckSum != null)
|
|
grpcHeader.PayloadHash = Sha256Checksum(header.PayloadCheckSum);
|
|
else if (payload != null)
|
|
grpcHeader.PayloadHash = Sha256Checksum(payload);
|
|
|
|
return grpcHeader;
|
|
}
|
|
|
|
internal static Checksum Sha256Checksum(byte[] data)
|
|
{
|
|
return new Checksum
|
|
{
|
|
Type = ChecksumType.Sha256,
|
|
Sum = ByteString.CopyFrom(data.Sha256())
|
|
};
|
|
}
|
|
} |