CalDAV and CardDAV checkers sharing a single Go module. Discovery follows RFC 6764 (/.well-known + SRV/TXT), authenticated probes cover principal, home-set, collections and a minimal REPORT query on top of go-webdav. Common shape in internal/dav/; CalDAV adds a scheduling rule. Surfaces its context URL (and each secure-SRV target) as TLS endpoints via the EndpointDiscoverer interface, so the dedicated TLS checker can pick them up without re-parsing observations. HTML report foregrounds common misconfigs (well-known returning 200, missing SRV, plaintext-only SRV, missing DAV capability, skipped auth phase) as action-item callouts before the full phase breakdown.
105 lines
3.2 KiB
Go
105 lines
3.2 KiB
Go
package dav
|
|
|
|
// ReportCSS is the shared stylesheet embedded in both checkers' HTML reports.
|
|
// Lifted (with minor edits) from checker-matrix so the whole happyDomain
|
|
// checker fleet has a consistent visual language.
|
|
const ReportCSS = `
|
|
*, *::before, *::after { box-sizing: border-box; }
|
|
:root {
|
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
font-size: 14px;
|
|
line-height: 1.5;
|
|
color: #1f2937;
|
|
background: #f3f4f6;
|
|
}
|
|
body { margin: 0; padding: 1rem; }
|
|
code { font-family: ui-monospace, monospace; font-size: .9em; }
|
|
h1 { margin: 0 0 .4rem; font-size: 1.15rem; font-weight: 700; }
|
|
h2 { font-size: 1rem; font-weight: 700; margin: 0 0 .6rem; }
|
|
h3 { font-size: .9rem; font-weight: 600; margin: 0 0 .4rem; }
|
|
|
|
.hd {
|
|
background: #fff;
|
|
border-radius: 10px;
|
|
padding: 1rem 1.25rem;
|
|
margin-bottom: .75rem;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,.08);
|
|
}
|
|
.verdict { color: #4b5563; margin-top: .35rem; font-size: .9rem; }
|
|
|
|
.badge {
|
|
display: inline-flex; align-items: center;
|
|
padding: .2em .65em;
|
|
border-radius: 9999px;
|
|
font-size: .78rem; font-weight: 700;
|
|
letter-spacing: .02em;
|
|
}
|
|
.ok { background: #d1fae5; color: #065f46; }
|
|
.warn { background: #fef3c7; color: #92400e; }
|
|
.fail { background: #fee2e2; color: #991b1b; }
|
|
.unk { background: #e5e7eb; color: #374151; }
|
|
.info { background: #dbeafe; color: #1e40af; }
|
|
|
|
.section {
|
|
background: #fff;
|
|
border-radius: 8px;
|
|
padding: .85rem 1rem;
|
|
margin-bottom: .6rem;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,.07);
|
|
}
|
|
|
|
.callouts { display: flex; flex-direction: column; gap: .5rem; margin-bottom: .75rem; }
|
|
.callout {
|
|
background: #fff7ed;
|
|
border-left: 4px solid #f97316;
|
|
border-radius: 6px;
|
|
padding: .7rem .9rem;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,.06);
|
|
}
|
|
.callout.crit { background: #fef2f2; border-color: #dc2626; }
|
|
.callout h3 { margin: 0 0 .2rem; }
|
|
.callout p { margin: .15rem 0; font-size: .88rem; color: #374151; }
|
|
|
|
details {
|
|
background: #fff;
|
|
border-radius: 8px;
|
|
margin-bottom: .45rem;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,.07);
|
|
overflow: hidden;
|
|
}
|
|
summary {
|
|
display: flex; align-items: center; gap: .5rem;
|
|
padding: .65rem 1rem;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
list-style: none;
|
|
}
|
|
summary::-webkit-details-marker { display: none; }
|
|
summary::before {
|
|
content: "▶";
|
|
font-size: .65rem;
|
|
color: #9ca3af;
|
|
transition: transform .15s;
|
|
flex-shrink: 0;
|
|
}
|
|
details[open] > summary::before { transform: rotate(90deg); }
|
|
.phase-title { flex: 1; font-weight: 600; }
|
|
.details-body { padding: .6rem 1rem .85rem; border-top: 1px solid #f3f4f6; }
|
|
|
|
table { border-collapse: collapse; width: 100%; font-size: .85rem; }
|
|
th, td { text-align: left; padding: .3rem .5rem; border-bottom: 1px solid #f3f4f6; vertical-align: top; }
|
|
th { font-weight: 600; color: #6b7280; }
|
|
|
|
.check-ok { color: #059669; font-weight: 700; }
|
|
.check-warn { color: #d97706; font-weight: 700; }
|
|
.check-fail { color: #dc2626; font-weight: 700; }
|
|
.check-unk { color: #6b7280; font-weight: 700; }
|
|
|
|
.errmsg { color: #dc2626; font-size: .85rem; margin: .25rem 0 0; }
|
|
.note { color: #6b7280; font-size: .85rem; }
|
|
|
|
ul { margin: .25rem 0; padding-left: 1.2rem; }
|
|
li { margin-bottom: .15rem; }
|
|
|
|
pre { background: #f9fafb; padding: .5rem; border-radius: 4px; overflow-x: auto; font-size: .8rem; }
|
|
`
|