Merge branch 'MDL-38194-master' of git://github.com/sammarshallou/moodle
authorSam Hemelryk <sam@moodle.com>
Mon, 16 Sep 2013 01:56:05 +0000 (13:56 +1200)
committerSam Hemelryk <sam@moodle.com>
Mon, 16 Sep 2013 01:56:05 +0000 (13:56 +1200)
Conflicts:
lib/upgrade.txt

40 files changed:
auth/ldap/auth.php
auth/ldap/ntlmsso_magic.php
badges/criteria/award_criteria_activity.php
config-dist.php
course/lib.php
course/tests/courselib_test.php
enrol/self/lib.php
error/index.php
grade/report/grader/lib.php
lang/en/admin.php
lib/ajax/ajaxlib.php
lib/authlib.php
lib/badgeslib.php
lib/classes/user.php [new file with mode: 0644]
lib/classes/useragent.php
lib/cronlib.php
lib/deprecatedlib.php
lib/editor/tinymce/lib.php
lib/editor/tinymce/plugins/spellchecker/lib.php
lib/excellib.class.php
lib/filelib.php
lib/medialib.php
lib/messagelib.php
lib/moodlelib.php
lib/outputlib.php
lib/tests/user_test.php [new file with mode: 0644]
lib/tests/useragent_test.php
lib/upgrade.txt
message/index.php
message/lib.php
message/output/email/message_output_email.php
message/output/lib.php
message/upgrade.txt
mod/resource/locallib.php
mod/scorm/lib.php
mod/scorm/locallib.php
mod/scorm/player.php
repository/repository_ajax.php
theme/bootstrapbase/config.php
user/edit.php

