MDL-63867 tool_dataprivacy: Add site purpose checks to tasks
authorMichael Hawkins <michaelh@moodle.com>
Wed, 7 Nov 2018 14:19:49 +0000 (22:19 +0800)
committerMichael Hawkins <michaelh@moodle.com>
Fri, 9 Nov 2018 07:20:12 +0000 (15:20 +0800)
If a site purpose is not defined, requests cannot be processed.

admin/tool/dataprivacy/classes/task/process_data_request_task.php
admin/tool/dataprivacy/tests/behat/datadelete.feature
admin/tool/dataprivacy/tests/behat/dataexport.feature
admin/tool/dataprivacy/tests/expired_data_requests_test.php

index c44b661..8b6350a 100644 (file)
@@ -74,6 +74,13 @@ class process_data_request_task extends adhoc_task {
             return;
         }
 
+        // If no site purpose is defined, reject requests since they cannot be processed.
+        if (!\tool_dataprivacy\data_registry::defaults_set()) {
+            api::update_request_status($requestid, api::DATAREQUEST_STATUS_REJECTED);
+            mtrace('No site purpose defined. Request ' . $requestid . ' rejected.');
+            return;
+        }
+
         // Get the user details now. We might not be able to retrieve it later if it's a deletion processing.
         $foruser = core_user::get_user($request->userid);
         $usercontext = \context_user::instance($foruser->id);
index 99daa14..7161f6a 100644 (file)
@@ -20,6 +20,13 @@ Feature: Data delete from the privacy API
       | parent | tired | User         | victim    |
     And the following config values are set as admin:
       | contactdataprotectionofficer | 1  | tool_dataprivacy |
+    And the following data privacy "categories" exist:
+      | name          |
+      | Site category |
+    And the following data privacy "purposes" exist:
+      | name         | retentionperiod |
+      | Site purpose | P10Y           |
+    And I set the site category and purpose to "Site category" and "Site purpose"
 
   @javascript
   Scenario: As admin, delete a user and their data
index b2a8235..e0ab984 100644 (file)
@@ -21,6 +21,13 @@ Feature: Data export from the privacy API
     And the following config values are set as admin:
       | contactdataprotectionofficer | 1  | tool_dataprivacy |
       | privacyrequestexpiry         | 55 | tool_dataprivacy |
+    And the following data privacy "categories" exist:
+      | name          |
+      | Site category |
+    And the following data privacy "purposes" exist:
+      | name         | retentionperiod |
+      | Site purpose | P10Y           |
+    And I set the site category and purpose to "Site category" and "Site purpose"
 
   @javascript
   Scenario: As admin, export data for a user and download it, unless it has expired
index 662d9ab..8a5c312 100644 (file)
@@ -23,7 +23,9 @@
  */
 
 use tool_dataprivacy\api;
+use tool_dataprivacy\category;
 use tool_dataprivacy\data_request;
+use tool_dataprivacy\purpose;
 
 defined('MOODLE_INTERNAL') || die();
 global $CFG;
@@ -62,6 +64,9 @@ class tool_dataprivacy_expired_data_requests_testcase extends data_privacy_testc
         $dpouser = $this->getDataGenerator()->create_user();
         $this->assign_site_dpo($dpouser);
 
+        // Set site purpose.
+        $this->create_system_purpose();
+
         // Set request expiry to 5 minutes.
         set_config('privacyrequestexpiry', 300, 'tool_dataprivacy');
 
@@ -130,6 +135,9 @@ class tool_dataprivacy_expired_data_requests_testcase extends data_privacy_testc
         $admin = get_admin();
         $this->setAdminUser();
 
+        // Set site purpose.
+        $this->create_system_purpose();
+
         // Create export request.
         $datarequest = api::create_data_request($admin->id, api::DATAREQUEST_TYPE_EXPORT);
         $requestid = $datarequest->get('id');
@@ -170,4 +178,28 @@ class tool_dataprivacy_expired_data_requests_testcase extends data_privacy_testc
         $result = data_request::is_expired($request);
         $this->assertTrue($result);
     }
+
+    /**
+     * Create a site (system context) purpose and category.
+     *
+     * @return  void
+     */
+    protected function create_system_purpose() {
+        $purpose = new purpose(0, (object) [
+            'name' => 'Test purpose ' . rand(1, 1000),
+            'retentionperiod' => 'P1D',
+            'lawfulbases' => 'gdpr_art_6_1_a',
+        ]);
+        $purpose->create();
+
+        $cat = new category(0, (object) ['name' => 'Test category']);
+        $cat->create();
+
+        $record = (object) [
+            'purposeid'     => $purpose->get('id'),
+            'categoryid'    => $cat->get('id'),
+            'contextlevel'  => CONTEXT_SYSTEM,
+        ];
+        api::set_contextlevel($record);
+    }
 }