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); }
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(); }
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(); }
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(); }
public static List <DkimSelector> ToDkimSelectors(this DkimRecordEvaluationResult evaluationResult) { return(evaluationResult.SelectorResults.Select(_ => _.ToDkimSelector()).ToList()); }