92 lines
4.6 KiB
HTML
92 lines
4.6 KiB
HTML
{{define "title"}}DMARC Reports — {{.Domain.Name}}{{end}}
|
|
{{define "content"}}
|
|
<div class="flex items-center gap-3 mb-6">
|
|
<a href="/admin/domains" class="text-gray-400 text-sm hover:text-white">Domains</a>
|
|
<span class="text-gray-600">/</span>
|
|
<a href="/admin/domains/{{.Domain.ID}}" class="text-gray-400 text-sm hover:text-white">{{.Domain.Name}}</a>
|
|
<span class="text-gray-600">/</span>
|
|
<h1 class="text-xl font-bold text-white">DMARC Reports</h1>
|
|
</div>
|
|
|
|
{{if not .Domain.DMARCRua}}
|
|
<div class="card text-center" style="max-width:32rem;margin:0 auto">
|
|
<div class="text-sm text-gray-400 mb-3">DMARC monitoring is not enabled for this domain.</div>
|
|
<a href="/admin/domains/{{.Domain.ID}}" class="btn btn-primary btn-sm">Back to domain</a>
|
|
</div>
|
|
{{else if eq (len .Reports) 0}}
|
|
<div class="card text-center" style="max-width:32rem;margin:0 auto">
|
|
<div class="text-sm font-semibold text-gray-300 mb-2">No reports yet</div>
|
|
<div class="text-xs text-gray-500 mb-1">Monitoring address: <span class="text-blue-400">{{.Domain.DMARCRua}}</span></div>
|
|
<div class="text-xs text-gray-500 mb-4">Reports arrive after external senders process your DMARC policy. This can take 24-48 hours after DNS propagation.</div>
|
|
<a href="/admin/domains/{{.Domain.ID}}" class="btn btn-primary btn-sm">Back to domain</a>
|
|
</div>
|
|
{{else}}
|
|
<div class="flex items-center justify-between mb-4">
|
|
<div class="text-xs text-gray-500">Monitoring: <span class="text-blue-400">{{.Domain.DMARCRua}}</span> — {{len .Reports}} reports</div>
|
|
<a href="/admin/domains/{{.Domain.ID}}" class="btn btn-primary btn-sm">Back to domain</a>
|
|
</div>
|
|
|
|
{{range .Reports}}
|
|
<div class="card" style="margin-bottom:1.25rem">
|
|
<!-- Report header -->
|
|
<div class="flex items-start justify-between mb-3">
|
|
<div>
|
|
<div class="text-sm font-semibold text-white">{{.OrgName}}</div>
|
|
<div class="text-xs text-gray-400">{{.OrgEmail}}</div>
|
|
</div>
|
|
<div class="text-right">
|
|
<div class="text-xs text-gray-400">Report ID: <span class="text-gray-300">{{.ReportID}}</span></div>
|
|
<div class="text-xs text-gray-500">{{shortTime .ReceivedAt}}</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Date range + policy -->
|
|
<div style="display:flex;gap:2rem;margin-bottom:.75rem;font-size:.75rem;color:#9ca3af">
|
|
<div>Period: <span class="text-gray-300">{{unixDate .DateBegin}} to {{unixDate .DateEnd}}</span></div>
|
|
<div>Policy: <span class="text-gray-300">{{.PolicyP}}</span>
|
|
{{if .PolicyADKIM}}<span style="margin-left:.5rem">adkim=<span class="text-gray-300">{{.PolicyADKIM}}</span></span>{{end}}
|
|
{{if .PolicyASPF}}<span style="margin-left:.5rem">aspf=<span class="text-gray-300">{{.PolicyASPF}}</span></span>{{end}}
|
|
{{if .PolicyPct}}<span style="margin-left:.5rem">pct=<span class="text-gray-300">{{.PolicyPct}}%</span></span>{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- IP records table -->
|
|
{{if .Records}}
|
|
<div style="overflow:auto">
|
|
<table style="font-size:.75rem;width:100%">
|
|
<thead>
|
|
<tr style="color:#6b7280;text-align:left;border-bottom:1px solid #374151">
|
|
<th style="padding:.375rem .5rem;white-space:nowrap">Source IP</th>
|
|
<th style="padding:.375rem .5rem;text-align:center">Count</th>
|
|
<th style="padding:.375rem .5rem;text-align:center">Disposition</th>
|
|
<th style="padding:.375rem .5rem;text-align:center">DKIM</th>
|
|
<th style="padding:.375rem .5rem;text-align:center">SPF</th>
|
|
<th style="padding:.375rem .5rem">From</th>
|
|
<th style="padding:.375rem .5rem">DKIM domain</th>
|
|
<th style="padding:.375rem .5rem">SPF domain</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Records}}
|
|
<tr style="border-bottom:1px solid #1f2937">
|
|
<td style="padding:.375rem .5rem;font-family:monospace;color:#93c5fd">{{.SourceIP}}</td>
|
|
<td style="padding:.375rem .5rem;text-align:center;color:#d1d5db">{{.Count}}</td>
|
|
<td style="padding:.375rem .5rem;text-align:center">{{dispositionBadge .Disposition}}</td>
|
|
<td style="padding:.375rem .5rem;text-align:center">{{passBadge .DKIMResult}}</td>
|
|
<td style="padding:.375rem .5rem;text-align:center">{{passBadge .SPFResult}}</td>
|
|
<td style="padding:.375rem .5rem;color:#9ca3af">{{.HeaderFrom}}</td>
|
|
<td style="padding:.375rem .5rem;color:#9ca3af;font-family:monospace">{{if .DKIMDomain}}{{.DKIMDomain}}{{if .DKIMSelector}}/{{.DKIMSelector}}{{end}}{{end}}</td>
|
|
<td style="padding:.375rem .5rem;color:#9ca3af;font-family:monospace">{{.SPFDomain}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{{else}}
|
|
<div class="text-xs text-gray-500">No IP records in this report.</div>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|