annotate vendor/egulias/email-validator/EmailValidator/Validation/DNSCheckValidation.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents
children
rev   line source
Chris@5 1 <?php
Chris@5 2
Chris@5 3 namespace Egulias\EmailValidator\Validation;
Chris@5 4
Chris@5 5 use Egulias\EmailValidator\EmailLexer;
Chris@5 6 use Egulias\EmailValidator\Exception\InvalidEmail;
Chris@5 7 use Egulias\EmailValidator\Warning\NoDNSMXRecord;
Chris@5 8 use Egulias\EmailValidator\Exception\NoDNSRecord;
Chris@5 9
Chris@5 10 class DNSCheckValidation implements EmailValidation
Chris@5 11 {
Chris@5 12 /**
Chris@5 13 * @var array
Chris@5 14 */
Chris@5 15 private $warnings = [];
Chris@5 16
Chris@5 17 /**
Chris@5 18 * @var InvalidEmail
Chris@5 19 */
Chris@5 20 private $error;
Chris@5 21
Chris@5 22 public function __construct()
Chris@5 23 {
Chris@5 24 if (!extension_loaded('intl')) {
Chris@5 25 throw new \LogicException(sprintf('The %s class requires the Intl extension.', __CLASS__));
Chris@5 26 }
Chris@5 27 }
Chris@5 28
Chris@5 29 public function isValid($email, EmailLexer $emailLexer)
Chris@5 30 {
Chris@5 31 // use the input to check DNS if we cannot extract something similar to a domain
Chris@5 32 $host = $email;
Chris@5 33
Chris@5 34 // Arguable pattern to extract the domain. Not aiming to validate the domain nor the email
Chris@5 35 if (false !== $lastAtPos = strrpos($email, '@')) {
Chris@5 36 $host = substr($email, $lastAtPos + 1);
Chris@5 37 }
Chris@5 38
Chris@5 39 return $this->checkDNS($host);
Chris@5 40 }
Chris@5 41
Chris@5 42 public function getError()
Chris@5 43 {
Chris@5 44 return $this->error;
Chris@5 45 }
Chris@5 46
Chris@5 47 public function getWarnings()
Chris@5 48 {
Chris@5 49 return $this->warnings;
Chris@5 50 }
Chris@5 51
Chris@5 52 protected function checkDNS($host)
Chris@5 53 {
Chris@5 54 $variant = INTL_IDNA_VARIANT_2003;
Chris@5 55 if ( defined('INTL_IDNA_VARIANT_UTS46') ) {
Chris@5 56 $variant = INTL_IDNA_VARIANT_UTS46;
Chris@5 57 }
Chris@5 58 $host = rtrim(idn_to_ascii($host, IDNA_DEFAULT, $variant), '.') . '.';
Chris@5 59
Chris@5 60 $Aresult = true;
Chris@5 61 $MXresult = checkdnsrr($host, 'MX');
Chris@5 62
Chris@5 63 if (!$MXresult) {
Chris@5 64 $this->warnings[NoDNSMXRecord::CODE] = new NoDNSMXRecord();
Chris@5 65 $Aresult = checkdnsrr($host, 'A') || checkdnsrr($host, 'AAAA');
Chris@5 66 if (!$Aresult) {
Chris@5 67 $this->error = new NoDNSRecord();
Chris@5 68 }
Chris@5 69 }
Chris@5 70 return $MXresult || $Aresult;
Chris@5 71 }
Chris@5 72 }