Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\node\Functional;
|
Chris@0
|
4
|
Chris@18
|
5 use Drupal\Core\Database\Database;
|
Chris@0
|
6 use Drupal\Core\Language\LanguageInterface;
|
Chris@0
|
7 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@0
|
8 use Drupal\node\Entity\NodeType;
|
Chris@0
|
9 use Drupal\user\Entity\User;
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Tests node_access and db_select() with node_access tag functionality with
|
Chris@0
|
13 * multiple languages with a test node access module that is not language-aware.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @group node
|
Chris@0
|
16 */
|
Chris@0
|
17 class NodeAccessLanguageTest extends NodeTestBase {
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * Modules to enable.
|
Chris@0
|
21 *
|
Chris@0
|
22 * @var array
|
Chris@0
|
23 */
|
Chris@0
|
24 public static $modules = ['language', 'node_access_test'];
|
Chris@0
|
25
|
Chris@0
|
26 protected function setUp() {
|
Chris@0
|
27 parent::setUp();
|
Chris@0
|
28
|
Chris@0
|
29 node_access_test_add_field(NodeType::load('page'));
|
Chris@0
|
30
|
Chris@0
|
31 // After enabling a node access module, the access table has to be rebuild.
|
Chris@0
|
32 node_access_rebuild();
|
Chris@0
|
33
|
Chris@0
|
34 // Enable the private node feature of the node_access_test module.
|
Chris@0
|
35 \Drupal::state()->set('node_access_test.private', TRUE);
|
Chris@0
|
36
|
Chris@0
|
37 // Add Hungarian, Catalan and Croatian.
|
Chris@0
|
38 ConfigurableLanguage::createFromLangcode('hu')->save();
|
Chris@0
|
39 ConfigurableLanguage::createFromLangcode('ca')->save();
|
Chris@0
|
40 ConfigurableLanguage::createFromLangcode('hr')->save();
|
Chris@0
|
41 }
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * Tests node access with multiple node languages and no private nodes.
|
Chris@0
|
45 */
|
Chris@0
|
46 public function testNodeAccess() {
|
Chris@0
|
47 $web_user = $this->drupalCreateUser(['access content']);
|
Chris@0
|
48
|
Chris@0
|
49 $expected_node_access = ['view' => TRUE, 'update' => FALSE, 'delete' => FALSE];
|
Chris@0
|
50 $expected_node_access_no_access = ['view' => FALSE, 'update' => FALSE, 'delete' => FALSE];
|
Chris@0
|
51
|
Chris@0
|
52 // Creating a public node with langcode Hungarian, will be saved as the
|
Chris@0
|
53 // fallback in node access table.
|
Chris@0
|
54 $node_public_hu = $this->drupalCreateNode(['body' => [[]], 'langcode' => 'hu', 'private' => FALSE]);
|
Chris@0
|
55 $this->assertTrue($node_public_hu->language()->getId() == 'hu', 'Node created as Hungarian.');
|
Chris@0
|
56
|
Chris@0
|
57 // Tests the default access is provided for the public Hungarian node.
|
Chris@0
|
58 $this->assertNodeAccess($expected_node_access, $node_public_hu, $web_user);
|
Chris@0
|
59
|
Chris@0
|
60 // Tests that Hungarian provided specifically results in the same.
|
Chris@0
|
61 $this->assertNodeAccess($expected_node_access, $node_public_hu->getTranslation('hu'), $web_user);
|
Chris@0
|
62
|
Chris@0
|
63 // Creating a public node with no special langcode, like when no language
|
Chris@0
|
64 // module enabled.
|
Chris@0
|
65 $node_public_no_language = $this->drupalCreateNode([
|
Chris@0
|
66 'private' => FALSE,
|
Chris@0
|
67 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
|
Chris@0
|
68 ]);
|
Chris@0
|
69 $this->assertTrue($node_public_no_language->language()->getId() == LanguageInterface::LANGCODE_NOT_SPECIFIED, 'Node created with not specified language.');
|
Chris@0
|
70
|
Chris@0
|
71 // Tests that access is granted if requested with no language.
|
Chris@0
|
72 $this->assertNodeAccess($expected_node_access, $node_public_no_language, $web_user);
|
Chris@0
|
73
|
Chris@0
|
74 // Reset the node access cache and turn on our test node access code.
|
Chris@0
|
75 \Drupal::entityManager()->getAccessControlHandler('node')->resetCache();
|
Chris@0
|
76 \Drupal::state()->set('node_access_test_secret_catalan', 1);
|
Chris@0
|
77 $node_public_ca = $this->drupalCreateNode(['body' => [[]], 'langcode' => 'ca', 'private' => FALSE]);
|
Chris@0
|
78 $this->assertTrue($node_public_ca->language()->getId() == 'ca', 'Node created as Catalan.');
|
Chris@0
|
79
|
Chris@0
|
80 // Tests that access is granted if requested with no language.
|
Chris@0
|
81 $this->assertNodeAccess($expected_node_access, $node_public_no_language, $web_user);
|
Chris@0
|
82 $this->assertNodeAccess($expected_node_access_no_access, $node_public_ca, $web_user);
|
Chris@0
|
83
|
Chris@0
|
84 // Tests that Hungarian node is still accessible.
|
Chris@0
|
85 $this->assertNodeAccess($expected_node_access, $node_public_hu, $web_user);
|
Chris@0
|
86 $this->assertNodeAccess($expected_node_access, $node_public_hu->getTranslation('hu'), $web_user);
|
Chris@0
|
87
|
Chris@0
|
88 // Tests that Catalan is still not accessible.
|
Chris@0
|
89 $this->assertNodeAccess($expected_node_access_no_access, $node_public_ca->getTranslation('ca'), $web_user);
|
Chris@0
|
90
|
Chris@0
|
91 // Make Catalan accessible.
|
Chris@0
|
92 \Drupal::state()->set('node_access_test_secret_catalan', 0);
|
Chris@0
|
93
|
Chris@0
|
94 // Tests that Catalan is accessible on a node with a Catalan version as the
|
Chris@0
|
95 // static cache has not been reset.
|
Chris@0
|
96 $this->assertNodeAccess($expected_node_access_no_access, $node_public_ca, $web_user);
|
Chris@0
|
97 $this->assertNodeAccess($expected_node_access_no_access, $node_public_ca->getTranslation('ca'), $web_user);
|
Chris@0
|
98
|
Chris@0
|
99 \Drupal::entityManager()->getAccessControlHandler('node')->resetCache();
|
Chris@0
|
100
|
Chris@0
|
101 // Tests that access is granted if requested with no language.
|
Chris@0
|
102 $this->assertNodeAccess($expected_node_access, $node_public_no_language, $web_user);
|
Chris@0
|
103 $this->assertNodeAccess($expected_node_access, $node_public_ca, $web_user);
|
Chris@0
|
104
|
Chris@0
|
105 // Tests that Hungarian node is still accessible.
|
Chris@0
|
106 $this->assertNodeAccess($expected_node_access, $node_public_hu, $web_user);
|
Chris@0
|
107 $this->assertNodeAccess($expected_node_access, $node_public_hu->getTranslation('hu'), $web_user);
|
Chris@0
|
108
|
Chris@0
|
109 // Tests that Catalan is accessible on a node with a Catalan version.
|
Chris@0
|
110 $this->assertNodeAccess($expected_node_access, $node_public_ca->getTranslation('ca'), $web_user);
|
Chris@0
|
111 }
|
Chris@0
|
112
|
Chris@0
|
113 /**
|
Chris@0
|
114 * Tests node access with multiple node languages and private nodes.
|
Chris@0
|
115 */
|
Chris@0
|
116 public function testNodeAccessPrivate() {
|
Chris@0
|
117 $web_user = $this->drupalCreateUser(['access content']);
|
Chris@0
|
118 $expected_node_access = ['view' => TRUE, 'update' => FALSE, 'delete' => FALSE];
|
Chris@0
|
119 $expected_node_access_no_access = ['view' => FALSE, 'update' => FALSE, 'delete' => FALSE];
|
Chris@0
|
120
|
Chris@0
|
121 // Creating a private node with langcode Hungarian, will be saved as the
|
Chris@0
|
122 // fallback in node access table.
|
Chris@0
|
123 $node_private_hu = $this->drupalCreateNode(['body' => [[]], 'langcode' => 'hu', 'private' => TRUE]);
|
Chris@0
|
124 $this->assertTrue($node_private_hu->language()->getId() == 'hu', 'Node created as Hungarian.');
|
Chris@0
|
125
|
Chris@0
|
126 // Tests the default access is not provided for the private Hungarian node.
|
Chris@0
|
127 $this->assertNodeAccess($expected_node_access_no_access, $node_private_hu, $web_user);
|
Chris@0
|
128
|
Chris@0
|
129 // Tests that Hungarian provided specifically results in the same.
|
Chris@0
|
130 $this->assertNodeAccess($expected_node_access_no_access, $node_private_hu->getTranslation('hu'), $web_user);
|
Chris@0
|
131
|
Chris@0
|
132 // Creating a private node with no special langcode, like when no language
|
Chris@0
|
133 // module enabled.
|
Chris@0
|
134 $node_private_no_language = $this->drupalCreateNode([
|
Chris@0
|
135 'private' => TRUE,
|
Chris@0
|
136 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
|
Chris@0
|
137 ]);
|
Chris@0
|
138 $this->assertTrue($node_private_no_language->language()->getId() == LanguageInterface::LANGCODE_NOT_SPECIFIED, 'Node created with not specified language.');
|
Chris@0
|
139
|
Chris@0
|
140 // Tests that access is not granted if requested with no language.
|
Chris@0
|
141 $this->assertNodeAccess($expected_node_access_no_access, $node_private_no_language, $web_user);
|
Chris@0
|
142
|
Chris@0
|
143 // Reset the node access cache and turn on our test node access code.
|
Chris@0
|
144 \Drupal::entityManager()->getAccessControlHandler('node')->resetCache();
|
Chris@0
|
145 \Drupal::state()->set('node_access_test_secret_catalan', 1);
|
Chris@0
|
146
|
Chris@0
|
147 // Tests that access is not granted if requested with no language.
|
Chris@0
|
148 $this->assertNodeAccess($expected_node_access_no_access, $node_private_no_language, $web_user);
|
Chris@0
|
149
|
Chris@0
|
150 // Creating a private node with langcode Catalan to test that the
|
Chris@0
|
151 // node_access_test_secret_catalan flag works.
|
Chris@0
|
152 $private_ca_user = $this->drupalCreateUser(['access content', 'node test view']);
|
Chris@0
|
153 $node_private_ca = $this->drupalCreateNode(['body' => [[]], 'langcode' => 'ca', 'private' => TRUE]);
|
Chris@0
|
154 $this->assertTrue($node_private_ca->language()->getId() == 'ca', 'Node created as Catalan.');
|
Chris@0
|
155
|
Chris@0
|
156 // Tests that Catalan is still not accessible to either user.
|
Chris@0
|
157 $this->assertNodeAccess($expected_node_access_no_access, $node_private_ca, $web_user);
|
Chris@0
|
158 $this->assertNodeAccess($expected_node_access_no_access, $node_private_ca->getTranslation('ca'), $web_user);
|
Chris@0
|
159 $this->assertNodeAccess($expected_node_access_no_access, $node_private_ca, $private_ca_user);
|
Chris@0
|
160 $this->assertNodeAccess($expected_node_access_no_access, $node_private_ca->getTranslation('ca'), $private_ca_user);
|
Chris@0
|
161
|
Chris@0
|
162 \Drupal::entityManager()->getAccessControlHandler('node')->resetCache();
|
Chris@0
|
163 \Drupal::state()->set('node_access_test_secret_catalan', 0);
|
Chris@0
|
164
|
Chris@0
|
165 // Tests that Catalan is still not accessible for a user with no access to
|
Chris@0
|
166 // private nodes.
|
Chris@0
|
167 $this->assertNodeAccess($expected_node_access_no_access, $node_private_ca, $web_user);
|
Chris@0
|
168 $this->assertNodeAccess($expected_node_access_no_access, $node_private_ca->getTranslation('ca'), $web_user);
|
Chris@0
|
169
|
Chris@0
|
170 // Tests that Catalan is accessible by a user with the permission to see
|
Chris@0
|
171 // private nodes.
|
Chris@0
|
172 $this->assertNodeAccess($expected_node_access, $node_private_ca, $private_ca_user);
|
Chris@0
|
173 $this->assertNodeAccess($expected_node_access, $node_private_ca->getTranslation('ca'), $private_ca_user);
|
Chris@0
|
174 }
|
Chris@0
|
175
|
Chris@0
|
176 /**
|
Chris@0
|
177 * Tests db_select() with a 'node_access' tag and langcode metadata.
|
Chris@0
|
178 */
|
Chris@0
|
179 public function testNodeAccessQueryTag() {
|
Chris@0
|
180 // Create a normal authenticated user.
|
Chris@0
|
181 $web_user = $this->drupalCreateUser(['access content']);
|
Chris@0
|
182
|
Chris@0
|
183 // Load the user 1 user for later use as an admin user with permission to
|
Chris@0
|
184 // see everything.
|
Chris@0
|
185 $admin_user = User::load(1);
|
Chris@0
|
186
|
Chris@0
|
187 // Creating a private node with langcode Hungarian, will be saved as
|
Chris@0
|
188 // the fallback in node access table.
|
Chris@0
|
189 $node_private = $this->drupalCreateNode(['body' => [[]], 'langcode' => 'hu', 'private' => TRUE]);
|
Chris@0
|
190 $this->assertTrue($node_private->language()->getId() == 'hu', 'Node created as Hungarian.');
|
Chris@0
|
191
|
Chris@0
|
192 // Creating a public node with langcode Hungarian, will be saved as
|
Chris@0
|
193 // the fallback in node access table.
|
Chris@0
|
194 $node_public = $this->drupalCreateNode(['body' => [[]], 'langcode' => 'hu', 'private' => FALSE]);
|
Chris@0
|
195 $this->assertTrue($node_public->language()->getId() == 'hu', 'Node created as Hungarian.');
|
Chris@0
|
196
|
Chris@0
|
197 // Creating a public node with no special langcode, like when no language
|
Chris@0
|
198 // module enabled.
|
Chris@0
|
199 $node_no_language = $this->drupalCreateNode([
|
Chris@0
|
200 'private' => FALSE,
|
Chris@0
|
201 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
|
Chris@0
|
202 ]);
|
Chris@0
|
203 $this->assertTrue($node_no_language->language()->getId() == LanguageInterface::LANGCODE_NOT_SPECIFIED, 'Node created with not specified language.');
|
Chris@0
|
204
|
Chris@18
|
205 $connection = Database::getConnection();
|
Chris@0
|
206 // Query the nodes table as the web user with the node access tag and no
|
Chris@0
|
207 // specific langcode.
|
Chris@18
|
208 $select = $connection->select('node', 'n')
|
Chris@0
|
209 ->fields('n', ['nid'])
|
Chris@0
|
210 ->addMetaData('account', $web_user)
|
Chris@0
|
211 ->addTag('node_access');
|
Chris@0
|
212 $nids = $select->execute()->fetchAllAssoc('nid');
|
Chris@0
|
213
|
Chris@0
|
214 // The public node and no language node should be returned. Because no
|
Chris@0
|
215 // langcode is given it will use the fallback node.
|
Chris@0
|
216 $this->assertEqual(count($nids), 2, 'db_select() returns 2 node');
|
Chris@0
|
217 $this->assertTrue(array_key_exists($node_public->id(), $nids), 'Returned node ID is public node.');
|
Chris@0
|
218 $this->assertTrue(array_key_exists($node_no_language->id(), $nids), 'Returned node ID is no language node.');
|
Chris@0
|
219
|
Chris@0
|
220 // Query the nodes table as the web user with the node access tag and
|
Chris@0
|
221 // langcode de.
|
Chris@18
|
222 $select = $connection->select('node', 'n')
|
Chris@0
|
223 ->fields('n', ['nid'])
|
Chris@0
|
224 ->addMetaData('account', $web_user)
|
Chris@0
|
225 ->addMetaData('langcode', 'de')
|
Chris@0
|
226 ->addTag('node_access');
|
Chris@0
|
227 $nids = $select->execute()->fetchAllAssoc('nid');
|
Chris@0
|
228
|
Chris@0
|
229 // Because no nodes are created in German, no nodes are returned.
|
Chris@0
|
230 $this->assertTrue(empty($nids), 'db_select() returns an empty result.');
|
Chris@0
|
231
|
Chris@0
|
232 // Query the nodes table as admin user (full access) with the node access
|
Chris@0
|
233 // tag and no specific langcode.
|
Chris@18
|
234 $select = $connection->select('node', 'n')
|
Chris@0
|
235 ->fields('n', ['nid'])
|
Chris@0
|
236 ->addMetaData('account', $admin_user)
|
Chris@0
|
237 ->addTag('node_access');
|
Chris@0
|
238 $nids = $select->execute()->fetchAllAssoc('nid');
|
Chris@0
|
239
|
Chris@0
|
240 // All nodes are returned.
|
Chris@0
|
241 $this->assertEqual(count($nids), 3, 'db_select() returns all three nodes.');
|
Chris@0
|
242
|
Chris@0
|
243 // Query the nodes table as admin user (full access) with the node access
|
Chris@0
|
244 // tag and langcode de.
|
Chris@18
|
245 $select = $connection->select('node', 'n')
|
Chris@0
|
246 ->fields('n', ['nid'])
|
Chris@0
|
247 ->addMetaData('account', $admin_user)
|
Chris@0
|
248 ->addMetaData('langcode', 'de')
|
Chris@0
|
249 ->addTag('node_access');
|
Chris@0
|
250 $nids = $select->execute()->fetchAllAssoc('nid');
|
Chris@0
|
251
|
Chris@0
|
252 // All nodes are returned because node access tag is not invoked when the
|
Chris@0
|
253 // user is user 1.
|
Chris@0
|
254 $this->assertEqual(count($nids), 3, 'db_select() returns all three nodes.');
|
Chris@0
|
255 }
|
Chris@0
|
256
|
Chris@0
|
257 }
|