Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
662 changes: 334 additions & 328 deletions src/DiadocApi.Async.cs

Large diffs are not rendered by default.

23 changes: 13 additions & 10 deletions src/DiadocHttpApi.Async.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using Diadoc.Api.Proto.Events;
using JetBrains.Annotations;
Expand All @@ -9,29 +10,30 @@ namespace Diadoc.Api
public partial class DiadocHttpApi
{
[ItemNotNull]
protected Task<byte[]> PerformHttpRequestAsync([CanBeNull] string token, [NotNull] string method, [NotNull] string queryString, [CanBeNull] byte[] requestBody = null)
protected Task<byte[]> PerformHttpRequestAsync([CanBeNull] string token, [NotNull] string method, [NotNull] string queryString, [CanBeNull] byte[] requestBody = null, CancellationToken ct = default)
{
return PerformHttpRequestAsync(token, method, queryString, requestBody, responseContent => responseContent);
return PerformHttpRequestAsync(token, method, queryString, requestBody, responseContent => responseContent, ct: ct);
}

[ItemNotNull]
protected Task<TResponse> PerformHttpRequestAsync<TRequest, TResponse>([CanBeNull] string token, [NotNull] string queryString, [NotNull] TRequest request)
protected Task<TResponse> PerformHttpRequestAsync<TRequest, TResponse>([CanBeNull] string token, [NotNull] string queryString, [NotNull] TRequest request, CancellationToken ct = default)
where TRequest: class
where TResponse: class
{
return PerformHttpRequestAsync(token, "POST", queryString, Serialize(request), Deserialize<TResponse>);
return PerformHttpRequestAsync(token, "POST", queryString, Serialize(request), Deserialize<TResponse>, ct: ct);
}

[ItemNotNull]
protected Task<TResponse> PerformHttpRequestAsync<TResponse>(
[CanBeNull] string token,
[NotNull] string method,
[NotNull] string queryString,
[CanBeNull] byte[] requestBody = null,
[CanBeNull] byte[] requestBody = null,
CancellationToken ct = default,
params HttpStatusCode[] allowStatusCodes)
where TResponse: class
{
return PerformHttpRequestAsync(token, method, queryString, requestBody, Deserialize<TResponse>, allowStatusCodes);
return PerformHttpRequestAsync(token, method, queryString, requestBody, Deserialize<TResponse>, ct: ct, allowStatusCodes);
}

[ItemNotNull]
Expand All @@ -40,20 +42,21 @@ protected async Task<TResponse> PerformHttpRequestAsync<TResponse>(
[NotNull] string method,
[NotNull] string queryString,
[CanBeNull] byte[] requestBody,
[NotNull] Func<byte[], TResponse> convertResponse,
[NotNull] Func<byte[], TResponse> convertResponse,
CancellationToken ct = default,
params HttpStatusCode[] allowStatusCodes)
{
var request = BuildHttpRequest(token, method, queryString, requestBody);
var response = await HttpClient.PerformHttpRequestAsync(request, allowStatusCodes).ConfigureAwait(false);
var response = await HttpClient.PerformHttpRequestAsync(request, ct: ct, allowStatusCodes).ConfigureAwait(false);
return DeserializeResponse(request, response, convertResponse);
}

[ItemNotNull]
protected async Task<GeneratedFile> PerformGenerateXmlHttpRequestAsync<TRequest>([CanBeNull] string token, [NotNull] string queryString, [NotNull] TRequest requestObject)
protected async Task<GeneratedFile> PerformGenerateXmlHttpRequestAsync<TRequest>([CanBeNull] string token, [NotNull] string queryString, [NotNull] TRequest requestObject, CancellationToken ct = default)
where TRequest: class
{
var request = BuildHttpRequest(token, "POST", queryString, Serialize(requestObject));
var response = await HttpClient.PerformHttpRequestAsync(request).ConfigureAwait(false);
var response = await HttpClient.PerformHttpRequestAsync(request, ct: ct).ConfigureAwait(false);
return new GeneratedFile(response.ContentDispositionFileName, response.Content);
}
}
Expand Down
62 changes: 34 additions & 28 deletions src/DiadocHttpApi.AuthAsync.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Diadoc.Api.Http;

