checker-email-autoconfig/checker/types.go

148 lines
5.9 KiB
Go

// Package checker probes a domain for the three competing email
// autoconfiguration mechanisms (Bucksch autoconfig, Microsoft Autodiscover
// POX, RFC 6186 SRV) and cross-checks them.
package checker
import (
"time"
)
// ObservationKeyAutoconfig is the observation key for autoconfig data.
const ObservationKeyAutoconfig = "email_autoconfig"
// Data is the full collected payload.
type Data struct {
Domain string `json:"domain"`
Email string `json:"email"`
CollectedAt time.Time `json:"collected_at"`
MX []MXRecord `json:"mx,omitempty"`
MXError string `json:"mx_error,omitempty"`
SRV []SRVRecord `json:"srv,omitempty"`
Autoconfig []AutoconfigProbe `json:"autoconfig,omitempty"`
Autodiscover []AutodiscoverProbe `json:"autodiscover,omitempty"`
// First successful autoconfig parse, promoted here for rules to consume.
ClientConfig *ClientConfig `json:"client_config,omitempty"`
ClientConfigSource string `json:"client_config_source,omitempty"`
AutodiscoverResult *AutodiscoverResponse `json:"autodiscover_result,omitempty"`
}
// MXRecord is a single MX record.
type MXRecord struct {
Host string `json:"host"`
Preference uint16 `json:"preference"`
}
// SRVRecord is a single RFC 6186 SRV record observation.
type SRVRecord struct {
Service string `json:"service"` // RFC 6186 tag, e.g. "_imaps._tcp"
Target string `json:"target"`
Port uint16 `json:"port"`
Priority uint16 `json:"priority"`
Weight uint16 `json:"weight"`
// Skip means the service is explicitly disabled (RFC 6186 target ".").
Skip bool `json:"skip,omitempty"`
}
// ProbeResult captures the outcome of a single HTTP probe.
type ProbeResult struct {
URL string `json:"url"`
Method string `json:"method,omitempty"`
StatusCode int `json:"status_code,omitempty"`
DurationMs int64 `json:"duration_ms,omitempty"`
ContentType string `json:"content_type,omitempty"`
BodyBytes int `json:"body_bytes,omitempty"`
Redirected bool `json:"redirected,omitempty"`
FinalURL string `json:"final_url,omitempty"`
TLSServerName string `json:"tls_server_name,omitempty"`
TLSIssuer string `json:"tls_issuer,omitempty"`
TLSSubject string `json:"tls_subject,omitempty"`
TLSNotAfter string `json:"tls_not_after,omitempty"`
TLSError string `json:"tls_error,omitempty"`
Error string `json:"error,omitempty"`
ParseError string `json:"parse_error,omitempty"`
}
// AutoconfigProbe is one probe attempt for Thunderbird-style autoconfig.
type AutoconfigProbe struct {
Source string `json:"source"` // "autoconfig", "wellknown", "http-autoconfig", "ispdb", "mx-autoconfig", "mx-ispdb"
Result ProbeResult `json:"result"`
Parsed *ClientConfig `json:"parsed,omitempty"`
}
// AutodiscoverProbe is one probe attempt for MS Autodiscover (POX).
type AutodiscoverProbe struct {
Source string `json:"source"` // "root", "subdomain", "srv", "redirect"
Result ProbeResult `json:"result"`
Parsed *AutodiscoverResponse `json:"parsed,omitempty"`
}
// ClientConfig is the parsed Thunderbird-style clientConfig document.
type ClientConfig struct {
Version string `json:"version,omitempty"`
EmailProviderID string `json:"email_provider_id,omitempty"`
DisplayName string `json:"display_name,omitempty"`
ShortName string `json:"short_name,omitempty"`
Domains []string `json:"domains,omitempty"`
Incoming []ServerConfig `json:"incoming,omitempty"`
Outgoing []ServerConfig `json:"outgoing,omitempty"`
AddressBook []DavServer `json:"address_book,omitempty"`
Calendar []DavServer `json:"calendar,omitempty"`
WebMail *WebMail `json:"webmail,omitempty"`
Documentation []Documentation `json:"documentation,omitempty"`
}
// ServerConfig is one incoming/outgoing server definition.
type ServerConfig struct {
Type string `json:"type"` // imap, pop3, smtp
Hostname string `json:"hostname"`
Port int `json:"port"`
SocketType string `json:"socket_type"` // plain, SSL, STARTTLS
Username string `json:"username"` // may contain %EMAIL% placeholders
Authentication string `json:"authentication"` // password-cleartext, password-encrypted, OAuth2, ...
}
// DavServer is a CardDAV or CalDAV server reference.
type DavServer struct {
Type string `json:"type"`
Username string `json:"username,omitempty"`
Authentication string `json:"authentication,omitempty"`
ServerURL string `json:"server_url,omitempty"`
}
// WebMail holds webmail configuration (if any).
type WebMail struct {
LoginPage string `json:"login_page,omitempty"`
}
// Documentation is a clientConfig <documentation> entry.
type Documentation struct {
URL string `json:"url,omitempty"`
Descr string `json:"descr,omitempty"`
}
// AutodiscoverResponse is the parsed POX response.
type AutodiscoverResponse struct {
DisplayName string `json:"display_name,omitempty"`
// Set when Action is redirectAddr / redirectUrl; mutually exclusive with Protocols.
RedirectAddr string `json:"redirect_addr,omitempty"`
RedirectURL string `json:"redirect_url,omitempty"`
Protocols []AutodiscoverProtocol `json:"protocols,omitempty"`
}
// AutodiscoverProtocol covers IMAP/POP/SMTP fields; Exchange-only protocols
// (EXCH/EXPR/MobileSync) are stored but not analysed.
type AutodiscoverProtocol struct {
Type string `json:"type"` // IMAP, POP3, SMTP, EXCH, EXPR, WEB, MobileSync
Server string `json:"server,omitempty"`
Port int `json:"port,omitempty"`
Encryption string `json:"encryption,omitempty"` // SSL, TLS, None
SSL string `json:"ssl,omitempty"` // on/off
LoginName string `json:"login_name,omitempty"`
DomainRequired string `json:"domain_required,omitempty"`
AuthRequired string `json:"auth_required,omitempty"`
}