email_confirmer-8.x-1.x-dev/src/EmailConfirmationAccessControlHandler.php

src/EmailConfirmationAccessControlHandler.php
<?php

namespace Drupal\email_confirmer;

use Drupal\Core\Entity\EntityAccessControlHandler;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Drupal\Core\Entity\EntityHandlerInterface;

/**
 * Access controller for the email confirmation entity.
 *
 * @see \Drupal\email_confirmer\Entity\EmailConfirmation.
 */
class EmailConfirmationAccessControlHandler extends EntityAccessControlHandler implements EntityHandlerInterface {

  /**
   * The email confirmer config.
   *
   * @var \Drupal\Core\Config\ImmutableConfig
   */
  protected $confirmerConfig;

  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * Creates a new EmailConfirmationAccessControlHandler.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   *   The entity type definition.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   */
  public function __construct(EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, RequestStack $request_stack) {
    parent::__construct($entity_type);

    $this->confirmerConfig = $config_factory->get('email_confirmer.settings');
    $this->requestStack = $request_stack;
  }

  /**
   * {@inheritdoc}
   */
  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
    return new static($entity_type, $container->get('config.factory'), $container->get('request_stack'));
  }

  /**
   * {@inheritdoc}
   */
  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    /** @var \Drupal\email_confirmer\EmailConfirmationInterface $entity */
    if ($account->hasPermission('administer email confirmations')) {
      return AccessResult::allowed()->cachePerPermissions();
    }

    // IP access restriction.
    if ($this->confirmerConfig->get('restrict_same_ip')
      && !$entity->get('ip')->isEmpty()
      && $entity->get('ip')->getString() != $this->requestStack->getCurrentRequest()->getClientIp()) {
      return AccessResult::forbidden()->addCacheContexts(['ip'])->addCacheTags($entity->getCacheTags());
    }

    // Private confirmation access restriction.
    if ($entity->isPrivate()
      && !in_array($entity->get('uid')->target_id, [0, $account->id()])) {
      return AccessResult::forbidden()->cachePerUser()->addCacheTags($entity->getCacheTags());
    }

    return AccessResult::allowedIfHasPermission($account, 'access email confirmation')->cachePerPermissions()->addCacheTags($entity->getCacheTags());
  }

  /**
   * {@inheritdoc}
   */
  protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
    return AccessResult::allowedIfHasPermission($account, 'access email confirmation')->cachePerPermissions();
  }

}

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

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