Merge branch 'MDL-62135-master' of git://github.com/FMCorz/moodle
[moodle.git] / admin / tool / log / classes / local / privacy / helper.php
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/>.
17 /**
18  * Privacy helper.
19  *
20  * @package    tool_log
21  * @copyright  2018 Frédéric Massart
22  * @author     Frédéric Massart <fred@branchup.tech>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 namespace tool_log\local\privacy;
27 defined('MOODLE_INTERNAL') || die();
29 use core_privacy\local\request\transform;
31 /**
32  * Privacy helper class.
33  *
34  * @package    tool_log
35  * @copyright  2018 Frédéric Massart
36  * @author     Frédéric Massart <fred@branchup.tech>
37  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class helper {
41     /**
42      * Returns an event from a standard record.
43      *
44      * @see \logstore_standard\log\store::get_log_event()
45      * @param object $data Log data.
46      * @return \core\event\base
47      */
48     protected static function restore_event_from_standard_record($data) {
49         $extra = ['origin' => $data->origin, 'ip' => $data->ip, 'realuserid' => $data->realuserid];
50         $data = (array) $data;
51         $id = $data['id'];
52         $data['other'] = unserialize($data['other']);
53         if ($data['other'] === false) {
54             $data['other'] = [];
55         }
56         unset($data['origin']);
57         unset($data['ip']);
58         unset($data['realuserid']);
59         unset($data['id']);
61         if (!$event = \core\event\base::restore($data, $extra)) {
62             return null;
63         }
65         return $event;
66     }
68     /**
69      * Transform a standard log record for a user.
70      *
71      * @param object $record The record.
72      * @param int $userid The user ID.
73      * @return array
74      */
75     public static function transform_standard_log_record_for_userid($record, $userid) {
77         // Restore the event to try to get the name, description and other field.
78         $restoredevent = static::restore_event_from_standard_record($record);
79         if ($restoredevent) {
80             $name = $restoredevent->get_name();
81             $description = $restoredevent->get_description();
82             $other = $restoredevent->other;
84         } else {
85             $name = $record->eventname;
86             $description = "Unknown event ({$name})";
87             $other = unserialize($record->other);
88         }
90         $realuserid = $record->realuserid;
91         $isauthor = $record->userid == $userid;
92         $isrelated = $record->relateduserid == $userid;
93         $isrealuser = $realuserid == $userid;
94         $ismasqueraded = $realuserid !== null && $record->userid != $realuserid;
95         $ismasquerading = $isrealuser && !$isauthor;
96         $isanonymous = $record->anonymous;
98         $data = [
99             'name' => $name,
100             'description' => $description,
101             'timecreated' => transform::datetime($record->timecreated),
102             'ip' => $record->ip,
103             'origin' => static::transform_origin($record->origin),
104             'other' => $other ? $other : []
105         ];
107         if ($isanonymous) {
108             $data['action_was_done_anonymously'] = transform::yesno($isanonymous);
109         }
110         if ($isauthor || !$isanonymous) {
111             $data['authorid'] = transform::user($record->userid);
112             $data['author_of_the_action_was_you'] = transform::yesno($isauthor);
113         }
115         if ($record->relateduserid) {
116             $data['relateduserid'] = transform::user($record->relateduserid);
117             $data['related_user_was_you'] = transform::yesno($isrelated);
118         }
120         if ($ismasqueraded) {
121             $data['author_of_the_action_was_masqueraded'] = transform::yesno(true);
122             if ($ismasquerading || !$isanonymous) {
123                 $data['masqueradinguserid'] = transform::user($realuserid);
124                 $data['masquerading_user_was_you'] = transform::yesno($ismasquerading);
125             }
126         }
128         return $data;
129     }
131     /**
132      * Transform origin.
133      *
134      * @param string $origin The page request origin.
135      * @return string
136      */
137     public static function transform_origin($origin) {
138         switch ($origin) {
139             case 'cli':
140             case 'restore':
141             case 'web':
142             case 'ws':
143                 return get_string('privacy:request:origin:' . $origin, 'tool_log');
144                 break;
145         }
146         return $origin;
147     }