Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.
   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   * Privacy class for requesting user data.
  18   *
  19   * @package    tool_monitor
  20   * @copyright  2018 Adrian Greeve <adrian@moodle.com>
  21   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  22   */
  23  namespace tool_monitor\privacy;
  24  
  25  defined('MOODLE_INTERNAL') || die();
  26  
  27  use \core_privacy\local\metadata\collection;
  28  use \core_privacy\local\request\contextlist;
  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\userlist;
  33  use \core_privacy\local\request\writer;
  34  use \tool_monitor\subscription_manager;
  35  use \tool_monitor\rule_manager;
  36  
  37  /**
  38   * Privacy provider for tool_monitor
  39   *
  40   * @package    tool_monitor
  41   * @copyright  2018 Adrian Greeve <adrian@moodle.com>
  42   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  43   */
  44  class provider implements
  45          \core_privacy\local\metadata\provider,
  46          \core_privacy\local\request\core_userlist_provider,
  47          \core_privacy\local\request\plugin\provider {
  48  
  49      /**
  50       * Get information about the user data stored by this plugin.
  51       *
  52       * @param  collection $collection An object for storing metadata.
  53       * @return collection The metadata.
  54       */
  55      public static function get_metadata(collection $collection) : collection {
  56          $toolmonitorrules = [
  57              'description' => 'privacy:metadata:description',
  58              'name' => 'privacy:metadata:name',
  59              'userid' => 'privacy:metadata:userid',
  60              'plugin' => 'privacy:metadata:plugin',
  61              'eventname' => 'privacy:metadata:eventname',
  62              'template' => 'privacy:metadata:template',
  63              'frequency' => 'privacy:metadata:frequency',
  64              'timewindow' => 'privacy:metadata:timewindow',
  65              'timemodified' => 'privacy:metadata:timemodifiedrule',
  66              'timecreated' => 'privacy:metadata:timecreatedrule'
  67          ];
  68          $toolmonitorsubscriptions = [
  69              'userid' => 'privacy:metadata:useridsub',
  70              'timecreated' => 'privacy:metadata:timecreatedsub',
  71              'lastnotificationsent' => 'privacy:metadata:lastnotificationsent',
  72              'inactivedate' => 'privacy:metadata:inactivedate'
  73          ];
  74          // Tool monitor history doesn't look like it is used at all.
  75          $toolmonitorhistory = [
  76              'userid' => 'privacy:metadata:useridhistory',
  77              'timesent' => 'privacy:metadata:timesent'
  78          ];
  79          $collection->add_database_table('tool_monitor_rules', $toolmonitorrules, 'privacy:metadata:rulessummary');
  80          $collection->add_database_table('tool_monitor_subscriptions', $toolmonitorsubscriptions,
  81                  'privacy:metadata:subscriptionssummary');
  82          $collection->add_database_table('tool_monitor_history', $toolmonitorhistory, 'privacy:metadata:historysummary');
  83          $collection->link_subsystem('core_message', 'privacy:metadata:messagesummary');
  84          return $collection;
  85      }
  86  
  87      /**
  88       * Return all contexts for this userid. In this situation the user context.
  89       *
  90       * @param  int $userid The user ID.
  91       * @return contextlist The list of context IDs.
  92       */
  93      public static function get_contexts_for_userid(int $userid) : contextlist {
  94          $params = ['useridrules' => $userid, 'useridsubscriptions' => $userid, 'contextuserrule' => CONTEXT_USER,
  95                  'contextusersub' => CONTEXT_USER];
  96          $sql = "SELECT DISTINCT ctx.id
  97                    FROM {context} ctx
  98               LEFT JOIN {tool_monitor_rules} mr ON ctx.instanceid = mr.userid AND ctx.contextlevel = :contextuserrule
  99                         AND mr.userid = :useridsubscriptions
 100               LEFT JOIN {tool_monitor_subscriptions} ms ON ctx.instanceid = ms.userid AND ctx.contextlevel = :contextusersub
 101                         AND ms.userid = :useridrules
 102                   WHERE ms.id IS NOT NULL OR mr.id IS NOT NULL";
 103  
 104          $contextlist = new contextlist();
 105          $contextlist->add_from_sql($sql, $params);
 106          return $contextlist;
 107      }
 108  
 109      /**
 110       * Get the list of users who have data within a context.
 111       *
 112       * @param   userlist    $userlist   The userlist containing the list of users who have data in this context/plugin combination.
 113       */
 114      public static function get_users_in_context(userlist $userlist) {
 115          $context = $userlist->get_context();
 116  
 117          if (!$context instanceof \context_user) {
 118              return;
 119          }
 120  
 121          $params = ['userid' => $context->instanceid];
 122  
 123          $sql = "SELECT userid FROM {tool_monitor_rules} WHERE userid = :userid";
 124          $userlist->add_from_sql('userid', $sql, $params);
 125  
 126          $sql = "SELECT userid FROM {tool_monitor_subscriptions} WHERE userid = :userid";
 127          $userlist->add_from_sql('userid', $sql, $params);
 128      }
 129  
 130      /**
 131       * Export all event monitor information for the list of contexts and this user.
 132       *
 133       * @param  approved_contextlist $contextlist The list of approved contexts for a user.
 134       */
 135      public static function export_user_data(approved_contextlist $contextlist) {
 136          global $DB;
 137          // Export rules.
 138          $context = \context_user::instance($contextlist->get_user()->id);
 139          $rules = $DB->get_records('tool_monitor_rules', ['userid' => $contextlist->get_user()->id]);
 140          if ($rules) {
 141              static::export_monitor_rules($rules, $context);
 142          }
 143          // Export subscriptions.
 144          $subscriptions = subscription_manager::get_user_subscriptions(0, 0, $contextlist->get_user()->id);
 145          if ($subscriptions) {
 146              static::export_monitor_subscriptions($subscriptions, $context);
 147          }
 148      }
 149  
 150      /**
 151       * Delete all user data for this context.
 152       *
 153       * @param  \context $context The context to delete data for.
 154       */
 155      public static function delete_data_for_all_users_in_context(\context $context) {
 156          // Only delete data for user contexts.
 157          if ($context->contextlevel == CONTEXT_USER) {
 158              static::delete_user_data($context->instanceid);
 159          }
 160      }
 161  
 162      /**
 163       * Delete all user data for this user only.
 164       *
 165       * @param  approved_contextlist $contextlist The list of approved contexts for a user.
 166       */
 167      public static function delete_data_for_user(approved_contextlist $contextlist) {
 168          static::delete_user_data($contextlist->get_user()->id);
 169      }
 170  
 171      /**
 172       * Delete multiple users within a single context.
 173       *
 174       * @param   approved_userlist       $userlist The approved context and user information to delete information for.
 175       */
 176      public static function delete_data_for_users(approved_userlist $userlist) {
 177          $context = $userlist->get_context();
 178          $userids = $userlist->get_userids();
 179          $userid = reset($userids);
 180  
 181          // Only delete data for user context, which should be a single user.
 182          if ($context->contextlevel == CONTEXT_USER && count($userids) == 1 && $userid == $context->instanceid) {
 183              static::delete_user_data($userid);
 184          }
 185      }
 186  
 187      /**
 188       * This does the deletion of user data for the event monitor.
 189       *
 190       * @param  int $userid The user ID
 191       */
 192      protected static function delete_user_data(int $userid) {
 193          global $DB;
 194          // Delete this user's subscriptions first.
 195          subscription_manager::delete_user_subscriptions($userid);
 196          // Because we only use user contexts the instance ID is the user ID.
 197          // Get the rules and check if this user has the capability to delete them.
 198          $rules = $DB->get_records('tool_monitor_rules', ['userid' => $userid]);
 199          foreach ($rules as $ruledata) {
 200              $rule = rule_manager::get_rule($ruledata);
 201              // If no-one is suscribed to the rule then it is safe to delete.
 202              if ($rule->can_manage_rule($userid) && subscription_manager::count_rule_subscriptions($rule->id) == 0) {
 203                  $rule->delete_rule();
 204              }
 205          }
 206      }
 207  
 208      /**
 209       * This formats and then exports the monitor rules.
 210       *
 211       * @param  array $rules The monitor rules.
 212       * @param  context_user $context The user context
 213       */
 214      protected static function export_monitor_rules(array $rules, \context_user $context) {
 215          foreach ($rules as $rule) {
 216              $rule = rule_manager::get_rule($rule);
 217              $ruledata = new \stdClass();
 218              $ruledata->name = $rule->name;
 219              $ruledata->eventname = $rule->get_event_name();
 220              $ruledata->description = $rule->get_description($context);
 221              $ruledata->plugin = $rule->get_plugin_name();
 222              $ruledata->template = $rule->template;
 223              $ruledata->frequency = $rule->get_filters_description();
 224              $ruledata->course = $rule->get_course_name($context);
 225              $ruledata->timecreated = transform::datetime($rule->timecreated);
 226              $ruledata->timemodified = transform::datetime($rule->timemodified);
 227              writer::with_context($context)->export_data([get_string('privacy:createdrules', 'tool_monitor'),
 228                      $rule->name . '_' . $rule->id], $ruledata);
 229          }
 230      }
 231  
 232      /**
 233       * This formats and then exports the event monitor subscriptions.
 234       *
 235       * @param  array $subscriptions Subscriptions
 236       * @param  \context_user $context The user context
 237       */
 238      protected static function export_monitor_subscriptions(array $subscriptions, \context_user $context) {
 239          foreach ($subscriptions as $subscription) {
 240              $subscriptiondata = new \stdClass();
 241              $subscriptiondata->instancename = $subscription->get_instance_name();
 242              $subscriptiondata->eventname = $subscription->get_event_name();
 243              $subscriptiondata->frequency = $subscription->get_filters_description();
 244              $subscriptiondata->name = $subscription->get_name($context);
 245              $subscriptiondata->description = $subscription->get_description($context);
 246              $subscriptiondata->pluginname = $subscription->get_plugin_name();
 247              $subscriptiondata->course = $subscription->get_course_name($context);
 248              $subscriptiondata->timecreated = transform::datetime($subscription->timecreated);
 249              $subscriptiondata->lastnotificationsent = transform::datetime($subscription->lastnotificationsent);
 250              writer::with_context($context)->export_data([get_string('privacy:subscriptions', 'tool_monitor'),
 251                      $subscriptiondata->name . '_' . $subscription->id, $subscriptiondata->course, $subscriptiondata->instancename],
 252                      $subscriptiondata);
 253          }
 254      }
 255  }