Mercurial > hg > isophonics-drupal-site
comparison core/modules/node/src/Cache/NodeAccessGrantsCacheContext.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\node\Cache; | |
4 | |
5 use Drupal\Core\Cache\CacheableMetadata; | |
6 use Drupal\Core\Cache\Context\CalculatedCacheContextInterface; | |
7 use Drupal\Core\Cache\Context\UserCacheContextBase; | |
8 | |
9 /** | |
10 * Defines the node access view cache context service. | |
11 * | |
12 * Cache context ID: 'user.node_grants' (to vary by all operations' grants). | |
13 * Calculated cache context ID: 'user.node_grants:%operation', e.g. | |
14 * 'user.node_grants:view' (to vary by the view operation's grants). | |
15 * | |
16 * This allows for node access grants-sensitive caching when listing nodes. | |
17 * | |
18 * @see node_query_node_access_alter() | |
19 * @ingroup node_access | |
20 */ | |
21 class NodeAccessGrantsCacheContext extends UserCacheContextBase implements CalculatedCacheContextInterface { | |
22 | |
23 /** | |
24 * {@inheritdoc} | |
25 */ | |
26 public static function getLabel() { | |
27 return t("Content access view grants"); | |
28 } | |
29 | |
30 /** | |
31 * {@inheritdoc} | |
32 */ | |
33 public function getContext($operation = NULL) { | |
34 // If the current user either can bypass node access then we don't need to | |
35 // determine the exact node grants for the current user. | |
36 if ($this->user->hasPermission('bypass node access')) { | |
37 return 'all'; | |
38 } | |
39 | |
40 // When no specific operation is specified, check the grants for all three | |
41 // possible operations. | |
42 if ($operation === NULL) { | |
43 $result = []; | |
44 foreach (['view', 'update', 'delete'] as $op) { | |
45 $result[] = $this->checkNodeGrants($op); | |
46 } | |
47 return implode('-', $result); | |
48 } | |
49 else { | |
50 return $this->checkNodeGrants($operation); | |
51 } | |
52 } | |
53 | |
54 /** | |
55 * Checks the node grants for the given operation. | |
56 * | |
57 * @param string $operation | |
58 * The operation to check the node grants for. | |
59 * | |
60 * @return string | |
61 * The string representation of the cache context. | |
62 */ | |
63 protected function checkNodeGrants($operation) { | |
64 // When checking the grants for the 'view' operation and the current user | |
65 // has a global view grant (i.e. a view grant for node ID 0) — note that | |
66 // this is automatically the case if no node access modules exist (no | |
67 // hook_node_grants() implementations) then we don't need to determine the | |
68 // exact node view grants for the current user. | |
69 if ($operation === 'view' && node_access_view_all_nodes($this->user)) { | |
70 return 'view.all'; | |
71 } | |
72 | |
73 $grants = node_access_grants($operation, $this->user); | |
74 $grants_context_parts = []; | |
75 foreach ($grants as $realm => $gids) { | |
76 $grants_context_parts[] = $realm . ':' . implode(',', $gids); | |
77 } | |
78 return $operation . '.' . implode(';', $grants_context_parts); | |
79 } | |
80 | |
81 /** | |
82 * {@inheritdoc} | |
83 */ | |
84 public function getCacheableMetadata($operation = NULL) { | |
85 $cacheable_metadata = new CacheableMetadata(); | |
86 | |
87 if (!\Drupal::moduleHandler()->getImplementations('node_grants')) { | |
88 return $cacheable_metadata; | |
89 } | |
90 | |
91 // The node grants may change if the user is updated. (The max-age is set to | |
92 // zero below, but sites may override this cache context, and change it to a | |
93 // non-zero value. In such cases, this cache tag is needed for correctness.) | |
94 $cacheable_metadata->setCacheTags(['user:' . $this->user->id()]); | |
95 | |
96 // If the site is using node grants, this cache context can not be | |
97 // optimized. | |
98 return $cacheable_metadata->setCacheMaxAge(0); | |
99 } | |
100 | |
101 } |