From 19ca0aaa6b3a7eec74f105288e563aab239222df Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Tue, 20 Mar 2018 15:20:22 +0800 Subject: [PATCH] MDL-61692 core_privacy: add privacyfields to link_ methods Some subsystems are like conduits, passing data along to plugins which, in turn, send the data externally. Only the component linking to (using) the subsystem will know what data it is sending along to the eventual external system, so should be able to specify this at the time of linking. The same goes for plugintypes. --- privacy/classes/local/metadata/collection.php | 59 +++++++++++++++++-- .../local/metadata/types/plugintype_link.php | 10 +++- .../local/metadata/types/subsystem_link.php | 11 +++- privacy/tests/collection_test.php | 6 +- privacy/tests/types_plugintype_link_test.php | 15 +++-- privacy/tests/types_subsystem_link_test.php | 15 +++-- 6 files changed, 92 insertions(+), 24 deletions(-) diff --git a/privacy/classes/local/metadata/collection.php b/privacy/classes/local/metadata/collection.php index f82a92d50ee..0e7668ede3f 100644 --- a/privacy/classes/local/metadata/collection.php +++ b/privacy/classes/local/metadata/collection.php @@ -86,12 +86,28 @@ class collection { /** * Function to link a subsystem to the component. * - * @param string $name the name of the subsystem to link. - * @param string $summary A description of what is stored within this subsystem. + * @param string $name the name of the subsystem to link. + * @param array $privacyfields An optional associative array of fieldname to description. + * @param string $summary A description of what is stored within this subsystem. + * @return $this + */ + public function add_subsystem_link($name, array $privacyfields = [], $summary = '') { + $this->add_type(new types\subsystem_link($name, $privacyfields, $summary)); + + return $this; + } + + /** + * Old function to link a subsystem to the component. + * + * This function is legacy and is not recommended. Please use add_subsystem_link() instead. + * + * @param string $name the name of the subsystem to link. + * @param string $summary A description of what is stored within this subsystem. * @return $this */ public function link_subsystem($name, $summary = '') { - $this->add_type(new types\subsystem_link($name, $summary)); + $this->add_type(new types\subsystem_link($name, [], $summary)); return $this; } @@ -100,11 +116,27 @@ class collection { * Function to link a plugin to the component. * * @param string $name the name of the plugin to link. - * @param string $summary A description of what tis stored within this plugin. + * @param array $privacyfields An optional associative array of fieldname to description. + * @param string $summary A description of what is stored within this plugin. + * @return $this + */ + public function add_plugintype_link($name, array $privacyfields = [], $summary = '') { + $this->add_type(new types\plugintype_link($name, $privacyfields, $summary)); + + return $this; + } + + /** + * Old function to link a plugin to the component. + * + * This function is legacy and is not recommended. Please use add_plugintype_link() instead. + * + * @param string $name the name of the plugin to link. + * @param string $summary A description of what is stored within this plugin. * @return $this */ public function link_plugintype($name, $summary = '') { - $this->add_type(new types\plugintype_link($name, $summary)); + $this->add_type(new types\plugintype_link($name, [], $summary)); return $this; } @@ -118,6 +150,23 @@ class collection { * within the component. * @return $this */ + public function add_external_location_link($name, array $privacyfields, $summary = '') { + $this->add_type(new types\external_location($name, $privacyfields, $summary)); + + return $this; + } + + /** + * Old function to indicate that data may be exported to an external location. + * + * This function is legacy and is not recommended. Please use add_external_location_link() instead. + * + * @param string $name A name for the type of data exported. + * @param array $privacyfields A list of fields with their description. + * @param string $summary A description of what the table is used for. This is a language string identifier + * within the component. + * @return $this + */ public function link_external_location($name, array $privacyfields, $summary = '') { $this->add_type(new types\external_location($name, $privacyfields, $summary)); diff --git a/privacy/classes/local/metadata/types/plugintype_link.php b/privacy/classes/local/metadata/types/plugintype_link.php index 54b29cf3ee1..08e3b94c8cc 100644 --- a/privacy/classes/local/metadata/types/plugintype_link.php +++ b/privacy/classes/local/metadata/types/plugintype_link.php @@ -38,6 +38,11 @@ class plugintype_link implements type { */ protected $name; + /** + * @var array The list of data names and descriptions. + */ + protected $privacyfields; + /** * @var string A description of what this plugintype is used to store. */ @@ -49,7 +54,7 @@ class plugintype_link implements type { * @param string $name The name of the plugintype to link. * @param string $summary A description of what is stored within this plugintype. */ - public function __construct($name, $summary = '') { + public function __construct($name, $privacyfields = [], $summary = '') { if (debugging('', DEBUG_DEVELOPER)) { $teststring = clean_param($summary, PARAM_STRINGID); if ($teststring !== $summary) { @@ -60,6 +65,7 @@ class plugintype_link implements type { } $this->name = $name; + $this->privacyfields = $privacyfields; $this->summary = $summary; } @@ -78,7 +84,7 @@ class plugintype_link implements type { * @return array */ public function get_privacy_fields() : array { - return null; + return $this->privacyfields; } /** diff --git a/privacy/classes/local/metadata/types/subsystem_link.php b/privacy/classes/local/metadata/types/subsystem_link.php index 88eedb57d2d..05e5a3a5fcb 100644 --- a/privacy/classes/local/metadata/types/subsystem_link.php +++ b/privacy/classes/local/metadata/types/subsystem_link.php @@ -38,6 +38,11 @@ class subsystem_link implements type { */ protected $name; + /** + * @var array The list of data names and descriptions. + */ + protected $privacyfields; + /** * @var string A description of what this subsystem is used to store. */ @@ -47,9 +52,10 @@ class subsystem_link implements type { * Constructor for the subsystem_link. * * @param string $name The name of the subsystem to link. + * @param array $privacyfields An optional array of fields and their descriptions. * @param string $summary A description of what is stored within this subsystem. */ - public function __construct($name, $summary = '') { + public function __construct($name, array $privacyfields = [], $summary = '') { if (debugging('', DEBUG_DEVELOPER)) { $teststring = clean_param($summary, PARAM_STRINGID); if ($teststring !== $summary) { @@ -60,6 +66,7 @@ class subsystem_link implements type { } $this->name = $name; + $this->privacyfields = $privacyfields; $this->summary = $summary; } @@ -78,7 +85,7 @@ class subsystem_link implements type { * @return array */ public function get_privacy_fields() : array { - return null; + return $this->privacyfields; } /** diff --git a/privacy/tests/collection_test.php b/privacy/tests/collection_test.php index f8a324d7214..3835175c0aa 100644 --- a/privacy/tests/collection_test.php +++ b/privacy/tests/collection_test.php @@ -60,7 +60,7 @@ class core_privacy_metadata_collection extends advanced_testcase { public function test_add_type_known_type() { $collection = new collection('core_privacy'); - $linked = new types\subsystem_link('example', 'langstring'); + $linked = new types\subsystem_link('example', [], 'langstring'); $collection->add_type($linked); $items = $collection->get_collection(); @@ -74,10 +74,10 @@ class core_privacy_metadata_collection extends advanced_testcase { public function test_add_type_multiple() { $collection = new collection('core_privacy'); - $a = new types\subsystem_link('example', 'langstring'); + $a = new types\subsystem_link('example', [], 'langstring'); $collection->add_type($a); - $b = new types\subsystem_link('example', 'langstring'); + $b = new types\subsystem_link('example', [], 'langstring'); $collection->add_type($b); $items = $collection->get_collection(); diff --git a/privacy/tests/types_plugintype_link_test.php b/privacy/tests/types_plugintype_link_test.php index fcb43bf21ad..82e30524895 100644 --- a/privacy/tests/types_plugintype_link_test.php +++ b/privacy/tests/types_plugintype_link_test.php @@ -44,8 +44,8 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase { * @param string $name Name * @param string $summary Summary */ - public function test_invalid_configs($name, $summary) { - $record = new plugintype_link($name, $summary); + public function test_invalid_configs($name, $privacyfields, $summary) { + $record = new plugintype_link($name, $privacyfields, $summary); $this->assertDebuggingCalled(); } @@ -56,12 +56,12 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase { * @param string $name Name * @param string $summary Summary */ - public function test_invalid_configs_debug_normal($name, $summary) { + public function test_invalid_configs_debug_normal($name, $privacyfields, $summary) { global $CFG; $this->resetAfterTest(); $CFG->debug = DEBUG_NORMAL; - $record = new plugintype_link($name, $summary); + $record = new plugintype_link($name, $privacyfields, $summary); $this->assertDebuggingNotCalled(); } @@ -72,8 +72,8 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase { * @param string $name Name * @param string $summary Summary */ - public function test_valid_configs($name, $summary) { - $record = new plugintype_link($name, $summary); + public function test_valid_configs($name, $privacyfields, $summary) { + $record = new plugintype_link($name, $privacyfields, $summary); $this->assertDebuggingNotCalled(); } @@ -86,10 +86,12 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase { return [ 'Space in summary' => [ 'example', + [], 'This table is used for purposes.', ], 'Comma in summary' => [ 'example', + [], 'privacy,foo', ], ]; @@ -104,6 +106,7 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase { return [ 'Valid combination' => [ 'example', + [], 'privacy:example:valid', ], ]; diff --git a/privacy/tests/types_subsystem_link_test.php b/privacy/tests/types_subsystem_link_test.php index 9a6438d70b9..780aa793a90 100644 --- a/privacy/tests/types_subsystem_link_test.php +++ b/privacy/tests/types_subsystem_link_test.php @@ -44,8 +44,8 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase { * @param string $name Name * @param string $summary Summary */ - public function test_invalid_configs($name, $summary) { - $record = new subsystem_link($name, $summary); + public function test_invalid_configs($name, $privacyfields, $summary) { + $record = new subsystem_link($name, $privacyfields, $summary); $this->assertDebuggingCalled(); } @@ -56,12 +56,12 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase { * @param string $name Name * @param string $summary Summary */ - public function test_invalid_configs_debug_normal($name, $summary) { + public function test_invalid_configs_debug_normal($name, $privacyfields, $summary) { global $CFG; $this->resetAfterTest(); $CFG->debug = DEBUG_NORMAL; - $record = new subsystem_link($name, $summary); + $record = new subsystem_link($name, $privacyfields, $summary); $this->assertDebuggingNotCalled(); } @@ -72,8 +72,8 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase { * @param string $name Name * @param string $summary Summary */ - public function test_valid_configs($name, $summary) { - $record = new subsystem_link($name, $summary); + public function test_valid_configs($name, $privacyfields, $summary) { + $record = new subsystem_link($name, $privacyfields, $summary); $this->assertDebuggingNotCalled(); } @@ -86,10 +86,12 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase { return [ 'Space in summary' => [ 'example', + [], 'This table is used for purposes.', ], 'Comma in summary' => [ 'example', + [], 'privacy,foo', ], ]; @@ -104,6 +106,7 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase { return [ 'Valid combination' => [ 'example', + [], 'privacy:example:valid', ], ];