namespace Diadoc.Api
{
public partial class DiadocHttpApi
{
public async Task<string> AuthenticateAsync(string login, string password, string key = null, string id = null)
public async Task<string> AuthenticateAsync(string login, string password, string key = null, string id = null, CancellationToken ct = default)
{
var qsb = new PathAndQueryBuilder("/V2/Authenticate");
qsb.AddParameter("login", login);
Expand All @@ -18,87 +19,89 @@ public async Task<string> AuthenticateAsync(string login, string password, strin
qsb.AddParameter("id", id);
}

var httpResponse = await PerformHttpRequestAsync(null, "POST", qsb.BuildPathAndQuery()).ConfigureAwait(false);
var httpResponse = await PerformHttpRequestAsync(null, "POST", qsb.BuildPathAndQuery(), ct: ct).ConfigureAwait(false);
return Encoding.UTF8.GetString(httpResponse);
}

public async Task<string> AuthenticateByKeyAsync(string key, string id)
public async Task<string> AuthenticateByKeyAsync(string key, string id, CancellationToken ct = default)
{
var qsb = new PathAndQueryBuilder("/V2/Authenticate");
qsb.AddParameter("key", key);
qsb.AddParameter("id", id);
var httpResponse = await PerformHttpRequestAsync(null, "POST", qsb.BuildPathAndQuery()).ConfigureAwait(false);
var httpResponse = await PerformHttpRequestAsync(null, "POST", qsb.BuildPathAndQuery(), ct: ct).ConfigureAwait(false);
return Encoding.UTF8.GetString(httpResponse);
}

public async Task<string> AuthenticateBySidAsync(string sid)
public async Task<string> AuthenticateBySidAsync(string sid, CancellationToken ct = default)
{
var qsb = new PathAndQueryBuilder("/V2/Authenticate");
qsb.AddParameter("sid", sid);
var httpResponse = await PerformHttpRequestAsync(null, "POST", qsb.BuildPathAndQuery()).ConfigureAwait(false);
var httpResponse = await PerformHttpRequestAsync(null, "POST", qsb.BuildPathAndQuery(), ct: ct).ConfigureAwait(false);
return Encoding.UTF8.GetString(httpResponse);
}

public async Task<string> AuthenticateAsync(byte[] certificateBytes, bool useLocalSystemStorage = false)
public async Task<string> AuthenticateAsync(byte[] certificateBytes, bool useLocalSystemStorage = false, CancellationToken ct = default)
{
var token = await AuthenticateByCertificateAsync(
certificateBytes,
useLocalSystemStorage,
key: null,
id: null)
id: null,
ct: ct)
.ConfigureAwait(false);

return await ConfirmAuthenticationByCertificateAsync(certificateBytes, token, saveBinding: false).ConfigureAwait(false);
return await ConfirmAuthenticationByCertificateAsync(certificateBytes, token, saveBinding: false, ct: ct).ConfigureAwait(false);
}

public async Task<string> AuthenticateAsync(string thumbprint, bool useLocalSystemStorage = false)
public async Task<string> AuthenticateAsync(string thumbprint, bool useLocalSystemStorage = false, CancellationToken ct = default)
{
var userCert = crypt.GetCertificateWithPrivateKey(thumbprint, useLocalSystemStorage);

var token = await AuthenticateByCertificateAsync(
userCert.RawData,
useLocalSystemStorage,
key: null,
id: null)
id: null,
ct: ct)
.ConfigureAwait(false);

return await ConfirmAuthenticationByCertificateThumbprintAsync(userCert.Thumbprint, token, saveBinding: false).ConfigureAwait(false);
return await ConfirmAuthenticationByCertificateThumbprintAsync(userCert.Thumbprint, token, saveBinding: false, ct: ct).ConfigureAwait(false);
}

