1 | <?php |
||
24 | class MozillaIspDb { |
||
25 | |||
26 | private $logger; |
||
27 | private $urls = array( |
||
28 | 'https://autoconfig.{DOMAIN}/mail/config-v1.1.xml', |
||
29 | 'https://{DOMAIN}/.well-known/autoconfig/mail/config-v1.1.xml', |
||
30 | 'https://autoconfig.thunderbird.net/v1.1/{DOMAIN}', |
||
31 | // fallback for self-signed certificates (needed?) |
||
32 | 3 | 'http://autoconfig.{DOMAIN}/mail/config-v1.1.xml', |
|
33 | 3 | 'http://{DOMAIN}/.well-known/autoconfig/mail/config-v1.1.xml', |
|
34 | 3 | ); |
|
35 | |||
36 | public function __construct(Logger $logger) { |
||
37 | $this->logger = $logger; |
||
38 | } |
||
39 | |||
40 | 3 | private function queryUrl($url) { |
|
41 | 3 | try { |
|
42 | 3 | $xml = @simplexml_load_file($url); |
|
43 | if (!is_object($xml) || !$xml->emailProvider) { |
||
44 | return []; |
||
45 | } |
||
46 | $provider = [ |
||
47 | 3 | 'displayName' => (string) $xml->emailProvider->displayName, |
|
48 | ]; |
||
49 | foreach ($xml->emailProvider->children() as $tag => $server) { |
||
50 | 3 | if (!in_array($tag, ['incomingServer', 'outgoingServer'])) { |
|
51 | 3 | continue; |
|
52 | } |
||
53 | foreach ($server->attributes() as $name => $value) { |
||
54 | if ($name == 'type') { |
||
55 | 3 | $type = (string) $value; |
|
56 | 3 | } |
|
57 | 3 | } |
|
58 | 3 | $data = []; |
|
59 | 3 | foreach ($server as $name => $value) { |
|
60 | foreach ($value->children() as $tag => $val) { |
||
61 | 3 | $data[$name][$tag] = (string) $val; |
|
62 | 3 | } |
|
63 | 3 | if (!isset($data[$name])) { |
|
64 | 3 | $data[$name] = (string) $value; |
|
65 | 3 | } |
|
66 | 3 | } |
|
67 | 3 | $provider[$type][] = $data; |
|
68 | 3 | } |
|
69 | 2 | } catch (Exception $e) { |
|
70 | 3 | // ignore own not-found exception or xml parsing exceptions |
|
71 | 3 | unset($e); |
|
72 | 3 | $provider = []; |
|
73 | 3 | } |
|
74 | 3 | return $provider; |
|
75 | 3 | } |
|
76 | 3 | ||
77 | 3 | /** |
|
78 | * @param string $domain |
||
79 | * @return array |
||
80 | */ |
||
81 | public function query($domain, $tryMx = true) { |
||
82 | $this->logger->debug("MozillaIsbDb: querying <$domain>"); |
||
83 | if (strpos($domain, '@') !== false) { |
||
84 | // TODO: use horde mail address parsing instead |
||
85 | list(, $domain) = explode('@', $domain); |
||
86 | } |
||
87 | |||
88 | $provider = [] |
||
89 | foreach($this->urls as $url) { |
||
|
|||
90 | $url = str_replace("{DOMAIN}", $domain, $url); |
||
91 | 3 | $this->logger->debug("MozillaIsbDb: querying <$domain> via <$url>"); |
|
92 | |||
93 | $provider = $this->queryUrl($url); |
||
94 | if (!empty($provider)) { |
||
95 | return $provider; |
||
110 |