mirror of
https://github.com/moodle/moodle.git
synced 2025-01-29 11:46:19 +01:00
MDL-62078 rss: Link to core_userkey in the Privacy API implementation
This commit is contained in:
parent
6fa694bef0
commit
b720d9dae8
@ -24,9 +24,6 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['privacy:metadata:user_private_key'] = 'Information about the user\'s access keys used in cookieless scripts, such as RSS.';
|
||||
$string['privacy:metadata:user_private_key:timecreated'] = 'The timestamp indicating when the key was created';
|
||||
$string['privacy:metadata:user_private_key:userid'] = 'The ID of the user which is associated to this key';
|
||||
$string['privacy:metadata:user_private_key:validuntil'] = 'The timestamp indicating when the key will expire';
|
||||
$string['privacy:metadata:user_private_key:value'] = 'The token used for getting the ID of the user';
|
||||
|
||||
$string['privacy:metadata:core_userkey'] = 'User\'s keys used to access RSS from a URL';
|
||||
$string['rss'] = 'RSS';
|
||||
|
@ -49,12 +49,8 @@ class provider implements
|
||||
* @return collection A listing of user data stored through this system.
|
||||
*/
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_database_table('user_private_key', [
|
||||
'value' => 'privacy:metadata:user_private_key:value',
|
||||
'userid' => 'privacy:metadata:user_private_key:userid',
|
||||
'validuntil' => 'privacy:metadata:user_private_key:validuntil',
|
||||
'timecreated' => 'privacy:metadata:user_private_key:timecreated'
|
||||
], 'privacy:metadata:user_private_key');
|
||||
$collection->add_subsystem_link('core_userkey', [], 'privacy:metadata:core_userkey');
|
||||
|
||||
return $collection;
|
||||
}
|
||||
|
||||
@ -84,25 +80,20 @@ class provider implements
|
||||
* @param approved_contextlist $contextlist The approved contexts to export information for.
|
||||
*/
|
||||
public static function export_user_data(approved_contextlist $contextlist) {
|
||||
$results = static::get_records($contextlist->get_user()->id);
|
||||
$context = $contextlist->current();
|
||||
if ($context->contextlevel == CONTEXT_USER) {
|
||||
foreach ($results as $result) {
|
||||
$context = \context_user::instance($result->userid);
|
||||
$subcontext = [
|
||||
get_string('rss', 'rss'),
|
||||
transform::user($result->userid)
|
||||
];
|
||||
$name = 'user_private_key-' . $result->id;
|
||||
$data = (object)[
|
||||
'value' => $result->value,
|
||||
'iprestriction' => $result->iprestriction,
|
||||
'validuntil' => $result->validuntil,
|
||||
'timecreated' => transform::datetime($result->timecreated),
|
||||
];
|
||||
writer::with_context($context)->export_related_data($subcontext, $name, $data);
|
||||
}
|
||||
// If the user has data, then only the CONTEXT_USER should be present so get the first context.
|
||||
$contexts = $contextlist->get_contexts();
|
||||
if (count($contexts) == 0) {
|
||||
return;
|
||||
}
|
||||
$context = reset($contexts);
|
||||
|
||||
// Sanity check that context is at the user context level, then get the userid.
|
||||
if ($context->contextlevel !== CONTEXT_USER) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Export associated userkeys.
|
||||
\core_userkey\privacy\provider::export_userkeys($context, [], 'rss');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -111,7 +102,15 @@ class provider implements
|
||||
* @param context $context A user context.
|
||||
*/
|
||||
public static function delete_data_for_all_users_in_context(\context $context) {
|
||||
// The information in user_private_key table is removed automaticaly when a user is deteled.
|
||||
// Sanity check that context is at the user context level, then get the userid.
|
||||
if ($context->contextlevel !== CONTEXT_USER) {
|
||||
return;
|
||||
}
|
||||
$userid = $context->instanceid;
|
||||
|
||||
// Delete all the userkeys.
|
||||
\core_userkey\privacy\provider::delete_userkeys('rss', $userid);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -120,18 +119,19 @@ class provider implements
|
||||
* @param approved_contextlist $contextlist The approved contexts and user information to delete information for.
|
||||
*/
|
||||
public static function delete_data_for_user(approved_contextlist $contextlist) {
|
||||
// The information in user_private_key table is removed automaticaly when a user is deteled.
|
||||
}
|
||||
// If the user has data, then only the user context should be present so get the first context.
|
||||
$contexts = $contextlist->get_contexts();
|
||||
if (count($contexts) == 0) {
|
||||
return;
|
||||
}
|
||||
$context = reset($contexts);
|
||||
|
||||
/**
|
||||
* Get records related to this plugin and user.
|
||||
*
|
||||
* @param int $userid The user ID
|
||||
* @return array An array of records.
|
||||
*/
|
||||
protected static function get_records(int $userid) : array {
|
||||
global $DB;
|
||||
|
||||
return $DB->get_records('user_private_key', ['userid' => $userid, 'script' => 'rss']);
|
||||
// Sanity check that context is at the user context level, then get the userid.
|
||||
if ($context->contextlevel !== CONTEXT_USER) {
|
||||
return;
|
||||
}
|
||||
$userid = $context->instanceid;
|
||||
// Delete all the userkeys.
|
||||
\core_userkey\privacy\provider::delete_userkeys('rss', $userid);
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
use \core_privacy\tests\provider_testcase;
|
||||
use \core_rss\privacy\provider;
|
||||
use \core_privacy\local\request\writer;
|
||||
use \core_privacy\local\request\approved_contextlist;
|
||||
|
||||
/**
|
||||
* Unit tests for rss\classes\privacy\provider.php
|
||||
@ -46,6 +47,7 @@ class core_rss_testcase extends provider_testcase {
|
||||
* Test getting the context for the user ID related to this plugin.
|
||||
*/
|
||||
public function test_get_contexts_for_userid() {
|
||||
// Create user and RSS user keys.
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
$context = \context_user::instance($user->id);
|
||||
$key = get_user_key('rss', $user->id);
|
||||
@ -60,15 +62,69 @@ class core_rss_testcase extends provider_testcase {
|
||||
public function test_export_user_data() {
|
||||
global $DB;
|
||||
|
||||
// Create user and RSS user keys.
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
$context = \context_user::instance($user->id);
|
||||
$keyvalue = get_user_key('rss', $user->id);
|
||||
$key = $DB->get_record('user_private_key', ['value' => $keyvalue]);
|
||||
|
||||
// Validate exported data.
|
||||
$this->setUser($user);
|
||||
$writer = writer::with_context($context);
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
$this->export_context_data_for_user($user->id, $context, 'core_rss');
|
||||
$data = $writer->get_related_data([get_string('rss', 'rss'), $user->id], 'user_private_key-' . $key->id);
|
||||
$this->assertEquals($key->value, $data->value);
|
||||
$userkeydata = $writer->get_related_data([], 'userkeys');
|
||||
$this->assertCount(1, $userkeydata->keys);
|
||||
$this->assertEquals($key->script, reset($userkeydata->keys)->script);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for provider::delete_data_for_all_users_in_context().
|
||||
*/
|
||||
public function test_delete_data_for_all_users_in_context() {
|
||||
global $DB;
|
||||
|
||||
// Create user and RSS user keys.
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
$context = \context_user::instance($user->id);
|
||||
$keyvalue = get_user_key('rss', $user->id);
|
||||
$key = $DB->get_record('user_private_key', ['value' => $keyvalue]);
|
||||
|
||||
// Before deletion, we should have 1 user_private_key.
|
||||
$count = $DB->count_records('user_private_key', ['script' => 'rss']);
|
||||
$this->assertEquals(1, $count);
|
||||
|
||||
// Delete data.
|
||||
provider::delete_data_for_all_users_in_context($context);
|
||||
|
||||
// After deletion, the user_private_key entries should have been deleted.
|
||||
$count = $DB->count_records('user_private_key', ['script' => 'rss']);
|
||||
$this->assertEquals(0, $count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for provider::delete_data_for_user().
|
||||
*/
|
||||
public function test_delete_data_for_user() {
|
||||
global $DB;
|
||||
|
||||
// Create user and RSS user keys.
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
$context = \context_user::instance($user->id);
|
||||
$keyvalue = get_user_key('rss', $user->id);
|
||||
$key = $DB->get_record('user_private_key', ['value' => $keyvalue]);
|
||||
|
||||
// Before deletion, we should have 1 user_private_key.
|
||||
$count = $DB->count_records('user_private_key', ['script' => 'rss']);
|
||||
$this->assertEquals(1, $count);
|
||||
|
||||
// Delete data.
|
||||
$contextlist = provider::get_contexts_for_userid($user->id);
|
||||
$approvedcontextlist = new approved_contextlist($user, 'rss', $contextlist->get_contextids());
|
||||
provider::delete_data_for_user($approvedcontextlist);
|
||||
|
||||
// After deletion, the user_private_key entries should have been deleted.
|
||||
$count = $DB->count_records('user_private_key', ['script' => 'rss']);
|
||||
$this->assertEquals(0, $count);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user