public async Task<string> AuthenticateWithKeyAsync(byte[] certificateBytes, bool useLocalSystemStorage = false, string key = null, string id = null, bool autoConfirm = true)
public async Task<string> AuthenticateWithKeyAsync(byte[] certificateBytes, bool useLocalSystemStorage = false, string key = null, string id = null, bool autoConfirm = true, CancellationToken ct = default)
{
var authenticationWithKey = !string.IsNullOrEmpty(key);

var token = await AuthenticateByCertificateAsync(certificateBytes, useLocalSystemStorage, key, id).ConfigureAwait(false);
var token = await AuthenticateByCertificateAsync(certificateBytes, useLocalSystemStorage, key, id, ct: ct).ConfigureAwait(false);

return autoConfirm
? await ConfirmAuthenticationByCertificateAsync(certificateBytes, token, saveBinding: authenticationWithKey).ConfigureAwait(false)
? await ConfirmAuthenticationByCertificateAsync(certificateBytes, token, saveBinding: authenticationWithKey, ct: ct).ConfigureAwait(false)
: token;
}

public async Task<string> AuthenticateWithKeyAsync(string thumbprint, bool useLocalSystemStorage = false, string key = null, string id = null, bool autoConfirm = true)
public async Task<string> AuthenticateWithKeyAsync(string thumbprint, bool useLocalSystemStorage = false, string key = null, string id = null, bool autoConfirm = true, CancellationToken ct = default)
{
var authenticationWithKey = !string.IsNullOrEmpty(key);
var userCert = crypt.GetCertificateWithPrivateKey(thumbprint, useLocalSystemStorage);

var token = await AuthenticateByCertificateAsync(userCert.RawData, useLocalSystemStorage, key, id).ConfigureAwait(false);
var token = await AuthenticateByCertificateAsync(userCert.RawData, useLocalSystemStorage, key, id, ct: ct).ConfigureAwait(false);

return autoConfirm
? await ConfirmAuthenticationByCertificateThumbprintAsync(userCert.Thumbprint, token, saveBinding: authenticationWithKey).ConfigureAwait(false)
? await ConfirmAuthenticationByCertificateThumbprintAsync(userCert.Thumbprint, token, saveBinding: authenticationWithKey, ct: ct).ConfigureAwait(false)
: token;
}

public Task<string> AuthenticateWithKeyConfirmAsync(byte[] certificateBytes, string token, bool saveBinding = false)
public Task<string> AuthenticateWithKeyConfirmAsync(byte[] certificateBytes, string token, bool saveBinding = false, CancellationToken ct = default)
{
return ConfirmAuthenticationByCertificateAsync(certificateBytes, token, saveBinding);
return ConfirmAuthenticationByCertificateAsync(certificateBytes, token, saveBinding, ct: ct);
}

public Task<string> AuthenticateWithKeyConfirmAsync(string thumbprint, string token, bool saveBinding = false)
public Task<string> AuthenticateWithKeyConfirmAsync(string thumbprint, string token, bool saveBinding = false, CancellationToken ct = default)
{
return ConfirmAuthenticationByCertificateThumbprintAsync(thumbprint, token, saveBinding);
return ConfirmAuthenticationByCertificateThumbprintAsync(thumbprint, token, saveBinding, ct: ct);
}

