public async Task Handle(DkimRecordEvaluationResult message)
        {
            string id = message.Id.ToLower();

            DkimEntityState state = await LoadDkimState(id, message.Timestamp, nameof(DkimRecordEvaluationResult));

            if (!state.CanUpdate(nameof(DkimRecordEvaluationResult).ToLower(), message.Timestamp))
            {
                _log.LogInformation("Cannot handle event DkimRecordEvaluationResult as newer state exists for {id}.");
                return;
            }

            _changeNotifierComposite.Handle(state, message);
            _domainStatusPublisher.Publish(message);

            List <DkimSelector> selectors = message.ToDkimSelectors();

            state.UpdateRecords(selectors, message.Timestamp);

            DkimEvaluationUpdated evaluationUpdated = state.UpdateEvaluations(message.Timestamp);

            state.Version++;
            state.UpdateSource(nameof(DkimRecordEvaluationResult).ToLower(), message.Timestamp);
            await _dao.Save(state);

            _dispatcher.Dispatch(evaluationUpdated, _config.SnsTopicArn);
            _log.LogInformation("Updated DkimEntity evaluation results for {Id}", id);
        }
        public void Publish(DkimRecordEvaluationResult message)
        {
            if (message.SelectorResults is null || message.SelectorResults.Count == 0)
            {
                return;
            }

            List <Contracts.SharedDomain.DkimSelector> selectors = message.SelectorResults?.Select(x => x.Selector).ToList();

            IEnumerable <SharedDomainMessage> pollErrors = selectors
                                                           .Where(x => x.PollError != null)
                                                           .Select(x => x.PollError);

            IEnumerable <SharedDomainMessage> selectorMessages = selectors
                                                                 .Where(x => x.Records != null)
                                                                 .SelectMany(x => x.Records)
                                                                 .Where(x => x.Messages != null)
                                                                 .SelectMany(x => x.Messages);

            IEnumerable <SharedDomainMessage> messages = pollErrors.Concat(selectorMessages);

            List <DkimEvaluatorMessage> recordResults = message.SelectorResults.SelectMany(x => x.RecordsResults)
                                                        .SelectMany(x => x.Messages).ToList();

            Status status = _domainStatusEvaluator.GetStatus(recordResults.ToList(), messages.ToList());

            DomainStatusEvaluation domainStatusEvaluation = new DomainStatusEvaluation(message.Id, "DKIM", status);

            _log.LogInformation($"Publishing DKIM domain status for {message.Id}.");

            _dispatcher.Dispatch(domainStatusEvaluation, _spfEntityConfig.SnsTopicArn);
        }
예제 #3
0
        public void DoesNotNotifyWhenNewSelectorHasNoRecord()
        {
            Guid Id = Guid.NewGuid();

            DkimEntityState oldState = new DkimEntityState("", 0, DkimState.PollPending, DateTime.MinValue, DateTime.MinValue, DateTime.MaxValue, new List <DkimSelector>
            {
                CreateDkimSelector("selector1", new List <Message>
                {
                    new Message(Id, "selector 1 record 1 message 1", string.Empty, MessageType.Info)
                })
            });

            DkimRecordEvaluationResult newRecord = new DkimRecordEvaluationResult(null, new List <DkimSelectorResult>
            {
                CreateDkimSelectorResult("selector1", new List <DkimEvaluatorMessage>
                {
                    new DkimEvaluatorMessage(Id, EvaluationErrorType.Info, "selector 1 record 1 message 1 same as old", string.Empty)
                }),

                new DkimSelectorResult(new Contracts.SharedDomain.DkimSelector("rogueSelector"), null)
            });

            _advisoryChangedNotifier.Handle(oldState, newRecord);

            A.CallTo(() => _messageDispatcher.Dispatch(A <Common.Messaging.Abstractions.Message> ._, A <string> ._)).MustNotHaveHappened();
        }
