├── Jenkinsfile ├── LICENSE ├── README.md ├── RELEASE ├── Terraform ├── common │ └── common │ │ ├── provider.tf │ │ ├── route53-1st-domain.tf │ │ ├── route53-2nd-domain.tf │ │ ├── route53-staging-domain.tf │ │ ├── s3-prod.tf │ │ ├── s3-staging.tf │ │ ├── ses.tf │ │ └── variables.tf ├── modules │ ├── ECScluster-module │ │ ├── cloudwatch-alarms.tf │ │ ├── cluster-iam-roles.tf │ │ ├── cluster.tf │ │ ├── ecs-autoscaling.tf │ │ ├── launch-configuration.tf │ │ ├── outputs.tf │ │ ├── scaling-policy.tf │ │ ├── security-groups.tf │ │ └── variables.tf │ ├── Microservice-module │ │ ├── elasticache.tf │ │ ├── input-sqs-queue-subscriptions.tf │ │ ├── input-sqs-queue.tf │ │ ├── output-sns-topic.tf │ │ ├── outputs.tf │ │ ├── service.tf │ │ └── variables.tf │ ├── auroraBackup-module │ │ ├── cloudwatch-alarms.tf │ │ ├── lambda-function.tf │ │ ├── lambda-packages │ │ │ ├── copy_snapshots_dest_aurora.zip │ │ │ ├── copy_snapshots_no_x_account_aurora.zip │ │ │ ├── delete_old_snapshots_aurora.zip │ │ │ ├── delete_old_snapshots_dest_aurora.zip │ │ │ ├── delete_old_snapshots_no_x_account_aurora.zip │ │ │ ├── share_snapshots_aurora.zip │ │ │ ├── snapshots_tool_utils.py │ │ │ └── take_snapshots_aurora.zip │ │ ├── lambdas-iam.tf │ │ ├── output-sns-topic.tf │ │ ├── outputs.tf │ │ ├── scheduler.tf │ │ ├── state-machine-iam.tf │ │ ├── state-machine.tf │ │ └── variables.tf │ ├── lambdaProcessor-module │ │ ├── lambda-function.tf │ │ ├── lambdas-iam.tf │ │ ├── output-sns-topic.tf │ │ ├── outputs.tf │ │ ├── scheduler.tf │ │ └── variables.tf │ ├── loadBalancer-module │ │ ├── alb-listener.tf │ │ ├── alb-rule.tf │ │ ├── alb-target.tf │ │ ├── alb.tf │ │ ├── data.tf │ │ ├── outputs.tf │ │ ├── route53.tf │ │ ├── s3.tf │ │ ├── security-groups.tf │ │ └── variables.tf │ └── sourceip-module │ │ ├── ip-lists.tf │ │ ├── outputs.tf │ │ └── source-ip-template.tf └── prod-env │ └── prod-env │ ├── aggregate-report-processor-large.tf │ ├── aggregate-report-processor-small.tf │ ├── aurora-backup-source.tf │ ├── cloudwatch-dashboard-main.tf │ ├── cloudwatch-dashboard-queues.tf │ ├── cloudwatch-dashboard-s3.tf │ ├── cluster-api.tf │ ├── cluster-frontend.tf │ ├── cluster-processor.tf │ ├── dashboard-main.tf │ ├── dnsrecord-dmarc-processor.tf │ ├── dnsrecord-mx-processor.tf │ ├── dnsrecord-spf-processor.tf │ ├── loadbalancer-external.tf │ ├── loadbalancer-internal.tf │ ├── microservice-adminapi.tf │ ├── microservice-aggregatereportapi.tf │ ├── microservice-certificate-evaluator.tf │ ├── microservice-dkim.tf │ ├── microservice-dmarcrecordevaluator.tf │ ├── microservice-domainstatusapi.tf │ ├── microservice-frontend.tf │ ├── microservice-metricsapi.tf │ ├── microservice-reports.tf │ ├── microservice-reverse-dns.tf │ ├── microservice-securityevaluator.tf │ ├── microservice-securitytester.tf │ ├── microservice-spf.tf │ ├── microservice-spfrecordevaluator.tf │ ├── provider.tf │ ├── quicksight-rds-security-group.tf │ ├── rds-cluster.tf │ ├── rds-iam.tf │ ├── route53.tf │ ├── s3-email-bucket.tf │ ├── s3-notification-sqs.tf │ ├── s3-rds-data-export.tf │ ├── security-groups.tf │ ├── sns-cloudwatch-alerts.tf │ ├── sns-topics.tf │ ├── sourceip-module.tf │ ├── sqs-queue-aggregate.tf │ ├── terraform-backend.tf │ ├── terraform-tfstate.tf │ ├── variables.tf │ ├── vpc-endpoints.tf │ ├── vpc-peering.tf │ └── vpc-subnets.tf ├── apply_schema_changes └── src ├── angular └── dmarc-service │ ├── README.md │ ├── angular-cli.json │ ├── e2e │ ├── app.e2e-spec.ts │ ├── app.po.ts │ └── tsconfig.json │ ├── package.json │ ├── protractor.conf.js │ ├── src │ ├── app │ │ ├── aggregate-report │ │ │ ├── aggregate-report.module.ts │ │ │ ├── components │ │ │ │ ├── aggregate-report-dmarc-dash │ │ │ │ │ ├── aggregate-report-dmarc-dash.component.css │ │ │ │ │ ├── aggregate-report-dmarc-dash.component.html │ │ │ │ │ └── aggregate-report-dmarc-dash.component.ts │ │ │ │ ├── chart │ │ │ │ │ ├── chart.component.css │ │ │ │ │ ├── chart.component.html │ │ │ │ │ ├── chart.component.ts │ │ │ │ │ ├── doughnut-chart.component.ts │ │ │ │ │ ├── horizontal-stacked-bar-chart.component.ts │ │ │ │ │ └── stacked-bar-chart.component.ts │ │ │ │ ├── filter │ │ │ │ │ ├── filter.component.css │ │ │ │ │ ├── filter.component.html │ │ │ │ │ ├── filter.component.ts │ │ │ │ │ └── filtervalues.model.ts │ │ │ │ └── headline │ │ │ │ │ ├── headline.component.css │ │ │ │ │ ├── headline.component.html │ │ │ │ │ └── headline.component.ts │ │ │ ├── configuration │ │ │ │ └── aggregate-report-dmarc-dash.config.ts │ │ │ ├── factory │ │ │ │ └── statistics-service.factory.ts │ │ │ ├── mappers │ │ │ │ ├── aggregated-compliance-statistics.mapper.ts │ │ │ │ ├── aggregated-disposition-statistics.mapper.ts │ │ │ │ ├── aggregated-headline-statistics.mapper.ts │ │ │ │ ├── aggregated-trust-statistics.mapper.ts │ │ │ │ ├── daily-compliance-statistics.mapper.ts │ │ │ │ ├── daily-disposition-statistics.mapper.ts │ │ │ │ ├── daily-trust-statistics.mapper.ts │ │ │ │ ├── dataset.model.ts │ │ │ │ ├── response-mapper.interface.ts │ │ │ │ ├── senders-dkim-only.mapper.ts │ │ │ │ ├── senders-spf-only.mapper.ts │ │ │ │ ├── senders-trusted.mapper.ts │ │ │ │ └── senders-untrusted.mapper.ts │ │ │ └── services │ │ │ │ ├── aggregated-headline-statistics.model.ts │ │ │ │ ├── domain-search.service.ts │ │ │ │ ├── statistics-service.ts │ │ │ │ └── statistics-source.interface.ts │ │ ├── app.component.css │ │ ├── app.component.html │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── app.routing.ts │ │ ├── banner │ │ │ └── banner.component.tsx │ │ ├── dns-record │ │ │ ├── components │ │ │ │ ├── dmarc │ │ │ │ │ ├── dmarc.component.css │ │ │ │ │ ├── dmarc.component.html │ │ │ │ │ └── dmarc.component.ts │ │ │ │ ├── dns-record-dash-domain │ │ │ │ │ ├── dns-record-dash-domain.component.css │ │ │ │ │ ├── dns-record-dash-domain.component.html │ │ │ │ │ ├── dns-record-dash-domain.component.spec.ts │ │ │ │ │ └── dns-record-dash-domain.component.ts │ │ │ │ ├── dns-record-dash │ │ │ │ │ ├── dns-record-dash.component.css │ │ │ │ │ ├── dns-record-dash.component.html │ │ │ │ │ ├── dns-record-dash.component.spec.ts │ │ │ │ │ └── dns-record-dash.component.ts │ │ │ │ ├── dns-record-search │ │ │ │ │ ├── dns-record-search.component.css │ │ │ │ │ ├── dns-record-search.component.html │ │ │ │ │ ├── dns-record-search.component.spec.ts │ │ │ │ │ └── dns-record-search.component.ts │ │ │ │ ├── dns-record-table │ │ │ │ │ ├── dns-record-table.component.css │ │ │ │ │ ├── dns-record-table.component.html │ │ │ │ │ ├── dns-record-table.component.spec.ts │ │ │ │ │ └── dns-record-table.component.ts │ │ │ │ ├── domain-security-header │ │ │ │ │ ├── domain-security-header.component.css │ │ │ │ │ ├── domain-security-header.component.html │ │ │ │ │ ├── domain-security-header.component.spec.ts │ │ │ │ │ └── domain-security-header.component.ts │ │ │ │ ├── no-results │ │ │ │ │ ├── no-results.component.css │ │ │ │ │ └── no-results.component.html │ │ │ │ ├── pagination-display │ │ │ │ │ ├── pagination-display.component.css │ │ │ │ │ ├── pagination-display.component.html │ │ │ │ │ ├── pagination-display.component.spec.ts │ │ │ │ │ └── pagination-display.component.ts │ │ │ │ ├── spf │ │ │ │ │ ├── spf.component.css │ │ │ │ │ ├── spf.component.html │ │ │ │ │ ├── spf.component.spec.ts │ │ │ │ │ └── spf.component.ts │ │ │ │ ├── status-control │ │ │ │ │ └── status-control.component.spec.ts │ │ │ │ └── tls │ │ │ │ │ ├── tls.component.css │ │ │ │ │ ├── tls.component.html │ │ │ │ │ └── tls.component.ts │ │ │ ├── dns-record.module.ts │ │ │ ├── long-tag-splitter.pipe.ts │ │ │ ├── models │ │ │ │ ├── anti-spoofing.model.ts │ │ │ │ ├── certificate.model.ts │ │ │ │ ├── dmarc-config.model.ts │ │ │ │ ├── dmarc-record.model.ts │ │ │ │ ├── domain-security-info.model.ts │ │ │ │ ├── domain.model.ts │ │ │ │ ├── domains-security-info.model.ts │ │ │ │ ├── mx-record.model.ts │ │ │ │ ├── receiving_encrypted.model.ts │ │ │ │ ├── spf-config.model.ts │ │ │ │ ├── spf-record.model.ts │ │ │ │ └── tls-result.model.ts │ │ │ └── services │ │ │ │ ├── dns-record-info.service.ts │ │ │ │ ├── page.service.ts │ │ │ │ └── search.service.ts │ │ ├── footer │ │ │ ├── footer.component.css │ │ │ ├── footer.component.html │ │ │ └── footer.component.ts │ │ ├── http.service.ts │ │ ├── img │ │ │ ├── logo.png │ │ │ └── ncsc-white.png │ │ ├── nav-bar │ │ │ ├── nav-bar.component.css │ │ │ ├── nav-bar.component.html │ │ │ └── nav-bar.component.ts │ │ ├── shared │ │ │ ├── pipes │ │ │ │ └── large-number.pipe.ts │ │ │ └── shared.module.ts │ │ ├── terms-and-conditions │ │ │ ├── terms-and-conditions.component.css │ │ │ ├── terms-and-conditions.component.html │ │ │ └── terms-and-conditions.component.ts │ │ ├── user.service.ts │ │ └── utils │ │ │ ├── date.utils.ts │ │ │ └── string.utils.ts │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.png │ ├── index.html │ ├── karma.conf.js │ ├── main.ts │ ├── polyfills.ts │ ├── react │ │ ├── components │ │ │ ├── banner │ │ │ │ ├── banner.component.tsx │ │ │ │ └── index.ts │ │ │ ├── domain-admin │ │ │ │ ├── domain-admin.component.tsx │ │ │ │ └── index.ts │ │ │ ├── domain-list │ │ │ │ ├── domain-list.component.tsx │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── pagination-display │ │ │ │ ├── index.ts │ │ │ │ └── pagination-display.component.tsx │ │ │ ├── pagination │ │ │ │ ├── index.ts │ │ │ │ └── pagination.component.tsx │ │ │ ├── permissions │ │ │ │ ├── index.ts │ │ │ │ └── permissions.component.tsx │ │ │ ├── search-box │ │ │ │ ├── index.ts │ │ │ │ └── search-box.component.tsx │ │ │ ├── user-admin │ │ │ │ ├── index.ts │ │ │ │ └── user-admin.component.tsx │ │ │ ├── user-list │ │ │ │ ├── index.ts │ │ │ │ └── user-list.component.tsx │ │ │ └── user │ │ │ │ ├── index.ts │ │ │ │ └── user.component.tsx │ │ ├── containers │ │ │ ├── header │ │ │ │ ├── header.container.tsx │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── services │ │ │ └── mail-check-api.service.ts │ │ ├── store.ts │ │ └── stores │ │ │ ├── index.ts │ │ │ ├── root.reducer.ts │ │ │ └── user │ │ │ ├── index.ts │ │ │ └── user.ts │ ├── styles.css │ ├── test.ts │ └── tsconfig.json │ ├── tslint.json │ ├── webpack.config.js │ ├── webpack.dev.config.js │ └── yarn.lock ├── docker ├── frontend │ ├── Dockerfile │ ├── apache2.conf │ └── public_html │ │ └── healthcheck │ │ └── index.html └── microservice │ └── Dockerfile ├── dotnet └── Dmarc │ ├── Dmarc.sln │ └── src │ ├── Dmarc.Admin.Api.Test │ ├── Controllers │ │ └── DomainContollerTests.cs │ ├── Dao │ │ ├── Domain │ │ │ └── DomainDaoTests.cs │ │ ├── Group │ │ │ └── GroupDaoTests.cs │ │ ├── GroupDomain │ │ │ └── GroupDomainDaoTests.cs │ │ ├── GroupUser │ │ │ └── GroupUserDaoTests.cs │ │ ├── Search │ │ │ └── SearchDaoTests.cs │ │ ├── TestHelpers.cs │ │ └── User │ │ │ └── UserDaoTests.cs │ ├── Dmarc.Admin.Api.Test.csproj │ └── Validation │ │ ├── AllEntitiesSearchRequestValidatorTests.cs │ │ ├── ChangeMembershipRequestValidatorTest.cs │ │ ├── EntitySearchRequestValidatorTests.cs │ │ ├── GetEntitiesByRelatedIdRequestValidatorTests.cs │ │ ├── GroupForCreationValidatorTests.cs │ │ ├── PublicDomainValidatorTests.cs │ │ └── UserForCreationValidatorTests.cs │ ├── Dmarc.Admin.Api │ ├── Config │ │ └── AdminApiConfig.cs │ ├── Contract │ │ └── Messages │ │ │ └── DomainCreated.cs │ ├── Controllers │ │ ├── DomainContoller.cs │ │ ├── GroupContoller.cs │ │ ├── SearchController.cs │ │ └── UserController.cs │ ├── Dao │ │ ├── Domain │ │ │ ├── DomainDao.cs │ │ │ ├── DomainDaoResources.Designer.cs │ │ │ └── DomainDaoResources.resx │ │ ├── Group │ │ │ ├── GroupDao.cs │ │ │ ├── GroupDaoResources.Designer.cs │ │ │ └── GroupDaoResources.resx │ │ ├── GroupDomain │ │ │ ├── GroupDomainDao.cs │ │ │ ├── GroupDomainDaoResources.Designer.cs │ │ │ └── GroupDomainDaoResources.resx │ │ ├── GroupUser │ │ │ ├── GroupUserDao.cs │ │ │ ├── GroupUserDaoResources.Designer.cs │ │ │ └── GroupUserDaoResources.resx │ │ ├── Search │ │ │ ├── SearchDao.cs │ │ │ ├── SearchDaoResources.Designer.cs │ │ │ └── SearchDaoResources.resx │ │ └── User │ │ │ ├── UserDao.cs │ │ │ ├── UserDaoResources.Designer.cs │ │ │ └── UserDaoResources.resx │ ├── Dmarc.Admin.Api.csproj │ ├── DockerFile │ ├── Domain │ │ ├── AllEntitiesSearchRequest.cs │ │ ├── ChangeMembershipRequest.cs │ │ ├── Domain.cs │ │ ├── DomainForCreation.cs │ │ ├── DomainPermission.cs │ │ ├── EntitySearchRequest.cs │ │ ├── GetEntitiesByRelatedIdRequest.cs │ │ ├── Group.cs │ │ ├── GroupForCreation.cs │ │ ├── Permission.cs │ │ ├── PublicDomainForCreation.cs │ │ ├── Result.cs │ │ ├── SearchResult.cs │ │ ├── User.cs │ │ ├── UserForCreation.cs │ │ └── UserPermissions.cs │ ├── Program.cs │ ├── StartUp.cs │ └── Validation │ │ ├── AllEntitiesSearchRequestValidator.cs │ │ ├── ChangeMembershipRequestValidator.cs │ │ ├── DomainForCreationValidator.cs │ │ ├── EntitySearchRequestValidator.cs │ │ ├── GetEntitiesByRelatedIdRequestValidator.cs │ │ ├── GroupForCreationValidator.cs │ │ ├── PublicDomainValidator.cs │ │ ├── SearchRegex.cs │ │ └── UserForCreationValidator.cs │ ├── Dmarc.AggregateReport.Api.Test │ ├── Dmarc.AggregateReport.Api.Test.csproj │ └── Validation │ │ ├── DateRangeDomainValidatorTests.cs │ │ └── DomainSearchValidatorTests.cs │ ├── Dmarc.AggregateReport.Api │ ├── Controllers │ │ ├── AggregatedStatisticsController.cs │ │ ├── DailyStatisticsController.cs │ │ ├── DateRangeDomainController.cs │ │ ├── DomainsController.cs │ │ └── SenderStatisticsController.cs │ ├── Dao │ │ ├── Aggregated │ │ │ ├── AggregatedStatisticsDao.cs │ │ │ ├── AggregatedStatisticsDaoResources.Designer.cs │ │ │ └── AggregatedStatisticsDaoResources.resx │ │ ├── Daily │ │ │ ├── DailyStatisticDao.cs │ │ │ ├── DailyStatisticDaoResources.Designer.cs │ │ │ └── DailyStatisticDaoResources.resx │ │ ├── Domain │ │ │ ├── DomainsDao.cs │ │ │ ├── DomainsDaoResources.Designer.cs │ │ │ └── DomainsDaoResources.resx │ │ └── Sender │ │ │ ├── SenderStatisticsDao.cs │ │ │ ├── SenderStatisticsDaoResources.Designer.cs │ │ │ └── SenderStatisticsDaoResources.resx │ ├── Dmarc.AggregateReport.Api.csproj │ ├── DockerFile │ ├── Domain │ │ ├── AggregatedStatistics.cs │ │ ├── DailyStatistics.cs │ │ ├── DateRangeDomainRequest.cs │ │ ├── Domain.cs │ │ ├── DomainSearchRequest.cs │ │ ├── MatchingDomains.cs │ │ └── SenderStatistics.cs │ ├── LocalEntryPoint.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── StartUp.cs │ ├── Validation │ │ ├── DateRangeDomainRequestValidator.cs │ │ └── DomainSearchRequestValidator.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── aws-lambda-tools-defaults.json │ └── web.config │ ├── Dmarc.AggregateReport.Contracts │ ├── AggregateReportIpAddresses.cs │ ├── DkimSelectorsSeen.cs │ ├── Dmarc.AggregateReport.Contracts.csproj │ └── DomainEvent.cs │ ├── Dmarc.AggregateReport.Parser.Lambda.Test │ ├── Compression │ │ ├── GzipDecompressorTests.cs │ │ └── ZipDecompressorTests.cs │ ├── Converters │ │ ├── AggregateReportToEntityConverterTests.cs │ │ └── DenormalisedRecordConverterTests.cs │ ├── Dmarc.AggregateReport.Parser.Lambda.Test.csproj │ ├── Factory │ │ └── AggregateReportParserAppFactoryTests.cs │ ├── Parsers │ │ ├── AggregateReportParserVerboseTests.cs │ │ ├── AttachmentStreamNormaliserTests.cs │ │ └── ContentTypeProviderTests.cs │ └── Serialisation │ │ └── AggregateReportDeserialisation │ │ ├── AggregateReportDeserialiserTests.cs │ │ ├── AggregateReportDeserialiserTestsResource.Designer.cs │ │ ├── AggregateReportDeserialiserTestsResource.resx │ │ ├── DkimAuthResultDerserialiserTests.cs │ │ ├── DkimAuthResultSerialiserTestsResources.Designer.cs │ │ ├── DkimAuthResultSerialiserTestsResources.resx │ │ ├── IdentifiersDeserialiserTests.cs │ │ ├── IdentifiersDeserialiserTestsResources.Designer.cs │ │ ├── IdentifiersDeserialiserTestsResources.resx │ │ ├── PolicyEvaluatedDeserialiserTest.cs │ │ ├── PolicyEvaluatedDeserialiserTestsResource.Designer.cs │ │ ├── PolicyEvaluatedDeserialiserTestsResource.resx │ │ ├── PolicyOverrideReasonDeserialiserTests.cs │ │ ├── PolicyOverrideReasonDeserialserTestsResources.Designer.cs │ │ ├── PolicyOverrideReasonDeserialserTestsResources.resx │ │ ├── PolicyPublishedDerserialiserTests.cs │ │ ├── PolicyPublishedDeserialiserTestsResources.Designer.cs │ │ ├── PolicyPublishedDeserialiserTestsResources.resx │ │ ├── RecordDeserialiserTests.cs │ │ ├── RecordDeserialiserTestsResource.Designer.cs │ │ ├── RecordDeserialiserTestsResource.resx │ │ ├── ReportMetadataParserTests.cs │ │ ├── ReportMetadataParserTestsResources.Designer.cs │ │ ├── ReportMetadataParserTestsResources.resx │ │ ├── RowDeserialiserTests.cs │ │ ├── RowDeserialiserTestsResource.Designer.cs │ │ ├── RowDeserialiserTestsResource.resx │ │ ├── SpfAuthResultsDeserialiserTests.cs │ │ ├── SpfAuthResultsDeserialiserTestsResource.Designer.cs │ │ ├── SpfAuthResultsDeserialiserTestsResource.resx │ │ └── TestConstants.cs │ ├── Dmarc.AggregateReport.Parser.Lambda │ ├── AggregateReportProcessor.cs │ ├── AggregateReportPublishingEmailMessageInfoProcessor.cs │ ├── CommandLineArgs.cs │ ├── Compression │ │ ├── GzipDecompressor.cs │ │ ├── IDecompressor.cs │ │ └── ZipDecompressor.cs │ ├── Config │ │ ├── DkimSelectorPulisherConfig.cs │ │ └── LambdaAggregateReportParserConfig.cs │ ├── Converters │ │ ├── AggregateReportToEntityConverter.cs │ │ └── DenormalisedRecordConverter.cs │ ├── Dao │ │ ├── AggregateReportParserDaoAsync.cs │ │ ├── AggregateReportParserDaoResources.Designer.cs │ │ ├── AggregateReportParserDaoResources.resx │ │ └── Entities │ │ │ ├── AggregateReportEntity.cs │ │ │ ├── DkimAuthResultEntity.cs │ │ │ ├── EntityAlignment.cs │ │ │ ├── EntityDisposition.cs │ │ │ ├── EntityDkimResult.cs │ │ │ ├── EntityDmarcResult.cs │ │ │ ├── EntityPolicyOverride.cs │ │ │ ├── EntitySpfDomainScope.cs │ │ │ ├── EntitySpfResult.cs │ │ │ ├── PolicyOverrideReasonEntity.cs │ │ │ ├── RecordEntity.cs │ │ │ └── SpfAuthResultEntity.cs │ ├── Dmarc.AggregateReport.Parser.Lambda.csproj │ ├── Domain │ │ ├── AggregateReportInfo.cs │ │ ├── AttachmentInfo.cs │ │ ├── AttachmentMetadata.cs │ │ ├── DenormalisedRecord.cs │ │ └── Dmarc │ │ │ ├── AggregateReport.cs │ │ │ ├── Alignment.cs │ │ │ ├── AuthResult.cs │ │ │ ├── DMARCResult.cs │ │ │ ├── DateRange.cs │ │ │ ├── Disposition.cs │ │ │ ├── DkimAuthResult.cs │ │ │ ├── DkimResult.cs │ │ │ ├── Identifier.cs │ │ │ ├── PolicyEvaluated.cs │ │ │ ├── PolicyOverride.cs │ │ │ ├── PolicyOverrideReason.cs │ │ │ ├── PolicyPublished.cs │ │ │ ├── Record.cs │ │ │ ├── ReportMetadata.cs │ │ │ ├── Row.cs │ │ │ ├── SpfAuthResult.cs │ │ │ ├── SpfDomainScope.cs │ │ │ └── SpfResult.cs │ ├── Factory │ │ ├── AggregateReportParserAppFactory.cs │ │ └── AggregateReportParserLambdaFactory.cs │ ├── LocalEntryPoint.cs │ ├── Parser │ │ ├── AggregateReportParser.cs │ │ ├── AggregateReportParserVerbose.cs │ │ ├── AttachmentStreamNormaliser.cs │ │ ├── ContentType.cs │ │ └── ContentTypeProvider.cs │ ├── Persistence │ │ ├── Console │ │ │ └── CsvDenormalisedRecordPersistor.cs │ │ ├── FileSystem │ │ │ ├── CsvDenormalisedRecordPersistor.cs │ │ │ ├── SqliteDenormalisedRecordPersistor.cs │ │ │ └── XmlAttachmentPersitor.cs │ │ ├── Multi │ │ │ ├── MulitDenormalisedRecordPersistor.cs │ │ │ ├── MultiAggregateReportDao.cs │ │ │ └── MultiAttachmentPersistor.cs │ │ └── Single │ │ │ ├── IAggregateReportPersistor.cs │ │ │ ├── IAttachmentPersitor.cs │ │ │ └── IDenormalisedRecordPersistor.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Publishers │ │ ├── AggregateReportIpAddressesMessagePublisher.cs │ │ ├── DkimSelectorSeenPublisher.cs │ │ ├── IMessagePublisher.cs │ │ └── MessagePublisher.cs │ ├── Serialisation │ │ ├── AggregateReportDeserialisation │ │ │ ├── AggregateReportDeserialiser.cs │ │ │ ├── AuthResultDeserialiser.cs │ │ │ ├── DkimAuthResultDeserialiser.cs │ │ │ ├── IdentifierDeserialiser.cs │ │ │ ├── PolicyEvaluatedDeserialiser.cs │ │ │ ├── PolicyOverrideReasonDeserialiser.cs │ │ │ ├── PolicyPublishedDeserialiser.cs │ │ │ ├── RecordDeserialiser.cs │ │ │ ├── ReportMetadataDeserialiser.cs │ │ │ ├── RowDeserialiser.cs │ │ │ └── SpfAuthResultDeserialiser.cs │ │ └── CsvDenormalisedRecordSerialiser.cs │ ├── Utils │ │ ├── Conversion │ │ │ └── ConversionUtils.cs │ │ ├── MimePartExtensionMethods.cs │ │ └── XDocumentExtensions.cs │ └── aws-lambda-tools-defaults.json │ ├── Dmarc.Common.Api │ ├── Dmarc.Common.Api.csproj │ ├── Domain │ │ └── ErrorResponse.cs │ ├── Identity │ │ ├── Authentication │ │ │ ├── MailCheckAuthenticationExtensions.cs │ │ │ ├── MailCheckAuthenticationHandler.cs │ │ │ └── MailCheckAuthenticationOptions.cs │ │ ├── Dao │ │ │ ├── IdentityDao.cs │ │ │ ├── IdentityDaoResources.Designer.cs │ │ │ └── IdentityDaoResources.resx │ │ └── Domain │ │ │ ├── Identity.cs │ │ │ ├── IdentityForCreation.cs │ │ │ ├── OidcClaims.cs │ │ │ ├── PolicyType.cs │ │ │ └── RoleType.cs │ ├── Middleware │ │ ├── RequestHeaderLoggingMiddleware.cs │ │ └── UnhandledExceptionMiddleware.cs │ └── Utils │ │ ├── UserExtensionMethods.cs │ │ └── ValidationResultExtensionMethods.cs │ ├── Dmarc.Common.Interface │ ├── Dmarc.Common.Interface.csproj │ ├── Logging │ │ ├── ILogger.cs │ │ └── LogLevel.cs │ ├── Mapping │ │ └── IMapper.cs │ ├── Message.cs │ ├── Messaging │ │ ├── IPublisher.cs │ │ ├── IPublisherConfig.cs │ │ ├── IQueueProcessor.cs │ │ └── ISqsConfig.cs │ ├── PublicSuffix │ │ ├── Domain │ │ │ └── OrganisationalDomain.cs │ │ └── IOrganisationalDomainProvider.cs │ ├── ReadMe.txt │ └── Tls │ │ ├── Domain │ │ ├── Certificate.cs │ │ ├── CipherSuite.cs │ │ ├── CurveGroup.cs │ │ ├── Error.cs │ │ ├── SignatureHashAlgorithm.cs │ │ ├── TlsConnectionResult.cs │ │ ├── TlsEvaluatorResult.cs │ │ └── TlsVersion.cs │ │ ├── ITlsClient.cs │ │ └── ITlsClientConfig.cs │ ├── Dmarc.Common.Messaging.Sns │ ├── Dmarc.Common.Messaging.Sns.csproj │ ├── Models │ │ └── SnsMessage.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ └── Publisher │ │ └── SnsPublisher.cs │ ├── Dmarc.Common.Messaging.Sqs │ ├── Dmarc.Common.Messaging.Sqs.csproj │ ├── Properties │ │ └── AssemblyInfo.cs │ └── QueueProcessor │ │ └── SqsLongPollingQueueProcessor.cs │ ├── Dmarc.Common.PublicSuffix │ ├── Dmarc.Common.PublicSuffix.csproj │ ├── OrganisationDomainProvider.cs │ └── Properties │ │ └── AssemblyInfo.cs │ ├── Dmarc.Common.Report.Test │ ├── Dmarc.Common.Report.Test.csproj │ ├── Email │ │ ├── S3EmailMessageClientTests.cs │ │ └── S3EmailMessageProcessorTests.cs │ └── QueueProcessing │ │ ├── AggregateReportQueueProcessorTests.cs │ │ └── S3EventMessageProcessorTests.cs │ ├── Dmarc.Common.Report │ ├── Config │ │ └── LambdaReportParserConfig.cs │ ├── Conversion │ │ └── IToEntityConverter.cs │ ├── Dmarc.Common.Report.csproj │ ├── Domain │ │ ├── EmailMessageInfo.cs │ │ ├── EmailMetadata.cs │ │ └── ReportInfo.cs │ ├── Email │ │ ├── EmailMessageInfoProcessor.cs │ │ ├── MimeMessageFactory.cs │ │ ├── PersistentEmailMessageInfoProcessor.cs │ │ ├── Result.cs │ │ ├── S3EmailMessageClient.cs │ │ └── S3EmailMessageProcessor.cs │ ├── Evnts │ │ ├── Detail.cs │ │ ├── LambdaContext.cs │ │ └── ScheduledEvent.cs │ ├── File │ │ └── FileEmailMessageProcessor.cs │ ├── Logger │ │ └── LambdaLoggerAdaptor.cs │ ├── Parser │ │ └── IReportParser.cs │ ├── Persistance │ │ ├── Dao │ │ │ └── IReportDaoAsync.cs │ │ ├── DatabaseConnectionTester.cs │ │ └── IReportPersistor.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ └── QueueProcessing │ │ ├── QueueProcessor.cs │ │ ├── S3EventDeserializer.cs │ │ └── S3EventMessageProcessor.cs │ ├── Dmarc.Common.Test │ ├── Data │ │ ├── DatabaseAccessUtilsTest.cs │ │ └── SecureConnectionInfoTest.cs │ ├── Dmarc.Common.Test.csproj │ ├── Environment │ │ └── EnvironmentVariablesTests.cs │ ├── Linq │ │ └── LinqExtensionsTests.cs │ ├── Logging │ │ └── AbstractLoggerTests.cs │ ├── Serialisation │ │ └── CsvSerialiserTests.cs │ ├── Tasks │ │ └── TaskExtensionMethodsTests.cs │ └── Validation │ │ └── DomainValidatorTest.cs │ ├── Dmarc.Common.TestSupport │ ├── DatabaseTestBase.cs │ ├── DateTimeExtensionMethods.cs │ └── Dmarc.Common.TestSupport.csproj │ ├── Dmarc.Common.Tls.BouncyCastle │ ├── BasicTlsClient.cs │ ├── Dmarc.Common.Tls.BouncyCastle.csproj │ ├── EmptyTlsAuthentication.cs │ ├── KeyExchange │ │ ├── TestTlsDhKeyExchange.cs │ │ ├── TestTlsDheKeyExchange.cs │ │ ├── TestTlsEcDheKeyExchange.cs │ │ └── TestTlsEcdhKeyExchange.cs │ ├── Mapping │ │ ├── AdditionalGroups.cs │ │ ├── BouncyCastleMappingExtensionMethods.cs │ │ └── DomainMappingExtensionMethods.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── SignerInputBuffer.cs │ ├── TestTlsClient.cs │ ├── TestTlsClientProtocol.cs │ └── TlsClient.cs │ ├── Dmarc.Common │ ├── Data │ │ ├── ConnectionInfo.cs │ │ ├── DatabaseAccessUtils.cs │ │ ├── Db.cs │ │ ├── DbDataReaderExtensionMethods.cs │ │ ├── MySqlHelperWrapper.cs │ │ ├── MySqlParametersCollectionExtensionMethods.cs │ │ ├── SecureConnectionInfo.cs │ │ └── Timer.cs │ ├── Dmarc.Common.csproj │ ├── Encryption │ │ ├── AmazonEncryptionUtils.cs │ │ └── ParameterStoreRequest.cs │ ├── Environment │ │ ├── EnvironmentVariables.cs │ │ └── EnvironmentWrapper.cs │ ├── Linq │ │ └── LinqExtensions.cs │ ├── Logging │ │ ├── AbstractLogger.cs │ │ └── ConsoleLogger.cs │ ├── Serialisation │ │ └── CsvSerialiser.cs │ ├── Tasks │ │ ├── AsyncLazy.cs │ │ └── TaskExtensionMethods.cs │ ├── Util │ │ ├── Clock.cs │ │ ├── EnumExtensions.cs │ │ └── StringExtensions.cs │ └── Validation │ │ ├── DomainValidator.cs │ │ ├── PublicDomainListValidator.cs │ │ ├── ValidationResources.Designer.cs │ │ └── ValidationResources.resx │ ├── Dmarc.DnsRecord.Contract │ ├── Dmarc.DnsRecord.Contract.csproj │ ├── Domain │ │ ├── DmarcConfig.cs │ │ ├── Domain.cs │ │ └── SpfConfig.cs │ └── Messages │ │ ├── DmarcConfigsUpdated.cs │ │ ├── DnsRecordMessage.cs │ │ └── SpfConfigsUpdated.cs │ ├── Dmarc.DnsRecord.Evaluator.Test │ ├── Dmarc.DnsRecord.Evaluator.Test.csproj │ ├── Dmarc │ │ ├── Dao │ │ │ └── DmarcConfigReadModelDaoTests.cs │ │ ├── Parsers │ │ │ ├── AspfParserStrategyTests.cs │ │ │ ├── DmarcRecordParserComponentTest.cs │ │ │ ├── DmarcUriParserTests.cs │ │ │ ├── FailureOptionsParserStrategyTests.cs │ │ │ ├── MaxReportSizeParserTest.cs │ │ │ ├── PercentParserStrategyTests.cs │ │ │ ├── PolicyParserStrategyTests.cs │ │ │ ├── ReportFormatParserStrategyTests.cs │ │ │ ├── ReportIntervalParserStrategyTest.cs │ │ │ ├── TagParserTests.cs │ │ │ ├── UriTagParserTests.cs │ │ │ └── VersionParserStrategyTests.cs │ │ └── Rules │ │ │ ├── Config │ │ │ ├── OnlyOneDmarcRecordTests.cs │ │ │ └── TldDmarcRecordBehaviourIsWeaklyDefined.cs │ │ │ └── Record │ │ │ ├── MaxLengthOf450CharactersTests.cs │ │ │ ├── PctValueShouldBe100Tests.cs │ │ │ ├── PolicyShouldBeQuarantineOrRejectTests.cs │ │ │ ├── PolicyTagMustExistTests.cs │ │ │ ├── RuaTagShouldHaveUrisTest.cs │ │ │ ├── RuaTagShouldNotHaveMoreThanTwoUrisTest.cs │ │ │ ├── RuaTagsShouldBeMailToTests.cs │ │ │ ├── RuaTagsShouldContainDmarcServiceMailBoxTest.cs │ │ │ ├── RufTagShouldNotHaveMoreThanTwoUrisTest.cs │ │ │ ├── RufTagsShouldBeMailToTests.cs │ │ │ ├── SubDomainPolicyShouldBeQuarantineOrRejectTests.cs │ │ │ ├── SubDomainPolicyShouldNotBeOnNonOrganisationalDomainTests.cs │ │ │ └── VersionMustBeFirstTagTests.cs │ └── Spf │ │ ├── Dao │ │ └── SpfConfigReadModelDaoTests.cs │ │ ├── Parsers │ │ ├── DomainSpecDualCidrBlockMechanismParserTests.cs │ │ ├── DomainSpecParserPassiveTests.cs │ │ ├── Ip4AddrParserTests.cs │ │ ├── Ip4CidrBlockParserTests.cs │ │ ├── Ip6AddrParserTests.cs │ │ ├── Ip6CidrBlockParserTests.cs │ │ ├── MechanismParserTests.cs │ │ ├── ModifierParserTests.cs │ │ ├── QualifierParserTests.cs │ │ ├── SpfVersionParserTests.cs │ │ └── TermParserTests.cs │ │ └── Rules │ │ ├── Config │ │ └── OnlyOneSpfRecordTests.cs │ │ └── Record │ │ ├── AllMustBeLastMechanismTests.cs │ │ ├── DontUsePtrMechanismTest.cs │ │ ├── ExplanationDoesntOccurMoreThanOnceTests.cs │ │ ├── MaxLengthOf450CharactersTests.cs │ │ ├── ModifiersOccurAfterMechanismsTests.cs │ │ ├── RedirectDoesntOccurMoreThanOnceTests.cs │ │ ├── RedirectModifierAndAllMechanismNotValidTests.cs │ │ └── ShouldHaveFailAllEnabledTests.cs │ ├── Dmarc.DnsRecord.Evaluator │ ├── Config │ │ └── RecordEvaluatorConfig.cs │ ├── Dmarc.DnsRecord.Evaluator.csproj │ ├── Dmarc │ │ ├── Dao │ │ │ ├── DmarcConfigReadModelDao.cs │ │ │ ├── DmarcReadModelDaoResources.Designer.cs │ │ │ ├── DmarcReadModelDaoResources.resx │ │ │ └── Entities │ │ │ │ ├── DmarcConfigReadModelEntity.cs │ │ │ │ └── ErrorType.cs │ │ ├── Domain │ │ │ ├── Adkim.cs │ │ │ ├── AdkimParserStrategy.cs │ │ │ ├── AlignmentType.cs │ │ │ ├── Aspf.cs │ │ │ ├── DmarcConfig.cs │ │ │ ├── DmarcEntity.cs │ │ │ ├── DmarcRecord.cs │ │ │ ├── DmarcUri.cs │ │ │ ├── FailureOption.cs │ │ │ ├── FailureOptionType.cs │ │ │ ├── MaxReportSize.cs │ │ │ ├── OptionalDefaultTag.cs │ │ │ ├── Percent.cs │ │ │ ├── Policy.cs │ │ │ ├── PolicyType.cs │ │ │ ├── ReportFormat.cs │ │ │ ├── ReportFormatType.cs │ │ │ ├── ReportInterval.cs │ │ │ ├── ReportUri.cs │ │ │ ├── ReportUriAggregate.cs │ │ │ ├── ReportUriForensic.cs │ │ │ ├── SubDomainPolicy.cs │ │ │ ├── Tag.cs │ │ │ ├── Unit.cs │ │ │ ├── UnknownTag.cs │ │ │ ├── UriTag.cs │ │ │ ├── Version.cs │ │ │ └── app.config │ │ ├── Explainers │ │ │ ├── AdkimTagExplainer.cs │ │ │ ├── AspfTagExplainer.cs │ │ │ ├── BaseTagExplainerStrategy.cs │ │ │ ├── DmarcExplainerResource.Designer.cs │ │ │ ├── DmarcExplainerResource.resx │ │ │ ├── FailureOptionsExplainer.cs │ │ │ ├── PercentExplainer.cs │ │ │ ├── PolicyExplainer.cs │ │ │ ├── ReportFormatExplainer.cs │ │ │ ├── ReportIntervalExplainer.cs │ │ │ ├── ReportUriAggregateExplainer.cs │ │ │ ├── ReportUriForensicExplainer.cs │ │ │ ├── SubDomainPolicyExplainer.cs │ │ │ └── VersionExplainer.cs │ │ ├── Factory │ │ │ └── DmarcRecordProcessorFactory.cs │ │ ├── Implict │ │ │ ├── AdkimImplicitProvider.cs │ │ │ ├── AspfImplicitProvider.cs │ │ │ ├── FailureOptionsImplicitProvider.cs │ │ │ ├── ImplicitTagProviderStrategyBase.cs │ │ │ ├── PercentImplicitProvider.cs │ │ │ ├── ReportFormatImplicitProvider.cs │ │ │ ├── ReportIntervalImplicitProvider.cs │ │ │ └── SubDomainPolicyImplicitProvider.cs │ │ ├── Mapping │ │ │ └── MapperExtension.cs │ │ ├── Parsers │ │ │ ├── AspfParserStrategy.cs │ │ │ ├── DmarcConfigParser.cs │ │ │ ├── DmarcParserResource.Designer.cs │ │ │ ├── DmarcParserResource.resx │ │ │ ├── DmarcRecordParser.cs │ │ │ ├── DmarcUriParser.cs │ │ │ ├── FailureOptionsParserStrategy.cs │ │ │ ├── ITagParserStrategy.cs │ │ │ ├── MaxReportSizeParser.cs │ │ │ ├── PercentParserStrategy.cs │ │ │ ├── PolicyParserStrategy.cs │ │ │ ├── ReportFormatParserStrategy.cs │ │ │ ├── ReportIntervalParserStrategy.cs │ │ │ ├── ReportUriAggregateParserStrategy.cs │ │ │ ├── ReportUriForensicParserStrategy.cs │ │ │ ├── SubDomainPolicyParserStrategy.cs │ │ │ ├── TagParser.cs │ │ │ ├── UriTagParser.cs │ │ │ └── VersionParserStrategy.cs │ │ ├── ReadModel │ │ │ ├── DmarcConfig.cs │ │ │ ├── DmarcRecord.cs │ │ │ ├── Error.cs │ │ │ ├── ErrorType.cs │ │ │ └── Tag.cs │ │ └── Rules │ │ │ ├── Config │ │ │ ├── OnlyOneDmarcRecord.cs │ │ │ └── TldDmarcRecordBehaviourIsWeaklyDefined.cs │ │ │ ├── DmarcRulesResource.Designer.cs │ │ │ ├── DmarcRulesResource.resx │ │ │ └── Record │ │ │ ├── MaxLengthOf450Characters.cs │ │ │ ├── PctValueShouldBe100.cs │ │ │ ├── PolicyShouldBeQuarantineOrReject.cs │ │ │ ├── PolicyTagMustExist.cs │ │ │ ├── RuaTagShouldHaveUris.cs │ │ │ ├── RuaTagShouldNotHaveMoreThanTwoUris.cs │ │ │ ├── RuaTagsMustBeForDomainThatWillAcceptReports.cs │ │ │ ├── RuaTagsShouldBeMailTo.cs │ │ │ ├── RuaTagsShouldContainDmarcServiceMailBox.cs │ │ │ ├── RufTagShouldBeMailTo.cs │ │ │ ├── RufTagShouldNotHaveMoreThanTwoUris.cs │ │ │ ├── RufTagsMustBeForDomainThatWillAcceptReports.cs │ │ │ ├── SubDomainPolicyShouldBeQuarantineOrReject.cs │ │ │ ├── SubDomainPolicyShouldNotBeOnNonOrganisationalDomain.cs │ │ │ ├── TagShouldBeMailTo.cs │ │ │ ├── TagShouldHaveUris.cs │ │ │ ├── TagShouldNotHaveMoreThanTwoUris.cs │ │ │ ├── TagsShouldContainDmarcServiceMailBox.cs │ │ │ └── VersionMustBeFirstTag.cs │ ├── DmarcRecordProcessor.cs │ ├── DockerFile │ ├── Explainers │ │ ├── BaseExplainerStrategy.cs │ │ ├── Explainer.cs │ │ └── IExplainerStrategy.cs │ ├── Implicit │ │ ├── IImplicitProviderStrategy.cs │ │ ├── ImplicitProvider.cs │ │ └── ImplicitProviderStrategyBase.cs │ ├── Program.cs │ ├── Rules │ │ ├── Error.cs │ │ ├── ErrorType.cs │ │ ├── IRule.cs │ │ └── RuleEvaluator.cs │ ├── Spf │ │ ├── Dao │ │ │ ├── Entities │ │ │ │ ├── ErrorType.cs │ │ │ │ └── SpfConfigReadModelEntity.cs │ │ │ ├── SpfConfigReadModelDao.cs │ │ │ ├── SpfReadModelDaoResources.Designer.cs │ │ │ └── SpfReadModelDaoResources.resx │ │ ├── Domain │ │ │ ├── A.cs │ │ │ ├── All.cs │ │ │ ├── DomainSpec.cs │ │ │ ├── DualCidrBlock.cs │ │ │ ├── Exists.cs │ │ │ ├── Explanation.cs │ │ │ ├── Include.cs │ │ │ ├── Ip4.cs │ │ │ ├── Ip4Addr.cs │ │ │ ├── Ip4CidrBlock.cs │ │ │ ├── Ip6.cs │ │ │ ├── Ip6Addr.cs │ │ │ ├── Ip6CidrBlock.cs │ │ │ ├── Mechanism.cs │ │ │ ├── Modifier.cs │ │ │ ├── Mx.cs │ │ │ ├── OptionalDefaultMechanism.cs │ │ │ ├── Ptr.cs │ │ │ ├── Qualifier.cs │ │ │ ├── Redirect.cs │ │ │ ├── SpfConfig.cs │ │ │ ├── SpfEntity.cs │ │ │ ├── SpfRecord.cs │ │ │ ├── Term.cs │ │ │ ├── UnknownModifier.cs │ │ │ ├── UnknownTerm.cs │ │ │ └── Version.cs │ │ ├── Explainers │ │ │ ├── ATermExplainer.cs │ │ │ ├── AllTermExplainer.cs │ │ │ ├── BaseTermExplainerStrategy.cs │ │ │ ├── ExistsTermExplainer.cs │ │ │ ├── ExplanationTermExplainer.cs │ │ │ ├── IncludeTermExplainer.cs │ │ │ ├── Ip4TermExplainer.cs │ │ │ ├── Ip6TermExplainer.cs │ │ │ ├── MxTermExplainer.cs │ │ │ ├── PtrTermExplainer.cs │ │ │ ├── QualifierExplainer.cs │ │ │ ├── RedirectTermExplainer.cs │ │ │ ├── SpfExplainerResource.Designer.cs │ │ │ ├── SpfExplainerResource.resx │ │ │ ├── UnknownModifierExplainer.cs │ │ │ ├── UnknownTermExplainer.cs │ │ │ └── VersionExplainer.cs │ │ ├── Factory │ │ │ └── SpfRecordProcessorFactory.cs │ │ ├── Implicit │ │ │ ├── AllImplicitTermProvider.cs │ │ │ ├── ImplicitTagProviderStrategyBase.cs │ │ │ └── ImplicitTermProviderStrategyBase.cs │ │ ├── Mapping │ │ │ └── MapperExtension.cs │ │ ├── Parsers │ │ │ ├── AMechanismParser.cs │ │ │ ├── AllMechanismParser.cs │ │ │ ├── DomainSpecDualCidrBlockMechanismParser.cs │ │ │ ├── DomainSpecParserPassive.cs │ │ │ ├── DualCidrBlockParser.cs │ │ │ ├── ExistsMechanismParser.cs │ │ │ ├── ExplanationModifierParser.cs │ │ │ ├── IMechanismParserStrategy.cs │ │ │ ├── IModifierParserStrategy.cs │ │ │ ├── IncludeMechanismParser.cs │ │ │ ├── Ip4AddrParser.cs │ │ │ ├── Ip4CidrBlockParser.cs │ │ │ ├── Ip4MechanismParser.cs │ │ │ ├── Ip6AddrParser.cs │ │ │ ├── Ip6CidrBlockParser.cs │ │ │ ├── Ip6MechanismParser.cs │ │ │ ├── MechanismParser.cs │ │ │ ├── ModifierParser.cs │ │ │ ├── MxMechanismParser.cs │ │ │ ├── PtrMechanismParser.cs │ │ │ ├── QualifierParser.cs │ │ │ ├── RedirectModifierParser.cs │ │ │ ├── SpfConfigParser.cs │ │ │ ├── SpfParserResource.Designer.cs │ │ │ ├── SpfParserResource.resx │ │ │ ├── SpfRecordParser.cs │ │ │ ├── SpfVersionParser.cs │ │ │ └── TermParser.cs │ │ ├── ReadModel │ │ │ ├── Error.cs │ │ │ ├── ErrorType.cs │ │ │ ├── SpfConfig.cs │ │ │ ├── SpfRecord.cs │ │ │ ├── Term.cs │ │ │ └── Version.cs │ │ └── Rules │ │ │ ├── Config │ │ │ └── OnlyOneSpfRecord.cs │ │ │ ├── Record │ │ │ ├── AllMustBeLastMechanism.cs │ │ │ ├── DontUsePtrMechanism.cs │ │ │ ├── ExplanationDoesntOccurMoreThanOnce.cs │ │ │ ├── MaxLengthOf450Characters.cs │ │ │ ├── ModifiersOccurAfterMechanisms.cs │ │ │ ├── RedirectDoesntOccurMoreThanOnce.cs │ │ │ ├── RedirectModifierAndAllMechanismNotValid.cs │ │ │ └── ShouldHaveHardFailAllEnabled.cs │ │ │ ├── SpfRulesResource.Designer.cs │ │ │ └── SpfRulesResource.resx │ └── SpfRecordProcessor.cs │ ├── Dmarc.DnsRecord.Importer.Lambda.Test │ ├── Client │ │ ├── DmarcDnsClientTests.cs │ │ ├── MxRecordDnsClientTest.cs │ │ ├── SpfRecordDnsClientIntegrationTests.cs │ │ └── SpfRecordDnsClientTests.cs │ ├── Dao │ │ ├── Dmarc │ │ │ └── DmarcRecordDaoTests.cs │ │ ├── Mx │ │ │ └── MxRecordDaoTests.cs │ │ └── Spf │ │ │ └── SpfRecordDaoTests.cs │ ├── Dmarc.DnsRecord.Importer.Lambda.Test.csproj │ ├── Factory │ │ ├── DmarcRecordProcessorFactoryTests.cs │ │ ├── MxRecordProcessorFactoryTests.cs │ │ └── SpfRecordProcessorFactoryTests.cs │ ├── Mapping │ │ ├── DmarcConfigsUpdatedMapperTests.cs │ │ └── SpfConfigsUpdatedMapperTests.cs │ └── RecordProcessor │ │ ├── DnsRecordProcessorTests.cs │ │ └── DnsRecordUpdaterTests.cs │ ├── Dmarc.DnsRecord.Importer.Lambda │ ├── Config │ │ └── RecordImporterConfig.cs │ ├── Dao │ │ ├── Dmarc │ │ │ ├── DmarcRecordDao.cs │ │ │ ├── DmarcRecordDaoResources.Designer.cs │ │ │ └── DmarcRecordDaoResources.resx │ │ ├── DnsRecordDao.cs │ │ ├── Entities │ │ │ ├── DomainEntity.cs │ │ │ └── RecordEntity.cs │ │ ├── IDnsRecordDao.cs │ │ ├── Mx │ │ │ ├── MxRecordDao.cs │ │ │ ├── MxRecordDaoResources.Designer.cs │ │ │ └── MxRecordDaoResources.resx │ │ └── Spf │ │ │ ├── SpfRecordDao.cs │ │ │ ├── SpfRecordDaoResources.Designer.cs │ │ │ └── SpfRecordDaoResources.resx │ ├── Dmarc.DnsRecord.Importer.Lambda.csproj │ ├── DmarcRecordImporter.cs │ ├── Dns │ │ ├── Client │ │ │ ├── DmarcRecordDnsClient.cs │ │ │ ├── DnsRecordClient.cs │ │ │ ├── MxRecordDnsClient.cs │ │ │ ├── RecordInfos │ │ │ │ ├── DmarcRecordInfo.cs │ │ │ │ ├── MxRecordInfo.cs │ │ │ │ ├── RecordInfo.cs │ │ │ │ └── SpfRecordInfo.cs │ │ │ └── SpfRecordDnsClient.cs │ │ ├── DnsResolverWrapper.cs │ │ ├── DnsResponse.cs │ │ ├── IDnsRecordClient.cs │ │ └── LinuxDnsNameServerProvider.cs │ ├── DnsRecordImporter.cs │ ├── Factory │ │ ├── DmarcRecordProcessorFactory.cs │ │ ├── MxRecordProcessorFactory.cs │ │ └── SpfRecordProcessorFactory.cs │ ├── Mapping │ │ ├── DmarcConfigsUpdatedMapper.cs │ │ └── SpfConfigsUpdatedMapper.cs │ ├── MxRecordImporter.cs │ ├── RecordProcessor │ │ ├── DnsRecordProcessor.cs │ │ ├── DnsRecordUpdater.cs │ │ ├── IDnsRecordUpdater.cs │ │ ├── PersistantDnsRecordUpdater.cs │ │ └── PublishingDnsRecordUpdater.cs │ ├── SpfRecordImporter.cs │ ├── Util │ │ └── StringExtensionMethods.cs │ └── aws-lambda-tools-defaults.json │ ├── Dmarc.DomainStatus.Api.Test │ ├── Controllers │ │ ├── DomainStatusControllerTests.cs │ │ └── DomainStatusListControllerTests.cs │ ├── Dmarc.DomainStatus.Api.Test.csproj │ ├── Services │ │ ├── CertificateEvaluatorApiTests.cs │ │ └── ReverseDnsApiTests.cs │ └── Validation │ │ ├── DateRangeDomainRequestTests.cs │ │ └── DomainsRequestValidatorTests.cs │ ├── Dmarc.DomainStatus.Api │ ├── Config │ │ └── DomainStatusApiConfig.cs │ ├── Controllers │ │ ├── DomainStatusController.cs │ │ └── DomainStatusListController.cs │ ├── Dao │ │ ├── DomainStatus │ │ │ ├── DomainStatusDao.cs │ │ │ ├── DomainStatusDaoResources.Designer.cs │ │ │ └── DomainStatusDaoResources.resx │ │ ├── DomainStatusList │ │ │ ├── DomainStatusListDao.cs │ │ │ ├── DomainStatusListDaoResources.Designer.cs │ │ │ └── DomainStatusListDaoResources.resx │ │ └── Permission │ │ │ ├── PermissionDao.cs │ │ │ ├── PermissionDaoResource.Designer.cs │ │ │ └── PermissionDaoResource.resx │ ├── Dmarc.DomainStatus.Api.csproj │ ├── Dockerfile │ ├── Domain │ │ ├── AggregateReportExportItem.cs │ │ ├── AggregateSummary.cs │ │ ├── AggregateSummaryItem.cs │ │ ├── Certificate.cs │ │ ├── CertificateEvaluatorApiRequest.cs │ │ ├── CertificateEvaluatorApiResponse.cs │ │ ├── CipherSuite.cs │ │ ├── DateRangeDomainRequest.cs │ │ ├── DmarcRecord.cs │ │ ├── DnsRecord.cs │ │ ├── DnsResponse.cs │ │ ├── Domain.cs │ │ ├── DomainPermissions.cs │ │ ├── DomainRecords.cs │ │ ├── DomainRequest.cs │ │ ├── DomainSecurityInfo.cs │ │ ├── DomainStatus.cs │ │ ├── DomainTlsEvaluatorResults.cs │ │ ├── DomainsRequest.cs │ │ ├── DomainsResponse.cs │ │ ├── DomainsSecurityResponse.cs │ │ ├── MxRecord.cs │ │ ├── MxTlsEvaluatorResults.cs │ │ ├── MyDomainsResponse.cs │ │ ├── ReceivingEncrypted.cs │ │ ├── ReverseDnsInfoApiRequest.cs │ │ ├── ReverseDnsInfoApiResponse.cs │ │ ├── SpfRecord.cs │ │ ├── Status.cs │ │ ├── TlsResult.cs │ │ ├── TlsResults.cs │ │ ├── WelcomeSearchResponse.cs │ │ └── WelcomeSearchResult.cs │ ├── LocalEntryPoint.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Services │ │ ├── CertificateEvaluatorApiClient.cs │ │ └── ReverseDnsApiClient.cs │ ├── StartUp.cs │ ├── Util │ │ └── NoParametersConstraint.cs │ ├── Validation │ │ ├── DateRangeDomainRequestValidator.cs │ │ ├── DomainRequestValidator.cs │ │ └── DomainsRequestValidator.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── aws-lambda-tools-defaults.json │ └── web.config │ ├── Dmarc.Metrics.Api │ ├── Controllers │ │ └── MetricsController.cs │ ├── Dao │ │ ├── MetricsDao.cs │ │ ├── MetricsDaoResources.Designer.cs │ │ └── MetricsDaoResources.resx │ ├── Dmarc.Metrics.Api.csproj │ ├── Domain │ │ ├── MetricsDateRange.cs │ │ └── MetricsResults.cs │ ├── Program.cs │ ├── StartUp.cs │ └── Validation │ │ └── MetricsDateRangeValidator.cs │ ├── Dmarc.MxSecurityEvaluator.Test │ ├── ConnectionResultsTests.cs │ ├── Dmarc.MxSecurityEvaluator.Test.csproj │ ├── Evaluators │ │ ├── Ssl3FailsWithBadCipherSuiteTest.cs │ │ ├── Tls10AvailableWithBestCipherSuiteSelectedTest.cs │ │ ├── Tls10AvailableWithWeakCipherSuiteNotSelectedTest.cs │ │ ├── Tls11AvailableWithBestCipherSuiteSelectedTest.cs │ │ ├── Tls11AvailableWithWeakCipherSuiteNotSelectedTest.cs │ │ ├── Tls12AvailableWithBestCipherSuiteSelectedFromReverseListTest.cs │ │ ├── Tls12AvailableWithBestCipherSuiteSelectedTest.cs │ │ ├── Tls12AvailableWithSha2HashFunctionSelectedTest.cs │ │ ├── Tls12AvailableWithWeakCipherSuiteNotSelectedTest.cs │ │ ├── TlsSecureDiffieHellmanGroupSelectedTest.cs │ │ ├── TlsSecureEllipticCurveSelectedTEst.cs │ │ └── TlsWeakCipherSuitesRejectedTest.cs │ └── TlsTestDataUtil.cs │ ├── Dmarc.MxSecurityEvaluator │ ├── Config │ │ └── MxSecurityEvaluatorSqsConfig.cs │ ├── Dao │ │ ├── TlsRecordDao.cs │ │ ├── TlsRecordDaoResources.Designer.cs │ │ └── TlsRecordDaoResources.resx │ ├── Dmarc.MxSecurityEvaluator.csproj │ ├── Domain │ │ ├── ConnectionResults.cs │ │ ├── EvaluatorResults.cs │ │ ├── MxRecordTlsProfile.cs │ │ └── MxSecurityEvaluatorArguments.cs │ ├── Evaluators │ │ ├── ITlsEvaluator.cs │ │ ├── Ssl3FailsWithBadCipherSuite.cs │ │ ├── Tls10AvailableWithBestCipherSuiteSelected.cs │ │ ├── Tls10AvailableWithWeakCipherSuiteNotSelected.cs │ │ ├── Tls11AvailableWithBestCipherSuiteSelected.cs │ │ ├── Tls11AvailableWithWeakCipherSuiteNotSelected.cs │ │ ├── Tls12AvailableWithBestCipherSuiteSelected.cs │ │ ├── Tls12AvailableWithBestCipherSuiteSelectedFromReverseList.cs │ │ ├── Tls12AvailableWithSha2HashFunctionSelected.cs │ │ ├── Tls12AvailableWithWeakCipherSuiteNotSelected.cs │ │ ├── TlsSecureDiffieHellmanGroupSelected.cs │ │ ├── TlsSecureEllipticCurveSelected.cs │ │ └── TlsWeakCipherSuitesRejected.cs │ ├── Factory │ │ └── MxSecurityEvaluatorFactory.cs │ ├── MxSecurityEvaluator.cs │ ├── Processors │ │ ├── TlsRecordProcessor.cs │ │ ├── TlsRecordProcessorManual.cs │ │ └── TlsRecordProcessorQueue.cs │ ├── Program.cs │ └── Util │ │ └── TlsTestType.cs │ ├── Dmarc.MxSecurityTester.Contract │ ├── Dmarc.MxSecurityTester.Contract.csproj │ ├── Messages │ │ ├── CertificateResultMessage.cs │ │ └── DomainTlsProfileChanged.cs │ └── Properties │ │ └── AssemblyInfo.cs │ ├── Dmarc.MxSecurityTester.Test │ ├── Dao │ │ └── TlsSecurityProfileDaoTests.cs │ ├── Dmarc.MxSecurityTester.Test.csproj │ ├── Factory │ │ └── MxSecurityTesterFactoryTests.cs │ ├── MxTester │ │ ├── CachingTlsSecurityTesterAdapatorTests.cs │ │ ├── MxSecurityTesterProcessorTests.cs │ │ ├── PublishingCertSecurityProfileUpdaterTests.cs │ │ └── TlsSecurityProfileUpdaterTests.cs │ ├── Smtp │ │ ├── SmtpClientTests.cs │ │ └── SmtpDeserializerTests.cs │ └── TestCertificates.cs │ └── Dmarc.MxSecurityTester │ ├── Caching │ ├── ICache.cs │ ├── IRedisConfig.cs │ └── RedisCache.cs │ ├── CommandLineArgs.cs │ ├── Config │ ├── CertificatePublisherConfig.cs │ ├── IMxSecurityTesterConfig.cs │ ├── MxSecurityTesterAppConfig.cs │ └── MxSecurityTesterConfig.cs │ ├── Console │ ├── MxSecurityTesterDebugApp.cs │ └── TlsTestResult.cs │ ├── Dao │ ├── Entities │ │ ├── Domain.cs │ │ ├── DomainTlsSecurityProfile.cs │ │ ├── MxRecord.cs │ │ ├── MxRecordTlsSecurityProfile.cs │ │ ├── TlsSecurityProfile.cs │ │ ├── TlsTestResult.cs │ │ ├── TlsTestResults.cs │ │ └── TlsTestResultsWithoutCertificates.cs │ ├── TlsSecurityProfileDao.cs │ ├── TlsSecurityProfileDaoResources.Designer.cs │ └── TlsSecurityProfileDaoResources.resx │ ├── Dmarc.MxSecurityTester.csproj │ ├── DockerFile │ ├── Factory │ ├── ConsoleLogger.cs │ ├── MxSecurityTesterAppFactory.cs │ └── MxSecurityTesterFactory.cs │ ├── MxSecurityTester.cs │ ├── MxTester │ ├── CachingTlsSecurityTesterAdapator.cs │ ├── MxSecurityTesterProcessor.cs │ ├── MxSecurityTesterProcessorRunner.cs │ ├── PersistentTlsSecurityProfileUpdater.cs │ ├── PublishingCertsSecurityProfileUpdater.cs │ ├── PublishingTlsSecurityProfileUpdater.cs │ ├── TlsSecurityProfileUpdater.cs │ ├── TlsSecurityTester.cs │ └── TlsSecurityTesterAdapator.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── Scheduling │ └── Scheduler.cs │ ├── Smtp │ ├── Command.cs │ ├── EhloCommand.cs │ ├── Response.cs │ ├── ResponseCode.cs │ ├── SmtpClient.cs │ ├── SmtpDeserializer.cs │ ├── SmtpResponse.cs │ ├── SmtpSerializer.cs │ ├── SmtpStatusCode.cs │ └── StartTlsCommand.cs │ ├── Tls │ ├── ITlsTest.cs │ ├── SmtpTlsClient.cs │ └── Tests │ │ ├── Ssl3FailsWithBadCipherSuite.cs │ │ ├── Tls10AvailableWithBestCipherSuiteSelected.cs │ │ ├── Tls10AvailableWithWeakCipherSuiteNotSelected.cs │ │ ├── Tls11AvailableWithBestCipherSuiteSelected.cs │ │ ├── Tls11AvailableWithWeakCipherSuiteNotSelected.cs │ │ ├── Tls12AvailableWithBestCipherSuiteSelected.cs │ │ ├── Tls12AvailableWithBestCipherSuiteSelectedFromReversedList.cs │ │ ├── Tls12AvailableWithSha2HashFunctionSelected.cs │ │ ├── Tls12AvailableWithWeakCipherSuiteNotSelected.cs │ │ ├── TlsSecureDiffieHelmanGroupSelected.cs │ │ ├── TlsSecureEllipticCurveSelected.cs │ │ └── TlsWeakCipherSuitesRejected.cs │ └── Util │ ├── DistributedCacheWrapper.cs │ ├── StreamReaderWrapper.cs │ ├── StreamWriterWrapper.cs │ ├── TlsTestType.cs │ └── X509CertificateConverter.cs ├── react ├── ukncsc-mail-check-app │ ├── nightwatch.conf.js │ ├── package.json │ ├── public │ │ ├── favicon.png │ │ ├── index.html │ │ └── manifest.json │ ├── readme.md │ ├── src │ │ ├── App.css │ │ ├── App.js │ │ ├── admin │ │ │ ├── components │ │ │ │ ├── AddEntitiesModal │ │ │ │ │ ├── AddEntitiesModal.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainAdmin │ │ │ │ │ ├── DomainAdmin.js │ │ │ │ │ └── index.js │ │ │ │ ├── EntitiesSearch │ │ │ │ │ ├── EntitiesSearch.js │ │ │ │ │ └── index.js │ │ │ │ ├── EntityAccessGroup │ │ │ │ │ ├── EntityAccessGroup.js │ │ │ │ │ └── index.js │ │ │ │ ├── EntityDetails │ │ │ │ │ ├── EntityDetails.js │ │ │ │ │ └── index.js │ │ │ │ ├── EntityDisplay │ │ │ │ │ ├── EntityDisplay.js │ │ │ │ │ └── index.js │ │ │ │ ├── EntitySearchableDropdown │ │ │ │ │ ├── EntitySearchableDropdown.js │ │ │ │ │ └── index.js │ │ │ │ ├── GroupAdmin │ │ │ │ │ ├── GroupAdmin.js │ │ │ │ │ └── index.js │ │ │ │ ├── UserAdmin │ │ │ │ │ ├── UserAdmin.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ └── withAddRemoveModals │ │ │ │ │ ├── index.js │ │ │ │ │ └── withAddRemoveModals.js │ │ │ ├── containers │ │ │ │ ├── Admin │ │ │ │ │ ├── Admin.js │ │ │ │ │ ├── AdminHelpers.js │ │ │ │ │ ├── AdminHelpers.spec.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── routes │ │ │ │ ├── AdminRoutes.js │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── idam │ │ │ │ ├── current-entity │ │ │ │ │ ├── current-entity.js │ │ │ │ │ └── index.js │ │ │ │ ├── entities │ │ │ │ │ ├── entities.js │ │ │ │ │ └── index.js │ │ │ │ ├── entity-suggestions │ │ │ │ │ ├── entity-suggestions.helpers.js │ │ │ │ │ ├── entity-suggestions.js │ │ │ │ │ └── index.js │ │ │ │ ├── idam.js │ │ │ │ ├── index.js │ │ │ │ └── search-suggestions │ │ │ │ │ ├── index.js │ │ │ │ │ └── search-suggestions.js │ │ │ │ └── index.js │ │ ├── anti-spoofing │ │ │ ├── components │ │ │ │ ├── DomainsStatusDisplay │ │ │ │ │ ├── DomainsStatusDisplay.js │ │ │ │ │ └── index.js │ │ │ │ ├── Pagination │ │ │ │ │ ├── Pagination.js │ │ │ │ │ └── index.js │ │ │ │ ├── RatingDisplay │ │ │ │ │ ├── RatingDisplay.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── containers │ │ │ │ ├── AntiSpoofing │ │ │ │ │ ├── AntiSpoofing.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── routes │ │ │ │ ├── AntiSpoofingRoutes.js │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── domains.js │ │ │ │ └── index.js │ │ ├── common │ │ │ ├── components │ │ │ │ ├── Breadcrumb │ │ │ │ │ ├── Breadcrumb.js │ │ │ │ │ ├── Breadcrumb.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Breadcrumb.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── BreadcrumbItem │ │ │ │ │ ├── BreadcrumbItem.js │ │ │ │ │ ├── BreadcrumbItem.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── BreadcrumbItem.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ConfirmationModal │ │ │ │ │ ├── ConfirmationModal.js │ │ │ │ │ ├── ConfirmationModal.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── ConfirmationModal.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DetailedTab │ │ │ │ │ ├── DetailedTab.css │ │ │ │ │ ├── DetailedTab.js │ │ │ │ │ ├── DetailedTab.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DetailedTab.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DetailedTabList │ │ │ │ │ ├── DetailedTabList.css │ │ │ │ │ ├── DetailedTabList.js │ │ │ │ │ ├── DetailedTabList.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DetailedTabList.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── IeFriendlyVictoryChart │ │ │ │ │ ├── IeFriendlyVictoryChart.js │ │ │ │ │ └── index.js │ │ │ │ ├── MailCheckMessage │ │ │ │ │ ├── MailCheckMessage.css │ │ │ │ │ ├── MailCheckMessage.js │ │ │ │ │ ├── MailCheckMessage.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── MailCheckMessage.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ScrollToTop │ │ │ │ │ ├── ScrollToTop.js │ │ │ │ │ ├── ScrollToTop.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── ScrollToTop.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── ShowMoreDropdown │ │ │ │ │ ├── ShowMoreDropdown.css │ │ │ │ │ ├── ShowMoreDropdown.js │ │ │ │ │ ├── ShowMoreDropdown.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── ShowMoreDropdown.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── TermsAndConditions │ │ │ │ │ ├── TermsAndConditions.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── helpers │ │ │ │ ├── action-helpers │ │ │ │ │ ├── action.helpers.js │ │ │ │ │ └── index.js │ │ │ │ ├── api-helpers │ │ │ │ │ ├── api.helpers.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ ├── markdown │ │ │ │ │ ├── index.js │ │ │ │ │ └── renderer.helpers.js │ │ │ │ ├── reducer-helpers │ │ │ │ │ ├── index.js │ │ │ │ │ └── reducer.helpers.js │ │ │ │ └── state │ │ │ │ │ ├── index.js │ │ │ │ │ └── state.helpers.js │ │ │ ├── index.js │ │ │ ├── routes │ │ │ │ ├── CommonRoutes.js │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── index.js │ │ │ │ ├── initial-state │ │ │ │ ├── index.js │ │ │ │ └── initial-state.js │ │ │ │ ├── reducers │ │ │ │ ├── current-user │ │ │ │ │ ├── current-user.js │ │ │ │ │ ├── current-user.spec.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ └── root.reducer.js │ │ │ │ └── store.js │ │ ├── domain-security │ │ │ ├── assets │ │ │ │ └── doc.png │ │ │ ├── components │ │ │ │ ├── AggregateReportChart │ │ │ │ │ ├── AggregateReportChart.js │ │ │ │ │ ├── AggregateReportChart.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── AggregateReportChart.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── AggregateReportChartLegend │ │ │ │ │ ├── AggregateReportChartLegend.css │ │ │ │ │ ├── AggregateReportChartLegend.js │ │ │ │ │ ├── AggregateReportChartLegend.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── AggregateReportChartLegend.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── AggregateReportDateSelector │ │ │ │ │ ├── AggregateReportDateSelector.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── periodOptions.json │ │ │ │ ├── AggregateReportSummary │ │ │ │ │ ├── AggregateReportSummary.css │ │ │ │ │ ├── AggregateReportSummary.js │ │ │ │ │ ├── AggregateReportSummary.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── AggregateReportSummary.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsMessages │ │ │ │ │ ├── DomainSecurityDetailsMessages.css │ │ │ │ │ ├── DomainSecurityDetailsMessages.js │ │ │ │ │ ├── DomainSecurityDetailsMessages.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecurityDetailsMessages.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsMx │ │ │ │ │ ├── DomainSecurityDetailsMx.js │ │ │ │ │ ├── DomainSecurityDetailsMx.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecurityDetailsMx.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsTxt │ │ │ │ │ ├── DomainSecurityDetailsTxt.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityPill │ │ │ │ │ ├── DomainSecurityPill.css │ │ │ │ │ ├── DomainSecurityPill.js │ │ │ │ │ ├── DomainSecurityPill.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecurityPill.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityRecord │ │ │ │ │ ├── DomainSecurityRecord.css │ │ │ │ │ ├── DomainSecurityRecord.js │ │ │ │ │ ├── DomainSecurityRecord.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecurityRecord.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityRecordExplanation │ │ │ │ │ ├── DomainSecurityRecordExplanation.css │ │ │ │ │ ├── DomainSecurityRecordExplanation.js │ │ │ │ │ ├── DomainSecurityRecordExplanation.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecurityRecordExplanation.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummary │ │ │ │ │ ├── DomainSecuritySummary.css │ │ │ │ │ ├── DomainSecuritySummary.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryMessages │ │ │ │ │ ├── DomainSecuritySummaryMessages.js │ │ │ │ │ ├── DomainSecuritySummaryMessages.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecuritySummaryMessages.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryMx │ │ │ │ │ ├── DomainSecuritySummaryMx.js │ │ │ │ │ ├── DomainSecuritySummaryMx.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecuritySummaryMx.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummarySubdomains │ │ │ │ │ ├── DomainSecuritySummarySubdomains.js │ │ │ │ │ ├── DomainSecuritySummarySubdomains.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecuritySummarySubdomains.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryTxt │ │ │ │ │ ├── DomainSecuritySummaryTxt.js │ │ │ │ │ ├── DomainSecuritySummaryTxt.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecuritySummaryTxt.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityTitle │ │ │ │ │ ├── DomainSecurityTitle.css │ │ │ │ │ ├── DomainSecurityTitle.helpers.js │ │ │ │ │ ├── DomainSecurityTitle.js │ │ │ │ │ ├── DomainSecurityTitle.spec.js │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DomainSecurityTitle.spec.js.snap │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── containers │ │ │ │ ├── AggregateReportSummaryContainer │ │ │ │ │ ├── AggregateReportSummaryContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityAggregateExport │ │ │ │ │ ├── DomainSecurityAggregateExport.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsCertificates │ │ │ │ │ ├── DomainSecurityDetailsCertificates.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsDkimContainer │ │ │ │ │ ├── DomainSecurityDetailsDkimContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsDmarc │ │ │ │ │ ├── DomainSecurityDetailsDmarc.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsSpf │ │ │ │ │ ├── DomainSecurityDetailsSpf.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityDetailsTls │ │ │ │ │ ├── DomainSecurityDetailsTls.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryCertificatesContainer │ │ │ │ │ ├── DomainSecuritySummaryCertificatesContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryContainer │ │ │ │ │ ├── DomainSecuritySummaryContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryDkimContainer │ │ │ │ │ ├── DomainSecuritySummaryDkimContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryDmarcContainer │ │ │ │ │ ├── DomainSecuritySummaryDmarcContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummarySpfContainer │ │ │ │ │ ├── DomainSecuritySummarySpfContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummarySubdomainsContainer │ │ │ │ │ ├── DomainSecuritySummarySubdomainsContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecuritySummaryTlsContainer │ │ │ │ │ ├── DomainSecuritySummaryTlsContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── DomainSecurityTlsAdvice │ │ │ │ │ ├── DomainSecurityTlsAdvice.css │ │ │ │ │ ├── DomainSecurityTlsAdvice.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── context │ │ │ │ ├── DomainSecurityLocationContext │ │ │ │ │ ├── DomainSecurityLocationContext.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── data │ │ │ │ ├── aggregate-report-export-fields.json │ │ │ │ ├── aggregate-report-info-static-data.json │ │ │ │ ├── domain-security-copy.json │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── routes │ │ │ │ ├── DomainSecurityRoutes.js │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── domain-security-aggregate-data.js │ │ │ │ ├── domain-security-certificates.js │ │ │ │ ├── domain-security-dkim.js │ │ │ │ ├── domain-security-dmarc.js │ │ │ │ ├── domain-security-domain.js │ │ │ │ ├── domain-security-spf.js │ │ │ │ ├── domain-security-subdomains.js │ │ │ │ ├── domain-security-tls.js │ │ │ │ ├── helpers │ │ │ │ ├── domain-security-store.helpers.js │ │ │ │ ├── domain-security-store.helpers.spec.js │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ ├── index.css │ │ ├── index.js │ │ ├── metrics │ │ │ ├── components │ │ │ │ ├── MetricsChart │ │ │ │ │ ├── MetricsChart.js │ │ │ │ │ └── index.js │ │ │ │ ├── MetricsDateRange │ │ │ │ │ ├── MetricsDateRange.js │ │ │ │ │ └── index.js │ │ │ │ ├── MetricsHeadlineStats │ │ │ │ │ ├── MetricsHeadlineStats.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── containers │ │ │ │ ├── Metrics │ │ │ │ │ ├── Metrics.css │ │ │ │ │ ├── Metrics.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── routes │ │ │ │ ├── MetricsRoutes.js │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── index.js │ │ │ │ └── metrics.js │ │ ├── my-domains │ │ │ ├── containers │ │ │ │ ├── MyDomains │ │ │ │ │ ├── MyDomains.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── data │ │ │ │ ├── index.js │ │ │ │ └── my-domains-copy.json │ │ │ ├── index.js │ │ │ ├── routes │ │ │ │ ├── MyDomainsRoutes.js │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── index.js │ │ │ │ └── my-domains.js │ │ ├── page │ │ │ ├── assets │ │ │ │ ├── company-logo-inverted.svg │ │ │ │ ├── company-logo.png │ │ │ │ └── index.js │ │ │ ├── components │ │ │ │ ├── AgreeToTermsMessage │ │ │ │ │ ├── AgreeToTermsMessage.js │ │ │ │ │ └── index.js │ │ │ │ ├── Banner │ │ │ │ │ ├── Banner.css │ │ │ │ │ ├── Banner.js │ │ │ │ │ └── index.js │ │ │ │ ├── CurrentUserMenu │ │ │ │ │ ├── CurrentUserMenu.js │ │ │ │ │ └── index.js │ │ │ │ ├── InitialRedirect │ │ │ │ │ ├── InitialRedirect.js │ │ │ │ │ └── index.js │ │ │ │ ├── NavBar │ │ │ │ │ ├── NavBar.css │ │ │ │ │ ├── NavBar.js │ │ │ │ │ └── index.js │ │ │ │ ├── PageFooter │ │ │ │ │ ├── PageFooter.css │ │ │ │ │ ├── PageFooter.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── containers │ │ │ │ ├── InitialRedirectContainer │ │ │ │ │ ├── InitialRedirectContainer.js │ │ │ │ │ └── index.js │ │ │ │ ├── PageHeader │ │ │ │ │ ├── PageHeader.css │ │ │ │ │ ├── PageHeader.js │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── data │ │ │ │ ├── footer-links.json │ │ │ │ ├── index.js │ │ │ │ └── nav-links.json │ │ │ ├── index.js │ │ │ └── routes │ │ │ │ ├── PageRoutes.js │ │ │ │ └── index.js │ │ ├── registerServiceWorker.js │ │ └── welcome │ │ │ ├── components │ │ │ ├── Welcome │ │ │ │ ├── Welcome.js │ │ │ │ ├── Welcome.spec.js │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── Welcome.spec.js.snap │ │ │ │ └── index.js │ │ │ ├── WelcomeSearchMessages │ │ │ │ ├── WelcomeSearchMessages.js │ │ │ │ ├── WelcomeSearchMessages.spec.js │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── WelcomeSearchMessages.spec.js.snap │ │ │ │ └── index.js │ │ │ └── index.js │ │ │ ├── containers │ │ │ ├── WelcomeContainer │ │ │ │ ├── WelcomeContainer.js │ │ │ │ └── index.js │ │ │ └── index.js │ │ │ ├── routes │ │ │ ├── WelcomeRoutes.js │ │ │ └── index.js │ │ │ └── store │ │ │ ├── index.js │ │ │ └── welcome.js │ ├── test │ │ └── e2e │ │ │ └── mail-check-login.js │ └── yarn.lock └── ukncsc-semantic-ui-theme │ ├── gulpfile.js │ ├── package.json │ ├── readme.md │ ├── semantic.json │ ├── src │ ├── definitions │ │ ├── collections │ │ │ ├── breadcrumb.less │ │ │ ├── form.less │ │ │ ├── grid.less │ │ │ ├── menu.less │ │ │ ├── message.less │ │ │ └── table.less │ │ ├── elements │ │ │ ├── button.less │ │ │ ├── container.less │ │ │ ├── divider.less │ │ │ ├── flag.less │ │ │ ├── header.less │ │ │ ├── icon.less │ │ │ ├── image.less │ │ │ ├── input.less │ │ │ ├── label.less │ │ │ ├── list.less │ │ │ ├── loader.less │ │ │ ├── rail.less │ │ │ ├── reveal.less │ │ │ ├── segment.less │ │ │ └── step.less │ │ ├── globals │ │ │ ├── reset.less │ │ │ └── site.less │ │ ├── modules │ │ │ ├── accordion.less │ │ │ ├── checkbox.less │ │ │ ├── dimmer.less │ │ │ ├── dropdown.less │ │ │ ├── embed.less │ │ │ ├── modal.less │ │ │ ├── nag.less │ │ │ ├── popup.less │ │ │ ├── progress.less │ │ │ ├── rating.less │ │ │ ├── search.less │ │ │ ├── shape.less │ │ │ ├── sidebar.less │ │ │ ├── sticky.less │ │ │ ├── tab.less │ │ │ └── transition.less │ │ └── views │ │ │ ├── ad.less │ │ │ ├── card.less │ │ │ ├── comment.less │ │ │ ├── feed.less │ │ │ ├── item.less │ │ │ └── statistic.less │ ├── semantic.less │ ├── site │ │ ├── collections │ │ │ ├── breadcrumb.overrides │ │ │ ├── breadcrumb.variables │ │ │ ├── form.overrides │ │ │ ├── form.variables │ │ │ ├── grid.overrides │ │ │ ├── grid.variables │ │ │ ├── menu.overrides │ │ │ ├── menu.variables │ │ │ ├── message.overrides │ │ │ ├── message.variables │ │ │ ├── table.overrides │ │ │ └── table.variables │ │ ├── elements │ │ │ ├── button.overrides │ │ │ ├── button.variables │ │ │ ├── container.overrides │ │ │ ├── container.variables │ │ │ ├── divider.overrides │ │ │ ├── divider.variables │ │ │ ├── flag.overrides │ │ │ ├── flag.variables │ │ │ ├── header.overrides │ │ │ ├── header.variables │ │ │ ├── icon.overrides │ │ │ ├── icon.variables │ │ │ ├── image.overrides │ │ │ ├── image.variables │ │ │ ├── input.overrides │ │ │ ├── input.variables │ │ │ ├── label.overrides │ │ │ ├── label.variables │ │ │ ├── list.overrides │ │ │ ├── list.variables │ │ │ ├── loader.overrides │ │ │ ├── loader.variables │ │ │ ├── rail.overrides │ │ │ ├── rail.variables │ │ │ ├── reveal.overrides │ │ │ ├── reveal.variables │ │ │ ├── segment.overrides │ │ │ ├── segment.variables │ │ │ ├── step.overrides │ │ │ └── step.variables │ │ ├── globals │ │ │ ├── reset.overrides │ │ │ ├── reset.variables │ │ │ ├── site.overrides │ │ │ └── site.variables │ │ ├── modules │ │ │ ├── accordion.overrides │ │ │ ├── accordion.variables │ │ │ ├── chatroom.overrides │ │ │ ├── chatroom.variables │ │ │ ├── checkbox.overrides │ │ │ ├── checkbox.variables │ │ │ ├── dimmer.overrides │ │ │ ├── dimmer.variables │ │ │ ├── dropdown.overrides │ │ │ ├── dropdown.variables │ │ │ ├── embed.overrides │ │ │ ├── embed.variables │ │ │ ├── modal.overrides │ │ │ ├── modal.variables │ │ │ ├── nag.overrides │ │ │ ├── nag.variables │ │ │ ├── popup.overrides │ │ │ ├── popup.variables │ │ │ ├── progress.overrides │ │ │ ├── progress.variables │ │ │ ├── rating.overrides │ │ │ ├── rating.variables │ │ │ ├── search.overrides │ │ │ ├── search.variables │ │ │ ├── shape.overrides │ │ │ ├── shape.variables │ │ │ ├── sidebar.overrides │ │ │ ├── sidebar.variables │ │ │ ├── sticky.overrides │ │ │ ├── sticky.variables │ │ │ ├── tab.overrides │ │ │ ├── tab.variables │ │ │ ├── transition.overrides │ │ │ └── transition.variables │ │ └── views │ │ │ ├── ad.overrides │ │ │ ├── ad.variables │ │ │ ├── card.overrides │ │ │ ├── card.variables │ │ │ ├── comment.overrides │ │ │ ├── comment.variables │ │ │ ├── feed.overrides │ │ │ ├── feed.variables │ │ │ ├── item.overrides │ │ │ ├── item.variables │ │ │ ├── statistic.overrides │ │ │ └── statistic.variables │ ├── theme.config │ ├── theme.less │ └── themes │ │ └── default │ │ ├── assets │ │ ├── fonts │ │ │ ├── brand-icons.eot │ │ │ ├── brand-icons.svg │ │ │ ├── brand-icons.ttf │ │ │ ├── brand-icons.woff │ │ │ ├── brand-icons.woff2 │ │ │ ├── icons.eot │ │ │ ├── icons.svg │ │ │ ├── icons.ttf │ │ │ ├── icons.woff │ │ │ ├── icons.woff2 │ │ │ ├── outline-icons.eot │ │ │ ├── outline-icons.svg │ │ │ ├── outline-icons.ttf │ │ │ ├── outline-icons.woff │ │ │ └── outline-icons.woff2 │ │ └── images │ │ │ └── flags.png │ │ ├── collections │ │ ├── breadcrumb.overrides │ │ ├── breadcrumb.variables │ │ ├── form.overrides │ │ ├── form.variables │ │ ├── grid.overrides │ │ ├── grid.variables │ │ ├── menu.overrides │ │ ├── menu.variables │ │ ├── message.overrides │ │ ├── message.variables │ │ ├── table.overrides │ │ └── table.variables │ │ ├── elements │ │ ├── button.overrides │ │ ├── button.variables │ │ ├── container.overrides │ │ ├── container.variables │ │ ├── divider.overrides │ │ ├── divider.variables │ │ ├── flag.overrides │ │ ├── flag.variables │ │ ├── header.overrides │ │ ├── header.variables │ │ ├── icon.overrides │ │ ├── icon.variables │ │ ├── image.overrides │ │ ├── image.variables │ │ ├── input.overrides │ │ ├── input.variables │ │ ├── label.overrides │ │ ├── label.variables │ │ ├── list.overrides │ │ ├── list.variables │ │ ├── loader.overrides │ │ ├── loader.variables │ │ ├── rail.overrides │ │ ├── rail.variables │ │ ├── reveal.overrides │ │ ├── reveal.variables │ │ ├── segment.overrides │ │ ├── segment.variables │ │ ├── step.overrides │ │ └── step.variables │ │ ├── globals │ │ ├── reset.overrides │ │ ├── reset.variables │ │ ├── site.overrides │ │ └── site.variables │ │ ├── modules │ │ ├── accordion.overrides │ │ ├── accordion.variables │ │ ├── chatroom.overrides │ │ ├── chatroom.variables │ │ ├── checkbox.overrides │ │ ├── checkbox.variables │ │ ├── dimmer.overrides │ │ ├── dimmer.variables │ │ ├── dropdown.overrides │ │ ├── dropdown.variables │ │ ├── embed.overrides │ │ ├── embed.variables │ │ ├── modal.overrides │ │ ├── modal.variables │ │ ├── nag.overrides │ │ ├── nag.variables │ │ ├── popup.overrides │ │ ├── popup.variables │ │ ├── progress.overrides │ │ ├── progress.variables │ │ ├── rating.overrides │ │ ├── rating.variables │ │ ├── search.overrides │ │ ├── search.variables │ │ ├── shape.overrides │ │ ├── shape.variables │ │ ├── sidebar.overrides │ │ ├── sidebar.variables │ │ ├── sticky.overrides │ │ ├── sticky.variables │ │ ├── tab.overrides │ │ ├── tab.variables │ │ ├── transition.overrides │ │ └── transition.variables │ │ └── views │ │ ├── ad.overrides │ │ ├── ad.variables │ │ ├── card.overrides │ │ ├── card.variables │ │ ├── comment.overrides │ │ ├── comment.variables │ │ ├── feed.overrides │ │ ├── feed.variables │ │ ├── item.overrides │ │ ├── item.variables │ │ ├── statistic.overrides │ │ └── statistic.variables │ ├── tasks │ ├── README.md │ ├── admin │ │ ├── components │ │ │ ├── create.js │ │ │ ├── init.js │ │ │ └── update.js │ │ ├── distributions │ │ │ ├── create.js │ │ │ ├── init.js │ │ │ └── update.js │ │ ├── publish.js │ │ ├── register.js │ │ └── release.js │ ├── build.js │ ├── build │ │ ├── assets.js │ │ ├── css.js │ │ └── javascript.js │ ├── check-install.js │ ├── clean.js │ ├── collections │ │ ├── README.md │ │ ├── admin.js │ │ ├── build.js │ │ ├── internal.js │ │ └── rtl.js │ ├── config │ │ ├── admin │ │ │ ├── github.js │ │ │ ├── oauth.example.js │ │ │ ├── release.js │ │ │ └── templates │ │ │ │ ├── README.md │ │ │ │ ├── bower.json │ │ │ │ ├── component-package.js │ │ │ │ ├── composer.json │ │ │ │ ├── css-package.js │ │ │ │ ├── less-package.js │ │ │ │ └── package.json │ │ ├── defaults.js │ │ ├── docs.js │ │ ├── npm │ │ │ └── gulpfile.js │ │ ├── project │ │ │ ├── config.js │ │ │ ├── install.js │ │ │ └── release.js │ │ ├── tasks.js │ │ └── user.js │ ├── docs │ │ ├── build.js │ │ ├── metadata.js │ │ └── serve.js │ ├── install.js │ ├── rtl │ │ ├── build.js │ │ └── watch.js │ ├── version.js │ └── watch.js │ └── yarn.lock └── sql ├── dmarc_database_schema.sql ├── generate_temp_tables.sql └── schema ├── 2016-09-01-1200_schema_version_info_table.sql ├── 2016-09-02-1200_aggregate_report_tables.sql ├── 2016-10-01-1200_aggregate_effective_date.sql ├── 2017-04-07-1200_forensic_report_initial_tables.sql ├── 2017-06-16-1075_domain_normalisation.sql ├── 2017-06-29-1315_dns_record_mx_nullable_preference_column.sql ├── 2017-07-14-1553_add_timestamps_to_domain_permissions.sql ├── 2017-07-17-1129_alter_domain_permission_primary_key.sql ├── 2017-08-23-1011_tls_security_profiles.sql ├── 2017-10-09-1127_create_spf_read_model_table.sql ├── 2017-10-17-1254_create_dmarc_read_model_table.sql ├── 2017-11-22-1607_simple_user_domain_group.sql ├── 2017-12-15-1400_add_created_date_to_user_group.sql ├── 2018-01-08-1542_move_domain_id_to_record.sql ├── 2018-01-25-0908_domain_monitor_flag.sql ├── 2018-01-25-0930_import_new_domains.sql ├── 2018-02-01-1035_alter_publish_default.sql ├── 2018-02-08-1136_create_tls_profile_and_certificate_mapping_tables.sql ├── 2018-02-13-1309_generate_tls_evaluator_results_table.sql.sql ├── 2018-02-19-1606_add_provider_entity_reference_from_agg_report.sql ├── 2018-03-27-1358_regenerate_permissions_tables.sql ├── 2018-03-29-0901_scheduled_job_semaphore_table.sql ├── 2018-03-29-0902_import_new_providers.sql ├── 2018-03-29-0903_generate_derived_tables_incremental.sql ├── 2018-03-29-0904_generate_derived_top10_incremental.sql ├── 2018-03-29-0905_generate_derived_domain_tree_rollup.sql ├── 2018-03-29-0906_generate_derived_daily_rollup.sql ├── 2018-03-29-0907_generate_derived_daily_senders_rollup.sql ├── 2018-03-29-0910_scheduled_events.sql ├── 2018-04-12-1450_drop_dns_record_ns.sql ├── 2018-04-24-2359_remove_derived_table_version_for_this_date.sql ├── 2018-04-27-0901_scheduled_job_semaphore_table.sql ├── 2018-04-27-1000_import_new_domains.sql ├── 2018-04-27-1001_import_new_providers.sql ├── 2018-04-27-1102_generate_derived_tables_incremental.sql ├── 2018-04-27-1103_generate_derived_top10_incremental.sql ├── 2018-04-27-1200_generate_derived_domain_tree_rollup.sql ├── 2018-04-27-1301_generate_derived_daily_rollup.sql ├── 2018-04-27-1302_generate_derived_daily_senders_rollup.sql ├── 2018-04-27-1700_scheduled_events.sql ├── 2018-04-30-0900_rename_versioned_tables.sql ├── 2018-04-30-0901_scheduled_job_semaphore_table.sql ├── 2018-04-30-1000_import_new_domains.sql ├── 2018-04-30-1001_import_new_providers.sql ├── 2018-04-30-1102_generate_derived_tables_incremental.sql ├── 2018-04-30-1103_generate_derived_top10_incremental.sql ├── 2018-04-30-1200_generate_derived_domain_tree_rollup.sql ├── 2018-04-30-1301_generate_derived_daily_rollup.sql ├── 2018-04-30-1305_generate_derived_daily_senders_rollup.sql ├── 2018-04-30-1700_scheduled_events.sql ├── 2018-05-09-0839_update_tls_evaluator_results.sql ├── 2018-05-09-1709_daily_task_set_monitor_flag.sql ├── 2018-06-04-1525_remove_scsv_column.sql ├── 2018-06-04-1618_last_checked_tls_results.sql ├── 2018-06-11-1520_certificate_add_raw_data.sql ├── 2018-06-13-1437_import_new_domains.sql ├── 2018-06-14-0940_generate_stats.sql ├── 2018-06-15-13-45_remove_forensic_and_unused_tables.sql ├── 2018-07-02-13-03_change_report_unique_index_for_deduplication.sql ├── 2018-07-16-13-02_update_to_use_json_for_mx_results.sql ├── 2018-07-24-1346_add_missing_aggregate_report_columns.sql ├── 2018-08-28-1029_add_org_name_columns_to_dmarc.sql └── 2018-09-10-1135_update_tls_status_generated_column.sql /RELEASE: -------------------------------------------------------------------------------- 1 | v1.9 2 | -------------------------------------------------------------------------------- /Terraform/common/common/provider.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = "${var.aws-region}" 3 | // shared_credentials_file = "/mnt/jenkins-home/aws-shared-credentials" 4 | } 5 | 6 | -------------------------------------------------------------------------------- /Terraform/modules/ECScluster-module/cluster.tf: -------------------------------------------------------------------------------- 1 | # Create ECS Cluster 2 | 3 | resource "aws_ecs_cluster" "microservice-cluster" { 4 | name = "TF-${var.env-name}-${var.cluster-name}" 5 | } 6 | 7 | resource "aws_cloudwatch_log_group" "microservice-cluster-log-group" { 8 | name = "TF-${var.env-name}-ECS-${var.cluster-name}" 9 | } 10 | 11 | -------------------------------------------------------------------------------- /Terraform/modules/ECScluster-module/scaling-policy.tf: -------------------------------------------------------------------------------- 1 | resource "aws_autoscaling_policy" "scale-policy" { 2 | name = "TF-${var.env-name}-${var.cluster-name}-scale-policy" 3 | scaling_adjustment = 1 4 | adjustment_type = "ChangeInCapacity" 5 | cooldown = 300 6 | autoscaling_group_name = "${aws_autoscaling_group.ecs-cluster.name}" 7 | } 8 | -------------------------------------------------------------------------------- /Terraform/modules/Microservice-module/input-sqs-queue-subscriptions.tf: -------------------------------------------------------------------------------- 1 | resource "aws_sns_topic_subscription" "sns-subscription" { 2 | count = "${var.input-queue-subscription-count}" 3 | topic_arn = "${element(split(",",var.input-queue-subscriptions),count.index)}" 4 | protocol = "sqs" 5 | endpoint = "${aws_sqs_queue.microservice-input-queue.arn}" 6 | raw_message_delivery = "${var.raw-queue-subscription}" 7 | } 8 | -------------------------------------------------------------------------------- /Terraform/modules/Microservice-module/output-sns-topic.tf: -------------------------------------------------------------------------------- 1 | resource "aws_sns_topic" "microservice-output" { 2 | name = "TF-${var.env-name}-${var.service-name}-output" 3 | } 4 | -------------------------------------------------------------------------------- /Terraform/modules/Microservice-module/outputs.tf: -------------------------------------------------------------------------------- 1 | output "sns-arn" { 2 | value = "${aws_sns_topic.microservice-output.arn}" 3 | } 4 | 5 | output "sqs-arn" { 6 | value = ["${aws_sqs_queue.microservice-input-queue.*.arn}"] 7 | } 8 | -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/copy_snapshots_dest_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/copy_snapshots_dest_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/copy_snapshots_no_x_account_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/copy_snapshots_no_x_account_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/delete_old_snapshots_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/delete_old_snapshots_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/delete_old_snapshots_dest_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/delete_old_snapshots_dest_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/delete_old_snapshots_no_x_account_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/delete_old_snapshots_no_x_account_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/share_snapshots_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/share_snapshots_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/auroraBackup-module/lambda-packages/take_snapshots_aurora.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/Terraform/modules/auroraBackup-module/lambda-packages/take_snapshots_aurora.zip -------------------------------------------------------------------------------- /Terraform/modules/lambdaProcessor-module/output-sns-topic.tf: -------------------------------------------------------------------------------- 1 | resource "aws_sns_topic" "lambdaprocessor-output" { 2 | name = "TF-${var.env-name}-${var.lambda-function-name}-output" 3 | } 4 | -------------------------------------------------------------------------------- /Terraform/modules/lambdaProcessor-module/outputs.tf: -------------------------------------------------------------------------------- 1 | output "lambda-arn" { 2 | value = "${aws_lambda_function.scheduled-lambda-function.arn}" 3 | } 4 | 5 | output "sns-arn" { 6 | value = "${aws_sns_topic.lambdaprocessor-output.arn}" 7 | } 8 | -------------------------------------------------------------------------------- /Terraform/modules/loadBalancer-module/data.tf: -------------------------------------------------------------------------------- 1 | data "aws_route53_zone" "service-zone" { 2 | zone_id = "${var.route53-zone-id}" 3 | private_zone = true 4 | vpc_id = "${var.vpc-id}" 5 | } 6 | 7 | data "aws_acm_certificate" "lb-acm-cert" { 8 | domain = "${var.certificate-name == "" ? "*.${substr(data.aws_route53_zone.service-zone.name,0,length(data.aws_route53_zone.service-zone.name)-1)}" : "${var.certificate-name}"}" 9 | 10 | statuses = ["ISSUED"] 11 | } 12 | -------------------------------------------------------------------------------- /Terraform/modules/sourceip-module/ip-lists.tf: -------------------------------------------------------------------------------- 1 | variable "internal-sources" { 2 | type = "map" 3 | 4 | default = { 5 | 6 | } 7 | } 8 | 9 | variable "external-sources" { 10 | type = "map" 11 | 12 | default = { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/provider.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = "${var.aws-region}" 3 | allowed_account_ids = "${split(",",var.allowed-account-ids)}" 4 | 5 | assume_role { 6 | role_arn = "${var.role-to-assume}" 7 | } 8 | } 9 | 10 | provider "aws" { 11 | alias = "secondary" 12 | region = "${var.aws-secondary-region}" 13 | } 14 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/s3-notification-sqs.tf: -------------------------------------------------------------------------------- 1 | resource "aws_s3_bucket_notification" "aggregate_bucket_notification" { 2 | // provider = "aws.secondary" 3 | 4 | bucket = "${var.aggregate-report-bucket}" 5 | 6 | queue { 7 | queue_arn = "${aws_sqs_queue.aggregate-report-queue1.arn}" 8 | events = ["s3:ObjectCreated:*"] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/sns-cloudwatch-alerts.tf: -------------------------------------------------------------------------------- 1 | resource "aws_sns_topic" "cloudwatch-alerts" { 2 | name = "TF-${var.env-name}-cloudwatch-alerts" 3 | } 4 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/sns-topics.tf: -------------------------------------------------------------------------------- 1 | resource "aws_sns_topic" "selector-seen-in-aggregate-report" { 2 | name = "TF-${var.env-name}-selector-seen-in-aggregate-report" 3 | } 4 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/sourceip-module.tf: -------------------------------------------------------------------------------- 1 | module "sourceip" { 2 | source = "../../private-modules/sourceip-module" 3 | } 4 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/terraform-backend.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | backend "s3" { 3 | bucket = "ncscdmarc-terraform-state" 4 | key = "" 5 | region = "eu-west-2" 6 | // shared_credentials_file = "/mnt/jenkins-home/aws-shared-credentials" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/terraform-tfstate.tf: -------------------------------------------------------------------------------- 1 | data "terraform_remote_state" "tfstate" { 2 | backend = "s3" 3 | config { 4 | bucket = "ncscdmarc-terraform-state" 5 | key = "${var.env-name}/terraform.tfstate" 6 | region = "eu-west-2" 7 | // shared_credentials_file = "/mnt/jenkins-home/aws-shared-credentials" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Terraform/prod-env/prod-env/vpc-endpoints.tf: -------------------------------------------------------------------------------- 1 | resource "aws_vpc_endpoint" "private-s3" { 2 | vpc_id = "${aws_vpc.dmarc-env.id}" 3 | service_name = "com.amazonaws.${var.aws-region}.s3" 4 | } 5 | 6 | resource "aws_vpc_endpoint_route_table_association" "private_s3" { 7 | count = "${var.zone-count}" 8 | vpc_endpoint_id = "${aws_vpc_endpoint.private-s3.id}" 9 | route_table_id = "${element(aws_route_table.private.*.id,count.index)}" 10 | } 11 | 12 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { DmarcServicePage } from './app.po'; 2 | 3 | describe('dmarc-service App', function() { 4 | let page: DmarcServicePage; 5 | 6 | beforeEach(() => { 7 | page = new DmarcServicePage(); 8 | }); 9 | 10 | it('should display message saying app works', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toEqual('app works!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, element, by } from 'protractor'; 2 | 3 | export class DmarcServicePage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "declaration": false, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "module": "commonjs", 8 | "moduleResolution": "node", 9 | "outDir": "../dist/out-tsc-e2e", 10 | "sourceMap": true, 11 | "target": "es5", 12 | "typeRoots": [ 13 | "../node_modules/@types" 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/components/aggregate-report-dmarc-dash/aggregate-report-dmarc-dash.component.css: -------------------------------------------------------------------------------- 1 | .dash-item{ 2 | margin-top: 20px; 3 | } 4 | 5 | .card{ 6 | border: 1px solid #D7DBE5; 7 | } 8 | 9 | .card-header{ 10 | color: #464A4C; 11 | font-weight: bold; 12 | background: #D7DBE5; 13 | border-radius: 0; 14 | border: 0; 15 | } 16 | 17 | .alert{ 18 | border-radius: 0; 19 | border: 0; 20 | } -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/components/chart/chart.component.css: -------------------------------------------------------------------------------- 1 | .card{ 2 | border: 1px solid #D7DBE5; 3 | } 4 | 5 | .card-header{ 6 | color: #464A4C; 7 | font-weight: bold; 8 | background: #D7DBE5; 9 | border-radius: 0; 10 | border: 0; 11 | } 12 | 13 | .badge 14 | { 15 | margin-top: 40px; 16 | } 17 | 18 | .hidden { 19 | visibility: hidden; 20 | } 21 | 22 | 23 | mat-spinner{ 24 | margin-top: 30px; 25 | } -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/components/chart/doughnut-chart.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { ChartComponent } from './chart.component'; 3 | 4 | @Component({ 5 | selector: 'doughnut-chart', 6 | templateUrl: './chart.component.html', 7 | styleUrls: ['./chart.component.css'] 8 | }) 9 | export class DoughnutComponent extends ChartComponent { 10 | constructor() { 11 | super(); 12 | this.chartType = 'doughnut'; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/components/filter/filter.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/src/angular/dmarc-service/src/app/aggregate-report/components/filter/filter.component.css -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/components/filter/filtervalues.model.ts: -------------------------------------------------------------------------------- 1 | export class FilterValues { 2 | constructor( 3 | public beginDate: Date, 4 | public endDate: Date, 5 | public domain: string, 6 | public domainId: number, 7 | public clear: boolean 8 | ) {} 9 | } 10 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/mappers/dataset.model.ts: -------------------------------------------------------------------------------- 1 | export class Series { 2 | public data: number[]; 3 | 4 | constructor(public name: string) { 5 | this.data = []; 6 | } 7 | } 8 | 9 | export class Dataset { 10 | constructor(public labels: string[], public series: Series[]) {} 11 | } 12 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/mappers/response-mapper.interface.ts: -------------------------------------------------------------------------------- 1 | export interface ResponseMapperInterface { 2 | mapResponse(response: any): any; 3 | } 4 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/services/aggregated-headline-statistics.model.ts: -------------------------------------------------------------------------------- 1 | export class HeadlineStatistics { 2 | constructor( 3 | public domainCount: number, 4 | public emailCount: number, 5 | public trustedPercentage: number, 6 | public untrustedPercentage: number, 7 | public fullyCompliantPercentage: number, 8 | public untrustedFilteredPercentage: number 9 | ) {} 10 | } 11 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/aggregate-report/services/statistics-source.interface.ts: -------------------------------------------------------------------------------- 1 | import { Observable } from 'rxjs/Rx'; 2 | 3 | export interface StatisticsSourceInterface { 4 | getStatistics( 5 | beginDate: Date, 6 | endDate: Date, 7 | domainId: number 8 | ): Observable; 9 | } 10 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | .container { 2 | background: white; 3 | min-height: calc(100vh - 402px); 4 | padding-top: 20px; 5 | padding-bottom: 20px; 6 | } 7 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |

