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);
        }
Esempio n. 4
0
 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();
        }
Esempio n. 14
0
        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
            }
        }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
        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);
        }