예제 #4
0
        public void NotifiesWhenSelectorRemoved()
        {
            Guid Id1 = Guid.NewGuid();

            DkimEntityState oldState = new DkimEntityState("", 0, DkimState.PollPending, DateTime.MinValue, DateTime.MinValue, DateTime.MaxValue, new List <DkimSelector>
            {
                CreateDkimSelector("selector1", new List <Message>
                {
                    new Message(Id1, "selector 1 record 1 message 1", string.Empty, MessageType.Info)
                }),
                CreateDkimSelector("selector2", new List <Message>
                {
                    new Message(Guid.NewGuid(), "selector 2 record 1 message 1", string.Empty, MessageType.Info)
                })
            });

            DkimRecordEvaluationResult newRecord = new DkimRecordEvaluationResult(null, new List <DkimSelectorResult>
            {
                CreateDkimSelectorResult("selector1", new List <DkimEvaluatorMessage>
                {
                    new DkimEvaluatorMessage(Id1, EvaluationErrorType.Info, "selector 1 record 1 message 1", string.Empty)
                })
            });

            _advisoryChangedNotifier.Handle(oldState, newRecord);

            A.CallTo(() => _messageDispatcher.Dispatch(A <DkimAdvisoryRemoved> ._, A <string> ._)).MustHaveHappenedOnceExactly();
            A.CallTo(() => _messageDispatcher.Dispatch(A <DkimAdvisoryAdded> ._, A <string> ._)).MustNotHaveHappened();

            A.CallTo(() =>
                     _messageDispatcher.Dispatch(
                         A <DkimAdvisoryRemoved> .That.Matches(x =>
                                                               x.SelectorMessages[0].Selector == "selector2" && (MessageType)x.SelectorMessages[0].Messages[0].MessageType == MessageType.Info &&
                                                               x.SelectorMessages[0].Messages[0].Text == "selector 2 record 1 message 1"), A <string> ._)).MustHaveHappenedOnceExactly();
        }
        public async Task HandleDkimEvaluationUpdateSuccessful()
        {
            DkimEntityState dkimEntityState = A.Fake <DkimEntityState>();

            A.CallTo(() => dkimEntityState.Id).Returns(Id);
            A.CallTo(() => dkimEntityState.CanUpdate(A <string> ._, A <DateTime> ._)).Returns(true);

            A.CallTo(() => _dkimEntityDao.Get(Id)).Returns(dkimEntityState);

            DkimRecordEvaluationResult dkimRecordEvaluationResult = new DkimRecordEvaluationResult(Id, new List <DkimSelectorResult>());
            await _dkimEntity.Handle(dkimRecordEvaluationResult);

            A.CallTo(() => _dkimEntityDao.Save(dkimEntityState)).MustHaveHappened();
            A.CallTo(() => _dispatcher.Dispatch(A <DkimEvaluationUpdated> ._, A <string> ._)).MustHaveHappened();
        }
        public Task Handle(DkimRecordsPolled message)
        {
            List <DkimSelector> selectors = message.ToDkimRecords();

            _log.LogInformation("Evaluating DKIM selectors record for {Domain}", message.Id);

            List <DkimSelectorRecords> dkimSelectorRecords = _dkimSelectorRecordsParser.Parse(selectors);

            _log.LogInformation("Evaluated DKIM selectors record for {Domain}", message.Id);

            DkimRecordEvaluationResult dkimRecordEvaluationResult = dkimSelectorRecords.MapToEvaluationResult(message.Id);

            _dispatcher.Dispatch(dkimRecordEvaluationResult, _config.SnsTopicArn);

            _log.LogInformation("Published DKIM results for {Domain}", message.Id);

            return(Task.CompletedTask);
        }
        public async Task HandleDkimRecordEvaluationResultRemovesPolledErrorSelectors()
        {
            DkimRecordEvaluationResult message = new DkimRecordEvaluationResult(
                Id, new List <DkimSelectorResult>
            {
                new DkimSelectorResult(new Contracts.SharedDomain.DkimSelector("selector", null, null, new Contracts.SharedDomain.Message(Guid.Empty, Contracts.SharedDomain.MessageType.error, "error", "markdown")), new List <RecordResult>())
            });

            message.Timestamp = DateTime.UtcNow;

            DkimEntityState dkimEntityState = new DkimEntityState(Id, 1, DkimState.PollPending, DateTime.Now, null, null, new List <DkimSelector>());

            dkimEntityState.Selectors.Add(new DkimSelector("selector1"));

            A.CallTo(() => _dkimEntityDao.Get(Id)).Returns(dkimEntityState);

            await _dkimEntity.Handle(message);

            A.CallTo(() => _dkimEntityDao.Save(A <DkimEntityState> .That.Matches(x => x.Selectors.Count == 0))).MustHaveHappenedOnceExactly();
        }
        public async Task HandleDkimRecordEvaluationResultUpdatesPolledSelectors()
        {
            DkimRecordEvaluationResult message = new DkimRecordEvaluationResult(
                Id, new List <DkimSelectorResult>
            {
                new DkimSelectorResult(new Contracts.SharedDomain.DkimSelector("selector1", null), new List <RecordResult> {
                    new RecordResult("record1", new List <DkimEvaluatorMessage>())
                })
            });

            message.Timestamp = DateTime.UtcNow;

            DkimEntityState dkimEntityState = new DkimEntityState(Id, 1, DkimState.PollPending, DateTime.Now, null, null, new List <DkimSelector>());

            dkimEntityState.Selectors.Add(new DkimSelector("selector1"));

            A.CallTo(() => _dkimEntityDao.Get(Id)).Returns(dkimEntityState);

            await _dkimEntity.Handle(message);

            A.CallTo(() => _dkimEntityDao.Save(A <DkimEntityState> .That.Matches(x => x.Selectors.Count == 1 && x.Selectors[0].Selector == "selector1"))).MustHaveHappenedOnceExactly();
        }