index 1bad153..a435caa 100644 (file)
@@ -1645,7 +1645,7 @@ class auth_plugin_ldap extends auth_plugin_base {
             // Now start the whole NTLM machinery.
             if($this->config->ntlmsso_ie_fastpath == AUTH_NTLM_FASTPATH_YESATTEMPT ||
                 $this->config->ntlmsso_ie_fastpath == AUTH_NTLM_FASTPATH_YESFORM) {
-                if (core_useragent::check_ie_version()) {
+                if (core_useragent::is_ie()) {
                     $sesskey = sesskey();
                     redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_magic.php?sesskey='.$sesskey);
                 } else if ($this->config->ntlmsso_ie_fastpath == AUTH_NTLM_FASTPATH_YESFORM) {
index 2ac49a3..37228c1 100644 (file)
@@ -28,7 +28,7 @@ $file = $CFG->dirroot.'/pix/spacer.gif';
 
 if ($authplugin->ntlmsso_magic($sesskey) && file_exists($file)) {
     if (!empty($authplugin->config->ntlmsso_ie_fastpath)) {
-        if (core_useragent::check_ie_version()) {
+        if (core_useragent::is_ie()) {
             // $PAGE->https_required() up above takes care of what $CFG->httpswwwroot should be.
             redirect($CFG->httpswwwroot.'/auth/ldap/ntlmsso_finish.php');
         }
index 3a14e6b..ff9b92e 100644 (file)
@@ -120,7 +120,7 @@ class award_criteria_activity extends award_criteria {
         $course = $DB->get_record('course', array('id' => $this->courseid));
         $info = new completion_info($course);
         $mods = $info->get_activities();
-        $mids = array_map(create_function('$o', 'return $o->id;'), $mods);
+        $mids = array_keys($mods);
 
         if ($this->id !== 0) {
             $existing = array_keys($this->params);
index 0b2a9b1..1865166 100644 (file)
@@ -448,6 +448,14 @@ $CFG->admin = 'admin';
 // config.php file
 //      $CFG->preventexecpath = true;
 //
+// Use the following flag to set userid for noreply user. If not set then moodle will
+// create dummy user and use -ve value as user id.
+//      $CFG->noreplyuserid = -10;
+//
+// As of version 2.6 Moodle supports admin to set support user. If not set, all mails
+// will be sent to supportemail.
+//      $CFG->supportuserid = -20;
+//
 //=========================================================================
 // 7. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!!
 //=========================================================================
index 50494d5..4f96995 100644 (file)
@@ -2186,7 +2186,7 @@ function move_courses($courseids, $categoryid) {
     $i = 1;
 
     list($where, $params) = $DB->get_in_or_equal($courseids);
-    $dbcourses = $DB->get_records_select('course', 'id ' . $where, $params);
+    $dbcourses = $DB->get_records_select('course', 'id ' . $where, $params, '', 'id, category, shortname, fullname');
     foreach ($dbcourses as $dbcourse) {
         $course = new stdClass();
         $course->id = $dbcourse->id;
@@ -2200,28 +2200,19 @@ function move_courses($courseids, $categoryid) {
 
         $DB->update_record('course', $course);
 
-        // Store the context.
+        // Update context, so it can be passed to event.
         $context = context_course::instance($course->id);
-
-        // Update the course object we are passing to the event.
-        $dbcourse->category = $course->category;
-        $dbcourse->sortorder = $course->sortorder;
-        if (isset($course->visible)) {
-            $dbcourse->visible = $course->visible;
-        }
+        $context->update_moved($newparent);
 
         // Trigger a course updated event.
         $event = \core\event\course_updated::create(array(
             'objectid' => $course->id,
-            'context' => $context,
+            'context' => context_course::instance($course->id),
             'other' => array('shortname' => $dbcourse->shortname,
                              'fullname' => $dbcourse->fullname)
         ));
-        $event->add_record_snapshot('course', $dbcourse);
         $event->set_legacy_logdata(array($course->id, 'course', 'move', 'edit.php?id=' . $course->id, $course->id));
         $event->trigger();
-
-        $context->update_moved($newparent);
     }
     fix_course_sortorder();
     cache_helper::purge_by_event('changesincourse');
@@ -2474,7 +2465,6 @@ function create_course($data, $editoroptions = NULL) {
         'other' => array('shortname' => $course->shortname,
                          'fullname' => $course->fullname)
     ));
-    $event->add_record_snapshot('course', $course);
     $event->trigger();
 
     return $course;
@@ -2558,8 +2548,8 @@ function update_course($data, $editoroptions = NULL) {
         $newparent = context_coursecat::instance($course->category);
         $context->update_moved($newparent);
     }
-
-    if ($movecat || (isset($data->sortorder) && $oldcourse->sortorder != $data->sortorder)) {
+    $fixcoursesortorder = $movecat || (isset($data->sortorder) && ($oldcourse->sortorder != $data->sortorder));
+    if ($fixcoursesortorder) {
         fix_course_sortorder();
     }
 
@@ -2581,11 +2571,11 @@ function update_course($data, $editoroptions = NULL) {
     // Trigger a course updated event.
     $event = \core\event\course_updated::create(array(
         'objectid' => $course->id,
-        'context' => $context,
+        'context' => context_course::instance($course->id),
         'other' => array('shortname' => $course->shortname,
                          'fullname' => $course->fullname)
     ));
-    $event->add_record_snapshot('course', $course);
+
     $event->set_legacy_logdata(array($course->id, 'course', 'update', 'edit.php?id=' . $course->id, $course->id));
     $event->trigger();
 
index a890de2..1d4f2e6 100644 (file)
@@ -1390,6 +1390,8 @@ class core_course_courselib_testcase extends advanced_testcase {
      * Test that triggering a course_created event works as expected.
      */
     public function test_course_created_event() {
+        global $DB;
+
         $this->resetAfterTest();
 
         // Catch the events.
@@ -1397,6 +1399,8 @@ class core_course_courselib_testcase extends advanced_testcase {
 
         // Create the course.
         $course = $this->getDataGenerator()->create_course();
+        // Get course from DB for comparison.
+        $course = $DB->get_record('course', array('id' => $course->id));
 
         // Capture the event.
         $events = $sink->get_events();
@@ -1407,7 +1411,7 @@ class core_course_courselib_testcase extends advanced_testcase {
         $this->assertInstanceOf('\core\event\course_created', $event);
         $this->assertEquals('course', $event->objecttable);
         $this->assertEquals($course->id, $event->objectid);
-        $this->assertEquals(context_course::instance($course->id)->id, $event->contextid);
+        $this->assertEquals(context_course::instance($course->id), $event->get_context());
         $this->assertEquals($course, $event->get_record_snapshot('course', $course->id));
         $this->assertEquals('course_created', $event->get_legacy_eventname());
         $this->assertEventLegacyData($course, $event);
@@ -1432,69 +1436,60 @@ class core_course_courselib_testcase extends advanced_testcase {
         // Create a hidden category we are going to move this course to.
         $categoryhidden = $this->getDataGenerator()->create_category(array('visible' => 0));
 
-        // Catch the update events.
+        // Update course and catch course_updated event.
         $sink = $this->redirectEvents();
-
-        // Keep track of the old sortorder.
-        $sortorder = $course->sortorder;
-
-        // Call update_course which will trigger a course_updated event.
         update_course($course);
-
-        // Return the updated course information from the DB.
-        $updatedcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
-
-        // Now move the course to the category, this will also trigger an event.
-        move_courses(array($course->id), $category->id);
-
-        // Return the moved course information from the DB.
-        $movedcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
-
-        // Now move the course to the hidden category, this will also trigger an event.
-        move_courses(array($course->id), $categoryhidden->id);
-
-        // Return the moved course information from the DB.
-        $movedcoursehidden = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
-
-        // Now we want to set the sortorder back to what it was before fix_course_sortorder() was called. The reason for
-        // this is because update_course() and move_courses() call fix_course_sortorder() which alters the sort order in
-        // the DB, but it does not set the value of the sortorder for the course object passed to the event.
-        $updatedcourse->sortorder = $sortorder;
-        $movedcourse->sortorder = $category->sortorder + MAX_COURSES_IN_CATEGORY - 1;
-        $movedcoursehidden->sortorder = $categoryhidden->sortorder + MAX_COURSES_IN_CATEGORY - 1;
-
-        // Capture the events.
         $events = $sink->get_events();
         $sink->close();
 
-        // Validate the events.
-        $event = $events[0];
+        // Get updated course information from the DB.
+        $updatedcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
+        // Validate event.
+        $event = array_shift($events);
         $this->assertInstanceOf('\core\event\course_updated', $event);
         $this->assertEquals('course', $event->objecttable);
         $this->assertEquals($updatedcourse->id, $event->objectid);
-        $this->assertEquals(context_course::instance($updatedcourse->id)->id, $event->contextid);
-        $this->assertEquals($updatedcourse, $event->get_record_snapshot('course', $updatedcourse->id));
+        $this->assertEquals(context_course::instance($course->id), $event->get_context());
+        $this->assertEquals($updatedcourse, $event->get_record_snapshot('course', $event->objectid));
         $this->assertEquals('course_updated', $event->get_legacy_eventname());
         $this->assertEventLegacyData($updatedcourse, $event);
         $expectedlog = array($updatedcourse->id, 'course', 'update', 'edit.php?id=' . $course->id, $course->id);
         $this->assertEventLegacyLogData($expectedlog, $event);
 
-        $event = $events[1];
+        // Move course and catch course_updated event.
+        $sink = $this->redirectEvents();
+        move_courses(array($course->id), $category->id);
+        $events = $sink->get_events();
+        $sink->close();
+
+        // Return the moved course information from the DB.
+        $movedcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
+        // Validate event.
+        $event = array_shift($events);
         $this->assertInstanceOf('\core\event\course_updated', $event);
         $this->assertEquals('course', $event->objecttable);
         $this->assertEquals($movedcourse->id, $event->objectid);
-        $this->assertEquals(context_course::instance($movedcourse->id)->id, $event->contextid);
+        $this->assertEquals(context_course::instance($course->id), $event->get_context());
         $this->assertEquals($movedcourse, $event->get_record_snapshot('course', $movedcourse->id));
         $this->assertEquals('course_updated', $event->get_legacy_eventname());
         $this->assertEventLegacyData($movedcourse, $event);
         $expectedlog = array($movedcourse->id, 'course', 'move', 'edit.php?id=' . $movedcourse->id, $movedcourse->id);
         $this->assertEventLegacyLogData($expectedlog, $event);
 
-        $event = $events[2];
+        // Move course to hidden category and catch course_updated event.
+        $sink = $this->redirectEvents();
+        move_courses(array($course->id), $categoryhidden->id);
+        $events = $sink->get_events();
+        $sink->close();
+
+        // Return the moved course information from the DB.
+        $movedcoursehidden = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
+        // Validate event.
+        $event = array_shift($events);
         $this->assertInstanceOf('\core\event\course_updated', $event);
         $this->assertEquals('course', $event->objecttable);
         $this->assertEquals($movedcoursehidden->id, $event->objectid);
-        $this->assertEquals(context_course::instance($movedcoursehidden->id)->id, $event->contextid);
+        $this->assertEquals(context_course::instance($course->id), $event->get_context());
         $this->assertEquals($movedcoursehidden, $event->get_record_snapshot('course', $movedcoursehidden->id));
         $this->assertEquals('course_updated', $event->get_legacy_eventname());
         $this->assertEventLegacyData($movedcoursehidden, $event);
index 9b0fa48..22d2f74 100644 (file)
@@ -433,7 +433,7 @@ class enrol_self_plugin extends enrol_plugin {
         if ($rusers) {
             $contact = reset($rusers);
         } else {
-            $contact = generate_email_supportuser();
+            $contact = core_user::get_support_user();
         }
 
         // Directly emailing welcome message rather than using messaging.
index aac240a..54f0b53 100644 (file)
@@ -3,32 +3,19 @@
     require('../config.php');
     require_once($CFG->libdir.'/eventslib.php');
 
-    if ($form = data_submitted()) { // form submitted, do not check referer (original page unknown)!
-
-    /// Only deal with real users
+    // Form submitted, do not check referer (original page unknown).
+    if ($form = data_submitted()) {
+        // Only deal with real users.
         if (!isloggedin()) {
             redirect($CFG->wwwroot);
         }
 
-    /// Work out who to send the message to
-        if (!$admin = get_admin() ) {
-            print_error('cannotfindadmin', 'debug');
-        }
-
-        $supportuser = new stdClass();
-        $supportuser->email = $CFG->supportemail ? $CFG->supportemail : $admin->email;
-        $supportuser->firstname = $CFG->supportname ? $CFG->supportname : $admin->firstname;
-        $supportuser->lastname = $CFG->supportname ? '' : $admin->lastname;
-        // emailstop could be hard coded "false" to ensure error reports are sent
-        // but then admin's would have to alter their messaging preferences to temporarily stop them
-        $supportuser->emailstop = $admin->emailstop;
-        $supportuser->maildisplay = true;
-
-    /// Send the message and redirect
+        // Send the message and redirect.
         $eventdata = new stdClass();
-        $eventdata->modulename        = 'moodle';
+        $eventdata->component        = 'moodle';
+        $eventdata->name             = 'errors';
         $eventdata->userfrom          = $USER;
-        $eventdata->userto            = $supportuser;
+        $eventdata->userto            = core_user::get_support_user();
         $eventdata->subject           = 'Error: '. $form->referer .' -> '. $form->requested;
         $eventdata->fullmessage       = $form->text;
         $eventdata->fullmessageformat = FORMAT_PLAIN;
index d4804fc..a6dcf42 100644 (file)
@@ -1585,14 +1585,8 @@ class grade_report_grader extends grade_report {
      */
     public function is_fixed_students() {
         global $CFG;
-        return $CFG->grade_report_fixedstudents &&
-            (core_useragent::check_ie_version('7.0') ||
-             core_useragent::check_firefox_version('2.0') ||
-             core_useragent::check_gecko_version('2006010100') ||
-             core_useragent::check_camino_version('1.0') ||
-             core_useragent::check_opera_version('6.0') ||
-             core_useragent::check_chrome_version('6') ||
-             core_useragent::check_safari_version('300'));
+
+        return $CFG->grade_report_fixedstudents;
     }
 
     /**
index ef68ec9..235a81c 100644 (file)
@@ -571,8 +571,6 @@ $string['guestroleid'] = 'Role for guest';
 $string['guestroleid_help'] = 'This role is automatically assigned to the guest user. It is also temporarily assigned to not enrolled users that enter the course via guest enrolment plugin.';
 $string['helpadminseesall'] = 'Do admins see all calendar events or just those that apply to themselves?';
 $string['helpcalendarcustomexport'] = 'Enable custom date range export option in calendar exports. Calendar exports must be enabled before this is effective.';
-$string['helpcalendarsettings'] = 'Configure various calendar and date/time-related aspects of Moodle';
-$string['helpcalendartype'] = 'This is the calendar type that will be used throughout your site.';
 $string['helpexportlookahead'] = 'How many days in the future does the calendar look for events during export for the custom export option?';
 $string['helpexportlookback'] = 'How many days in the past does the calendar look for events during export for the custom export option?';
 $string['helpforcetimezone'] = 'You can allow users to individually select their timezone, or force a timezone for everyone.';
index daa3126..c57e6c0 100644 (file)
@@ -61,19 +61,6 @@ function ajaxenabled(array $browsers = null) {
         }
     }
 
-    $ie = core_useragent::check_browser_version('MSIE', 6.0);
-    $ff = core_useragent::check_browser_version('Gecko', 20051106);
-    $op = core_useragent::check_browser_version('Opera', 9.0);
-    $sa = core_useragent::check_browser_version('Safari', 412);
-    $ch = core_useragent::check_browser_version('Chrome', 6);
-
-    if (!$ie && !$ff && !$op && !$sa && !$ch) {
-        /** @see http://en.wikipedia.org/wiki/User_agent */
-        // Gecko build 20051107 is what is in Firefox 1.5.
-        // We still have issues with AJAX in other browsers.
-        return false;
-    }
-
     if (!empty($CFG->enableajax)) {
         return true;
     } else {
index c24c5be..f8fac6e 100644 (file)
@@ -707,7 +707,7 @@ function login_lock_account($user) {
         }
 
         $site = get_site();
-        $supportuser = generate_email_supportuser();
+        $supportuser = core_user::get_support_user();
 
         $data = new stdClass();
         $data->firstname = $user->firstname;
index 598a88e..1a300b9 100644 (file)
@@ -1136,13 +1136,20 @@ function profile_display_badges($userid, $courseid = 0) {
     global $CFG, $PAGE, $USER, $SITE;
     require_once($CFG->dirroot . '/badges/renderer.php');
 
-    if ($USER->id == $userid || has_capability('moodle/badges:viewotherbadges', context_user::instance($USER->id))) {
+    // Determine context.
+    if (isloggedin()) {
+        $context = context_user::instance($USER->id);
+    } else {
+        $context = context_system::instance();
+    }
+
+    if ($USER->id == $userid || has_capability('moodle/badges:viewotherbadges', $context)) {
         $records = badges_get_user_badges($userid, $courseid, null, null, null, true);
         $renderer = new core_badges_renderer($PAGE, '');
 
         // Print local badges.
         if ($records) {
-            $left = get_string('localbadgesp', 'badges', $SITE->fullname);
+            $left = get_string('localbadgesp', 'badges', format_string($SITE->fullname));
             $right = $renderer->print_badges_list($records, $userid, true);
             echo html_writer::tag('dt', $left);
             echo html_writer::tag('dd', $right);
diff --git a/lib/classes/user.php b/lib/classes/user.php
new file mode 100644 (file)
index 0000000..4032884
--- /dev/null
@@ -0,0 +1,211 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * User class
+ *
+ * @package    core
+ * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * User class to access user details.
+ *
+ * @todo       move api's from user/lib.php and depreciate old ones.
+ * @package    core
+ * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class core_user {
+    /**
+     * No reply user id.
+     */
+    const NOREPLY_USER = -10;
+
+    /**
+     * Suppport user id.
+     */
+    const SUPPORT_USER = -20;
+
+    /** @var stdClass keep record of noreply user */
+    public static $noreplyuser = false;
+
+    /** @var stdClass keep record of support user */
+    public static $supportuser = false;
+
+    /**
+     * Return user object from db or create noreply or support user,
+     * if userid matches corse_user::NOREPLY_USER or corse_user::SUPPORT_USER
+     * respectively. If userid is not found, then return false.
+     *
+     * @param int $userid user id
+     * @param string $fields A comma separated list of user fields to be returned, support and noreply user
+     *                       will not be filtered by this.
+     * @param int $strictness IGNORE_MISSING means compatible mode, false returned if user not found, debug message if more found;
+     *                        IGNORE_MULTIPLE means return first user, ignore multiple user records found(not recommended);
+     *                        MUST_EXIST means throw an exception if no user record or multiple records found.
+     * @return stdClass|bool user record if found, else false.
+     * @throws dml_exception if user record not found and respective $strictness is set.
+     */
+    public static function get_user($userid, $fields = '*', $strictness = IGNORE_MISSING) {
+        global $DB;
+
+        // If noreply user then create fake record and return.
+        switch ($userid) {
+            case self::NOREPLY_USER:
+                return self::get_noreply_user($strictness);
+                break;
+            case self::SUPPORT_USER:
+                return self::get_support_user($strictness);
+                break;
+            default:
+                return $DB->get_record('user', array('id' => $userid), $fields, $strictness);
+        }
+    }
+
+    /**
+     * Helper function to return dummy noreply user record.
+     *
+     * @return stdClass
+     */
+    protected static function get_dummy_user_record() {
+        global $CFG;
+
+        $dummyuser = new stdClass();
+        $dummyuser->id = self::NOREPLY_USER;
+        $dummyuser->email = $CFG->noreplyaddress;
+        $dummyuser->firstname = get_string('noreplyname');
+        $dummyuser->username = 'noreply';
+        $dummyuser->lastname = '';
+        $dummyuser->confirmed = 1;
+        $dummyuser->suspended = 0;
+        $dummyuser->deleted = 0;
+        $dummyuser->picture = 0;
+        $dummyuser->auth = 'manual';
+        $dummyuser->firstnamephonetic = '';
+        $dummyuser->lastnamephonetic = '';
+        $dummyuser->middlename = '';
+        $dummyuser->alternatename = '';
+        $dummyuser->imagealt = '';
+        return $dummyuser;
+    }
+
+    /**
+     * Return noreply user record, this is currently used in messaging
+     * system only for sending messages from noreply email.
+     * It will return record of $CFG->noreplyuserid if set else return dummy
+     * user object with hard-coded $user->emailstop = 1 so noreply can be sent to user.
+     *
+     * @return stdClass user record.
+     */
+    public static function get_noreply_user() {
+        global $CFG;
+
+        if (!empty(self::$noreplyuser)) {
+            return self::$noreplyuser;
+        }
+
+        // If noreply user is set then use it, else create one.
+        if (!empty($CFG->noreplyuserid)) {
+            self::$noreplyuser = self::get_user($CFG->noreplyuserid);
+        }
+
+        if (empty(self::$noreplyuser)) {
+            self::$noreplyuser = self::get_dummy_user_record();
+        }
+        self::$noreplyuser->emailstop = 1; // Force msg stop for this user.
+        return self::$noreplyuser;
+    }
+
+    /**
+     * Return support user record, this is currently used in messaging
+     * system only for sending messages to support email.
+     * $CFG->supportuserid is set then returns user record
+     * $CFG->supportemail is set then return dummy record with $CFG->supportemail
+     * else return admin user record with hard-coded $user->emailstop = 0, so user
+     * gets support message.
+     *
+     * @return stdClass user record.
+     */
+    public static function get_support_user() {
+        global $CFG;
+
+        if (!empty(self::$supportuser)) {
+            return self::$supportuser;
+        }
+
+        // If custom support user is set then use it, else if supportemail is set then use it, else use noreply.
+        if (!empty($CFG->supportuserid)) {
+            self::$supportuser = self::get_user($CFG->supportuserid, '*', MUST_EXIST);
+        }
+
+        // Try sending it to support email if support user is not set.
+        if (empty(self::$supportuser) && !empty($CFG->supportemail)) {
+            self::$supportuser = self::get_dummy_user_record();
+            self::$supportuser->id = self::SUPPORT_USER;
+            self::$supportuser->email = $CFG->supportemail;
+            self::$supportuser->firstname = $CFG->supportname ? $CFG->supportname : $supportuser->firstname;
+            self::$supportuser->username = 'support';
+            self::$supportuser->maildisplay = true;
+        }
+
+        // Send support msg to admin user if nothing is set above.
+        if (empty(self::$supportuser)) {
+            self::$supportuser = get_admin();
+        }
+
+        // Unset emailstop to make sure support message is sent.
+        self::$supportuser->emailstop = 0;
+        return self::$supportuser;
+    }
+
+    /**
+     * Reset self::$noreplyuser and self::$supportuser.
+     * This is only used by phpunit, and there is no other use case for this function.
+     * Please don't use it outside phpunit.
+     */
+    public static function reset_internal_users() {
+        if (PHPUNIT_TEST) {
+            self::$noreplyuser = false;
+            self::$supportuser = false;
+        } else {
+            debugging('reset_internal_users() should not be used outside phpunit.', DEBUG_DEVELOPER);
+        }
+    }
+
+    /**
+     * Return true is user id is greater than self::NOREPLY_USER and
+     * alternetely check db.
+     *
+     * @param int $userid user id.
+     * @param bool $checkdb if true userid will be checked in db. By default it's false, and
+     *                      userid is compared with NOREPLY_USER for performance.
+     * @return bool true is real user else false.
+     */
+    public static function is_real_user($userid, $checkdb = false) {
+        if ($userid < 0) {
+            return false;
+        }
+        if ($checkdb) {
+            return $DB->record_exists('user', array('id' => $userid));
+        } else {
+            return true;
+        }
+    }
+}
index e8c1906..971d138 100644 (file)
@@ -367,6 +367,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is Firefox (of any version).
+     *
+     * @return bool true if firefox
+     */
+    public static function is_firefox() {
+        return self::check_firefox_version();
+    }
+
     /**
      * Checks the user agent is Firefox based and that the version is equal to or greater than that specified.
      *
@@ -393,6 +402,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is Gecko based (of any version).
+     *
+     * @return bool true if Gecko based.
+     */
+    public static function is_gecko() {
+        return self::check_gecko_version();
+    }
+
     /**
      * Checks the user agent is Gecko based and that the version is equal to or greater than that specified.
      *
@@ -447,6 +465,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is IE (of any version).
+     *
+     * @return bool true if internet exporeer
+     */
+    public static function is_ie() {
+        return self::check_ie_version();
+    }
+
     /**
      * Checks the user agent is IE and that the version is equal to or greater than that specified.
      *
@@ -484,6 +511,15 @@ class core_useragent {
         return ($browser >= $version);
     }
 
+    /**
+     * Checks the user agent is Opera (of any version).
+     *
+     * @return bool true if opera
+     */
+    public static function is_opera() {
+        return self::check_opera_version();
+    }
+
     /**
      * Checks the user agent is Opera and that the version is equal to or greater than that specified.
      *
@@ -517,6 +553,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is webkit based
+     *
+     * @return bool true if webkit
+     */
+    public static function is_webkit() {
+        return self::check_webkit_version();
+    }
+
     /**
      * Checks the user agent is Webkit based and that the version is equal to or greater than that specified.
      *
@@ -543,6 +588,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is Safari
+     *
+     * @return bool true if safari
+     */
+    public static function is_safari() {
+        return self::check_safari_version();
+    }
+
     /**
      * Checks the user agent is Safari based and that the version is equal to or greater than that specified.
      *
@@ -594,6 +648,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is Chrome
+     *
+     * @return bool true if chrome
+     */
+    public static function is_chrome() {
+        return self::check_chrome_version();
+    }
+
     /**
      * Checks the user agent is Chrome based and that the version is equal to or greater than that specified.
      *
@@ -620,6 +683,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is webkit android based.
+     *
+     * @return bool true if webkit based and on Android
+     */
+    public static function is_webkit_android() {
+        return self::check_webkit_android_version();
+    }
+
     /**
      * Checks the user agent is Webkit based and on Android and that the version is equal to or greater than that specified.
      *
@@ -646,6 +718,15 @@ class core_useragent {
         return false;
     }
 
+    /**
+     * Checks the user agent is Safari on iOS
+     *
+     * @return bool true if Safari on iOS
+     */
+    public static function is_safari_ios() {
+        return self::check_safari_ios_version();
+    }
+
     /**
      * Checks the user agent is Safari on iOS and that the version is equal to or greater than that specified.
      *
@@ -694,7 +775,7 @@ class core_useragent {
      */
     public static function get_browser_version_classes() {
         $classes = array();
-        if (self::check_ie_version('0')) {
+        if (self::is_ie()) {
             $classes[] = 'ie';
             for ($i = 12; $i >= 6; $i--) {
                 if (self::check_ie_version($i)) {
@@ -702,19 +783,19 @@ class core_useragent {
                     break;
                 }
             }
-        } else if (self::check_firefox_version() || self::check_gecko_version() || self::check_camino_version()) {
+        } else if (self::is_firefox() || self::is_gecko() || self::check_camino_version()) {
             $classes[] = 'gecko';
             if (preg_match('/rv\:([1-2])\.([0-9])/', self::get_user_agent_string(), $matches)) {
                 $classes[] = "gecko{$matches[1]}{$matches[2]}";
             }
-        } else if (self::check_webkit_version()) {
+        } else if (self::is_webkit()) {
             $classes[] = 'safari';
-            if (self::check_safari_ios_version()) {
+            if (self::is_safari_ios()) {
                 $classes[] = 'ios';
-            } else if (self::check_webkit_android_version()) {
+            } else if (self::is_webkit_android()) {
                 $classes[] = 'android';
             }
-        } else if (self::check_opera_version()) {
+        } else if (self::is_opera()) {
             $classes[] = 'opera';
         }
         return $classes;
@@ -732,13 +813,13 @@ class core_useragent {
             if ($instance->useragent === false) {
                 // Can't be sure, just say no.
                 $instance->supportssvg = false;
-            } else if (self::check_ie_version() and !self::check_ie_version('9')) {
+            } else if (self::is_ie() and !self::check_ie_version('9')) {
                 // IE < 9 doesn't support SVG. Say no.
                 $instance->supportssvg = false;
             } else if (preg_match('#Android +[0-2]\.#', $instance->useragent)) {
                 // Android < 3 doesn't support SVG. Say no.
                 $instance->supportssvg = false;
-            } else if (self::check_opera_version()) {
+            } else if (self::is_opera()) {
                 // Opera 12 still does not support SVG well enough. Say no.
                 $instance->supportssvg = false;
             } else {
index 117f155..b15105a 100644 (file)
@@ -758,7 +758,7 @@ function notify_login_failures() {
         mtrace('Emailing admins about '. $count .' failed login attempts');
         foreach ($recip as $admin) {
             //emailing the admins directly rather than putting these through the messaging system
-            email_to_user($admin, generate_email_supportuser(), $subject, $body);
+            email_to_user($admin, core_user::get_support_user(), $subject, $body);
         }
     }
 
index c5b6501..3cc26ed 100644 (file)
@@ -4532,4 +4532,16 @@ function get_user_device_type() {
 function get_browser_version_classes() {
     debugging('get_browser_version_classes has been deprecated, please update your code to use core_useragent instead.', DEBUG_DEVELOPER);
     return core_useragent::get_browser_version_classes();
+}
+
+/**
+ * Generate a fake user for emails based on support settings
+ *
+ * @deprecated since Moodle 2.6
+ * @see core_user::get_support_user()
+ * @return stdClass user info
+ */
+function generate_email_supportuser() {
+    debugging('generate_email_supportuser is deprecated, please use core_user::get_support_user');
+    return core_user::get_support_user();
 }
\ No newline at end of file
index 195710d..f0e6a19 100644 (file)
@@ -34,29 +34,8 @@ class tinymce_texteditor extends texteditor {
      * @return bool
      */
     public function supported_by_browser() {
-        if (core_useragent::check_ie_version(6)) {
-            return true;
-        }
-        if (core_useragent::check_gecko_version(20030516)) {
-            return true;
-        }
-        if (core_useragent::check_safari_version(412)) {
-            return true;
-        }
-        if (core_useragent::check_chrome_version(6)) {
-            return true;
-        }
-        if (core_useragent::check_opera_version(9)) {
-            return true;
-        }
-        if (core_useragent::check_safari_ios_version(534)) {
-            return true;
-        }
-        if (core_useragent::check_webkit_version(534)) {
-            return true;
-        }
-
-        return false;
+        // We don't support any browsers which it doesn't support.
+        return true;
     }
 
     /**
index a3c8540..330bbe4 100644 (file)
@@ -63,7 +63,7 @@ class tinymce_spellchecker extends editor_tinymce_plugin {
 
     protected function is_legacy_browser() {
         // IE8 and IE9 are the only supported browsers that do not have spellchecker.
-        if (core_useragent::check_ie_version() and !core_useragent::check_ie_version(10)) {
+        if (core_useragent::is_ie() and !core_useragent::check_ie_version(10)) {
             return true;
         }
         // The rest of browsers supports spellchecking or is horribly outdated and we do not care...
index 77341cc..ea3cbad 100644 (file)
@@ -120,7 +120,7 @@ class MoodleExcelWorkbook {
             header('Pragma: no-cache');
         }
 
-        if (core_useragent::check_ie_version()) {
+        if (core_useragent::is_ie()) {
             $filename = rawurlencode($filename);
         } else {
             $filename = s($filename);
index 3d4dd83..cf82585 100644 (file)
@@ -2163,7 +2163,7 @@ function readstring_accel($string, $mimetype, $accelerate) {
 function send_temp_file($path, $filename, $pathisstring=false) {
     global $CFG;
 
-    if (core_useragent::check_firefox_version('1.5')) {
+    if (core_useragent::is_firefox()) {
         // only FF is known to correctly save to disk before opening...
         $mimetype = mimeinfo('type', $filename);
     } else {
@@ -2183,7 +2183,7 @@ function send_temp_file($path, $filename, $pathisstring=false) {
     }
 
     // if user is using IE, urlencode the filename so that multibyte file name will show up correctly on popup
-    if (core_useragent::check_ie_version()) {
+    if (core_useragent::is_ie()) {
         $filename = urlencode($filename);
     }
 
@@ -2259,12 +2259,12 @@ function send_file($path, $filename, $lifetime = 'default' , $filter=0, $pathiss
     // Use given MIME type if specified, otherwise guess it using mimeinfo.
     // IE, Konqueror and Opera open html file directly in browser from web even when directed to save it to disk :-O
     // only Firefox saves all files locally before opening when content-disposition: attachment stated
-    $isFF         = core_useragent::check_firefox_version('1.5'); // only FF > 1.5 properly tested
+    $isFF         = core_useragent::is_firefox(); // only FF properly tested
     $mimetype     = ($forcedownload and !$isFF) ? 'application/x-forcedownload' :
                          ($mimetype ? $mimetype : mimeinfo('type', $filename));
 
     // if user is using IE, urlencode the filename so that multibyte file name will show up correctly on popup
-    if (core_useragent::check_ie_version()) {
+    if (core_useragent::is_ie()) {
         $filename = rawurlencode($filename);
     }
 
@@ -2423,12 +2423,12 @@ function send_stored_file($stored_file, $lifetime=86400 , $filter=0, $forcedownl
     // IE, Konqueror and Opera open html file directly in browser from web even when directed to save it to disk :-O
     // only Firefox saves all files locally before opening when content-disposition: attachment stated
     $filename     = is_null($filename) ? $stored_file->get_filename() : $filename;
-    $isFF         = core_useragent::check_firefox_version('1.5'); // only FF > 1.5 properly tested
+    $isFF         = core_useragent::is_firefox(); // only FF properly tested
     $mimetype     = ($forcedownload and !$isFF) ? 'application/x-forcedownload' :
                          ($stored_file->get_mimetype() ? $stored_file->get_mimetype() : mimeinfo('type', $filename));
 
     // if user is using IE, urlencode the filename so that multibyte file name will show up correctly on popup
-    if (core_useragent::check_ie_version()) {
+    if (core_useragent::is_ie()) {
         $filename = rawurlencode($filename);
     }
 
index 2de7fc6..e001185 100644 (file)
@@ -983,7 +983,7 @@ class core_media_player_html5video extends core_media_player {
     public function embed($urls, $name, $width, $height, $options) {
         // Special handling to make videos play on Android devices pre 2.3.
         // Note: I tested and 2.3.3 (in emulator) works without, is 533.1 webkit.
-        $oldandroid = core_useragent::check_webkit_android_version() &&
+        $oldandroid = core_useragent::is_webkit_android() &&
                 !core_useragent::check_webkit_android_version('533.1');
 
         // Build array of source tags.
@@ -1067,12 +1067,12 @@ OET;
                 // versions or manual plugins.
                 if ($ext === 'ogv' || $ext === 'webm') {
                     // Formats .ogv and .webm are not supported in IE or Safari.
-                    if (core_useragent::check_ie_version() || core_useragent::check_safari_version()) {
+                    if (core_useragent::is_ie() || core_useragent::is_safari()) {
                         continue;
                     }
                 } else {
                     // Formats .m4v and .mp4 are not supported in Firefox or Opera.
-                    if (core_useragent::check_firefox_version() || core_useragent::check_opera_version()) {
+                    if (core_useragent::is_firefox() || core_useragent::is_opera()) {
                         continue;
                     }
                 }
@@ -1136,18 +1136,18 @@ OET;
             if (in_array($ext, $extensions)) {
                 if ($ext === 'ogg' || $ext === 'oga') {
                     // Formats .ogg and .oga are not supported in IE or Safari.
-                    if (core_useragent::check_ie_version() || core_useragent::check_safari_version()) {
+                    if (core_useragent::is_ie() || core_useragent::is_safari()) {
                         continue;
                     }
                 } else {
                     // Formats .aac, .mp3, and .m4a are not supported in Firefox or Opera.
-                    if (core_useragent::check_firefox_version() || core_useragent::check_opera_version()) {
+                    if (core_useragent::is_firefox() || core_useragent::is_opera()) {
                         continue;
                     }
                 }
                 // Old Android versions (pre 2.3.3) 'support' audio tag but no codecs.
-                if (core_useragent::check_webkit_android_version() &&
-                        !core_useragent::check_webkit_android_version('533.1')) {
+                if (core_useragent::is_webkit_android() &&
+                        !core_useragent::is_webkit_android('533.1')) {
                     continue;
                 }
 
index d4cd8d0..426c593 100644 (file)
@@ -61,13 +61,21 @@ function message_send($eventdata) {
     $DB->transactions_forbidden();
 
     if (is_number($eventdata->userto)) {
-        $eventdata->userto = $DB->get_record('user', array('id' => $eventdata->userto));
+        $eventdata->userto = core_user::get_user($eventdata->userto);
     }
     if (is_int($eventdata->userfrom)) {
-        $eventdata->userfrom = $DB->get_record('user', array('id' => $eventdata->userfrom));
+        $eventdata->userfrom = core_user::get_user($eventdata->userfrom);
     }
+
+    $usertoisrealuser = (core_user::is_real_user($eventdata->userto->id) != false);
+    // If recipient is internal user (noreply user), and emailstop is set then don't send any msg.
+    if (!$usertoisrealuser && !empty($eventdata->userto->emailstop)) {
+        debugging('Attempt to send msg to internal (noreply) user', DEBUG_NORMAL);
+        return false;
+    }
+
     if (!isset($eventdata->userto->auth) or !isset($eventdata->userto->suspended) or !isset($eventdata->userto->deleted)) {
-        $eventdata->userto = $DB->get_record('user', array('id' => $eventdata->userto->id));
+        $eventdata->userto = core_user::get_user($eventdata->userto->id);
     }
 
     //after how long inactive should the user be considered logged off?
@@ -150,6 +158,11 @@ function message_send($eventdata) {
     $preferencebase = $eventdata->component.'_'.$eventdata->name;
     // Fill in the array of processors to be used based on default and user preferences
     foreach ($processors as $processor) {
+        // Skip adding processors for internal user, if processor doesn't support sending message to internal user.
+        if (!$usertoisrealuser && !$processor->object->can_send_to_any_users()) {
+            continue;
+        }
+
         // First find out permissions
         $defaultpreference = $processor->name.'_provider_'.$preferencebase.'_permitted';
         if (isset($defaultpreferences->{$defaultpreference})) {
index d599f05..92091ea 100644 (file)
@@ -5653,7 +5653,7 @@ function email_to_user($user, $from, $subject, $messagetext, $messagehtml = '',
     $temprecipients = array();
     $tempreplyto = array();
 
-    $supportuser = generate_email_supportuser();
+    $supportuser = core_user::get_support_user();
 
     // Make up an email address for handling bounces.
     if (!empty($CFG->handlebounces)) {
@@ -5802,30 +5802,6 @@ function generate_email_signoff() {
     return $signoff;
 }
 
-/**
- * Generate a fake user for emails based on support settings
- *
- * @return stdClass user info
- */
-function generate_email_supportuser() {
-    global $CFG;
-
-    static $supportuser;
-
-    if (!empty($supportuser)) {
-        return $supportuser;
-    }
-
-    $supportuser = new stdClass();
-    $supportuser->email = $CFG->supportemail ? $CFG->supportemail : $CFG->noreplyaddress;
-    $supportuser->firstname = $CFG->supportname ? $CFG->supportname : get_string('noreplyname');
-    $supportuser->lastname = '';
-    $supportuser->maildisplay = true;
-
-    return $supportuser;
-}
-
-
 /**
  * Sets specified user's password and send the new password to the user via email.
  *
@@ -5843,7 +5819,7 @@ function setnew_password_and_mail($user, $fasthash = false) {
 
     $site  = get_site();
 
-    $supportuser = generate_email_supportuser();
+    $supportuser = core_user::get_support_user();
 
     $newpassword = generate_password();
 
@@ -5877,7 +5853,7 @@ function reset_password_and_mail($user) {
     global $CFG;
 
     $site  = get_site();
-    $supportuser = generate_email_supportuser();
+    $supportuser = core_user::get_support_user();
 
     $userauth = get_auth_plugin($user->auth);
     if (!$userauth->can_reset_password() or !is_enabled_auth($user->auth)) {
@@ -5920,7 +5896,7 @@ function send_confirmation_email($user) {
     global $CFG;
 
     $site = get_site();
-    $supportuser = generate_email_supportuser();
+    $supportuser = core_user::get_support_user();
 
     $data = new stdClass();
     $data->firstname = fullname($user);
@@ -5951,7 +5927,7 @@ function send_password_change_confirmation_email($user) {
     global $CFG;
 
     $site = get_site();
-    $supportuser = generate_email_supportuser();
+    $supportuser = core_user::get_support_user();
 
     $data = new stdClass();
     $data->firstname = $user->firstname;
@@ -5978,7 +5954,7 @@ function send_password_change_info($user) {
     global $CFG;
 
     $site = get_site();
-    $supportuser = generate_email_supportuser();
+    $supportuser = core_user::get_support_user();
     $systemcontext = context_system::instance();
 
     $data = new stdClass();
index e1051dd..231e0a2 100644 (file)
@@ -656,7 +656,7 @@ class theme_config {
 
         if ($rev > -1) {
             $url = new moodle_url("$CFG->httpswwwroot/theme/styles.php");
-            $separate = (core_useragent::check_ie_version('5') && !core_useragent::check_ie_version('10'));
+            $separate = (core_useragent::is_ie() && !core_useragent::check_ie_version('10'));
             if (!empty($CFG->slasharguments)) {
                 $slashargs = '';
                 if (!$svg) {
@@ -734,7 +734,7 @@ class theme_config {
                 // We do this because all modern browsers support SVG and this param will one day be removed.
                 $baseurl->param('svg', '0');
             }
-            if (core_useragent::check_ie_version('5')) {
+            if (core_useragent::is_ie()) {
                 // lalala, IE does not allow more than 31 linked CSS files from main document
                 $urls[] = new moodle_url($baseurl, array('theme'=>$this->name, 'type'=>'ie', 'subtype'=>'plugins'));
                 foreach ($css['parents'] as $parent=>$sheets) {
diff --git a/lib/tests/user_test.php b/lib/tests/user_test.php
new file mode 100644 (file)
index 0000000..ea379e8
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Tests core_user class.
+ *
+ * @package    core
+ * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * Test core_user class.
+ *
+ * @package    core
+ * @copyright  2013 Rajesh Taneja <rajesh@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class core_user_testcase extends advanced_testcase {
+
+    public function test_get_user() {
+        global $CFG;
+
+        $this->resetAfterTest(true);
+
+        // Create user and try fetach it with api.
+        $user = $this->getDataGenerator()->create_user();
+        $this->assertEquals($user, core_user::get_user($user->id, '*', MUST_EXIST));
+
+        // Test noreply user.
+        $CFG->noreplyuserid = null;
+        $noreplyuser = core_user::get_noreply_user();
+        $this->assertEquals(1, $noreplyuser->emailstop);
+        $this->assertFalse(core_user::is_real_user($noreplyuser->id));
+        $this->assertEquals($CFG->noreplyaddress, $noreplyuser->email);
+        $this->assertEquals(get_string('noreplyname'), $noreplyuser->firstname);
+
+        // Set user as noreply user and make sure noreply propery is set.
+        core_user::reset_internal_users();
+        $CFG->noreplyuserid = $user->id;
+        $noreplyuser = core_user::get_noreply_user();
+        $this->assertEquals(1, $noreplyuser->emailstop);
+        $this->assertTrue(core_user::is_real_user($noreplyuser->id));
+
+        // Test support user.
+        core_user::reset_internal_users();
+        $CFG->supportemail = null;
+        $CFG->noreplyuserid = null;
+        $supportuser = core_user::get_support_user();
+        $adminuser = get_admin();
+        $this->assertEquals($adminuser, $supportuser);
+        $this->assertTrue(core_user::is_real_user($supportuser->id));
+
+        // When supportemail is set.
+        core_user::reset_internal_users();
+        $CFG->supportemail = 'test@support.moodle.test';
+        $supportuser = core_user::get_support_user();
+        $this->assertEquals(core_user::SUPPORT_USER, $supportuser->id);
+        $this->assertFalse(core_user::is_real_user($supportuser->id));
+
+        // Set user as support user and make sure noreply propery is set.
+        core_user::reset_internal_users();
+        $CFG->supportuserid = $user->id;
+        $supportuser = core_user::get_support_user();
+        $this->assertEquals($user, $supportuser);
+        $this->assertTrue(core_user::is_real_user($supportuser->id));
+    }
+}
index 21e0ef7..7d74dd9 100644 (file)
@@ -163,53 +163,69 @@ class core_useragent_testcase extends basic_testcase {
      */
     public function test_check_browser_version() {
         core_useragent::instance(true, $this->user_agents['Safari']['412']['Mac OS X']);
+        $this->assertTrue(core_useragent::is_safari());
         $this->assertTrue(core_useragent::check_safari_version());
+        $this->assertTrue(core_useragent::is_webkit());
         $this->assertTrue(core_useragent::check_webkit_version());
         $this->assertTrue(core_useragent::check_safari_version('312'));
         $this->assertFalse(core_useragent::check_safari_version('500'));
+        $this->assertFalse(core_useragent::is_chrome());
         $this->assertFalse(core_useragent::check_chrome_version());
+        $this->assertFalse(core_useragent::is_safari_ios());
         $this->assertFalse(core_useragent::check_safari_ios_version());
 
         core_useragent::instance(true, $this->user_agents['Safari iOS']['528']['iPhone']);
+        $this->assertTrue(core_useragent::is_safari_ios());
         $this->assertTrue(core_useragent::check_safari_ios_version());
+        $this->assertTrue(core_useragent::is_webkit());
         $this->assertTrue(core_useragent::check_webkit_version());
         $this->assertTrue(core_useragent::check_safari_ios_version('527'));
         $this->assertFalse(core_useragent::check_safari_ios_version(590));
         $this->assertFalse(core_useragent::check_safari_version('312'));
         $this->assertFalse(core_useragent::check_safari_version('500'));
+        $this->assertFalse(core_useragent::is_chrome());
         $this->assertFalse(core_useragent::check_chrome_version());
 
         core_useragent::instance(true, $this->user_agents['WebKit Android']['530']['Nexus']);
+        $this->assertTrue(core_useragent::is_webkit());
         $this->assertTrue(core_useragent::check_webkit_version());
         $this->assertTrue(core_useragent::check_webkit_android_version('527'));
         $this->assertFalse(core_useragent::check_webkit_android_version(590));
+        $this->assertFalse(core_useragent::is_safari());
         $this->assertFalse(core_useragent::check_safari_version());
+        $this->assertFalse(core_useragent::is_chrome());
         $this->assertFalse(core_useragent::check_chrome_version());
 
         core_useragent::instance(true, $this->user_agents['Chrome']['8']['Mac OS X']);
+        $this->assertTrue(core_useragent::is_chrome());
         $this->assertTrue(core_useragent::check_chrome_version());
+        $this->assertTrue(core_useragent::is_webkit());
         $this->assertTrue(core_useragent::check_webkit_version());
         $this->assertTrue(core_useragent::check_chrome_version(8));
         $this->assertFalse(core_useragent::check_chrome_version(10));
         $this->assertFalse(core_useragent::check_safari_version('1'));
 
         core_useragent::instance(true, $this->user_agents['Opera']['9.0']['Windows XP']);
+        $this->assertTrue(core_useragent::is_opera());
         $this->assertTrue(core_useragent::check_opera_version());
         $this->assertTrue(core_useragent::check_opera_version('8.0'));
         $this->assertFalse(core_useragent::check_opera_version('10.0'));
 
         core_useragent::instance(true, $this->user_agents['MSIE']['6.0']['Windows XP SP2']);
+        $this->assertTrue(core_useragent::is_ie());
         $this->assertTrue(core_useragent::check_ie_version());
         $this->assertTrue(core_useragent::check_ie_version('5.0'));
         $this->assertFalse(core_useragent::check_ie_version('7.0'));
 
         core_useragent::instance(true, $this->user_agents['MSIE']['5.0']['Windows 98']);
+        $this->assertFalse(core_useragent::is_ie());
         $this->assertFalse(core_useragent::check_ie_version());
         $this->assertTrue(core_useragent::check_ie_version(0));
         $this->assertTrue(core_useragent::check_ie_version('5.0'));
         $this->assertFalse(core_useragent::check_ie_version('7.0'));
 
         core_useragent::instance(true, $this->user_agents['MSIE']['9.0']['Windows 7']);
+        $this->assertTrue(core_useragent::is_ie());
         $this->assertTrue(core_useragent::check_ie_version());
         $this->assertTrue(core_useragent::check_ie_version(0));
         $this->assertTrue(core_useragent::check_ie_version('5.0'));
@@ -217,6 +233,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_ie_version('10'));
 
         core_useragent::instance(true, $this->user_agents['MSIE']['9.0i']['Windows 7']);
+        $this->assertTrue(core_useragent::is_ie());
         $this->assertTrue(core_useragent::check_ie_version());
         $this->assertTrue(core_useragent::check_ie_version(0));
         $this->assertTrue(core_useragent::check_ie_version('5.0'));
@@ -224,6 +241,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_ie_version('10'));
 
         core_useragent::instance(true, $this->user_agents['MSIE']['10.0']['Windows 8']);
+        $this->assertTrue(core_useragent::is_ie());
         $this->assertTrue(core_useragent::check_ie_version());
         $this->assertTrue(core_useragent::check_ie_version(0));
         $this->assertTrue(core_useragent::check_ie_version('5.0'));
@@ -232,6 +250,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_ie_version('11'));
 
         core_useragent::instance(true, $this->user_agents['MSIE']['10.0i']['Windows 8']);
+        $this->assertTrue(core_useragent::is_ie());
         $this->assertTrue(core_useragent::check_ie_version());
         $this->assertTrue(core_useragent::check_ie_version(0));
         $this->assertTrue(core_useragent::check_ie_version('5.0'));
@@ -240,6 +259,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_ie_version('11'));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['2.0']['Windows XP']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version('1.5'));
         $this->assertFalse(core_useragent::check_firefox_version('3.0'));
@@ -249,6 +269,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertTrue(core_useragent::check_gecko_version(2006010100));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['1.0.6']['Windows XP']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_gecko_version('1'));
         $this->assertFalse(core_useragent::check_gecko_version(20030516));
@@ -259,6 +280,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_gecko_version('2'));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['2.0']['Windows XP']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version('1.5'));
         $this->assertTrue(core_useragent::check_gecko_version('1'));
@@ -269,6 +291,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_firefox_version('3.0'));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['3.6']['Linux']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version('1.5'));
         $this->assertTrue(core_useragent::check_firefox_version('3.0'));
@@ -281,6 +304,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_firefox_version('10'));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['3.6']['Linux']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version('1.5'));
         $this->assertTrue(core_useragent::check_firefox_version('3.0'));
@@ -295,6 +319,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_gecko_version('4'));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['15.0a2']['Windows']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version('1.5'));
         $this->assertTrue(core_useragent::check_firefox_version('3.0'));
@@ -311,6 +336,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertFalse(core_useragent::check_gecko_version('18'));
 
         core_useragent::instance(true, $this->user_agents['Firefox']['18.0']['Mac OS X']);
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version('1.5'));
         $this->assertTrue(core_useragent::check_firefox_version('3.0'));
@@ -335,6 +361,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertTrue(core_useragent::check_gecko_version(2006010100));
         $this->assertFalse(core_useragent::check_gecko_version('3.6'));
         $this->assertFalse(core_useragent::check_gecko_version('4.0'));
+        $this->assertFalse(core_useragent::is_firefox());
         $this->assertFalse(core_useragent::check_firefox_version());
 
         core_useragent::instance(true, $this->user_agents['SeaMonkey']['2.1']['Linux']);
@@ -344,6 +371,7 @@ class core_useragent_testcase extends basic_testcase {
         $this->assertTrue(core_useragent::check_gecko_version(20030516));
         $this->assertTrue(core_useragent::check_gecko_version(20051106));
         $this->assertTrue(core_useragent::check_gecko_version(2006010100));
+        $this->assertTrue(core_useragent::is_firefox());
         $this->assertTrue(core_useragent::check_firefox_version());
         $this->assertTrue(core_useragent::check_firefox_version(4.0));
         $this->assertFalse(core_useragent::check_firefox_version(5));
@@ -416,4 +444,4 @@ class core_useragent_testcase extends basic_testcase {
 
         core_useragent::instance(true);
     }
-}
\ No newline at end of file
+}
index 0450eb2..4d47d06 100644 (file)
@@ -32,6 +32,9 @@ information provided here is intended especially for developers.
   get_fast_modinfo(). Purging all caches and every core upgrade purges course modinfo cache as well.
   If function get_fast_modinfo() is called for multiple courses make sure to include field cacherev in course
   object.
+* Internal (noreply and support) user support has been added for sending/receiving message.
+  Use core_user::get_noreply_user() and core_user::get_support_user() to get noreply and support user's respectively.
+  Real users can be used as noreply/support users by setting $CFG->noreplyuserid and $CFG->supportuserid
 * New function readfile_allow_large() in filelib.php for use when very large files may need sending to user.
 
 DEPRECATIONS:
@@ -105,6 +108,7 @@ Misc:
     * js_minify()                           -> core_minify::js_files()
     * css_minify_css()                      -> core_minify::css_files()
     * course_modinfo::build_section_cache() -> (no replacement)
+    * generate_email_supportuser()          -> core_user::get_support_user()
 
 User-agent related functions:
     * check_browser_operating_system()      -> core_useragent::check_browser_operating_system()
index 16c46fb..e13c486 100644 (file)
@@ -103,13 +103,15 @@ unset($user1id);
 
 $user2 = null;
 if (!empty($user2id)) {
-    $user2 = $DB->get_record("user", array("id" => $user2id));
+    $user2 = core_user::get_user($user2id);
     if (!$user2) {
         print_error('invaliduserid');
     }
 }
 unset($user2id);
 
+$user2realuser = !empty($user2) && core_user::is_real_user($user2->id);
+$showactionlinks = $showactionlinks && $user2realuser;
 $systemcontext = context_system::instance();
 
 if (!empty($user2) && $user1->id == $user2->id) {
@@ -159,7 +161,7 @@ if ($unblockcontact and confirm_sesskey()) {
 
 //was a message sent? Do NOT allow someone looking at someone else's messages to send them.
 $messageerror = null;
-if ($currentuser && !empty($user2) && has_capability('moodle/site:sendmessage', $systemcontext)) {
+if ($currentuser && $user2realuser && has_capability('moodle/site:sendmessage', $systemcontext)) {
     // Check that the user is not blocking us!!
     if ($contact = $DB->get_record('message_contacts', array('userid' => $user2->id, 'contactid' => $user1->id))) {
         if ($contact->blocked and !has_capability('moodle/site:readallmessages', $systemcontext)) {
@@ -199,7 +201,7 @@ if ($currentuser && !empty($user2) && has_capability('moodle/site:sendmessage',
 }
 
 $strmessages = get_string('messages', 'message');
-if (!empty($user2)) {
+if ($user2realuser) {
     $user2fullname = fullname($user2);
 
     $PAGE->set_title("$strmessages: $user2fullname");
@@ -219,7 +221,7 @@ $countunreadtotal = 0; //count of unread messages from all users
 
 //we're dealing with unread messages early so the contact list will accurately reflect what is read/unread
 $viewingnewmessages = false;
-if (!empty($user2)) {
+if ($user2realuser) {
     //are there any unread messages from $user2
     $countunread = message_count_unread_messages($user1, $user2);
     if ($countunread>0) {
@@ -247,7 +249,7 @@ list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts($user
 message_print_contact_selector($countunreadtotal, $viewing, $user1, $user2, $blockedusers, $onlinecontacts, $offlinecontacts, $strangers, $showactionlinks, $page);
 
 echo html_writer::start_tag('div', array('class' => 'messagearea mdl-align'));
-    if (!empty($user2)) {
+    if ($user2realuser) {
 
         echo html_writer::start_tag('div', array('class' => 'mdl-left messagehistory'));
 
index 288db3e..f0d8816 100644 (file)
@@ -1198,7 +1198,7 @@ function message_print_search_results($frm, $showicontext=false, $currentuser=nu
 
                 // Load user-to record.
                 if ($message->useridto !== $USER->id) {
-                    $userto = $DB->get_record('user', array('id' => $message->useridto));
+                    $userto = core_user::get_user($message->useridto);
                     $tocontact = (array_key_exists($message->useridto, $contacts) and
                                     ($contacts[$message->useridto]->blocked == 0) );
                     $toblocked = (array_key_exists($message->useridto, $contacts) and
@@ -1211,7 +1211,7 @@ function message_print_search_results($frm, $showicontext=false, $currentuser=nu
 
                 // Load user-from record.
                 if ($message->useridfrom !== $USER->id) {
-                    $userfrom = $DB->get_record('user', array('id' => $message->useridfrom));
+                    $userfrom = core_user::get_user($message->useridfrom);
                     $fromcontact = (array_key_exists($message->useridfrom, $contacts) and
                                     ($contacts[$message->useridfrom]->blocked == 0) );
                     $fromblocked = (array_key_exists($message->useridfrom, $contacts) and
@@ -1294,10 +1294,16 @@ function message_print_search_results($frm, $showicontext=false, $currentuser=nu
 function message_print_user ($user=false, $iscontact=false, $isblocked=false, $includeicontext=false) {
     global $USER, $OUTPUT;
 
+    $userpictureparams = array('size' => 20, 'courseid' => SITEID);
+
     if ($user === false) {
-        echo $OUTPUT->user_picture($USER, array('size' => 20, 'courseid' => SITEID));
+        echo $OUTPUT->user_picture($USER, $userpictureparams);
+    } else if (core_user::is_real_user($user->id)) { // If not real user, then don't show any links.
+        $userpictureparams['link'] = false;
+        echo $OUTPUT->user_picture($USER, $userpictureparams);
+        echo fullname($user);
     } else {
-        echo $OUTPUT->user_picture($user, array('size' => 20, 'courseid' => SITEID));
+        echo $OUTPUT->user_picture($user, $userpictureparams);
 
         $link = new moodle_url("/message/index.php?id=$user->id");
         echo $OUTPUT->action_link($link, fullname($user), null, array('title' =>
index 58d4b69..1873d1d 100644 (file)
@@ -127,4 +127,13 @@ class message_output_email extends message_output {
     function load_data(&$preferences, $userid){
         $preferences->email_email = get_user_preferences( 'message_processor_email_email', '', $userid);
     }
+
+    /**
+     * Returns true as message can be sent to internal support user.
+     *
+     * @return bool
+     */
+    public function can_send_to_any_users() {
+        return true;
+    }
 }
index dd480e5..2694333 100644 (file)
@@ -92,6 +92,16 @@ abstract class message_output {
     public function get_default_messaging_settings() {
         return MESSAGE_PERMITTED;
     }
+
+    /**
+     * Returns true if message can be sent to fake/internal user as well.
+     * If message_output support message to be sent to fake user, then it should return true, like email.
+     *
+     * @return bool
+     */
+    public function can_send_to_any_users() {
+        return false;
+    }
 }
 
 
index a45939c..715c9e2 100644 (file)
@@ -1,6 +1,10 @@
 This files describes API changes in /message/ messaging system,
 information provided here is intended especially for developers.
 
+=== 2.6 ===
+* Message processor extending message_output, should return true in can_send_to_any_users()
+  if it supports message sending to internal (noreply/support) users.
+
 === 2.2 ===
 
 required changes:
index 9dcef63..de0a00a 100644 (file)
@@ -404,7 +404,7 @@ function resource_print_filenotfound($resource, $cm, $course) {
 }
 
 /**
- * Decide the best diaply format.
+ * Decide the best display format.
  * @param object $resource
  * @return int display type constant
  */
@@ -424,7 +424,7 @@ function resource_get_final_display_type($resource) {
     if (file_mimetype_in_typegroup($mimetype, 'archive')) {
         return RESOURCELIB_DISPLAY_DOWNLOAD;
     }
-    if (file_mimetype_in_typegroup($mimetype, array('web_image', '.pdf', '.htm', 'web_video', 'web_audio'))) {
+    if (file_mimetype_in_typegroup($mimetype, array('web_image', '.htm', 'web_video', 'web_audio'))) {
         return RESOURCELIB_DISPLAY_EMBED;
     }
 
index 8f487a2..8fc726e 100644 (file)
@@ -1370,3 +1370,37 @@ function scorm_validate_package($file) {
     }
     return $errors;
 }
+
+/**
+ * Check and set the correct mode and attempt when entering a SCORM package.
+ *
+ * @param object $scorm object
+ * @param string $newattempt should a new attempt be generated here.
+ * @param int $attempt the attempt number this is for.
+ * @param int $userid the userid of the user.
+ * @param string $mode the current mode that has been selected.
+ */
+function scorm_check_mode($scorm, $newattempt, &$attempt, $userid, &$mode) {
+    global $DB;
+    if (($newattempt == 'on') && (($attempt < $scorm->maxattempt) || ($scorm->maxattempt == 0))) {
+        $attempt++;
+        $mode = 'normal';
+    } else if ($mode != 'browse') { // Check if review mode should be set.
+        $mode = 'normal'; // Set to normal mode by default.
+
+        // If all tracks == passed, failed or completed then use review mode.
+        $tracks = $DB->get_recordset('scorm_scoes_track', array('scormid' => $scorm->id, 'userid' => $userid,
+            'attempt' => $attempt, 'element' => 'cmi.core.lesson_status'));
+        foreach ($tracks as $track) {
+            if (($track->value == 'completed') || ($track->value == 'passed') || ($track->value == 'failed')) {
+                $mode = 'review';
+            } else { // Found an incomplete sco so exit and use normal mode.
+                $mode = 'normal';
+                break;
+            }
+        }
+        $tracks->close();
+    } else if (($mode == 'browse') && ($scorm->hidebrowse == 1)) { // Prevent Browse mode if hidebrowse is set.
+        $mode = 'normal';
+    }
+}
\ No newline at end of file
index 8287314..728a5ff 100644 (file)
@@ -1338,8 +1338,8 @@ function scorm_get_toc_object($user, $scorm, $currentorg='', $scoid='', $mode='n
     global $CFG, $DB, $PAGE, $OUTPUT;
 
     $modestr = '';
-    if ($mode == 'browse') {
-        $modestr = '&amp;mode='.$mode;
+    if ($mode != 'normal') {
+        $modestr = '&mode='.$mode;
     }
 
     $result = array();
@@ -1751,8 +1751,8 @@ function scorm_get_toc($user, $scorm, $cmid, $toclink=TOCJSLINK, $currentorg='',
         $tocmenu = scorm_format_toc_for_droplist($scorm, $scoes['scoes'][0]->children, $scoes['usertracks'], $currentorg, $organizationsco);
 
         $modestr = '';
-        if ($mode == 'browse') {
-            $modestr = '&amp;mode='.$mode;
+        if ($mode != 'normal') {
+            $modestr = '&mode='.$mode;
         }
 
         $url = new moodle_url('/mod/scorm/player.php?a='.$scorm->id.'&currentorg='.$currentorg.$modestr);
index 5828f36..4fa5808 100644 (file)
@@ -14,7 +14,7 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-/// This page prints a particular instance of aicc/scorm package
+// This page prints a particular instance of aicc/scorm package.
 
 require_once('../../config.php');
 require_once($CFG->dirroot.'/mod/scorm/locallib.php');
@@ -25,8 +25,8 @@ $a = optional_param('a', '', PARAM_INT);         // scorm ID
 $scoid = required_param('scoid', PARAM_INT);  // sco ID
 $mode = optional_param('mode', 'normal', PARAM_ALPHA); // navigation mode
 $currentorg = optional_param('currentorg', '', PARAM_RAW); // selected organization
-$newattempt = optional_param('newattempt', 'off', PARAM_ALPHA); // the user request to start a new attempt
-$displaymode = optional_param('display','',PARAM_ALPHA);
+$newattempt = optional_param('newattempt', 'off', PARAM_ALPHA); // the user request to start a new attempt.
+$displaymode = optional_param('display', '', PARAM_ALPHA);
 
 // IE 9 workaround for Flash bug: MDL-29213
 // Note that it's not clear if appending the meta tag via $CFG->additionalhtmlhead
@@ -63,6 +63,11 @@ if (!empty($id)) {
 } else {
     print_error('missingparameter');
 }
+// If new attempt is being triggered set normal mode and increment attempt number.
+$attempt = scorm_get_last_attempt($scorm->id, $USER->id);
+
+// Check mode is correct and set mode/attempt (uses pass by reference).
+scorm_check_mode($scorm, $newattempt, $attempt, $USER->id, $mode);
 
 $url = new moodle_url('/mod/scorm/player.php', array('scoid'=>$scoid, 'cm'=>$cm->id));
 if ($mode !== 'normal') {
@@ -104,7 +109,7 @@ if (!$cm->visible and !has_capability('moodle/course:viewhiddenactivities', $cou
     die;
 }
 
-//check if scorm closed
+// Check if scorm closed.
 $timenow = time();
 if ($scorm->timeclose !=0) {
     if ($scorm->timeopen > $timenow) {
@@ -121,17 +126,11 @@ if ($scorm->timeclose !=0) {
     }
 }
 // TOC processing
-$scorm->version = strtolower(clean_param($scorm->version, PARAM_SAFEDIR));   // Just to be safe
+$scorm->version = strtolower(clean_param($scorm->version, PARAM_SAFEDIR));   // Just to be safe.
 if (!file_exists($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'lib.php')) {
     $scorm->version = 'scorm_12';
 }
 require_once($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'lib.php');
-$attempt = scorm_get_last_attempt($scorm->id, $USER->id);
-if (($newattempt=='on') && (($attempt < $scorm->maxattempt) || ($scorm->maxattempt == 0))) {
-    $attempt++;
-    $mode = 'normal';
-}
-$attemptstr = '&amp;attempt=' . $attempt;
 
 $result = scorm_get_toc($USER, $scorm, $cm->id, TOCJSLINK, $currentorg, $scoid, $mode, $attempt, true, true);
 $sco = $result->sco;
@@ -142,33 +141,11 @@ if ($scorm->lastattemptlock == 1 && $result->attemptleft == 0) {
     exit;
 }
 
-if (($mode == 'browse') && ($scorm->hidebrowse == 1)) {
-    $mode = 'normal';
-}
-if ($mode != 'browse') {
-    if ($trackdata = scorm_get_tracks($sco->id, $USER->id, $attempt)) {
-        if (($trackdata->status == 'completed') || ($trackdata->status == 'passed') || ($trackdata->status == 'failed')) {
-            $mode = 'review';
-        } else {
-            $mode = 'normal';
-        }
-    } else {
-        $mode = 'normal';
-    }
-}
-
 add_to_log($course->id, 'scorm', 'view', "player.php?cm=$cm->id&scoid=$sco->id", "$scorm->id", $cm->id);
 
 
 $scoidstr = '&amp;scoid='.$sco->id;
-$scoidpop = '&scoid='.$sco->id;
 $modestr = '&amp;mode='.$mode;
-if ($mode == 'browse') {
-    $modepop = '&mode='.$mode;
-} else {
-    $modepop = '';
-}
-$orgstr = '&currentorg='.$currentorg;
 
 $SESSION->scorm = new stdClass();
 $SESSION->scorm->scoid = $sco->id;
@@ -176,11 +153,11 @@ $SESSION->scorm->scormstatus = 'Not Initialized';
 $SESSION->scorm->scormmode = $mode;
 $SESSION->scorm->attempt = $attempt;
 
-// Mark module viewed
+// Mark module viewed.
 $completion = new completion_info($course);
 $completion->set_module_viewed($cm);
 
-// Print the page header
+// Print the page header.
 if (empty($scorm->popup) || $displaymode=='popup') {
     $exitlink = '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$scorm->course.'" title="'.$strexit.'">'.$strexit.'</a> ';
     $PAGE->set_button($exitlink);
@@ -198,7 +175,6 @@ $PAGE->requires->js('/mod/scorm/request.js', true);
 $PAGE->requires->js('/lib/cookies.js', true);
 echo $OUTPUT->header();
 
-// NEW IMS TOC
 $PAGE->requires->string_for_js('navigation', 'scorm');
 $PAGE->requires->string_for_js('toc', 'scorm');
 $PAGE->requires->string_for_js('hide', 'moodle');
@@ -252,7 +228,7 @@ if ($result->prerequisites) {
         }
         $name = 'scorm_'.$name;
         echo html_writer::script('', $CFG->wwwroot.'/mod/scorm/player.js');
-        $url = new moodle_url($PAGE->url, array('scoid' => $sco->id, 'display' => 'popup'));
+        $url = new moodle_url($PAGE->url, array('scoid' => $sco->id, 'display' => 'popup', 'mode' => $mode));
         echo html_writer::script(
             js_writer::function_call('scorm_openpopup', Array($url->out(false),
                                                        $name, $scorm->options,
@@ -271,7 +247,7 @@ if ($result->prerequisites) {
 <?php
 $scoes = scorm_get_toc_object($USER, $scorm, "", $sco->id, $mode, $attempt);
 $adlnav = scorm_get_adlnav_json($scoes['scoes']);
-// NEW IMS TOC
+
 if (empty($scorm->popup) || $displaymode == 'popup') {
     if (!isset($result->toctitle)) {
         $result->toctitle = get_string('toc', 'scorm');
index 21ebc1a..ebb1c31 100644 (file)
@@ -53,7 +53,7 @@ $linkexternal  = optional_param('linkexternal', '', PARAM_ALPHA);
 $usefilereference  = optional_param('usefilereference', false, PARAM_BOOL);
 
 list($context, $course, $cm) = get_context_info_array($contextid);
-require_login($course, false, $cm);
+require_login($course, false, $cm, false, true);
 $PAGE->set_context($context);
 
 echo $OUTPUT->header(); // send headers
index 6a3bd9a..4ca1d83 100644 (file)
@@ -164,7 +164,7 @@ $THEME->javascripts_footer = array(
     'moodlebootstrap',
 );
 
-if (core_useragent::check_ie_version() && !core_useragent::check_ie_version('9.0')) {
+if (core_useragent::is_ie() && !core_useragent::check_ie_version('9.0')) {
     $THEME->javascripts[] = 'html5shiv';
 }
 
index 821ba4d..2a060d1 100644 (file)
@@ -250,7 +250,7 @@ if ($usernew = $userform->get_data()) {
         $emailupdatetitle = get_string('emailupdatetitle', 'auth', $a);
 
         //email confirmation directly rather than using messaging so they will definitely get an email
-        $supportuser = generate_email_supportuser();
+        $supportuser = core_user::get_support_user();
         if (!$mail_results = email_to_user($temp_user, $supportuser, $emailupdatetitle, $emailupdatemessage)) {
             die("could not send email!");
         }