75 lines
2.3 KiB
C#
75 lines
2.3 KiB
C#
using System.Collections.Specialized;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
|
|
using FrostFS.Refs;
|
|
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
|
using FrostFS.SDK.Cryptography;
|
|
using FrostFS.SDK.ProtosV2.Interfaces;
|
|
using FrostFS.Session;
|
|
|
|
namespace FrostFS.SDK.ClientV2;
|
|
|
|
public static class RequestConstructor
|
|
{
|
|
public static void AddMetaHeader(this IRequest request, NameValueCollection? xHeaders, Session.SessionToken? sessionToken = null)
|
|
{
|
|
if (request.MetaHeader is not null)
|
|
return;
|
|
|
|
request.MetaHeader = MetaHeader.Default().ToMessage();
|
|
|
|
if (sessionToken != null)
|
|
request.MetaHeader.SessionToken = sessionToken;
|
|
|
|
if (xHeaders != null && xHeaders.Count > 0)
|
|
request.MetaHeader.XHeaders.AddRange(
|
|
xHeaders.Cast<string>().SelectMany(key => xHeaders.GetValues(key),
|
|
(k, v) => new XHeader { Key = k, Value = v }));
|
|
}
|
|
|
|
public static void CreateObjectTokenContext(this Session.SessionToken sessionToken,
|
|
Address address,
|
|
ObjectSessionContext.Types.Verb verb,
|
|
ECDsa key)
|
|
{
|
|
if (sessionToken.Body.Object?.Target != null)
|
|
return;
|
|
|
|
ObjectSessionContext.Types.Target target = new() { Container = address.ContainerId };
|
|
|
|
if (address.ObjectId != null)
|
|
target.Objects.Add(address.ObjectId);
|
|
|
|
sessionToken.Body.Object = new()
|
|
{
|
|
Target = target,
|
|
Verb = verb
|
|
};
|
|
|
|
sessionToken.Body.SessionKey = Google.Protobuf.ByteString.CopyFrom(key.PublicKey());
|
|
|
|
sessionToken.Signature = key.SignMessagePart(sessionToken.Body);
|
|
}
|
|
|
|
public static void CreateContainerTokenContext(this Session.SessionToken sessionToken,
|
|
ContainerID? containerId,
|
|
ContainerSessionContext.Types.Verb verb,
|
|
ECDsa key,
|
|
Google.Protobuf.ByteString publicKey)
|
|
{
|
|
if (sessionToken.Body.Container?.ContainerId != null)
|
|
return;
|
|
|
|
sessionToken.Body.Container = new (){ Verb = verb };
|
|
|
|
if (containerId != null)
|
|
sessionToken.Body.Container.ContainerId = containerId;
|
|
else
|
|
sessionToken.Body.Container.Wildcard = true;
|
|
|
|
sessionToken.Body.SessionKey = publicKey;
|
|
|
|
sessionToken.Signature = key.SignMessagePart(sessionToken.Body);
|
|
}
|
|
}
|