diff core/modules/user/src/UserAccessControlHandler.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/user/src/UserAccessControlHandler.php	Thu Jul 05 14:24:15 2018 +0000
@@ -0,0 +1,143 @@
+<?php
+
+namespace Drupal\user;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Access\AccessResultNeutral;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityAccessControlHandler;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * Defines the access control handler for the user entity type.
+ *
+ * @see \Drupal\user\Entity\User
+ */
+class UserAccessControlHandler extends EntityAccessControlHandler {
+
+  /**
+   * Allow access to user label.
+   *
+   * @var bool
+   */
+  protected $viewLabelOperation = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
+    /** @var \Drupal\user\UserInterface $entity*/
+
+    // We don't treat the user label as privileged information, so this check
+    // has to be the first one in order to allow labels for all users to be
+    // viewed, including the special anonymous user.
+    if ($operation === 'view label') {
+      return AccessResult::allowed();
+    }
+
+    // The anonymous user's profile can neither be viewed, updated nor deleted.
+    if ($entity->isAnonymous()) {
+      return AccessResult::forbidden();
+    }
+
+    // Administrators can view/update/delete all user profiles.
+    if ($account->hasPermission('administer users')) {
+      return AccessResult::allowed()->cachePerPermissions();
+    }
+
+    switch ($operation) {
+      case 'view':
+        // Only allow view access if the account is active.
+        if ($account->hasPermission('access user profiles') && $entity->isActive()) {
+          return AccessResult::allowed()->cachePerPermissions()->addCacheableDependency($entity);
+        }
+        // Users can view own profiles at all times.
+        elseif ($account->id() == $entity->id()) {
+          return AccessResult::allowed()->cachePerUser();
+        }
+        else {
+          return AccessResultNeutral::neutral("The 'access user profiles' permission is required and the user must be active.")->cachePerPermissions()->addCacheableDependency($entity);
+        }
+        break;
+
+      case 'update':
+        // Users can always edit their own account.
+        return AccessResult::allowedIf($account->id() == $entity->id())->cachePerUser();
+
+      case 'delete':
+        // Users with 'cancel account' permission can cancel their own account.
+        return AccessResult::allowedIf($account->id() == $entity->id() && $account->hasPermission('cancel account'))->cachePerPermissions()->cachePerUser();
+    }
+
+    // No opinion.
+    return AccessResult::neutral();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function checkFieldAccess($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) {
+    // Fields that are not implicitly allowed to administrative users.
+    $explicit_check_fields = [
+      'pass',
+    ];
+
+    // Administrative users are allowed to edit and view all fields.
+    if (!in_array($field_definition->getName(), $explicit_check_fields) && $account->hasPermission('administer users')) {
+      return AccessResult::allowed()->cachePerPermissions();
+    }
+
+    // Flag to indicate if this user entity is the own user account.
+    $is_own_account = $items ? $items->getEntity()->id() == $account->id() : FALSE;
+    switch ($field_definition->getName()) {
+      case 'name':
+        // Allow view access to anyone with access to the entity. Anonymous
+        // users should be able to access the username field during the
+        // registration process, otherwise the username and email constraints
+        // are not checked.
+        if ($operation == 'view' || ($items && $account->isAnonymous() && $items->getEntity()->isAnonymous())) {
+          return AccessResult::allowed()->cachePerPermissions();
+        }
+        // Allow edit access for the own user name if the permission is
+        // satisfied.
+        if ($is_own_account && $account->hasPermission('change own username')) {
+          return AccessResult::allowed()->cachePerPermissions()->cachePerUser();
+        }
+        else {
+          return AccessResult::forbidden();
+        }
+
+      case 'preferred_langcode':
+      case 'preferred_admin_langcode':
+      case 'timezone':
+      case 'mail':
+        // Allow view access to own mail address and other personalization
+        // settings.
+        if ($operation == 'view') {
+          return $is_own_account ? AccessResult::allowed()->cachePerUser() : AccessResult::forbidden();
+        }
+        // Anyone that can edit the user can also edit this field.
+        return AccessResult::allowed()->cachePerPermissions();
+
+      case 'pass':
+        // Allow editing the password, but not viewing it.
+        return ($operation == 'edit') ? AccessResult::allowed() : AccessResult::forbidden();
+
+      case 'created':
+        // Allow viewing the created date, but not editing it.
+        return ($operation == 'view') ? AccessResult::allowed() : AccessResult::forbidden();
+
+      case 'roles':
+      case 'status':
+      case 'access':
+      case 'login':
+      case 'init':
+        return AccessResult::forbidden();
+    }
+
+    return parent::checkFieldAccess($operation, $field_definition, $account, $items);
+  }
+
+}