예제 #9
0
        public void StatusIsDeterminedAndDispatched()
        {
            Message pollError         = CreateMessage();
            Message dkimRecordMessage = CreateMessage();
            DkimEvaluatorMessage dkimEvaluatorMessage = CreateDkimEvaluatorMessage();

            DkimRecordEvaluationResult message = new DkimRecordEvaluationResult("testDomain",
                                                                                new List <DkimSelectorResult>
            {
                new DkimSelectorResult(
                    new DkimSelector("",
                                     new List <DkimRecord> {
                    new DkimRecord(null, new List <Message> {
                        dkimRecordMessage
                    })
                }, "",
                                     pollError),
                    new List <RecordResult>
                {
                    new RecordResult("", new List <DkimEvaluatorMessage> {
                        dkimEvaluatorMessage
                    })
                })
            });

            A.CallTo(() => _domainStatusEvaluator.GetStatus(A <List <DkimEvaluatorMessage> > .That.Matches(x => x.Contains(dkimEvaluatorMessage)), A <List <Message> > .That.Matches(x => x.Contains(pollError) && x.Contains(dkimRecordMessage)))).Returns(Status.Warning);

            _domainStatusPublisher.Publish(message);

            Expression <Func <DomainStatusEvaluation, bool> > predicate = x =>
                                                                          x.Status == Status.Warning &&
                                                                          x.RecordType == "DKIM" &&
                                                                          x.Id == "testDomain";

            A.CallTo(() => _dispatcher.Dispatch(A <DomainStatusEvaluation> .That.Matches(predicate), "testSnsTopicArn")).MustHaveHappenedOnceExactly();
        }
예제 #10
0
 public static List <DkimSelector> ToDkimSelectors(this DkimRecordEvaluationResult evaluationResult)
 {
     return(evaluationResult.SelectorResults.Select(_ => _.ToDkimSelector()).ToList());
 }