raven-8.x-2.x-dev/src/Plugin/CspReportingHandler/Raven.php

src/Plugin/CspReportingHandler/Raven.php
<?php

namespace Drupal\raven\Plugin\CspReportingHandler;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Url;
use Drupal\csp\Csp;
use Drupal\csp\Plugin\ReportingHandlerBase;
use Sentry\Dsn;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * CSP Reporting Plugin for a Sentry endpoint.
 *
 * @CspReportingHandler(
 *   id = "raven",
 *   label = "Sentry",
 *   description = @Translation("Reports will be sent to Sentry."),
 * )
 */
class Raven extends ReportingHandlerBase implements ContainerFactoryPluginInterface {

  /**
   * {@inheritdoc}
   *
   * @phpstan-ignore missingType.iterableValue
   */
  final public function __construct(array $configuration, $plugin_id, $plugin_definition, protected ConfigFactoryInterface $configFactory, protected string $environment) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
  }

  /**
   * {@inheritdoc}
   *
   * @phpstan-ignore missingType.iterableValue
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
    $environment = $container->getParameter('kernel.environment');
    if (!\is_string($environment)) {
      throw new \UnexpectedValueException('The kernel.environment parameter should be a string.');
    }
    return new static(
      $configuration,
      $plugin_id,
      // @phpstan-ignore argument.type
      $plugin_definition,
      $container->get('config.factory'),
      $environment,
    );
  }

  /**
   * {@inheritdoc}
   */
  public function alterPolicy(Csp $policy): void {
    $config = $this->configFactory->get('raven.settings');
    $dsn = $config->get('public_dsn');
    if (!\is_string($dsn)) {
      return;
    }
    try {
      $dsn = Dsn::createFromString($dsn);
    }
    catch (\InvalidArgumentException $e) {
      // Raven is incorrectly configured.
      return;
    }
    $query['sentry_environment'] = $config->get('environment') ?: $this->environment;
    if ($release = $config->get('release')) {
      $query['sentry_release'] = $release;
    }
    $policy->setDirective('report-uri', Url::fromUri($dsn->getCspReportEndpointUrl(), ['query' => $query])->toString());
  }

}

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

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