cas_mock_server-8.x-1.0/src/Config/CasMockServerConfigOverrider.php

src/Config/CasMockServerConfigOverrider.php
<?php

declare(strict_types=1);

namespace Drupal\cas_mock_server\Config;

use Drupal\cas_mock_server\CasVersionHelper;
use Drupal\cas_mock_server\ServerManagerInterface;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Config\ConfigFactoryOverrideInterface;
use Drupal\Core\Config\StorageInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Overrides the CAS module config to use the endpoint of the CAS mock server.
 *
 * If the CAS module is not enabled this overrider will have no effect since the
 * config factory will never ask us to override the module configuration.
 */
class CasMockServerConfigOverrider implements ConfigFactoryOverrideInterface {

  /**
   * The cache tag that is used to identify overridden config.
   */
  const CACHE_TAG = 'cas_mock_server_config_overrider';

  /**
   * Constructs a CasMockServerConfigOverrider.
   *
   * @param \Drupal\cas_mock_server\ServerManagerInterface $serverManager
   *   The CAS mock server manager.
   * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
   *   The request stack.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger service.
   * @param \Drupal\cas_mock_server\CasVersionHelper $casVersionHelper
   *   The CAS SSL verification constants.
   */
  public function __construct(
    protected ServerManagerInterface $serverManager,
    protected RequestStack $requestStack,
    protected MessengerInterface $messenger,
    protected CasVersionHelper $casVersionHelper,
  ) {}

  /**
   * {@inheritdoc}
   */
  public function loadOverrides($names) {
    $overrides = [];

    // Only override config if the server is active.
    if (in_array('cas.settings', $names) && $this->serverManager->isServerActive()) {
      $overrides['cas.settings'] = $this->getOverrides();
    }

    return $overrides;
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheSuffix() {
    return 'cas_mock_server';
  }

  /**
   * {@inheritdoc}
   */
  public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) {
    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheableMetadata($name) {
    $metadata = new CacheableMetadata();

    if ($name === 'cas.settings') {
      $metadata->addCacheContexts(['cas_mock_server_is_active']);
      $metadata->addCacheTags([self::CACHE_TAG]);
    }
    return $metadata;
  }

  /**
   * Returns the configuration of the mock server.
   *
   * @return array
   *   An associative array of configuration for the CAS module, in order to
   *   override the production CAS server with the mock server.
   */
  protected function getOverrides(): array {
    $overrides = [];

    $request = $this->requestStack->getCurrentRequest();
    $hostname = $request->getHost();

    if (!$this->isResolvable($hostname)) {
      $this->messenger->addError('Could not resolve the hostname "' . $hostname . '" for the CAS mock server.');
      return $overrides;
    }

    $overrides['server']['hostname'] = $hostname;
    $overrides['server']['protocol'] = $request->getScheme();
    $overrides['server']['port'] = $request->getPort();
    $overrides['server']['path'] = $request->getBasePath() . '/cas-mock-server';
    $overrides['server']['verify'] = $this->casVersionHelper->getNoneValue();
    $overrides['server']['version'] = '3.0';

    return $overrides;
  }

  /**
   * Returns whether or not the given hostname is resolvable.
   *
   * @param string $hostname
   *   The hostname to check.
   *
   * @return bool
   *   TRUE if the host is resolvable.
   */
  protected static function isResolvable(string $hostname): bool {
    // Lifted from Drush.
    // @see \Drush\Exec\ExecTrait::startBrowser()
    $host_error = gethostbynamel($hostname) === FALSE;
    $ip_error = ip2long($hostname) && gethostbyaddr($hostname) === $hostname;

    return !($host_error || $ip_error);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc