From ea9c822fc3ddd0e9d945add401f7976783e2c765 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Wed, 16 Sep 2020 18:41:47 +0200 Subject: [PATCH] MDL-68845 calendar: Move duplicated code to function --- calendar/export.php | 3 +-- calendar/export_execute.php | 4 ++-- calendar/lib.php | 17 ++++++++++++++--- calendar/tests/lib_test.php | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/calendar/export.php b/calendar/export.php index 89ca1e0b401..687f9cfbf40 100644 --- a/calendar/export.php +++ b/calendar/export.php @@ -141,10 +141,9 @@ $formdata = array( $exportform = new core_calendar_export_form(null, $formdata); $calendarurl = ''; if ($data = $exportform->get_data()) { - $password = $DB->get_record('user', array('id' => $USER->id), 'password'); $params = array(); $params['userid'] = $USER->id; - $params['authtoken'] = sha1($USER->id . (isset($password->password) ? $password->password : '') . $CFG->calendar_exportsalt); + $params['authtoken'] = calendar_get_export_token($USER); $params['preset_what'] = $data->events['exportevents']; $params['preset_time'] = $data->period['timeperiod']; diff --git a/calendar/export_execute.php b/calendar/export_execute.php index a06f3286cc6..66c348e522f 100644 --- a/calendar/export_execute.php +++ b/calendar/export_execute.php @@ -24,7 +24,7 @@ if (!$checkuserid && !$checkusername) { } //Check authentication token -$authuserid = !empty($userid) && $authtoken == sha1($userid . $user->password . $CFG->calendar_exportsalt); +$authuserid = !empty($userid) && $authtoken == calendar_get_export_token($user); //allowing for fallback check of old url - MDL-27542 $authusername = !empty($username) && $authtoken == sha1($username . $user->password . $CFG->calendar_exportsalt); if (!$authuserid && !$authusername) { @@ -44,7 +44,7 @@ $allowedwhat = ['all', 'user', 'groups', 'courses', 'categories']; $allowedtime = ['weeknow', 'weeknext', 'monthnow', 'monthnext', 'recentupcoming', 'custom']; if (!empty($generateurl)) { - $authtoken = sha1($user->id . $user->password . $CFG->calendar_exportsalt); + $authtoken = calendar_get_export_token($user); $params = array(); $params['preset_what'] = $what; $params['preset_time'] = $time; diff --git a/calendar/lib.php b/calendar/lib.php index 9755765b13a..59fc79655bb 100644 --- a/calendar/lib.php +++ b/calendar/lib.php @@ -3667,11 +3667,10 @@ function calendar_get_timestamp($d, $m, $y, $time = 0) { * @return array The data for template and template name. */ function calendar_get_footer_options($calendar) { - global $CFG, $USER, $DB, $PAGE; + global $CFG, $USER, $PAGE; // Generate hash for iCal link. - $rawhash = $USER->id . $DB->get_field('user', 'password', ['id' => $USER->id]) . $CFG->calendar_exportsalt; - $authtoken = sha1($rawhash); + $authtoken = calendar_get_export_token($USER); $renderer = $PAGE->get_renderer('core_calendar'); $footer = new \core_calendar\external\footer_options_exporter($calendar, $USER->id, $authtoken); @@ -3905,3 +3904,15 @@ function calendar_internal_update_course_and_group_permission(int $courseid, con } } } + +/** + * Get the auth token for exporting the given user calendar. + * @param stdClass $user The user to export the calendar for + * + * @return string The export token. + */ +function calendar_get_export_token(stdClass $user): string { + global $CFG, $DB; + + return sha1($user->id . $DB->get_field('user', 'password', ['id' => $user->id]) . $CFG->calendar_exportsalt); +} diff --git a/calendar/tests/lib_test.php b/calendar/tests/lib_test.php index 94a3cb4c9f4..4467337ce95 100644 --- a/calendar/tests/lib_test.php +++ b/calendar/tests/lib_test.php @@ -963,4 +963,36 @@ class core_calendar_lib_testcase extends advanced_testcase { // Viewing as someone not enrolled in a course with guest access on. $this->assertTrue(calendar_view_event_allowed($caleventguest)); } + + /** + * Test for calendar_get_export_token for current user. + */ + public function test_calendar_get_export_token_for_current_user() { + global $USER, $DB, $CFG; + + $this->setAdminUser(); + + // Get my token. + $authtoken = calendar_get_export_token($USER); + $expected = sha1($USER->id . $DB->get_field('user', 'password', ['id' => $USER->id]) . $CFG->calendar_exportsalt); + + $this->assertEquals($expected, $authtoken); + } + + /** + * Test for calendar_get_export_token for another user. + */ + public function test_calendar_get_export_token_for_another_user() { + global $CFG; + + // Get any user token. + $generator = $this->getDataGenerator(); + $user = $generator->create_user(); + + // Get other user token. + $authtoken = calendar_get_export_token($user); + $expected = sha1($user->id . $user->password . $CFG->calendar_exportsalt); + + $this->assertEquals($expected, $authtoken); + } }