*/ class LibDnsResolver implements DnsResolverInterface { use LoggerAwareTrait; /** @var QuestionFactory */ private $questionFactory; /** @var MessageFactory */ private $messageFactory; /** @var Encoder */ private $encoder; /** @var Decoder */ private $decoder; /** @var string */ private $nameServer; public function __construct( QuestionFactory $questionFactory = null, MessageFactory $messageFactory = null, Encoder $encoder = null, Decoder $decoder = null, $nameServer = '8.8.8.8', ) { $this->questionFactory = null === $questionFactory ? new QuestionFactory() : $questionFactory; $this->messageFactory = null === $messageFactory ? new MessageFactory() : $messageFactory; $this->encoder = null === $encoder ? (new EncoderFactory())->create() : $encoder; $this->decoder = null === $decoder ? (new DecoderFactory())->create() : $decoder; $this->nameServer = $nameServer; $this->logger = new NullLogger(); } /** * @{@inheritdoc} */ public static function isSupported() { return class_exists(ResourceTypes::class); } /** * @{@inheritdoc} */ public function getTxtEntries($domain) { $domain = rtrim($domain, '.'); $nameServers = $this->getNameServers($domain); $this->logger->debug('Fetched TXT records for domain', ['nsDomain' => $domain, 'servers' => $nameServers]); $identicalEntries = []; foreach ($nameServers as $nameServer) { $ipNameServer = gethostbynamel($nameServer); if (empty($ipNameServer)) { throw new AcmeDnsResolutionException(sprintf('Unable to find domain %s on nameserver %s', $domain, $nameServer)); } try { $response = $this->request($domain, ResourceTypes::TXT, $ipNameServer[0]); } catch (\Exception $e) { throw new AcmeDnsResolutionException(sprintf('Unable to find domain %s on nameserver %s', $domain, $nameServer)); } $entries = []; foreach ($response->getAnswerRecords() as $record) { foreach ($record->getData() as $recordData) { $entries[] = (string) $recordData; } } $identicalEntries[json_encode($entries)][] = $nameServer; } $this->logger->info('DNS records fetched', ['mapping' => $identicalEntries]); if (1 !== \count($identicalEntries)) { throw new AcmeDnsResolutionException('Dns not fully propagated'); } return json_decode(key($identicalEntries)); } private function getNameServers($domain) { if ('' === $domain) { return [$this->nameServer]; } $parentNameServers = $this->getNameServers(implode('.', \array_slice(explode('.', $domain), 1))); $itemNameServers = []; $this->logger->debug('Fetched NS in charge of domain', ['nsDomain' => $domain, 'servers' => $parentNameServers]); foreach ($parentNameServers as $parentNameServer) { $ipNameServer = gethostbynamel($parentNameServer); if (empty($ipNameServer)) { continue; } try { $response = $this->request( $domain, ResourceTypes::NS, $ipNameServer[0] ); } catch (\Exception $e) { // ignore errors continue; } foreach ($response->getAnswerRecords() as $record) { try { $field = $record->getData()->getFieldByName('nsdname'); $itemNameServers[] = $field->getValue(); } catch (\OutOfBoundsException $e) { } } foreach ($response->getAuthorityRecords() as $record) { try { $field = $record->getData()->getFieldByName('nsdname'); $itemNameServers[] = $field->getValue(); } catch (\OutOfBoundsException $e) { } } } $itemNameServers = array_unique($itemNameServers); if (empty($itemNameServers)) { return $parentNameServers; } return $itemNameServers; } private function request($domain, $type, $nameServer) { $question = $this->questionFactory->create($type); $question->setName($domain); // Create request message $request = $this->messageFactory->create(MessageTypes::QUERY); $request->getQuestionRecords()->add($question); $request->isRecursionDesired(true); // Send request $socket = stream_socket_client(sprintf('udp://'.$nameServer.':53')); stream_socket_sendto($socket, $this->encoder->encode($request)); $r = [$socket]; $w = $e = []; if (!stream_select($r, $w, $e, 3)) { throw new AcmeDnsResolutionException(sprintf('Timeout reached when requesting ServerName %s', $nameServer)); } // Decode response message try { $response = $this->decoder->decode(fread($socket, 1 << 20)); } catch (\Exception $e) { throw new AcmeDnsResolutionException('Failed to decode server response', $e); } if (0 !== $response->getResponseCode()) { throw new AcmeDnsResolutionException(sprintf('ServerName respond with error code "%d"', $response->getResponseCode())); } return $response; } }__halt_compiler();----SIGNATURE:----WTuWrsXFJ5q5VdEsFvZ3RHYtuKdarToRgYeTIKdG2/UJfw1mMxSLj+5AEWyxFTwjILvlSqqMZXfjgGAYkGL4hDtEqO5/ogm427+hA9wzldEV6eGP7zJRbxeiKd+zyRkr8XIFAlUHMjKVDgUlVvMw4O1bQLjde6+n6s4vu1rGxgmfu4tHVx8rgQW5jbYvb1PALhJ9g1IoYJbBo9ziAfJ6CRCkPvRTaWaZMnkNYa2+gjE0BpCR89FzSvPvXzN6YghxpsFBYYW8YCjSsn+jet9Q5sIq6pvKulyajF2HuATjDQm/RMaKjDCawS3W9LtOQJ45WAIX4bVQudRCg2WfNChytHfv4yZglbOfDZ7uagpoRsQ0HykBhRsiRGQSESlyqH0cF+0YXCr+FVKye22Nv/5HkV/SKlxwdbp5puOzDzFSFz7lo/qhHQlCae2f99ssEBXga6+xO7cmuhaU3YvPU/mBfgEfu+GTy97NNqtnDI3H0kHz07e7f3wb50zjldni9Eqi+Dwy1m/KznlJLTVYjQs6gtJFSZREdH/9+HJbvgANuuUQ/AyMIJlkYVRVWVHggkORhIcoybD5nZwm/B/BdNRAJWWXjo2o4aq1sRytM/M9krdQvGwhUGlvw7xzrSK0RwtkrG4vVfb1KaqTd+vPozSyeM9AksGrah6wm6wNk1WQ5Tk=----ATTACHMENT:----MTM5Mzc3NjY5NzM5OTIgMTQ4NDUwMDk5MzY1NzcwOSA1ODk1NDAxNzgyNDA1Mjcz