| 1 | efrain | 1 | <?php
 | 
        
           |  |  | 2 | // This file is part of Moodle - http://moodle.org/
 | 
        
           |  |  | 3 | //
 | 
        
           |  |  | 4 | // Moodle is free software: you can redistribute it and/or modify
 | 
        
           |  |  | 5 | // it under the terms of the GNU General Public License as published by
 | 
        
           |  |  | 6 | // the Free Software Foundation, either version 3 of the License, or
 | 
        
           |  |  | 7 | // (at your option) any later version.
 | 
        
           |  |  | 8 | //
 | 
        
           |  |  | 9 | // Moodle is distributed in the hope that it will be useful,
 | 
        
           |  |  | 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
        
           |  |  | 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
        
           |  |  | 12 | // GNU General Public License for more details.
 | 
        
           |  |  | 13 | //
 | 
        
           |  |  | 14 | // You should have received a copy of the GNU General Public License
 | 
        
           |  |  | 15 | // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 | 
        
           |  |  | 16 |   | 
        
           |  |  | 17 | /**
 | 
        
           |  |  | 18 |  * Data provider tests.
 | 
        
           |  |  | 19 |  *
 | 
        
           |  |  | 20 |  * @package    core_external
 | 
        
           |  |  | 21 |  * @category   test
 | 
        
           |  |  | 22 |  * @copyright  2018 Frédéric Massart
 | 
        
           |  |  | 23 |  * @author     Frédéric Massart <fred@branchup.tech>
 | 
        
           |  |  | 24 |  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 25 |  */
 | 
        
           |  |  | 26 | namespace core_external\privacy;
 | 
        
           |  |  | 27 |   | 
        
           |  |  | 28 | use core_external\privacy\provider;
 | 
        
           |  |  | 29 | use core_privacy\local\request\approved_contextlist;
 | 
        
           |  |  | 30 | use core_privacy\local\request\approved_userlist;
 | 
        
           |  |  | 31 | use core_privacy\local\request\transform;
 | 
        
           |  |  | 32 | use core_privacy\local\request\writer;
 | 
        
           |  |  | 33 | use core_privacy\tests\provider_testcase;
 | 
        
           |  |  | 34 |   | 
        
           |  |  | 35 | /**
 | 
        
           |  |  | 36 |  * External subsytem testcase class.
 | 
        
           |  |  | 37 |  *
 | 
        
           |  |  | 38 |  * @package    core_external
 | 
        
           |  |  | 39 |  * @category   test
 | 
        
           |  |  | 40 |  * @copyright  2018 Frédéric Massart
 | 
        
           |  |  | 41 |  * @author     Frédéric Massart <fred@branchup.tech>
 | 
        
           |  |  | 42 |  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 43 |  */
 | 
        
           | 1441 | ariadna | 44 | final class provider_test extends provider_testcase {
 | 
        
           | 1 | efrain | 45 |     public function setUp(): void {
 | 
        
           | 1441 | ariadna | 46 |         parent::setUp();
 | 
        
           | 1 | efrain | 47 |         $this->resetAfterTest();
 | 
        
           |  |  | 48 |     }
 | 
        
           |  |  | 49 |   | 
        
           |  |  | 50 |     /**
 | 
        
           |  |  | 51 |      * Test the external service get_contexts_for_userid function.
 | 
        
           |  |  | 52 |      *
 | 
        
           |  |  | 53 |      * @covers \core_external\privacy\provider::get_contexts_for_userid
 | 
        
           |  |  | 54 |      */
 | 
        
           |  |  | 55 |     public function test_get_contexts_for_userid(): void {
 | 
        
           |  |  | 56 |         $dg = $this->getDataGenerator();
 | 
        
           |  |  | 57 |         $u1 = $dg->create_user();
 | 
        
           |  |  | 58 |         $u2 = $dg->create_user();
 | 
        
           |  |  | 59 |         $u3 = $dg->create_user();
 | 
        
           |  |  | 60 |         $u4 = $dg->create_user();
 | 
        
           |  |  | 61 |         $u5 = $dg->create_user();
 | 
        
           |  |  | 62 |         $u1ctx = \context_user::instance($u1->id);
 | 
        
           |  |  | 63 |         $u2ctx = \context_user::instance($u2->id);
 | 
        
           |  |  | 64 |         $u3ctx = \context_user::instance($u3->id);
 | 
        
           |  |  | 65 |         $u5ctx = \context_user::instance($u5->id);
 | 
        
           |  |  | 66 |   | 
        
           |  |  | 67 |         $s = $this->create_service();
 | 
        
           |  |  | 68 |         $this->create_token(['userid' => $u1->id]);
 | 
        
           |  |  | 69 |         $this->create_token(['userid' => $u1->id]);
 | 
        
           |  |  | 70 |         $this->create_token(['userid' => $u2->id, 'creatorid' => $u3->id]);
 | 
        
           |  |  | 71 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u5->id]);
 | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 |         $contextids = provider::get_contexts_for_userid($u1->id)->get_contextids();
 | 
        
           |  |  | 74 |         $this->assertCount(1, $contextids);
 | 
        
           |  |  | 75 |         $this->assertTrue(in_array($u1ctx->id, $contextids));
 | 
        
           |  |  | 76 |   | 
        
           |  |  | 77 |         $contextids = provider::get_contexts_for_userid($u2->id)->get_contextids();
 | 
        
           |  |  | 78 |         $this->assertCount(1, $contextids);
 | 
        
           |  |  | 79 |         $this->assertTrue(in_array($u2ctx->id, $contextids));
 | 
        
           |  |  | 80 |   | 
        
           |  |  | 81 |         $contextids = provider::get_contexts_for_userid($u3->id)->get_contextids();
 | 
        
           |  |  | 82 |         $this->assertCount(1, $contextids);
 | 
        
           |  |  | 83 |         $this->assertTrue(in_array($u2ctx->id, $contextids));
 | 
        
           |  |  | 84 |   | 
        
           |  |  | 85 |         $contextids = provider::get_contexts_for_userid($u4->id)->get_contextids();
 | 
        
           |  |  | 86 |         $this->assertCount(0, $contextids);
 | 
        
           |  |  | 87 |   | 
        
           |  |  | 88 |         $contextids = provider::get_contexts_for_userid($u5->id)->get_contextids();
 | 
        
           |  |  | 89 |         $this->assertCount(1, $contextids);
 | 
        
           |  |  | 90 |         $this->assertTrue(in_array($u5ctx->id, $contextids));
 | 
        
           |  |  | 91 |     }
 | 
        
           |  |  | 92 |   | 
        
           |  |  | 93 |     /**
 | 
        
           |  |  | 94 |      * Test delete_data_for_user
 | 
        
           |  |  | 95 |      *
 | 
        
           |  |  | 96 |      * @covers \core_external\privacy\provider::delete_data_for_user
 | 
        
           |  |  | 97 |      */
 | 
        
           |  |  | 98 |     public function test_delete_data_for_user(): void {
 | 
        
           |  |  | 99 |         global $DB;
 | 
        
           |  |  | 100 |   | 
        
           |  |  | 101 |         $dg = $this->getDataGenerator();
 | 
        
           |  |  | 102 |         $u1 = $dg->create_user();
 | 
        
           |  |  | 103 |         $u2 = $dg->create_user();
 | 
        
           |  |  | 104 |         $u1ctx = \context_user::instance($u1->id);
 | 
        
           |  |  | 105 |         $u2ctx = \context_user::instance($u2->id);
 | 
        
           |  |  | 106 |   | 
        
           |  |  | 107 |         $s = $this->create_service();
 | 
        
           |  |  | 108 |         $this->create_token(['userid' => $u1->id, 'creatorid' => $u2->id]);
 | 
        
           |  |  | 109 |         $this->create_token(['userid' => $u1->id]);
 | 
        
           |  |  | 110 |         $this->create_token(['userid' => $u2->id]);
 | 
        
           |  |  | 111 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u1->id]);
 | 
        
           |  |  | 112 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u2->id]);
 | 
        
           |  |  | 113 |   | 
        
           |  |  | 114 |         $this->assertEquals(2, $DB->count_records('external_tokens', ['userid' => $u1->id]));
 | 
        
           |  |  | 115 |         $this->assertEquals(1, $DB->count_records('external_tokens', ['userid' => $u2->id]));
 | 
        
           |  |  | 116 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u1->id]));
 | 
        
           |  |  | 117 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u2->id]));
 | 
        
           |  |  | 118 |   | 
        
           |  |  | 119 |         // Delete in another context, nothing happens.
 | 
        
           |  |  | 120 |         provider::delete_data_for_user(new approved_contextlist($u2, 'core_external', [$u1ctx->id]));
 | 
        
           |  |  | 121 |         $this->assertEquals(2, $DB->count_records('external_tokens', ['userid' => $u1->id]));
 | 
        
           |  |  | 122 |         $this->assertEquals(1, $DB->count_records('external_tokens', ['userid' => $u2->id]));
 | 
        
           |  |  | 123 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u1->id]));
 | 
        
           |  |  | 124 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u2->id]));
 | 
        
           |  |  | 125 |   | 
        
           |  |  | 126 |         // Delete in my context.
 | 
        
           |  |  | 127 |         provider::delete_data_for_user(new approved_contextlist($u2, 'core_external', [$u2ctx->id]));
 | 
        
           |  |  | 128 |         $this->assertEquals(2, $DB->count_records('external_tokens', ['userid' => $u1->id]));
 | 
        
           |  |  | 129 |         $this->assertEquals(0, $DB->count_records('external_tokens', ['userid' => $u2->id]));
 | 
        
           |  |  | 130 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u1->id]));
 | 
        
           |  |  | 131 |         $this->assertFalse($DB->record_exists('external_services_users', ['userid' => $u2->id]));
 | 
        
           |  |  | 132 |     }
 | 
        
           |  |  | 133 |   | 
        
           |  |  | 134 |     /**
 | 
        
           |  |  | 135 |      * Test delete_data_for_all_users_in_context
 | 
        
           |  |  | 136 |      *
 | 
        
           |  |  | 137 |      * @covers \core_external\privacy\provider::delete_data_for_all_users_in_context
 | 
        
           |  |  | 138 |      */
 | 
        
           | 11 | efrain | 139 |     public function test_delete_data_for_all_users_in_context(): void {
 | 
        
           | 1 | efrain | 140 |         global $DB;
 | 
        
           |  |  | 141 |   | 
        
           |  |  | 142 |         $dg = $this->getDataGenerator();
 | 
        
           |  |  | 143 |         $u1 = $dg->create_user();
 | 
        
           |  |  | 144 |         $u2 = $dg->create_user();
 | 
        
           |  |  | 145 |         $u1ctx = \context_user::instance($u1->id);
 | 
        
           |  |  | 146 |         $u2ctx = \context_user::instance($u2->id);
 | 
        
           |  |  | 147 |   | 
        
           |  |  | 148 |         $s = $this->create_service();
 | 
        
           |  |  | 149 |         $this->create_token(['userid' => $u1->id, 'creatorid' => $u2->id]);
 | 
        
           |  |  | 150 |         $this->create_token(['userid' => $u1->id]);
 | 
        
           |  |  | 151 |         $this->create_token(['userid' => $u2->id]);
 | 
        
           |  |  | 152 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u1->id]);
 | 
        
           |  |  | 153 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u2->id]);
 | 
        
           |  |  | 154 |   | 
        
           |  |  | 155 |         $this->assertEquals(2, $DB->count_records('external_tokens', ['userid' => $u1->id]));
 | 
        
           |  |  | 156 |         $this->assertEquals(1, $DB->count_records('external_tokens', ['userid' => $u2->id]));
 | 
        
           |  |  | 157 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u1->id]));
 | 
        
           |  |  | 158 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u2->id]));
 | 
        
           |  |  | 159 |   | 
        
           |  |  | 160 |         provider::delete_data_for_all_users_in_context($u2ctx);
 | 
        
           |  |  | 161 |         $this->assertEquals(2, $DB->count_records('external_tokens', ['userid' => $u1->id]));
 | 
        
           |  |  | 162 |         $this->assertEquals(0, $DB->count_records('external_tokens', ['userid' => $u2->id]));
 | 
        
           |  |  | 163 |         $this->assertTrue($DB->record_exists('external_services_users', ['userid' => $u1->id]));
 | 
        
           |  |  | 164 |         $this->assertFalse($DB->record_exists('external_services_users', ['userid' => $u2->id]));
 | 
        
           |  |  | 165 |   | 
        
           |  |  | 166 |         provider::delete_data_for_all_users_in_context($u1ctx);
 | 
        
           |  |  | 167 |         $this->assertEquals(0, $DB->count_records('external_tokens', ['userid' => $u1->id]));
 | 
        
           |  |  | 168 |         $this->assertEquals(0, $DB->count_records('external_tokens', ['userid' => $u2->id]));
 | 
        
           |  |  | 169 |         $this->assertFalse($DB->record_exists('external_services_users', ['userid' => $u1->id]));
 | 
        
           |  |  | 170 |         $this->assertFalse($DB->record_exists('external_services_users', ['userid' => $u2->id]));
 | 
        
           |  |  | 171 |   | 
        
           |  |  | 172 |     }
 | 
        
           |  |  | 173 |   | 
        
           |  |  | 174 |     /**
 | 
        
           |  |  | 175 |      * Test the export_user_data function.
 | 
        
           |  |  | 176 |      * @covers \core_external\privacy\provider::export_user_data
 | 
        
           |  |  | 177 |      */
 | 
        
           | 11 | efrain | 178 |     public function test_export_data_for_user(): void {
 | 
        
           | 1 | efrain | 179 |         global $DB;
 | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 |         $dg = $this->getDataGenerator();
 | 
        
           |  |  | 182 |         $u1 = $dg->create_user();
 | 
        
           |  |  | 183 |         $u2 = $dg->create_user();
 | 
        
           |  |  | 184 |         $u1ctx = \context_user::instance($u1->id);
 | 
        
           |  |  | 185 |         $u2ctx = \context_user::instance($u2->id);
 | 
        
           |  |  | 186 |   | 
        
           |  |  | 187 |         $path = [get_string('services', 'core_external')];
 | 
        
           |  |  | 188 |         $yearago = time() - YEARSECS;
 | 
        
           |  |  | 189 |         $hourago = time() - HOURSECS;
 | 
        
           |  |  | 190 |   | 
        
           |  |  | 191 |         $s = $this->create_service(['name' => 'Party time!']);
 | 
        
           |  |  | 192 |         $this->create_token(['userid' => $u1->id, 'timecreated' => $yearago]);
 | 
        
           |  |  | 193 |         $this->create_token([
 | 
        
           |  |  | 194 |             'userid' => $u1->id,
 | 
        
           |  |  | 195 |             'creatorid' => $u2->id,
 | 
        
           |  |  | 196 |             'iprestriction' => '127.0.0.1',
 | 
        
           |  |  | 197 |             'lastaccess' => $hourago,
 | 
        
           |  |  | 198 |         ]);
 | 
        
           |  |  | 199 |         $this->create_token([
 | 
        
           |  |  | 200 |             'userid' => $u2->id,
 | 
        
           |  |  | 201 |             'iprestriction' => '192.168.1.0/24',
 | 
        
           |  |  | 202 |             'lastaccess' => $yearago,
 | 
        
           |  |  | 203 |             'externalserviceid' => $s->id,
 | 
        
           |  |  | 204 |         ]);
 | 
        
           |  |  | 205 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u2->id]);
 | 
        
           |  |  | 206 |   | 
        
           |  |  | 207 |         // User 1 exporting user 2 context does not give anything.
 | 
        
           |  |  | 208 |         writer::reset();
 | 
        
           |  |  | 209 |         provider::export_user_data(new approved_contextlist($u1, 'core_external', [$u2ctx->id]));
 | 
        
           |  |  | 210 |         $data = writer::with_context($u1ctx)->get_data($path);
 | 
        
           |  |  | 211 |         $this->assertEmpty($data);
 | 
        
           |  |  | 212 |         $data = writer::with_context($u1ctx)->get_related_data($path, 'created_by_you');
 | 
        
           |  |  | 213 |         $this->assertEmpty($data);
 | 
        
           |  |  | 214 |         $data = writer::with_context($u2ctx)->get_data($path);
 | 
        
           |  |  | 215 |         $this->assertEmpty($data);
 | 
        
           |  |  | 216 |         $data = writer::with_context($u2ctx)->get_related_data($path, 'created_by_you');
 | 
        
           |  |  | 217 |         $this->assertEmpty($data);
 | 
        
           |  |  | 218 |   | 
        
           |  |  | 219 |         // User 1 exporting their context.
 | 
        
           |  |  | 220 |         writer::reset();
 | 
        
           |  |  | 221 |         provider::export_user_data(new approved_contextlist($u1, 'core_external', [$u1ctx->id, $u2ctx->id]));
 | 
        
           |  |  | 222 |         $data = writer::with_context($u1ctx)->get_data($path);
 | 
        
           |  |  | 223 |         $this->assertFalse(isset($data->services_user));
 | 
        
           |  |  | 224 |         $this->assertCount(2, $data->tokens);
 | 
        
           |  |  | 225 |         $this->assertEquals(transform::datetime($yearago), $data->tokens[0]['created_on']);
 | 
        
           |  |  | 226 |         $this->assertEquals(null, $data->tokens[0]['ip_restriction']);
 | 
        
           |  |  | 227 |         $this->assertEquals(transform::datetime($hourago), $data->tokens[1]['last_access']);
 | 
        
           |  |  | 228 |         $this->assertEquals('127.0.0.1', $data->tokens[1]['ip_restriction']);
 | 
        
           |  |  | 229 |         $data = writer::with_context($u1ctx)->get_related_data($path, 'created_by_you');
 | 
        
           |  |  | 230 |         $this->assertEmpty($data);
 | 
        
           |  |  | 231 |         $data = writer::with_context($u2ctx)->get_data($path);
 | 
        
           |  |  | 232 |         $this->assertEmpty($data);
 | 
        
           |  |  | 233 |         $data = writer::with_context($u2ctx)->get_related_data($path, 'created_by_you');
 | 
        
           |  |  | 234 |         $this->assertEmpty($data);
 | 
        
           |  |  | 235 |   | 
        
           |  |  | 236 |         // User 2 exporting their context.
 | 
        
           |  |  | 237 |         writer::reset();
 | 
        
           |  |  | 238 |         provider::export_user_data(new approved_contextlist($u2, 'core_external', [$u1ctx->id, $u2ctx->id]));
 | 
        
           |  |  | 239 |         $data = writer::with_context($u2ctx)->get_data($path);
 | 
        
           |  |  | 240 |         $this->assertCount(1, $data->tokens);
 | 
        
           |  |  | 241 |         $this->assertEquals('Party time!', $data->tokens[0]['external_service']);
 | 
        
           |  |  | 242 |         $this->assertEquals(transform::datetime($yearago), $data->tokens[0]['last_access']);
 | 
        
           |  |  | 243 |         $this->assertEquals('192.168.1.0/24', $data->tokens[0]['ip_restriction']);
 | 
        
           |  |  | 244 |         $this->assertCount(1, $data->services_user);
 | 
        
           |  |  | 245 |         $this->assertEquals('Party time!', $data->services_user[0]['external_service']);
 | 
        
           |  |  | 246 |         $data = writer::with_context($u1ctx)->get_related_data($path, 'created_by_you');
 | 
        
           |  |  | 247 |         $this->assertCount(1, $data->tokens);
 | 
        
           |  |  | 248 |         $this->assertEquals(transform::datetime($hourago), $data->tokens[0]['last_access']);
 | 
        
           |  |  | 249 |         $this->assertEquals('127.0.0.1', $data->tokens[0]['ip_restriction']);
 | 
        
           |  |  | 250 |         $data = writer::with_context($u1ctx)->get_data($path);
 | 
        
           |  |  | 251 |         $this->assertEmpty($data);
 | 
        
           |  |  | 252 |         $data = writer::with_context($u2ctx)->get_related_data($path, 'created_by_you');
 | 
        
           |  |  | 253 |         $this->assertEmpty($data);
 | 
        
           |  |  | 254 |     }
 | 
        
           |  |  | 255 |   | 
        
           |  |  | 256 |     /**
 | 
        
           |  |  | 257 |      * Test that only users with a user context are fetched.
 | 
        
           |  |  | 258 |      *
 | 
        
           |  |  | 259 |      * @covers \core_external\privacy\provider::get_users_in_context
 | 
        
           |  |  | 260 |      */
 | 
        
           | 11 | efrain | 261 |     public function test_get_users_in_context(): void {
 | 
        
           | 1 | efrain | 262 |   | 
        
           |  |  | 263 |         $component = 'core_external';
 | 
        
           |  |  | 264 |         // Create user u1.
 | 
        
           |  |  | 265 |         $u1 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 266 |         $u1ctx = \context_user::instance($u1->id);
 | 
        
           |  |  | 267 |         // Create user u2.
 | 
        
           |  |  | 268 |         $u2 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 269 |         $u2ctx = \context_user::instance($u2->id);
 | 
        
           |  |  | 270 |         // Create user u3.
 | 
        
           |  |  | 271 |         $u3 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 272 |         $u3ctx = \context_user::instance($u3->id);
 | 
        
           |  |  | 273 |         // Create user u4.
 | 
        
           |  |  | 274 |         $u4 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 275 |         $u4ctx = \context_user::instance($u4->id);
 | 
        
           |  |  | 276 |         // Create user u5.
 | 
        
           |  |  | 277 |         $u5 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 278 |         $u5ctx = \context_user::instance($u5->id);
 | 
        
           |  |  | 279 |   | 
        
           |  |  | 280 |         // The lists of users for each user context ($u1ctx, $u2ctx, etc.) should be empty.
 | 
        
           |  |  | 281 |         // Related user data have not been created yet.
 | 
        
           |  |  | 282 |         $userlist1 = new \core_privacy\local\request\userlist($u1ctx, $component);
 | 
        
           |  |  | 283 |         provider::get_users_in_context($userlist1);
 | 
        
           |  |  | 284 |         $this->assertCount(0, $userlist1);
 | 
        
           |  |  | 285 |         $userlist2 = new \core_privacy\local\request\userlist($u2ctx, $component);
 | 
        
           |  |  | 286 |         provider::get_users_in_context($userlist2);
 | 
        
           |  |  | 287 |         $this->assertCount(0, $userlist2);
 | 
        
           |  |  | 288 |         $userlist3 = new \core_privacy\local\request\userlist($u3ctx, $component);
 | 
        
           |  |  | 289 |         provider::get_users_in_context($userlist3);
 | 
        
           |  |  | 290 |         $this->assertCount(0, $userlist3);
 | 
        
           |  |  | 291 |         $userlist4 = new \core_privacy\local\request\userlist($u4ctx, $component);
 | 
        
           |  |  | 292 |         provider::get_users_in_context($userlist4);
 | 
        
           |  |  | 293 |         $this->assertCount(0, $userlist4);
 | 
        
           |  |  | 294 |         $userlist5 = new \core_privacy\local\request\userlist($u5ctx, $component);
 | 
        
           |  |  | 295 |         provider::get_users_in_context($userlist5);
 | 
        
           |  |  | 296 |         $this->assertCount(0, $userlist5);
 | 
        
           |  |  | 297 |   | 
        
           |  |  | 298 |         // Create a service.
 | 
        
           |  |  | 299 |         $s = $this->create_service();
 | 
        
           |  |  | 300 |         // Create a ws token for u1.
 | 
        
           |  |  | 301 |         $this->create_token(['userid' => $u1->id]);
 | 
        
           |  |  | 302 |         // Create a ws token for u2, and u3 as the creator of the token.
 | 
        
           |  |  | 303 |         $this->create_token(['userid' => $u2->id, 'creatorid' => $u3->id]);
 | 
        
           |  |  | 304 |         // Create a service user (u4).
 | 
        
           |  |  | 305 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u4->id]);
 | 
        
           |  |  | 306 |   | 
        
           |  |  | 307 |         // The list of users for userlist1 should return one user (u1).
 | 
        
           |  |  | 308 |         provider::get_users_in_context($userlist1);
 | 
        
           |  |  | 309 |         $this->assertCount(1, $userlist1);
 | 
        
           |  |  | 310 |         $expected = [$u1->id];
 | 
        
           |  |  | 311 |         $actual = $userlist1->get_userids();
 | 
        
           |  |  | 312 |         $this->assertEquals($expected, $actual);
 | 
        
           |  |  | 313 |         // The list of users for userlist2 should return one user (u2).
 | 
        
           |  |  | 314 |         provider::get_users_in_context($userlist2);
 | 
        
           |  |  | 315 |         $this->assertCount(1, $userlist2);
 | 
        
           |  |  | 316 |         $expected = [$u2->id];
 | 
        
           |  |  | 317 |         $actual = $userlist2->get_userids();
 | 
        
           |  |  | 318 |         $this->assertEquals($expected, $actual);
 | 
        
           |  |  | 319 |         // The list of users for userlist3 should return one user (u3).
 | 
        
           |  |  | 320 |         provider::get_users_in_context($userlist3);
 | 
        
           |  |  | 321 |         $this->assertCount(1, $userlist3);
 | 
        
           |  |  | 322 |         $expected = [$u3->id];
 | 
        
           |  |  | 323 |         $actual = $userlist3->get_userids();
 | 
        
           |  |  | 324 |         $this->assertEquals($expected, $actual);
 | 
        
           |  |  | 325 |         // The list of users for userlist4 should return one user (u4).
 | 
        
           |  |  | 326 |         provider::get_users_in_context($userlist4);
 | 
        
           |  |  | 327 |         $this->assertCount(1, $userlist4);
 | 
        
           |  |  | 328 |         $expected = [$u4->id];
 | 
        
           |  |  | 329 |         $actual = $userlist4->get_userids();
 | 
        
           |  |  | 330 |         $this->assertEquals($expected, $actual);
 | 
        
           |  |  | 331 |         // The list of users for userlist5 should not return any users.
 | 
        
           |  |  | 332 |         provider::get_users_in_context($userlist5);
 | 
        
           |  |  | 333 |         $this->assertCount(0, $userlist5);
 | 
        
           |  |  | 334 |   | 
        
           |  |  | 335 |         // The list of users should only return users in the user context.
 | 
        
           |  |  | 336 |         $systemcontext = \context_system::instance();
 | 
        
           |  |  | 337 |         $userlist6 = new \core_privacy\local\request\userlist($systemcontext, $component);
 | 
        
           |  |  | 338 |         provider::get_users_in_context($userlist6);
 | 
        
           |  |  | 339 |         $this->assertCount(0, $userlist6);
 | 
        
           |  |  | 340 |     }
 | 
        
           |  |  | 341 |   | 
        
           |  |  | 342 |     /**
 | 
        
           |  |  | 343 |      * Test that data for users in approved userlist is deleted.
 | 
        
           |  |  | 344 |      *
 | 
        
           |  |  | 345 |      * @covers \core_external\privacy\provider::delete_data_for_users
 | 
        
           |  |  | 346 |      */
 | 
        
           | 11 | efrain | 347 |     public function test_delete_data_for_users(): void {
 | 
        
           | 1 | efrain | 348 |   | 
        
           |  |  | 349 |         $component = 'core_external';
 | 
        
           |  |  | 350 |         // Create user u1.
 | 
        
           |  |  | 351 |         $u1 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 352 |         $u1ctx = \context_user::instance($u1->id);
 | 
        
           |  |  | 353 |         // Create user u2.
 | 
        
           |  |  | 354 |         $u2 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 355 |         $u2ctx = \context_user::instance($u2->id);
 | 
        
           |  |  | 356 |         // Create user u3.
 | 
        
           |  |  | 357 |         $u3 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 358 |         $u3ctx = \context_user::instance($u3->id);
 | 
        
           |  |  | 359 |         // Create user u4.
 | 
        
           |  |  | 360 |         $u4 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 361 |         $u4ctx = \context_user::instance($u4->id);
 | 
        
           |  |  | 362 |         // Create user u5.
 | 
        
           |  |  | 363 |         $u5 = $this->getDataGenerator()->create_user();
 | 
        
           |  |  | 364 |         $u5ctx = \context_user::instance($u5->id);
 | 
        
           |  |  | 365 |   | 
        
           |  |  | 366 |         // Create a service.
 | 
        
           |  |  | 367 |         $s = $this->create_service();
 | 
        
           |  |  | 368 |         // Create a ws token for u1.
 | 
        
           |  |  | 369 |         $this->create_token(['userid' => $u1->id]);
 | 
        
           |  |  | 370 |         // Create a ws token for u2, and u3 as the creator of the token.
 | 
        
           |  |  | 371 |         $this->create_token(['userid' => $u2->id, 'creatorid' => $u3->id]);
 | 
        
           |  |  | 372 |         // Create a service user (u4).
 | 
        
           |  |  | 373 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u4->id]);
 | 
        
           |  |  | 374 |         // Create a service user (u5).
 | 
        
           |  |  | 375 |         $this->create_service_user(['externalserviceid' => $s->id, 'userid' => $u5->id]);
 | 
        
           |  |  | 376 |   | 
        
           |  |  | 377 |         // The list of users for u1ctx should return one user (u1).
 | 
        
           |  |  | 378 |         $userlist1 = new \core_privacy\local\request\userlist($u1ctx, $component);
 | 
        
           |  |  | 379 |         provider::get_users_in_context($userlist1);
 | 
        
           |  |  | 380 |         $this->assertCount(1, $userlist1);
 | 
        
           |  |  | 381 |         // The list of users for u2ctx should return one user (u2).
 | 
        
           |  |  | 382 |         $userlist2 = new \core_privacy\local\request\userlist($u2ctx, $component);
 | 
        
           |  |  | 383 |         provider::get_users_in_context($userlist2);
 | 
        
           |  |  | 384 |         $this->assertCount(1, $userlist2);
 | 
        
           |  |  | 385 |         // The list of users for u3ctx should return one user (u3).
 | 
        
           |  |  | 386 |         $userlist3 = new \core_privacy\local\request\userlist($u3ctx, $component);
 | 
        
           |  |  | 387 |         provider::get_users_in_context($userlist3);
 | 
        
           |  |  | 388 |         $this->assertCount(1, $userlist3);
 | 
        
           |  |  | 389 |         // The list of users for u4ctx should return one user (u4).
 | 
        
           |  |  | 390 |         $userlist4 = new \core_privacy\local\request\userlist($u4ctx, $component);
 | 
        
           |  |  | 391 |         provider::get_users_in_context($userlist4);
 | 
        
           |  |  | 392 |         $this->assertCount(1, $userlist4);
 | 
        
           |  |  | 393 |   | 
        
           |  |  | 394 |         $approvedlist = new approved_userlist($u1ctx, $component, $userlist1->get_userids());
 | 
        
           |  |  | 395 |         // Delete using delete_data_for_user.
 | 
        
           |  |  | 396 |         provider::delete_data_for_users($approvedlist);
 | 
        
           |  |  | 397 |         // Re-fetch users in u1ctx - the user data should now be empty.
 | 
        
           |  |  | 398 |         $userlist1 = new \core_privacy\local\request\userlist($u1ctx, $component);
 | 
        
           |  |  | 399 |         provider::get_users_in_context($userlist1);
 | 
        
           |  |  | 400 |         $this->assertCount(0, $userlist1);
 | 
        
           |  |  | 401 |   | 
        
           |  |  | 402 |         $approvedlist = new approved_userlist($u2ctx, $component, $userlist2->get_userids());
 | 
        
           |  |  | 403 |         // Delete using delete_data_for_user.
 | 
        
           |  |  | 404 |         provider::delete_data_for_users($approvedlist);
 | 
        
           |  |  | 405 |         // Re-fetch users in u2ctx - the user data should now be empty.
 | 
        
           |  |  | 406 |         $userlist2 = new \core_privacy\local\request\userlist($u2ctx, $component);
 | 
        
           |  |  | 407 |         provider::get_users_in_context($userlist2);
 | 
        
           |  |  | 408 |         $this->assertCount(0, $userlist2);
 | 
        
           |  |  | 409 |   | 
        
           |  |  | 410 |         $approvedlist = new approved_userlist($u3ctx, $component, $userlist3->get_userids());
 | 
        
           |  |  | 411 |         // Delete using delete_data_for_user.
 | 
        
           |  |  | 412 |         provider::delete_data_for_users($approvedlist);
 | 
        
           |  |  | 413 |         // Re-fetch users in u3ctx - the user data should now be empty.
 | 
        
           |  |  | 414 |         $userlist3 = new \core_privacy\local\request\userlist($u3ctx, $component);
 | 
        
           |  |  | 415 |         provider::get_users_in_context($userlist3);
 | 
        
           |  |  | 416 |         $this->assertCount(0, $userlist3);
 | 
        
           |  |  | 417 |   | 
        
           |  |  | 418 |         $approvedlist = new approved_userlist($u4ctx, $component, $userlist3->get_userids());
 | 
        
           |  |  | 419 |         // Delete using delete_data_for_user.
 | 
        
           |  |  | 420 |         provider::delete_data_for_users($approvedlist);
 | 
        
           |  |  | 421 |         // Re-fetch users in u4ctx - the user data should now be empty.
 | 
        
           |  |  | 422 |         $userlist4 = new \core_privacy\local\request\userlist($u4ctx, $component);
 | 
        
           |  |  | 423 |         provider::get_users_in_context($userlist4);
 | 
        
           |  |  | 424 |         $this->assertCount(0, $userlist4);
 | 
        
           |  |  | 425 |   | 
        
           |  |  | 426 |         // The list of users for u5ctx should still return one user (u5).
 | 
        
           |  |  | 427 |         $userlist5 = new \core_privacy\local\request\userlist($u5ctx, $component);
 | 
        
           |  |  | 428 |         provider::get_users_in_context($userlist5);
 | 
        
           |  |  | 429 |         $this->assertCount(1, $userlist5);
 | 
        
           |  |  | 430 |   | 
        
           |  |  | 431 |         // User data should only be removed in the user context.
 | 
        
           |  |  | 432 |         $systemcontext = \context_system::instance();
 | 
        
           |  |  | 433 |         $approvedlist = new approved_userlist($systemcontext, $component, $userlist5->get_userids());
 | 
        
           |  |  | 434 |         // Delete using delete_data_for_user.
 | 
        
           |  |  | 435 |         provider::delete_data_for_users($approvedlist);
 | 
        
           |  |  | 436 |         // Re-fetch users in u5ctx - the user data should still be present.
 | 
        
           |  |  | 437 |         $userlist5 = new \core_privacy\local\request\userlist($u5ctx, $component);
 | 
        
           |  |  | 438 |         provider::get_users_in_context($userlist5);
 | 
        
           |  |  | 439 |         $this->assertCount(1, $userlist5);
 | 
        
           |  |  | 440 |     }
 | 
        
           |  |  | 441 |   | 
        
           |  |  | 442 |     /**
 | 
        
           |  |  | 443 |      * Create a service.
 | 
        
           |  |  | 444 |      *
 | 
        
           |  |  | 445 |      * @param array $params The params.
 | 
        
           |  |  | 446 |      * @return \stdClass
 | 
        
           |  |  | 447 |      */
 | 
        
           |  |  | 448 |     protected function create_service(array $params = []) {
 | 
        
           |  |  | 449 |         global $DB;
 | 
        
           |  |  | 450 |         static $i = 0;
 | 
        
           |  |  | 451 |         $record = (object) array_merge([
 | 
        
           |  |  | 452 |             'name' => 'Some service',
 | 
        
           |  |  | 453 |             'enabled' => '1',
 | 
        
           |  |  | 454 |             'requiredcapability' => '',
 | 
        
           |  |  | 455 |             'restrictedusers' => '0',
 | 
        
           |  |  | 456 |             'component' => 'core_external',
 | 
        
           |  |  | 457 |             'timecreated' => time(),
 | 
        
           |  |  | 458 |             'timemodified' => time(),
 | 
        
           |  |  | 459 |             'shortname' => 'service' . $i,
 | 
        
           |  |  | 460 |             'downloadfiles' => '1',
 | 
        
           |  |  | 461 |             'uploadfiles' => '1',
 | 
        
           |  |  | 462 |         ], $params);
 | 
        
           |  |  | 463 |         $record->id = $DB->insert_record('external_services', $record);
 | 
        
           |  |  | 464 |         return $record;
 | 
        
           |  |  | 465 |     }
 | 
        
           |  |  | 466 |   | 
        
           |  |  | 467 |     /**
 | 
        
           |  |  | 468 |      * Create a service user.
 | 
        
           |  |  | 469 |      *
 | 
        
           |  |  | 470 |      * @param array $params The params.
 | 
        
           |  |  | 471 |      * @return \stdClass
 | 
        
           |  |  | 472 |      */
 | 
        
           |  |  | 473 |     protected function create_service_user(array $params) {
 | 
        
           |  |  | 474 |         global $DB, $USER;
 | 
        
           |  |  | 475 |         static $i = 0;
 | 
        
           |  |  | 476 |         $record = (object) array_merge([
 | 
        
           |  |  | 477 |             'externalserviceid' => null,
 | 
        
           |  |  | 478 |             'userid' => $USER->id,
 | 
        
           |  |  | 479 |             'validuntil' => time() + YEARSECS,
 | 
        
           |  |  | 480 |             'iprestriction' => '',
 | 
        
           |  |  | 481 |             'timecreated' => time(),
 | 
        
           |  |  | 482 |         ], $params);
 | 
        
           |  |  | 483 |         $record->id = $DB->insert_record('external_services_users', $record);
 | 
        
           |  |  | 484 |         return $record;
 | 
        
           |  |  | 485 |     }
 | 
        
           |  |  | 486 |   | 
        
           |  |  | 487 |     /**
 | 
        
           |  |  | 488 |      * Create a token.
 | 
        
           |  |  | 489 |      *
 | 
        
           |  |  | 490 |      * @param array $params The params.
 | 
        
           |  |  | 491 |      * @return stdClass
 | 
        
           |  |  | 492 |      */
 | 
        
           |  |  | 493 |     protected function create_token(array $params) {
 | 
        
           |  |  | 494 |         global $DB, $USER;
 | 
        
           |  |  | 495 |         $service = $DB->get_record('external_services', ['shortname' => MOODLE_OFFICIAL_MOBILE_SERVICE]);
 | 
        
           |  |  | 496 |         $record = (object) array_merge([
 | 
        
           |  |  | 497 |             'token' => random_string(64),
 | 
        
           |  |  | 498 |             'privatetoken' => random_string(64),
 | 
        
           |  |  | 499 |             'tokentype' => EXTERNAL_TOKEN_PERMANENT,
 | 
        
           |  |  | 500 |             'contextid' => SYSCONTEXTID,
 | 
        
           |  |  | 501 |             'externalserviceid' => $service->id,
 | 
        
           |  |  | 502 |             'userid' => $USER->id,
 | 
        
           |  |  | 503 |             'validuntil' => time() + YEARSECS,
 | 
        
           |  |  | 504 |             'iprestriction' => null,
 | 
        
           |  |  | 505 |             'sid' => null,
 | 
        
           |  |  | 506 |             'timecreated' => time(),
 | 
        
           |  |  | 507 |             'lastaccess' => time(),
 | 
        
           |  |  | 508 |             'creatorid' => $USER->id,
 | 
        
           |  |  | 509 |         ], $params);
 | 
        
           |  |  | 510 |         $record->id = $DB->insert_record('external_tokens', $record);
 | 
        
           |  |  | 511 |         return $record;
 | 
        
           |  |  | 512 |     }
 | 
        
           |  |  | 513 | }
 |