package checker import ( "bytes" "encoding/xml" "fmt" "strconv" "strings" ) // ── Thunderbird autoconfig (clientConfig) ──────────────────────────────────── type rawClientConfig struct { XMLName xml.Name `xml:"clientConfig"` Version string `xml:"version,attr"` EmailProvider rawEmailProvider `xml:"emailProvider"` } type rawEmailProvider struct { ID string `xml:"id,attr"` DisplayName string `xml:"displayName"` ShortName string `xml:"displayShortName"` Domains []string `xml:"domain"` Incoming []rawServer `xml:"incomingServer"` Outgoing []rawServer `xml:"outgoingServer"` AddressBook []rawDav `xml:"addressBook"` Calendar []rawDav `xml:"calendar"` WebMail *rawWebMail `xml:"webMail"` Documentation []rawDocuments `xml:"documentation"` } type rawServer struct { Type string `xml:"type,attr"` Hostname string `xml:"hostname"` Port string `xml:"port"` SocketType string `xml:"socketType"` Username string `xml:"username"` Authentication string `xml:"authentication"` } type rawDav struct { Type string `xml:"type,attr"` Username string `xml:"username"` Authentication string `xml:"authentication"` ServerURL string `xml:"serverURL"` } type rawWebMail struct { LoginPage struct { URL string `xml:"url,attr"` } `xml:"loginPage"` } type rawDocuments struct { URL string `xml:"url,attr"` Descr string `xml:"descr"` } // parseClientConfig decodes a clientConfig document. func parseClientConfig(body []byte) (*ClientConfig, error) { body = bytes.TrimSpace(body) if len(body) == 0 { return nil, fmt.Errorf("empty body") } // Cheap reject before invoking the XML decoder. if !bytes.Contains(body, []byte("