You are here

public function DomainValidator::validate in Domain Access 8

Validates the hostname for a domain.

Parameters

string $hostname: A hostname to validate.

Return value

array An array of validation errors. An empty array indicates a valid domain.

Overrides DomainValidatorInterface::validate

File

domain/src/DomainValidator.php, line 69

Class

DomainValidator
Provides validation of domain strings against RFC standards for hostnames.

Namespace

Drupal\domain

Code

public function validate($hostname) {
  $error_list = [];

  // Check for at least one dot or the use of 'localhost'.
  // Note that localhost can specify a port.
  $localhost_check = explode(':', $hostname);
  if (substr_count($hostname, '.') == 0 && $localhost_check[0] != 'localhost') {
    $error_list[] = $this
      ->t('At least one dot (.) is required, except when using <em>localhost</em>.');
  }

  // Check for one colon only.
  if (substr_count($hostname, ':') > 1) {
    $error_list[] = $this
      ->t('Only one colon (:) is allowed.');
  }
  elseif (substr_count($hostname, ':') == 1) {
    $parts = explode(':', $hostname);
    $port = (int) $parts[1];
    if (strcmp($port, $parts[1])) {
      $error_list[] = $this
        ->t('The port protocol must be an integer.');
    }
  }

  // The domain cannot begin or end with a period.
  if (substr($hostname, 0, 1) == '.') {
    $error_list[] = $this
      ->t('The domain must not begin with a dot (.)');
  }

  // The domain cannot begin or end with a period.
  if (substr($hostname, -1) == '.') {
    $error_list[] = $this
      ->t('The domain must not end with a dot (.)');
  }

  // Check for valid characters, unless using non-ASCII domains.
  $config = $this->configFactory
    ->get('domain.settings');
  $non_ascii = $config
    ->get('allow_non_ascii');
  if (!$non_ascii) {
    $pattern = '/^[a-z0-9\\.\\-:]*$/i';
    if (!preg_match($pattern, $hostname)) {
      $error_list[] = $this
        ->t('Only alphanumeric characters, dashes, and a colon are allowed.');
    }
  }

  // Check for lower case.
  if ($hostname != mb_strtolower($hostname)) {
    $error_list[] = $this
      ->t('Only lower-case characters are allowed.');
  }

  // Check for 'www' prefix if redirection / handling is
  // enabled under global domain settings.
  // Note that www prefix handling must be set explicitly in the UI.
  // See http://drupal.org/node/1529316 and http://drupal.org/node/1783042
  if ($config
    ->get('www_prefix') && substr($hostname, 0, strpos($hostname, '.')) == 'www') {
    $error_list[] = $this
      ->t('WWW prefix handling: Domains must be registered without the www. prefix.');
  }

  // Allow modules to alter this behavior.
  $this->moduleHandler
    ->alter('domain_validate', $error_list, $hostname);
  return $error_list;
}