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));
                }
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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))));
        }