2 | By using Mail Check you are agreeing to our use of cookies and our 3 | Terms and Conditions of Service 4 |

5 | 6 | 7 | 8 |
9 |
10 | 11 |
12 |
13 | 14 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.css'], 7 | }) 8 | export class AppComponent {} 9 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/dns-record-dash-domain/dns-record-dash-domain.component.css: -------------------------------------------------------------------------------- 1 | .breadcrumb{ 2 | background: white; 3 | padding-left: 0px; 4 | } 5 | 6 | .dmarc{ 7 | margin-bottom: 25px; 8 | } 9 | 10 | .spf{ 11 | margin-bottom: 25px; 12 | } 13 | 14 | .tls{ 15 | margin-bottom: 25px; 16 | } -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/dns-record-dash-domain/dns-record-dash-domain.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 | 13 |
-------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/dns-record-dash/dns-record-dash.component.css: -------------------------------------------------------------------------------- 1 | h1{ 2 | margin-bottom: 30px; 3 | } 4 | 5 | h4{ 6 | margin-bottom: 30px; 7 | } 8 | 9 | dns-record-search{ 10 | margin-bottom: 30px; 11 | } 12 | 13 | .alert-warning{ 14 | background-color: #D7DBE5; 15 | border-width: 0; 16 | border-radius: 0; 17 | } 18 | 19 | .alert-warning h5{ 20 | color: #292b2c; 21 | } -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/domain-security-header/domain-security-header.component.css: -------------------------------------------------------------------------------- 1 | h1{ 2 | margin-bottom: 30px; 3 | } -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/no-results/no-results.component.css: -------------------------------------------------------------------------------- 1 | .alert-warning{ 2 | background-color: #D7DBE5; 3 | border-width: 0; 4 | border-radius: 0; 5 | } 6 | 7 | h5{ 8 | color: #292b2c; 9 | } -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/no-results/no-results.component.html: -------------------------------------------------------------------------------- 1 |
2 |
The search returned no results.
3 |
-------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/pagination-display/pagination-display.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/src/angular/dmarc-service/src/app/dns-record/components/pagination-display/pagination-display.component.css -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/components/spf/spf.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SpfComponent } from './spf.component'; 4 | 5 | describe('SpfComponent', () => { 6 | 7 | beforeEach(() => { 8 | }); 9 | 10 | it('should be created', () => { 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/long-tag-splitter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'longTagSplitter' 5 | }) 6 | export class LongTagSplitterPipe implements PipeTransform { 7 | 8 | transform(value: string): any { 9 | return value.match(/[^,]+,?|,/g); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/anti-spoofing.model.ts: -------------------------------------------------------------------------------- 1 | import { Domain } from './domain.model'; 2 | import { DmarcRecord } from './dmarc-record.model'; 3 | import { SpfRecord } from './spf-record.model'; 4 | 5 | export interface AntiSpoofing { 6 | domain: Domain; 7 | dmarcRecords: DmarcRecord[]; 8 | dmarcRecordConfigValid: boolean; 9 | spfRecords: SpfRecord[]; 10 | spfRecordConfigValid: boolean; 11 | } 12 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/certificate.model.ts: -------------------------------------------------------------------------------- 1 | export interface Certificate { 2 | thumbPrint: string; 3 | issuer: string; 4 | subject: string; 5 | name: string; 6 | startDate: Date; 7 | endDate: Date; 8 | algorithm: string; 9 | serialNumber: string; 10 | version: number; 11 | valid: boolean; 12 | } 13 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/dmarc-record.model.ts: -------------------------------------------------------------------------------- 1 | export interface DmarcRecord { 2 | id: number; 3 | record: string; 4 | lastChecked: Date; 5 | } 6 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/domain-security-info.model.ts: -------------------------------------------------------------------------------- 1 | import { Domain } from './domain.model'; 2 | 3 | export interface DomainSecurityInfo{ 4 | domain : Domain; 5 | mxRecordCount : number; 6 | dmarcErrorCount : number; 7 | dmarcStatus : Status; 8 | spfErrorCount : number; 9 | spfStatus : Status; 10 | } 11 | 12 | export enum Status{ 13 | Error, 14 | Warning, 15 | Info, 16 | Success, 17 | Pending, 18 | None 19 | } 20 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/domain.model.ts: -------------------------------------------------------------------------------- 1 | export interface Domain { 2 | id: number; 3 | name: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/domains-security-info.model.ts: -------------------------------------------------------------------------------- 1 | import { DomainSecurityInfo } from './domain-security-info.model'; 2 | 3 | export interface DomainsSecurityInfo { 4 | domainSecurityInfos: DomainSecurityInfo[]; 5 | domainCount: number; 6 | page: number; 7 | pageSize: number; 8 | search: string; 9 | } 10 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/mx-record.model.ts: -------------------------------------------------------------------------------- 1 | import { TlsResult } from './tls-result.model'; 2 | import { Certificate } from './certificate.model'; 3 | 4 | export interface MxRecord { 5 | id: number; 6 | preference: number; 7 | hostname: string; 8 | sslv3: TlsResult; 9 | tlsv1: TlsResult; 10 | tlsv11: TlsResult; 11 | tlsv12: TlsResult; 12 | certificate: Certificate; 13 | mxLastChecked: Date; 14 | tlsLastChecked: Date; 15 | } 16 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/receiving_encrypted.model.ts: -------------------------------------------------------------------------------- 1 | import { Domain } from './domain.model'; 2 | import { MxRecord } from './mx-record.model'; 3 | 4 | export interface ReceivingEncrypted { 5 | domain: Domain; 6 | mxRecords: MxRecord[]; 7 | } 8 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/spf-record.model.ts: -------------------------------------------------------------------------------- 1 | export interface SpfRecord { 2 | id: number; 3 | record: string; 4 | lastChecked: Date; 5 | } 6 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/models/tls-result.model.ts: -------------------------------------------------------------------------------- 1 | export interface TlsResult { 2 | supported: boolean; 3 | cipherSuite: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/services/page.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Subject } from 'rxjs'; 3 | 4 | @Injectable() 5 | export class PageService { 6 | public page: Subject = new Subject(); 7 | } 8 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/dns-record/services/search.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Subject } from 'rxjs'; 3 | 4 | @Injectable() 5 | export class SearchService { 6 | public search: Subject = new Subject(); 7 | } 8 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/footer/footer.component.css: -------------------------------------------------------------------------------- 1 | .footer { 2 | bottom: 0; 3 | width: 100%; 4 | height: 200px; 5 | background-color: #34363c; 6 | } 7 | 8 | .container { 9 | padding-top: 15px; 10 | padding-bottom: 15px; 11 | /*height: 100%;*/ 12 | } 13 | 14 | a:hover { 15 | color: white; 16 | text-decoration: none; 17 | } 18 | 19 | a { 20 | color: #d7dbe5; 21 | text-decoration: none; 22 | } 23 | 24 | .block-title { 25 | color: white; 26 | } 27 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-footer', 5 | templateUrl: './footer.component.html', 6 | styleUrls: ['./footer.component.css'] 7 | }) 8 | export class FooterComponent {} 9 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/src/angular/dmarc-service/src/app/img/logo.png -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/img/ncsc-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/src/angular/dmarc-service/src/app/img/ncsc-white.png -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/shared/shared.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { LargeNumberPipe } from './pipes/large-number.pipe'; 4 | 5 | @NgModule({ 6 | imports: [CommonModule], 7 | declarations: [LargeNumberPipe], 8 | exports: [LargeNumberPipe] 9 | }) 10 | export class SharedModule {} 11 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/terms-and-conditions/terms-and-conditions.component.css: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/terms-and-conditions/terms-and-conditions.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-terms-and-conditions', 5 | templateUrl: './terms-and-conditions.component.html', 6 | styleUrls: ['./terms-and-conditions.component.css'], 7 | }) 8 | export class TermsAndConditionsComponent {} 9 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/app/utils/string.utils.ts: -------------------------------------------------------------------------------- 1 | export class StringUtils { 2 | public static isUndefinedNullOrWhitespace(str: string): boolean { 3 | if ( 4 | typeof str == 'undefined' || 5 | !str || 6 | str.length === 0 || 7 | str === '' || 8 | !/[^\s]/.test(str) || 9 | /^\s*$/.test(str) || 10 | str.replace(/\s/g, '') === '' 11 | ) { 12 | return true; 13 | } else { 14 | return false; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukncsc/mail-check/a8887d4e74d65719d828f68e39591294061ed813/src/angular/dmarc-service/src/favicon.png -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NCSC Mail Check 6 | 7 | 8 | 9 | 10 | 11 | 12 | Loading... 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/main.ts: -------------------------------------------------------------------------------- 1 | import './polyfills.ts'; 2 | 3 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 4 | import { enableProdMode } from '@angular/core'; 5 | import { environment } from './environments/environment'; 6 | import { AppModule } from './app/app.module'; 7 | 8 | if (environment.production) { 9 | enableProdMode(); 10 | } 11 | 12 | platformBrowserDynamic().bootstrapModule(AppModule); 13 | -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/banner/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './banner.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/domain-admin/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './domain-admin.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/domain-list/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './domain-list.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as User } from './user'; 2 | export { default as Banner } from './banner'; 3 | export { default as UserAdmin } from './user-admin'; 4 | export { default as DomainAdmin } from './domain-admin'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/pagination-display/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './pagination-display.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './pagination.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/permissions/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './permissions.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/permissions/permissions.component.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default() => ( 4 |
5 |

Permissions

6 |
7 | ); -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/search-box/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './search-box.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/user-admin/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './user-admin.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/user-list/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './user-list.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/user/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './user.component'; -------------------------------------------------------------------------------- /src/angular/dmarc-service/src/react/components/user/user.component.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default ({ info }) => 4 | info ? 5 | ( 6 |
7 |

8 |