*/ 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 = $questionFactory ?: new QuestionFactory(); $this->messageFactory = $messageFactory ?: new MessageFactory(); $this->encoder = $encoder ?: (new EncoderFactory())->create(); $this->decoder = $decoder ?: (new DecoderFactory())->create(); $this->nameServer = $nameServer; $this->logger = new NullLogger(); } /** * @{@inheritdoc} */ public static function isSupported(): bool { return class_exists(ResourceTypes::class); } /** * @{@inheritdoc} */ public function getTxtEntries($domain): array { $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:----MAcPjRs6k+4es1Ve4AuA+GYI3SFWnABOinIihYHz9KY3rOWJ+7p/K+/OIWaOrel/fqUz/gmDgyM9NolQhadMjnD/VOPY+3osrkPwLw+E2qAVyLikQn2/ecQz7D9x7IaBzewHSw1FPN75nLoExsHwT91GuxZBupcWvnkzlf/qofyCBZD3iaMmBjNFT68D2rzZWN5umnBfiAx/6O18x7OB9TGv0WHPV3rIMKGAxfjlMSJHcBpcTC6cCgRS8IHzgT9Ez3zjzo6Rqy+7NFMIyxxnc8FBB1gwN8uS2Upjze54xBPtnkfdaTIoIt72mDW9ey0Ti95ZM4BCZh2PG7AGfsVpcthDqksvx3+6l29mN1vrQQqgcZFP9y2AgaXbOYy2ERszeWWIqZpLAsJssG/uz534OC5CmzTPSWhssm4KijYWA7vIGa0G05ofjYiwQQx0RholQ8oMrxWLghlcn9DJ3mm/eZL0RQMer400sK/CESPukHSQSFuMUGg/e8J47kLDOpZs/4GdHJRTovvnLJsfEPJnhPHX9Jba9IriP3VVZVJePD+ILyaYWBlYnbmYR47M6bmGVwPcpYKtSnZ6v/7FdKxE7CzTfywxZx0QoI3Rd4X7Fm2fZq64pgAR/wjEJIpey6X13J9Cj0vHfaCz+MUbmUa5X0GRXCIwOzrOabuQhGxpqOs=----ATTACHMENT:----MTQzODUzNjI2NDI2MjE3MiA2NjMwMjQ0OTMzODI5MTg4IDU2MDE2MzI1MDU5NzQ5ODA=