public static List <DenormalisedRecord> ToDenormalisedRecord(this AggregateReportInfo aggregateReportInfo) { Domain.Dmarc.AggregateReport aggregateReport = aggregateReportInfo.AggregateReport; string originalUri = aggregateReportInfo.EmailMetadata.OriginalUri; return(aggregateReport.Records.Select(record => new DenormalisedRecord( originalUri, aggregateReport.ReportMetadata?.OrgName, aggregateReport.ReportMetadata?.Email, aggregateReport.ReportMetadata?.ExtraContactInfo, aggregateReport.ReportMetadata.Range.Begin.ToDateTime(), aggregateReport.ReportMetadata.Range.End.ToDateTime(), aggregateReport.PolicyPublished?.Domain, aggregateReport.PolicyPublished?.Adkim, aggregateReport.PolicyPublished?.Aspf, aggregateReport.PolicyPublished.P, aggregateReport.PolicyPublished?.Sp, aggregateReport.PolicyPublished?.Pct, record.Row?.SourceIp, record.Row.Count, record.Row?.PolicyEvaluated?.Disposition, record.Row?.PolicyEvaluated?.Dkim, record.Row.PolicyEvaluated.Spf, record.Row?.PolicyEvaluated?.Reasons != null ? string.Join(",", record.Row?.PolicyEvaluated?.Reasons.Select(_ => _.PolicyOverride.ToString())) : null, record.Row?.PolicyEvaluated?.Reasons != null ? string.Join(",", record.Row?.PolicyEvaluated?.Reasons.Where(_ => _.Comment != null).Select(_ => _.Comment.ToString())) : null, record.Identifiers?.EnvelopeTo, record.Identifiers?.HeaderFrom, record.AuthResults?.Dkim != null ? string.Join(",", record.AuthResults?.Dkim.Where(_ => _.Domain != null).Select(_ => _.Domain)) : null, record.AuthResults?.Dkim != null ? string.Join(",", record.AuthResults?.Dkim.Select(_ => _.Result)) : null, record.AuthResults?.Dkim != null ? string.Join(",", record.AuthResults?.Dkim.Where(_ => _.HumanResult != null).Select(_ => _.HumanResult)) : null, record.AuthResults?.Spf != null ? string.Join(",", record.AuthResults?.Spf.Where(_ => _.Domain != null).Select(_ => _.Domain)) : null, record.AuthResults?.Spf != null ? string.Join(",", record.AuthResults?.Spf.Select(_ => _.Result)) : null)).ToList()); }
public AggregateReportInfo Deserialise(AttachmentInfo attachment, EmailMetadata emailMetadata) { using (Stream stream = attachment.GetStream()) { using (StreamReader streamReader = new StreamReader(stream)) { using (XmlReader reader = XmlReader.Create(streamReader)) { XDocument document = XDocument.Load(reader); XElement feedback = document.Root; if (document.Root.Name != "feedback") { throw new ArgumentException("Root of aggregate report must be feedback."); } ReportMetadata reportMetadata = _reportMetadataDeserialiser.Deserialise(feedback.Single("report_metadata")); PolicyPublished policyPublished = _policyPublishedDeserialiser.Deserialise(feedback.Single("policy_published")); IEnumerable <XElement> recordElements = feedback.Where("record").ToList(); if (!recordElements.Any()) { throw new ArgumentException("Aggregate report must contain at least 1 record."); } Record[] records = _recordDeserialiser.Deserialise(recordElements); Domain.Dmarc.AggregateReport aggregateReport = new Domain.Dmarc.AggregateReport(reportMetadata, policyPublished, records); return(new AggregateReportInfo(aggregateReport, emailMetadata, attachment.AttachmentMetadata)); } } } }
private AggregateReportInfo CreateReportInfo(DkimAuthResult[] dkimAuthResults = null, SpfAuthResult[] spfAuthResults = null) { Domain.Dmarc.AggregateReport aggregateReport = new Domain.Dmarc.AggregateReport(1.0, new ReportMetadata("org", "*****@*****.**", "extra", "reportid", new DateRange(1, 2), new [] { "error" }), new PolicyPublished("abc.com", Alignment.r, Alignment.r, Disposition.none, Disposition.none, 0, "fo"), new Record[] { new Record(new Row("source", 1, new PolicyEvaluated(Disposition.none, DmarcResult.pass, DmarcResult.pass, new PolicyOverrideReason[0])), new Identifier("envelopeTo", "envelopeFrom", "headerFrom"), new AuthResult(dkimAuthResults ?? new DkimAuthResult[] {}, spfAuthResults ?? new SpfAuthResult[] {})) }); EmailMetadata emailMetadata = new EmailMetadata("org", "filename", 10); AttachmentInfo attachmentInfo = new AttachmentInfo(new AttachmentMetadata("filename"), Stream.Null); return(new AggregateReportInfo(aggregateReport, emailMetadata, attachmentInfo)); }
public AggregateReportInfo Deserialise(AttachmentInfo attachment, EmailMetadata emailMetadata) { attachment.AttachmentStream.Seek(0, SeekOrigin.Begin); using (StreamReader streamReader = new StreamReader(attachment.AttachmentStream, Encoding.UTF8, true, 1024, true)) { using (XmlReader reader = XmlReader.Create(streamReader)) { XDocument document = XDocument.Load(reader); XElement feedback = document.Root; if (document.Root != null && document.Root.Name != "feedback") { throw new ArgumentException("Root of aggregate report must be feedback."); } XElement versionElement = feedback.SingleOrDefault("version"); double? version = double.TryParse(versionElement?.Value, out var candidateVersion) ? candidateVersion : (double?)null; ReportMetadata reportMetadata = _reportMetadataDeserialiser.Deserialise(feedback.Single("report_metadata")); PolicyPublished policyPublished = _policyPublishedDeserialiser.Deserialise(feedback.Single("policy_published")); IEnumerable <XElement> recordElements = feedback.Where("record").ToList(); if (!recordElements.Any()) { throw new ArgumentException("Aggregate report must contain at least 1 record."); } Record[] records = _recordDeserialiser.Deserialise(recordElements); Domain.Dmarc.AggregateReport aggregateReport = new Domain.Dmarc.AggregateReport(version, reportMetadata, policyPublished, records); return(new AggregateReportInfo(aggregateReport, emailMetadata, attachment)); } } }
private static Domain.Dmarc.AggregateReport Create(Action <Domain.Dmarc.AggregateReport> setter, int policyOverrideCount = 1, int dkimAuthResultCount = 1, int spfAuthResultCount = 1) { PolicyOverrideReason[] policyOverrideReasons = Enumerable.Range(0, policyOverrideCount).Select(_ => new PolicyOverrideReason()).ToArray(); DkimAuthResult[] dkimAuthResults = Enumerable.Range(0, dkimAuthResultCount).Select(_ => new DkimAuthResult()).ToArray(); SpfAuthResult[] spfAuthResults = Enumerable.Range(0, spfAuthResultCount).Select(_ => new SpfAuthResult()).ToArray(); var aggregateReport = new Domain.Dmarc.AggregateReport { ReportMetadata = new ReportMetadata { Range = new DateRange() }, PolicyPublished = new PolicyPublished(), Records = new[] { new Record { Identifiers = new Identifier(), Row = new Row { PolicyEvaluated = new PolicyEvaluated { Reasons = policyOverrideReasons } }, AuthResults = new AuthResult { Dkim = dkimAuthResults, Spf = spfAuthResults } } } }; setter(aggregateReport); return(aggregateReport); }
public void MappingTests <TOut>(TOut expected, Domain.Dmarc.AggregateReport aggregateReport, Func <DenormalisedRecord, TOut> actualGetter) { IEnumerable <DenormalisedRecord> denormalisedRecords = _denormalisedRecordConverter.ToDenormalisedRecord(aggregateReport, string.Empty); Assert.That(expected, Is.EqualTo(actualGetter(denormalisedRecords.ElementAt(0)))); }