diff --git a/lib/accesslib.php b/lib/accesslib.php index 473e4df3e27..9ac1261a0ff 100755 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -3558,21 +3558,31 @@ function fetch_context_capabilities($context) { $cm = get_record('course_modules', 'id', $context->instanceid); $module = get_record('modules', 'id', $cm->module); - $extra = ""; $modfile = "$CFG->dirroot/mod/$module->name/lib.php"; if (file_exists($modfile)) { include_once($modfile); $modfunction = $module->name.'_get_extra_capabilities'; if (function_exists($modfunction)) { - if ($extracaps = $modfunction()) { - foreach ($extracaps as $key=>$value) { - $extracaps[$key]= "'$value'"; - } - $extra = implode(',', $extracaps); - $extra = "OR name IN ($extra)"; - } + $extracaps = $modfunction(); } } + if(empty($extracaps)) { + $extracaps = array(); + } + + // All modules allow viewhiddenactivities. This is so you can hide + // the module then override to allow specific roles to see it. + // The actual check is in course page so not module-specific + $extracaps[]="moodle/course:viewhiddenactivities"; + if (count($extracaps) == 1) { + $extra = "OR name = '".reset($extracaps)."'"; + } else { + foreach ($extracaps as $key=>$value) { + $extracaps[$key]= "'$value'"; + } + $extra = implode(',', $extracaps); + $extra = "OR name IN ($extra)"; + } $SQL = "SELECT * FROM {$CFG->prefix}capabilities diff --git a/lib/moodlelib.php b/lib/moodlelib.php index a04b1d75676..20a88093cf9 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -1986,10 +1986,15 @@ function require_login($courseorid=0, $autologinguest=true, $cm=null, $setwantsu print_error('nocontext'); } } + if (!empty($cm) && !isset($cm->context)) { + if ( ! $cm->context = get_context_instance(CONTEXT_MODULE, $cm->id) ) { + print_error('nocontext'); + } + } if ($COURSE->id == SITEID) { /// Eliminate hidden site activities straight away if (!empty($cm) && !$cm->visible - && !has_capability('moodle/course:viewhiddenactivities', $COURSE->context)) { + && !has_capability('moodle/course:viewhiddenactivities', $cm->context)) { redirect($CFG->wwwroot, get_string('activityiscurrentlyhidden')); } user_accesstime_log($COURSE->id); /// Access granted, update lastaccess times @@ -2080,7 +2085,7 @@ function require_login($courseorid=0, $autologinguest=true, $cm=null, $setwantsu /// Make sure they can read this activity too, if specified - if (!empty($cm) and !$cm->visible and !has_capability('moodle/course:viewhiddenactivities', $COURSE->context)) { + if (!empty($cm) and !$cm->visible and !has_capability('moodle/course:viewhiddenactivities', $cm->context)) { redirect($CFG->wwwroot.'/course/view.php?id='.$cm->course, get_string('activityiscurrentlyhidden')); } user_accesstime_log($COURSE->id); /// Access granted, update lastaccess times