private Task<string> AuthenticateByCertificateAsync(byte[] certificateBytes, bool useLocalSystemStorage, string key, string id)
private Task<string> AuthenticateByCertificateAsync(byte[] certificateBytes, bool useLocalSystemStorage, string key, string id, CancellationToken ct = default)
{
var qsb = new PathAndQueryBuilder("/V2/Authenticate");
var authenticationWithKey = !string.IsNullOrEmpty(key);
Expand All @@ -113,10 +116,11 @@ private Task<string> AuthenticateByCertificateAsync(byte[] certificateBytes, boo
"POST",
qsb.BuildPathAndQuery(),
certificateBytes,
responseContent => Convert.ToBase64String(crypt.Decrypt(responseContent, useLocalSystemStorage)));
responseContent => Convert.ToBase64String(crypt.Decrypt(responseContent, useLocalSystemStorage)),
ct: ct);
}

private Task<string> ConfirmAuthenticationByCertificateAsync(byte[] certificateBytes, string token, bool saveBinding)
private Task<string> ConfirmAuthenticationByCertificateAsync(byte[] certificateBytes, string token, bool saveBinding, CancellationToken ct = default)
{
var qsb = new PathAndQueryBuilder("/V2/AuthenticateConfirm");
qsb.AddParameter("token", token);
Expand All @@ -126,10 +130,11 @@ private Task<string> ConfirmAuthenticationByCertificateAsync(byte[] certificateB
"POST",
qsb.BuildPathAndQuery(),
certificateBytes,
responseContent => Encoding.UTF8.GetString(responseContent));
responseContent => Encoding.UTF8.GetString(responseContent),
ct: ct);
}

private Task<string> ConfirmAuthenticationByCertificateThumbprintAsync(string thumbprint, string token, bool saveBinding)
private Task<string> ConfirmAuthenticationByCertificateThumbprintAsync(string thumbprint, string token, bool saveBinding, CancellationToken ct = default)
{
var qsb = new PathAndQueryBuilder("/V2/AuthenticateConfirm");
qsb.AddParameter("thumbprint", thumbprint);
Expand All @@ -140,7 +145,8 @@ private Task<string> ConfirmAuthenticationByCertificateThumbprintAsync(string th
"POST",
qsb.BuildPathAndQuery(),
null,
responseContent => Encoding.UTF8.GetString(responseContent));
responseContent => Encoding.UTF8.GetString(responseContent),
ct: ct);
}
}
}
33 changes: 17 additions & 16 deletions src/DiadocHttpApi.CloudCryptAsync.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Diadoc.Api.Http;
using Diadoc.Api.Proto;
Expand All @@ -8,35 +9,35 @@ namespace Diadoc.Api
{
public partial class DiadocHttpApi
{
public Task<AsyncMethodResult> CloudSignAsync(string authToken, CloudSignRequest request, string certificateThumbprint = null)
public Task<AsyncMethodResult> CloudSignAsync(string authToken, CloudSignRequest request, string certificateThumbprint = null, CancellationToken ct = default)
{
var queryString = new PathAndQueryBuilder("/CloudSign");
if (!string.IsNullOrEmpty(certificateThumbprint))
queryString.AddParameter("certificateThumbprint", certificateThumbprint);
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery(), Serialize(request));
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery(), Serialize(request), ct: ct);
}

public Task<CloudSignResult> WaitCloudSignResultAsync(string authToken, string taskId, TimeSpan? timeout = null)
public Task<CloudSignResult> WaitCloudSignResultAsync(string authToken, string taskId, TimeSpan? timeout = null, CancellationToken ct = default)
{
return WaitTaskResultAsync<CloudSignResult>(authToken, "/CloudSignResult", taskId, timeout);
return WaitTaskResultAsync<CloudSignResult>(authToken, "/CloudSignResult", taskId, timeout, ct: ct);
}

public Task<AsyncMethodResult> CloudSignConfirmAsync(string authToken, string cloudSignToken, string confirmationCode, ContentLocationPreference? locationPreference = null)
public Task<AsyncMethodResult> CloudSignConfirmAsync(string authToken, string cloudSignToken, string confirmationCode, ContentLocationPreference? locationPreference = null, CancellationToken ct = default)
{
var queryString = new PathAndQueryBuilder("/CloudSignConfirm");
queryString.AddParameter("token", cloudSignToken);
queryString.AddParameter("confirmationCode", confirmationCode);
if (locationPreference.HasValue)
queryString.AddParameter("return", locationPreference.Value.ToString());
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery());
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery(), ct: ct);
}

