diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 07fa67e787b..22e0c28db3e 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -1772,13 +1772,28 @@ function require_login($courseorid=0, $autologinguest=true, $cm=null) { print_error('nocontext'); } - if (empty($USER->switchrole[$context->id]) && - !($COURSE->visible && course_parent_visible($COURSE)) && - !has_capability('moodle/course:viewhiddencourses', get_context_instance(CONTEXT_COURSE, $COURSE->id)) ){ - print_header_simple(); - notice(get_string('coursehidden'), $CFG->wwwroot .'/'); - } - + if (empty($USER->access['rsw'][$context->path])) { + // + // Spaghetti logic construct + // + // - able to view course? + // - able to view category? + // => if either is missing, course is hidden from this user + // + // It's carefully ordered so we run the cheap checks first, and the + // more costly checks last... + // + if (! (($COURSE->visible || has_capability('moodle/course:viewhiddencourses', + get_context_instance(CONTEXT_COURSE, + $COURSE->id))) + && (course_parent_visible($COURSE)) || has_capability('moodle/course:viewhiddencourses', + get_context_instance(CONTEXT_COURSECAT, + $COURSE->category)))) { + print_header_simple(); + notice(get_string('coursehidden'), $CFG->wwwroot .'/'); + } + } + /// Non-guests who don't currently have access, check if they can be allowed in as a guest if ($USER->username != 'guest' and !has_capability('moodle/course:view', $context)) {