2021-03-31 01:42:43 +02:00
|
|
|
using System;
|
|
|
|
using System.Net;
|
|
|
|
using System.Net.Http;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Bit.Core.Abstractions;
|
|
|
|
using Bit.Core.Exceptions;
|
|
|
|
using Bit.Core.Models.Domain;
|
|
|
|
using Bit.Core.Models.Request;
|
|
|
|
using Bit.Core.Models.Response;
|
|
|
|
using Bit.Core.Models.View;
|
|
|
|
using Bit.Core.Services;
|
|
|
|
using Bit.Core.Test.AutoFixture;
|
|
|
|
using Bit.Test.Common.AutoFixture;
|
|
|
|
using Bit.Test.Common.AutoFixture.Attributes;
|
|
|
|
using NSubstitute;
|
|
|
|
using NSubstitute.ExceptionExtensions;
|
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
namespace Bit.Core.Test.Services
|
|
|
|
{
|
|
|
|
public class CipherServiceTests
|
|
|
|
{
|
|
|
|
[Theory, UserCipherAutoData]
|
|
|
|
public async Task SaveWithServerAsync_PrefersFileUploadService(SutProvider<CipherService> sutProvider,
|
2021-04-21 22:27:14 +02:00
|
|
|
Cipher cipher, string fileName, EncByteArray data, AttachmentUploadDataResponse uploadDataResponse, EncString encKey)
|
2021-03-31 01:42:43 +02:00
|
|
|
{
|
2021-06-09 15:45:30 +02:00
|
|
|
var encFileName = new EncString(fileName);
|
2021-03-31 01:42:43 +02:00
|
|
|
sutProvider.GetDependency<ICryptoService>().EncryptAsync(fileName, Arg.Any<SymmetricCryptoKey>())
|
2021-06-09 15:45:30 +02:00
|
|
|
.Returns(encFileName);
|
2021-04-21 22:27:14 +02:00
|
|
|
sutProvider.GetDependency<ICryptoService>().EncryptToBytesAsync(data.Buffer, Arg.Any<SymmetricCryptoKey>())
|
2021-03-31 01:42:43 +02:00
|
|
|
.Returns(data);
|
2021-04-21 22:27:14 +02:00
|
|
|
sutProvider.GetDependency<ICryptoService>().MakeEncKeyAsync(Arg.Any<SymmetricCryptoKey>()).Returns(new Tuple<SymmetricCryptoKey, EncString>(null, encKey));
|
2021-03-31 01:42:43 +02:00
|
|
|
sutProvider.GetDependency<IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any<AttachmentRequest>())
|
|
|
|
.Returns(uploadDataResponse);
|
|
|
|
|
2021-04-21 22:27:14 +02:00
|
|
|
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer);
|
2021-03-31 01:42:43 +02:00
|
|
|
|
|
|
|
await sutProvider.GetDependency<IFileUploadService>().Received(1)
|
2021-06-09 15:45:30 +02:00
|
|
|
.UploadCipherAttachmentFileAsync(uploadDataResponse, encFileName, data);
|
2021-03-31 01:42:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
[InlineUserCipherAutoData(HttpStatusCode.NotFound)]
|
|
|
|
[InlineUserCipherAutoData(HttpStatusCode.MethodNotAllowed)]
|
|
|
|
public async Task SaveWithServerAsync_FallsBackToLegacyFormData(HttpStatusCode statusCode,
|
2021-04-21 22:27:14 +02:00
|
|
|
SutProvider<CipherService> sutProvider, Cipher cipher, string fileName, EncByteArray data,
|
|
|
|
CipherResponse response, EncString encKey)
|
2021-03-31 01:42:43 +02:00
|
|
|
{
|
|
|
|
sutProvider.GetDependency<ICryptoService>().EncryptAsync(fileName, Arg.Any<SymmetricCryptoKey>())
|
2021-04-21 22:27:14 +02:00
|
|
|
.Returns(new EncString(fileName));
|
|
|
|
sutProvider.GetDependency<ICryptoService>().EncryptToBytesAsync(data.Buffer, Arg.Any<SymmetricCryptoKey>())
|
2021-03-31 01:42:43 +02:00
|
|
|
.Returns(data);
|
2021-04-21 22:27:14 +02:00
|
|
|
sutProvider.GetDependency<ICryptoService>().MakeEncKeyAsync(Arg.Any<SymmetricCryptoKey>()).Returns(new Tuple<SymmetricCryptoKey, EncString>(null, encKey));
|
2021-03-31 01:42:43 +02:00
|
|
|
sutProvider.GetDependency<IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any<AttachmentRequest>())
|
|
|
|
.Throws(new ApiException(new ErrorResponse {StatusCode = statusCode}));
|
|
|
|
sutProvider.GetDependency<IApiService>().PostCipherAttachmentLegacyAsync(cipher.Id, Arg.Any<MultipartFormDataContent>())
|
|
|
|
.Returns(response);
|
|
|
|
|
2021-04-21 22:27:14 +02:00
|
|
|
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer);
|
2021-03-31 01:42:43 +02:00
|
|
|
|
|
|
|
await sutProvider.GetDependency<IApiService>().Received(1)
|
|
|
|
.PostCipherAttachmentLegacyAsync(cipher.Id, Arg.Any<MultipartFormDataContent>());
|
|
|
|
}
|
|
|
|
|
|
|
|
[Theory, UserCipherAutoData]
|
|
|
|
public async Task SaveWithServerAsync_ThrowsOnBadRequestApiException(SutProvider<CipherService> sutProvider,
|
2021-04-21 22:27:14 +02:00
|
|
|
Cipher cipher, string fileName, EncByteArray data, EncString encKey)
|
2021-03-31 01:42:43 +02:00
|
|
|
{
|
|
|
|
sutProvider.GetDependency<ICryptoService>().EncryptAsync(fileName, Arg.Any<SymmetricCryptoKey>())
|
2021-04-21 22:27:14 +02:00
|
|
|
.Returns(new EncString(fileName));
|
|
|
|
sutProvider.GetDependency<ICryptoService>().EncryptToBytesAsync(data.Buffer, Arg.Any<SymmetricCryptoKey>())
|
2021-03-31 01:42:43 +02:00
|
|
|
.Returns(data);
|
|
|
|
sutProvider.GetDependency<ICryptoService>().MakeEncKeyAsync(Arg.Any<SymmetricCryptoKey>())
|
2021-04-21 22:27:14 +02:00
|
|
|
.Returns(new Tuple<SymmetricCryptoKey, EncString>(null, encKey));
|
2021-03-31 01:42:43 +02:00
|
|
|
var expectedException = new ApiException(new ErrorResponse { StatusCode = HttpStatusCode.BadRequest });
|
|
|
|
sutProvider.GetDependency<IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any<AttachmentRequest>())
|
|
|
|
.Throws(expectedException);
|
|
|
|
|
|
|
|
var actualException = await Assert.ThrowsAsync<ApiException>(async () =>
|
2021-04-21 22:27:14 +02:00
|
|
|
await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer));
|
2021-03-31 01:42:43 +02:00
|
|
|
|
|
|
|
Assert.Equal(expectedException.Error.StatusCode, actualException.Error.StatusCode);
|
|
|
|
}
|
|
|
|
|
|
|
|
[Theory, CustomAutoData(typeof(SutProviderCustomization), typeof(SymmetricCryptoKeyCustomization))]
|
|
|
|
public async Task DownloadAndDecryptAttachmentAsync_RequestsTimeLimitedUrl(SutProvider<CipherService> sutProvider,
|
|
|
|
string cipherId, AttachmentView attachment, AttachmentResponse response)
|
|
|
|
{
|
|
|
|
sutProvider.GetDependency<IApiService>().GetAttachmentData(cipherId, attachment.Id)
|
|
|
|
.Returns(response);
|
|
|
|
|
|
|
|
await sutProvider.Sut.DownloadAndDecryptAttachmentAsync(cipherId, attachment, null);
|
|
|
|
|
2021-04-21 22:27:14 +02:00
|
|
|
await sutProvider.GetDependency<IApiService>().Received(1).GetAttachmentData(cipherId, attachment.Id);
|
2021-03-31 01:42:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|