public Task<CloudSignConfirmResult> WaitCloudSignConfirmResultAsync(string authToken, string taskId, TimeSpan? timeout = null)
public Task<CloudSignConfirmResult> WaitCloudSignConfirmResultAsync(string authToken, string taskId, TimeSpan? timeout = null, CancellationToken ct = default)
{
return WaitTaskResultAsync<CloudSignConfirmResult>(authToken, "/CloudSignConfirmResult", taskId, timeout);
return WaitTaskResultAsync<CloudSignConfirmResult>(authToken, "/CloudSignConfirmResult", taskId, timeout, ct: ct);
}

public Task<AsyncMethodResult> AutoSignReceiptsAsync(string authToken, string boxId, string certificateThumbprint, string batchKey)
public Task<AsyncMethodResult> AutoSignReceiptsAsync(string authToken, string boxId, string certificateThumbprint, string batchKey, CancellationToken ct = default)
{
if (boxId == null) throw new ArgumentNullException(nameof(boxId));
var queryString = new PathAndQueryBuilder("/AutoSignReceipts");
Expand All @@ -45,15 +46,15 @@ public Task<AsyncMethodResult> AutoSignReceiptsAsync(string authToken, string bo
queryString.AddParameter("certificateThumbprint", certificateThumbprint);
if (!string.IsNullOrEmpty(batchKey))
queryString.AddParameter("batchKey", batchKey);
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery());
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery(), ct: ct);
}

public Task<AutosignReceiptsResult> WaitAutosignReceiptsResultAsync(string authToken, string taskId, TimeSpan? timeout = null)
public Task<AutosignReceiptsResult> WaitAutosignReceiptsResultAsync(string authToken, string taskId, TimeSpan? timeout = null, CancellationToken ct = default)
{
return WaitTaskResultAsync<AutosignReceiptsResult>(authToken, "/AutosignReceiptsResult", taskId, timeout);
return WaitTaskResultAsync<AutosignReceiptsResult>(authToken, "/AutosignReceiptsResult", taskId, timeout, ct: ct);
}

public Task<AsyncMethodResult> DssSignAsync(string authToken, string boxId, DssSignRequest request, string certificateThumbprint = null)
public Task<AsyncMethodResult> DssSignAsync(string authToken, string boxId, DssSignRequest request, string certificateThumbprint = null, CancellationToken ct = default)
{
var queryString = new PathAndQueryBuilder("/DssSign");
queryString.AddParameter("boxId", boxId);
Expand All @@ -62,15 +63,15 @@ public Task<AsyncMethodResult> DssSignAsync(string authToken, string boxId, DssS
queryString.AddParameter("certificateThumbprint", certificateThumbprint);
}

return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery(), Serialize(request));
return PerformHttpRequestAsync<AsyncMethodResult>(authToken, "POST", queryString.BuildPathAndQuery(), Serialize(request), ct: ct);
}

public Task<DssSignResult> DssSignResultAsync(string authToken, string boxId, string taskId)
public Task<DssSignResult> DssSignResultAsync(string authToken, string boxId, string taskId, CancellationToken ct = default)
{
var queryString = new PathAndQueryBuilder("/DssSignResult");
queryString.AddParameter("boxId", boxId);
queryString.AddParameter("taskId", taskId);
return PerformHttpRequestAsync<DssSignResult>(authToken, "GET", queryString.BuildPathAndQuery());
return PerformHttpRequestAsync<DssSignResult>(authToken, "GET", queryString.BuildPathAndQuery(), ct: ct);
}
}
}
Loading