navigation MDL-25142 Fixed up differences in navigation between guest and normal...
[moodle.git] / lib / accesslib.php
index d6d6a08..b393851 100755 (executable)
@@ -2978,6 +2978,93 @@ function is_enrolled($context, $user = null, $withcapability = '', $onlyactive =
     return true;
 }
 
+/**
+ * Returns true if the user is able to access the course.
+ *
+ * This function is in no way, shape, or form a substitute for require_login.
+ * It should only be used in circumstances where it is not possible to call require_login
+ * such as the navigation.
+ *
+ * This function checks many of the methods of access to a course such as the view
+ * capability, enrollments, and guest access. It also makes use of the cache
+ * generated by require_login for guest access.
+ *
+ * The flags within the $USER object that are used here should NEVER be used outside
+ * of this function can_access_course and require_login. Doing so WILL break future
+ * versions.
+ *
+ * @global moodle_database $DB
+ * @param stdClass $context
+ * @param stdClass|null $user
+ * @param string $withcapability Check for this capability as well.
+ * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions
+ * @param boolean $trustcache If set to false guest access will always be checked
+ *                             against the enrolment plugins from the course, rather
+ *                             than the cache generated by require_login.
+ * @return boolean Returns true if the user is able to access the course
+ */
+function can_access_course($context, $user = null, $withcapability = '', $onlyactive = false, $trustcache = true) {
+    global $DB, $USER;
+
+    $coursecontext = get_course_context($context);
+    $courseid = $coursecontext->instanceid;
+
+    // First check the obvious, is the user viewing or is the user enrolled.
+    if (is_viewing($coursecontext, $user, $withcapability) || is_enrolled($coursecontext, $user, $withcapability, $onlyactive)) {
+        // How easy was that!
+        return true;
+    }
+
+    $access = false;
+    if (!isset($USER->enrol)) {
+        // Cache hasn't been generated yet so we can't trust it
+        $trustcache = false;
+        /**
+         * These flags within the $USER object should NEVER be used outside of this
+         * function can_access_course and the function require_login.
+         * Doing so WILL break future versions!!!!
+         */
+        $USER->enrol = array();
+        $USER->enrol['enrolled'] = array();
+        $USER->enrol['tempguest'] = array();
+    }
+
+    // If we don't trust the cache we need to check with the courses enrolment
+    // plugin instances to see if the user can access the course as a guest.
+    if (!$trustcache) {
+        // Ok, off to the database we go!
+        $instances = $DB->get_records('enrol', array('courseid'=>$courseid, 'status'=>ENROL_INSTANCE_ENABLED), 'sortorder, id ASC');
+        $enrols = enrol_get_plugins(true);
+        foreach($instances as $instance) {
+            if (!isset($enrols[$instance->enrol])) {
+                continue;
+            }
+            $until = $enrols[$instance->enrol]->try_guestaccess($instance);
+            if ($until !== false) {
+                // Never use me anywhere but here and require_login
+                $USER->enrol['tempguest'][$courseid] = $until;
+                $access = true;
+                break;
+            }
+        }
+    }
+
+    // If we don't already have access (from above) check the cache and see whether
+    // there is record of it in there.
+    if (!$access && isset($USER->enrol['tempguest'][$courseid])) {
+        // Never use me anywhere but here and require_login
+        if ($USER->enrol['tempguest'][$courseid] == 0) {
+            $access = true;
+        } else if ($USER->enrol['tempguest'][$courseid] > time()) {
+            $access = true;
+        } else {
+            //expired
+            unset($USER->enrol['tempguest'][$courseid]);
+        }
+    }
+    return $access;
+}
+
 /**
  * Returns array with sql code and parameters returning all ids
  * of users enrolled into course.