public async Task <Dictionary <string, List <TlsEntityState> > > GetDomains(string hostname) { string connectionString = await _connectionInfo.GetConnectionStringAsync(); Dictionary <string, List <TlsEntityState> > results = new Dictionary <string, List <TlsEntityState> >(); using (MySqlConnection connection = new MySqlConnection(connectionString)) { await connection.OpenAsync(); using (DbDataReader reader = await MySqlHelper.ExecuteReaderAsync(connection, TlsEntityDaoResources.GetDomainMxHosts, new MySqlParameter("hostname", ReverseUrl(hostname)))) { while (await reader.ReadAsync()) { string domain = ReverseUrl(reader.GetString("domain")); TlsEntityState state = JsonConvert.DeserializeObject <TlsEntityState>(reader.GetString("state")); if (results.ContainsKey(domain)) { results[domain].Add(state); } else { results[domain] = new List <TlsEntityState> { state }; } } } connection.Close(); } return(results); }
public DomainTlsEvaluatorResults Create(MxEntityState mxState, Dictionary <string, TlsEntityState> tlsEntityStates) { List <MxTlsEvaluatorResults> mxTlsEvaluatorResults = new List <MxTlsEvaluatorResults>(); List <MxTlsCertificateEvaluatorResults> mxTlsCertificateEvaluatorResults = new List <MxTlsCertificateEvaluatorResults>(); foreach (HostMxRecord hostMxRecord in mxState.HostMxRecords) { // tlsEntityStates keys are always lowercase due to ReverseUrl() in MxApiDao.GetTlsEntityStates TlsEntityState tlsEntityState = tlsEntityStates[hostMxRecord.Id.ToLower()]; List <TlsRecord> records = new List <TlsRecord>(); TlsRecords tlsRecords = tlsEntityState.TlsRecords; if (tlsRecords != null) { records.Add(tlsRecords.Tls12AvailableWithBestCipherSuiteSelected); records.Add(tlsRecords.Tls12AvailableWithBestCipherSuiteSelectedFromReverseList); records.Add(tlsRecords.Tls12AvailableWithSha2HashFunctionSelected); records.Add(tlsRecords.Tls12AvailableWithWeakCipherSuiteNotSelected); records.Add(tlsRecords.Tls11AvailableWithBestCipherSuiteSelected); records.Add(tlsRecords.Tls11AvailableWithWeakCipherSuiteNotSelected); records.Add(tlsRecords.Tls10AvailableWithBestCipherSuiteSelected); records.Add(tlsRecords.Tls10AvailableWithWeakCipherSuiteNotSelected); records.Add(tlsRecords.Ssl3FailsWithBadCipherSuite); records.Add(tlsRecords.TlsSecureEllipticCurveSelected); records.Add(tlsRecords.TlsSecureDiffieHellmanGroupSelected); records.Add(tlsRecords.TlsWeakCipherSuitesRejected); records.Add(tlsRecords.Tls12Available); records.Add(tlsRecords.Tls11Available); records.Add(tlsRecords.Tls10Available); } List <string> warnings = records.Where(_ => _.TlsEvaluatedResult.Result == EvaluatorResult.WARNING) .Select(_ => _.TlsEvaluatedResult.Description).ToList(); List <string> failures = records.Where(_ => _.TlsEvaluatedResult.Result == EvaluatorResult.FAIL) .Select(_ => _.TlsEvaluatedResult.Description).ToList(); List <string> informational = records .Where(_ => _.TlsEvaluatedResult.Result == EvaluatorResult.INFORMATIONAL || _.TlsEvaluatedResult.Result == EvaluatorResult.INCONCLUSIVE) .Select(_ => _.TlsEvaluatedResult.Description).ToList(); mxTlsEvaluatorResults.Add( new MxTlsEvaluatorResults( hostMxRecord.Id, hostMxRecord.Preference ?? 0, mxState.LastUpdated ?? DateTime.MinValue, warnings, failures, informational)); mxTlsCertificateEvaluatorResults.Add(CreateMxTlsCertificateEvaluatorResults(hostMxRecord.Id, hostMxRecord.Preference ?? 0, mxState.LastUpdated ?? DateTime.MinValue, tlsEntityState.CertificateResults)); } return(new DomainTlsEvaluatorResults(mxState.Id, mxState.MxState == MxState.PollPending, mxTlsEvaluatorResults, mxTlsCertificateEvaluatorResults)); }
private TlsEntityState CreateTwoAdvisoryEntityStateFromExample() { string text = ExampleStateResources.TwoAdvisoryExampleState; TlsEntityState result = JsonConvert.DeserializeObject <TlsEntityState>(text); return(result); }
public void Handle(TlsEntityState state, Common.Messaging.Abstractions.Message message, List <string> domains) { foreach (IChangeNotifier changeNotifier in _notifiers) { changeNotifier.Handle(state, message, domains); } }
public void NotifiesWhenMessageAdded_DataInRecords() { Guid messageId = Guid.NewGuid(); Guid messageId2 = Guid.NewGuid(); string errorMessage = "An error has occured"; string errorMessage2 = "An error has occured 2"; TlsRecords existingTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId, EvaluatorResult.FAIL, errorMessage))); TlsRecords newTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId, EvaluatorResult.FAIL, errorMessage)), new TlsRecord(new TlsEvaluatedResult(messageId2, EvaluatorResult.FAIL, errorMessage2))); TlsEntityState existingState = CreateEntityStateWithMessages(existingTlsRecords); _advisoryChangedNotifier.Handle(existingState, CreateTlsResultsEvaluatedWithResults(newTlsRecords), new List <string> { "test.gov.uk" }); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryAdded> ._, A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch( A <TlsAdvisoryAdded> .That.Matches(x => x.Messages.First().Text == errorMessage2), A <string> ._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryRemoved> ._, A <string> ._)) .MustNotHaveHappened(); }
public void NotifiesAdvisoryRemovedWhenPreviouslyTwoAdvisoryButNowOne() { Guid messageId1 = Guid.Parse("9f200bc1-bf50-4df6-a34d-5278a82e2245"); string errorMessage1 = "When testing TLS 1.2 with a range of cipher suites in reverse order the " + "server selected a different cipher suite (TLS_RSA_WITH_3DES_EDE_CBC_SHA) which has no " + "Perfect Forward Secrecy (PFS) and uses 3DES and SHA-1. The server should choose the same " + "cipher suite regardless of the order that they are presented by the client."; string errorMessage2 = "When testing TLS 1.0 we were unable to create a connection"; TlsEntityState existingState = CreateTwoAdvisoryEntityStateFromExample(); TlsRecords newTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId1, EvaluatorResult.WARNING, errorMessage1))); _advisoryChangedNotifier.Handle(existingState, CreateTlsResultsEvaluatedWithResults(newTlsRecords), new List <string> { "test.gov.uk" }); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryAdded> ._, A <string> ._)) .MustNotHaveHappened(); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryRemoved> ._, A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch( A <TlsAdvisoryRemoved> .That.Matches(x => x.Messages.First().Text == errorMessage2 && x.Id == "test.gov.uk" && x.Host == "mailchecktest.host.gov.uk."), A <string> ._)) .MustHaveHappenedOnceExactly(); }
public void NoNotifiersWhenSameAdvisories() { Guid messageId1 = Guid.Parse("9f200bc1-bf50-4df6-a34d-5278a82e2245"); string errorMessage = "When testing TLS 1.2 with a range of cipher suites in reverse order the " + "server selected a different cipher suite (TLS_RSA_WITH_3DES_EDE_CBC_SHA) which has no " + "Perfect Forward Secrecy (PFS) and uses 3DES and SHA-1. The server should choose the same " + "cipher suite regardless of the order that they are presented by the client."; TlsEntityState existingState = CreateOneAdvisoryEntityStateFromExample(); TlsRecords newTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId1, EvaluatorResult.WARNING, errorMessage))); _advisoryChangedNotifier.Handle(existingState, CreateTlsResultsEvaluatedWithResults(newTlsRecords), new List <string> { "test.gov.uk" }); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryAdded> ._, A <string> ._)) .MustNotHaveHappened(); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryRemoved> ._, A <string> ._)) .MustNotHaveHappened(); }
private TlsEntityState CreateEntityStateWithMessages(TlsRecords records = null) { TlsEntityState entityState = new TlsEntityState("hostName") { TlsRecords = records ?? CreateTlsRecords() }; return(entityState); }
public async Task ShouldHandleChangeSaveAndDispatchWhenTlsTestResultIsReceived() { string snsTopicArn = "snsTopicArn"; A.CallTo(() => _tlsEntityConfig.SnsTopicArn).Returns(snsTopicArn); string hostName = "testhostname"; TlsEntityState stateFromDb = new TlsEntityState(hostName) { TlsState = TlsState.Created }; A.CallTo(() => _dao.Get(hostName)).Returns(Task.FromResult(stateFromDb)); A.CallTo(() => _dao.GetDomainsFromHost(hostName)).Returns(Task.FromResult(new List <string> { "test.gov.uk" })); A.CallTo(() => _tlsEntityConfig.NextScheduledInSeconds).Returns(33); A.CallTo(() => _clock.GetDateTimeUtc()).Returns(DateTime.MinValue); CertificateResults certificateResults = new CertificateResults(null, null); TlsResultsEvaluated message = new TlsResultsEvaluated(hostName, false, new TlsRecords( new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) , new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) , new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) , new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) ), certificateResults); await _tlsEntity.Handle(message); Assert.AreEqual(stateFromDb.TlsState, TlsState.Evaluated); Assert.AreEqual(stateFromDb.TlsRecords, message.TlsRecords); Assert.AreEqual(stateFromDb.LastUpdated, message.Timestamp); List <string> domains = new List <string>(); A.CallTo(() => _changeNotifierComposite.Handle(stateFromDb, message, A <List <string> > ._)).MustHaveHappenedOnceExactly(); A.CallTo(() => _dao.Save(stateFromDb)).MustHaveHappenedOnceExactly(); A.CallTo(() => _dispatcher.Dispatch(A <TlsRecordEvaluationsChanged> .That.Matches(a => a.Id == message.Id && a.TlsRecords == message.TlsRecords && a.CertificateResults == message.Certificates), snsTopicArn)).MustHaveHappenedOnceExactly(); A.CallTo(() => _dispatcher.Dispatch(A <CreateScheduledReminder> .That.Matches(a => a.ResourceId == hostName && a.Service == "Tls" && a.ScheduledTime.Second == 33), snsTopicArn)).MustHaveHappenedOnceExactly(); }
public void Handle(TlsEntityState state, Message message, List <string> domains) { if (message is TlsResultsEvaluated evaluationResult) { List <TlsEvaluatedResult> currentMessages = GetAdvisoryMessages(state.TlsRecords); List <TlsEvaluatedResult> newMessages = GetAdvisoryMessages(evaluationResult.TlsRecords); _logger.LogInformation( $"Evaluation Result messages count: {newMessages.Count}"); List <TlsEvaluatedResult> addedMessages = newMessages.Except(currentMessages).ToList(); if (addedMessages.Any()) { foreach (string domain in domains) { TlsAdvisoryAdded advisoryAdded = new TlsAdvisoryAdded(domain, state.Id, addedMessages.Select(x => new AdvisoryMessage(GetMessageType(x.Result.Value), x.Description)) .ToList()); _dispatcher.Dispatch(advisoryAdded, _tlsEntityConfig.SnsTopicArn); _logger.LogInformation( $"TlsAdvisoryAdded message dispatched to {_tlsEntityConfig.SnsTopicArn} for domain: {domain} and host: {message.Id}"); } } else { _logger.LogInformation($"No new TlsAdvisoryAdded found for host: {message.Id}"); } List <TlsEvaluatedResult> removedMessages = currentMessages.Except(newMessages).ToList(); if (removedMessages.Any()) { foreach (string domain in domains) { TlsAdvisoryRemoved advisoryRemoved = new TlsAdvisoryRemoved(domain, state.Id, removedMessages.Select(x => new AdvisoryMessage(GetMessageType(x.Result.Value), x.Description)) .ToList()); _dispatcher.Dispatch(advisoryRemoved, _tlsEntityConfig.SnsTopicArn); _logger.LogInformation( $"TlsAdvisoryRemoved message dispatched to {_tlsEntityConfig.SnsTopicArn} for domain: {domain} and host: {message.Id}"); } } else { _logger.LogInformation($"No new TlsAdvisoryRemoved found for host: {message.Id}"); } } }
public async Task ShouldRescheduledWhenItHasFailedToCorrectPeriod() { string snsTopicArn = "snsTopicArn"; A.CallTo(() => _tlsEntityConfig.SnsTopicArn).Returns(snsTopicArn); string hostName = "testhostname"; TlsEntityState stateFromDb = new TlsEntityState(hostName) { TlsState = TlsState.Created }; A.CallTo(() => _dao.Get(hostName)).Returns(Task.FromResult(stateFromDb)); A.CallTo(() => _tlsEntityConfig.FailureNextScheduledInSeconds).Returns(15); A.CallTo(() => _tlsEntityConfig.MaxTlsRetryAttempts).Returns(5); A.CallTo(() => _clock.GetDateTimeUtc()).Returns(DateTime.MinValue); CertificateResults certificateResults = new CertificateResults(null, null); TlsResultsEvaluated message = new TlsResultsEvaluated(hostName, true, new TlsRecords( new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) , new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) , new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) , new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)), new TlsRecord(new TlsEvaluatedResult(Guid.NewGuid(), EvaluatorResult.PASS)) ), certificateResults); await _tlsEntity.Handle(message); A.CallTo(() => _changeNotifierComposite.Handle(stateFromDb, message, A <List <string> > ._)).MustNotHaveHappened(); A.CallTo(() => _dao.Save(stateFromDb)).MustHaveHappenedOnceExactly(); A.CallTo(() => _dispatcher.Dispatch(A <TlsRecordEvaluationsChanged> .That.Matches(a => a.Id == message.Id && a.TlsRecords == message.TlsRecords && a.CertificateResults == message.Certificates), snsTopicArn, null)).MustNotHaveHappened(); A.CallTo(() => _dispatcher.Dispatch(A <CreateScheduledReminder> .That.Matches(a => a.ResourceId == hostName && a.Service == "Tls" && a.ScheduledTime.Second == 15), snsTopicArn)).MustHaveHappenedOnceExactly(); }
public async Task Save(TlsEntityState state) { string connectionString = await _connectionInfo.GetConnectionStringAsync(); using (MySqlConnection connection = new MySqlConnection(connectionString)) { await connection.OpenAsync(); await MySqlHelper.ExecuteScalarAsync(connection, TlsEntityDaoResources.SaveTlsEntity, new MySqlParameter("hostname", ReverseUrl(state.Id)), new MySqlParameter("state", JsonConvert.SerializeObject(state))); connection.Close(); } }
public void NotifiesAdvisoryRemovedAndAdvisoryAddedWhenSameAmountButDifferentAdvisories() { Guid messageId = Guid.NewGuid(); string errorMessage1 = "When testing TLS 1.2 with a range of cipher suites in reverse order " + "we were unable to create a connection to the mail server. We will keep trying, so please check back later."; string errorMessage2 = "When testing TLS 1.1 we were unable to create a connection"; string errorMessage3 = "When testing TLS 1.2 with a range of cipher suites in reverse order the " + "server selected a different cipher suite (TLS_RSA_WITH_3DES_EDE_CBC_SHA) which has no " + "Perfect Forward Secrecy (PFS) and uses 3DES and SHA-1. The server should choose the same " + "cipher suite regardless of the order that they are presented by the client."; string errorMessage4 = "When testing TLS 1.0 we were unable to create a connection"; TlsEntityState existingState = CreateTwoAdvisoryEntityStateFromExample(); TlsRecords newTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId, EvaluatorResult.INCONCLUSIVE, errorMessage1)), new TlsRecord(new TlsEvaluatedResult(messageId, EvaluatorResult.FAIL, errorMessage2))); _advisoryChangedNotifier.Handle(existingState, CreateTlsResultsEvaluatedWithResults(newTlsRecords), new List <string> { "test.gov.uk" }); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryAdded> ._, A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch(A <TlsAdvisoryRemoved> ._, A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch( A <TlsAdvisoryAdded> .That.Matches(x => x.Messages[0].Text == errorMessage1 && x.Id == "test.gov.uk" && x.Host == "mailchecktest.host.gov.uk."), A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch( A <TlsAdvisoryAdded> .That.Matches(x => x.Messages[1].Text == errorMessage2 && x.Id == "test.gov.uk" && x.Host == "mailchecktest.host.gov.uk."), A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch( A <TlsAdvisoryRemoved> .That.Matches(x => x.Messages[0].Text == errorMessage3 && x.Id == "test.gov.uk" && x.Host == "mailchecktest.host.gov.uk."), A <string> ._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _messageDispatcher.Dispatch( A <TlsAdvisoryRemoved> .That.Matches(x => x.Messages[1].Text == errorMessage4 && x.Id == "test.gov.uk" && x.Host == "mailchecktest.host.gov.uk."), A <string> ._)) .MustHaveHappenedOnceExactly(); }
private async Task HandleReadyToPoll(string hostName, string messageType) { TlsEntityState state = await LoadState(hostName, messageType); if (state.LastUpdated == null || _clock.GetDateTimeUtc() > state.LastUpdated.Value.AddSeconds(_tlsEntityConfig.TlsResultsCacheInSeconds)) { state.TlsState = TlsState.PollPending; await _dao.Save(state); _dispatcher.Dispatch(new TlsTestPending(hostName), _tlsEntityConfig.SnsTopicArn); _log.LogInformation($"A TlsTestPending message for host: {hostName} has been dispatched to SnsTopic: {_tlsEntityConfig.SnsTopicArn}"); } else { _log.LogInformation($"A request to re-test {hostName} was ignored as it was last tested at {state.LastUpdated.Value} and the re-test cache " + $"is {TimeSpan.FromSeconds(_tlsEntityConfig.TlsResultsCacheInSeconds):dd\\d\\:hh\\h\\:mm\\m\\:ss\\s}."); // dd/hh/mm/ss } }
public async Task Handle(TlsResultsEvaluated message) { string messageId = message.Id.ToLower(); TlsEntityState state = await LoadState(messageId, nameof(message)); await _domainStatusPublisher.Publish(message); state.TlsState = TlsState.Evaluated; state.FailureCount = message.Failed ? state.FailureCount + 1 : 0; CreateScheduledReminder reminder; if (!message.Failed || message.Failed && state.FailureCount >= _tlsEntityConfig.MaxTlsRetryAttempts) { List <string> domains = await _dao.GetDomainsFromHost(messageId); _changeNotifiersComposite.Handle(state, message, domains); state.CertificateResults = message.Certificates; state.TlsRecords = message.TlsRecords; state.LastUpdated = message.Timestamp; await _dao.Save(state); _dispatcher.Dispatch(new TlsRecordEvaluationsChanged(messageId, state.TlsRecords, state.CertificateResults), _tlsEntityConfig.SnsTopicArn); reminder = new CreateScheduledReminder(Guid.NewGuid().ToString(), ServiceName, messageId, _clock.GetDateTimeUtc().AddSeconds(_tlsEntityConfig.NextScheduledInSeconds)); } else { await _dao.Save(state); reminder = new CreateScheduledReminder(Guid.NewGuid().ToString(), ServiceName, messageId, _clock.GetDateTimeUtc().AddSeconds(_tlsEntityConfig.FailureNextScheduledInSeconds)); } _dispatcher.Dispatch(reminder, _tlsEntityConfig.SnsTopicArn); }
private async Task <TlsEntityState> LoadState(string id, string messageType) { TlsEntityState state = await _dao.Get(id); if (state == null) { state = new TlsEntityState(id); _log.LogError("Processing {EventName} - Tls Entity State does not exist for {Id}, creating new state.", messageType, id); await _dao.Save(state); _log.LogError("Tls Entity State created for {Id}.", id); TlsEntityCreated mxEntityCreated = new TlsEntityCreated(id); _dispatcher.Dispatch(mxEntityCreated, _tlsEntityConfig.SnsTopicArn); _log.LogInformation("Created _tlsEntityConfig for {Id}.", id); } return(state); }
public void DoesNotNotifyWhenNoChanges_DataInRecords() { Guid messageId = Guid.NewGuid(); string errorMessage = "An error has occured"; TlsRecords existingTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId, EvaluatorResult.FAIL, errorMessage))); TlsEntityState existingState = CreateEntityStateWithMessages(existingTlsRecords); TlsRecords newTlsRecords = CreateTlsRecords( new TlsRecord(new TlsEvaluatedResult(messageId, EvaluatorResult.FAIL, errorMessage))); _advisoryChangedNotifier.Handle(existingState, CreateTlsResultsEvaluatedWithResults(newTlsRecords), new List <string> { "test.gov.uk" }); A.CallTo(() => _messageDispatcher.Dispatch(A <Message> ._, A <string> ._, A <string> ._)).MustNotHaveHappened(); }
public async Task <TlsEntityState> Get(string hostname) { string connectionString = await _connectionInfo.GetConnectionStringAsync(); TlsEntityState result = null; using (MySqlConnection connection = new MySqlConnection(connectionString)) { await connection.OpenAsync(); using (DbDataReader reader = await MySqlHelper.ExecuteReaderAsync(connection, TlsEntityDaoResources.GetTlsEntity, new MySqlParameter("hostname", ReverseUrl(hostname)))) { while (await reader.ReadAsync()) { result = JsonConvert.DeserializeObject <TlsEntityState>(reader.GetString("state")); } } connection.Close(); } return(result); }