Mercurial > hg > isophonics-drupal-site
comparison core/modules/user/src/UserAccessControlHandler.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\user; | |
4 | |
5 use Drupal\Core\Access\AccessResult; | |
6 use Drupal\Core\Access\AccessResultNeutral; | |
7 use Drupal\Core\Entity\EntityInterface; | |
8 use Drupal\Core\Entity\EntityAccessControlHandler; | |
9 use Drupal\Core\Field\FieldDefinitionInterface; | |
10 use Drupal\Core\Field\FieldItemListInterface; | |
11 use Drupal\Core\Session\AccountInterface; | |
12 | |
13 /** | |
14 * Defines the access control handler for the user entity type. | |
15 * | |
16 * @see \Drupal\user\Entity\User | |
17 */ | |
18 class UserAccessControlHandler extends EntityAccessControlHandler { | |
19 | |
20 /** | |
21 * Allow access to user label. | |
22 * | |
23 * @var bool | |
24 */ | |
25 protected $viewLabelOperation = TRUE; | |
26 | |
27 /** | |
28 * {@inheritdoc} | |
29 */ | |
30 protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { | |
31 /** @var \Drupal\user\UserInterface $entity*/ | |
32 | |
33 // We don't treat the user label as privileged information, so this check | |
34 // has to be the first one in order to allow labels for all users to be | |
35 // viewed, including the special anonymous user. | |
36 if ($operation === 'view label') { | |
37 return AccessResult::allowed(); | |
38 } | |
39 | |
40 // The anonymous user's profile can neither be viewed, updated nor deleted. | |
41 if ($entity->isAnonymous()) { | |
42 return AccessResult::forbidden(); | |
43 } | |
44 | |
45 // Administrators can view/update/delete all user profiles. | |
46 if ($account->hasPermission('administer users')) { | |
47 return AccessResult::allowed()->cachePerPermissions(); | |
48 } | |
49 | |
50 switch ($operation) { | |
51 case 'view': | |
52 // Only allow view access if the account is active. | |
53 if ($account->hasPermission('access user profiles') && $entity->isActive()) { | |
54 return AccessResult::allowed()->cachePerPermissions()->addCacheableDependency($entity); | |
55 } | |
56 // Users can view own profiles at all times. | |
57 elseif ($account->id() == $entity->id()) { | |
58 return AccessResult::allowed()->cachePerUser(); | |
59 } | |
60 else { | |
61 return AccessResultNeutral::neutral("The 'access user profiles' permission is required and the user must be active."); | |
62 } | |
63 break; | |
64 | |
65 case 'update': | |
66 // Users can always edit their own account. | |
67 return AccessResult::allowedIf($account->id() == $entity->id())->cachePerUser(); | |
68 | |
69 case 'delete': | |
70 // Users with 'cancel account' permission can cancel their own account. | |
71 return AccessResult::allowedIf($account->id() == $entity->id() && $account->hasPermission('cancel account'))->cachePerPermissions()->cachePerUser(); | |
72 } | |
73 | |
74 // No opinion. | |
75 return AccessResult::neutral(); | |
76 } | |
77 | |
78 /** | |
79 * {@inheritdoc} | |
80 */ | |
81 protected function checkFieldAccess($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) { | |
82 // Fields that are not implicitly allowed to administrative users. | |
83 $explicit_check_fields = [ | |
84 'pass', | |
85 ]; | |
86 | |
87 // Administrative users are allowed to edit and view all fields. | |
88 if (!in_array($field_definition->getName(), $explicit_check_fields) && $account->hasPermission('administer users')) { | |
89 return AccessResult::allowed()->cachePerPermissions(); | |
90 } | |
91 | |
92 // Flag to indicate if this user entity is the own user account. | |
93 $is_own_account = $items ? $items->getEntity()->id() == $account->id() : FALSE; | |
94 switch ($field_definition->getName()) { | |
95 case 'name': | |
96 // Allow view access to anyone with access to the entity. Anonymous | |
97 // users should be able to access the username field during the | |
98 // registration process, otherwise the username and email constraints | |
99 // are not checked. | |
100 if ($operation == 'view' || ($items && $account->isAnonymous() && $items->getEntity()->isAnonymous())) { | |
101 return AccessResult::allowed()->cachePerPermissions(); | |
102 } | |
103 // Allow edit access for the own user name if the permission is | |
104 // satisfied. | |
105 if ($is_own_account && $account->hasPermission('change own username')) { | |
106 return AccessResult::allowed()->cachePerPermissions()->cachePerUser(); | |
107 } | |
108 else { | |
109 return AccessResult::forbidden(); | |
110 } | |
111 | |
112 case 'preferred_langcode': | |
113 case 'preferred_admin_langcode': | |
114 case 'timezone': | |
115 case 'mail': | |
116 // Allow view access to own mail address and other personalization | |
117 // settings. | |
118 if ($operation == 'view') { | |
119 return $is_own_account ? AccessResult::allowed()->cachePerUser() : AccessResult::forbidden(); | |
120 } | |
121 // Anyone that can edit the user can also edit this field. | |
122 return AccessResult::allowed()->cachePerPermissions(); | |
123 | |
124 case 'pass': | |
125 // Allow editing the password, but not viewing it. | |
126 return ($operation == 'edit') ? AccessResult::allowed() : AccessResult::forbidden(); | |
127 | |
128 case 'created': | |
129 // Allow viewing the created date, but not editing it. | |
130 return ($operation == 'view') ? AccessResult::allowed() : AccessResult::forbidden(); | |
131 | |
132 case 'roles': | |
133 case 'status': | |
134 case 'access': | |
135 case 'login': | |
136 case 'init': | |
137 return AccessResult::forbidden(); | |
138 } | |
139 | |
140 return parent::checkFieldAccess($operation, $field_definition, $account, $items); | |
141 } | |
142 | |
143 } |