The core infrastructure backend (API, database, Docker, etc).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

89 lines
3.0 KiB

using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using Bit.Core.Platform.Mail.Delivery;
using Bit.Core.Settings;
using Microsoft.Extensions.Logging;
using NSubstitute;
using Xunit;
namespace Bit.Core.Test.Services;
public class MailKitSmtpMailDeliveryServiceTests
{
private readonly GlobalSettings _globalSettings;
private readonly ILogger<MailKitSmtpMailDeliveryService> _logger;
public MailKitSmtpMailDeliveryServiceTests()
{
_globalSettings = new GlobalSettings();
_logger = Substitute.For<ILogger<MailKitSmtpMailDeliveryService>>();
_globalSettings.Mail.Smtp.Host = "unittests.example.com";
_globalSettings.Mail.ReplyToEmail = "noreply@unittests.example.com";
}
private MailKitSmtpMailDeliveryService CreateSut(bool trustServer = false)
{
_globalSettings.Mail.Smtp.TrustServer = trustServer;
return new MailKitSmtpMailDeliveryService(_globalSettings, _logger);
}
[Fact]
public void ValidateServerCertificate_NoPolicyErrors_ReturnsTrue()
{
var sut = CreateSut();
var result = sut.ValidateServerCertificate(null!, null, null, SslPolicyErrors.None);
Assert.True(result);
}
[Fact]
public void ValidateServerCertificate_TrustServer_AnyError_ReturnsTrue()
{
var sut = CreateSut(trustServer: true);
var result = sut.ValidateServerCertificate(null!, null, null, SslPolicyErrors.RemoteCertificateNameMismatch);
Assert.True(result);
}
[Fact]
public void ValidateServerCertificate_TrustServer_ChainErrors_ReturnsTrue()
{
var sut = CreateSut(trustServer: true);
var result = sut.ValidateServerCertificate(null!, null, null, SslPolicyErrors.RemoteCertificateChainErrors);
Assert.True(result);
}
[Fact]
public void ValidateServerCertificate_NameMismatch_ReturnsFalse()
{
var sut = CreateSut();
var result = sut.ValidateServerCertificate(null!, null, null, SslPolicyErrors.RemoteCertificateNameMismatch);
Assert.False(result);
}
[Fact]
public void ValidateServerCertificate_ChainErrorsWithNullChain_ReturnsFalse()
{
var sut = CreateSut();
var result = sut.ValidateServerCertificate(null!, null, null, SslPolicyErrors.RemoteCertificateChainErrors);
Assert.False(result);
}
[Fact]
public void ValidateServerCertificate_ChainErrors_OnlyCrlStatuses_ReturnsTrue_LogsWarning()
{
var sut = CreateSut();
using var chain = new X509Chain();
// An unbuilt chain has an empty ChainStatus; All() on empty is vacuously true,
// exercising the CRL-only branch.
var result = sut.ValidateServerCertificate(null!, null, chain, SslPolicyErrors.RemoteCertificateChainErrors);
Assert.True(result);
_logger.Received(1).Log(
LogLevel.Warning,
Arg.Any<EventId>(),
Arg.Any<object>(),
null,
Arg.Any<Func<object, Exception, string>>());
}
}