MDL-11421 context levels fixed in capability definitions, sorting of caps by name, plug-ins may report used core caps, fixed some risks
This commit is contained in:
+53
-59
@@ -3399,45 +3399,83 @@ function fetch_context_capabilities($context) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$sort = 'ORDER BY contextlevel,component,id'; // To group them sensibly for display
|
||||
$sort = 'ORDER BY contextlevel,component,name'; // To group them sensibly for display
|
||||
|
||||
switch ($context->contextlevel) {
|
||||
|
||||
case CONTEXT_SYSTEM: // all
|
||||
$SQL = "select * from {$CFG->prefix}capabilities";
|
||||
$SQL = "SELECT *
|
||||
FROM {$CFG->prefix}capabilities";
|
||||
break;
|
||||
|
||||
case CONTEXT_USER:
|
||||
$extracaps = array('moodle/grade:viewall');
|
||||
foreach ($extracaps as $key=>$value) {
|
||||
$extracaps[$key]= "'$value'";
|
||||
}
|
||||
$extra = implode(',', $extracaps);
|
||||
$SQL = "SELECT *
|
||||
FROM {$CFG->prefix}capabilities
|
||||
WHERE contextlevel = ".CONTEXT_USER;
|
||||
FROM {$CFG->prefix}capabilities
|
||||
WHERE contextlevel = ".CONTEXT_USER."
|
||||
OR name IN ($extra)";
|
||||
break;
|
||||
|
||||
case CONTEXT_COURSECAT: // all
|
||||
$SQL = "select * from {$CFG->prefix}capabilities";
|
||||
case CONTEXT_COURSECAT: // course category context and bellow
|
||||
$SQL = "SELECT *
|
||||
FROM {$CFG->prefix}capabilities
|
||||
WHERE contextlevel IN (".CONTEXT_COURSECAT.",".CONTEXT_COURSE.",".CONTEXT_MODULE.",".CONTEXT_BLOCK.")";
|
||||
break;
|
||||
|
||||
case CONTEXT_COURSE: // all
|
||||
$SQL = "select * from {$CFG->prefix}capabilities";
|
||||
break;
|
||||
|
||||
case CONTEXT_GROUP: // group caps
|
||||
case CONTEXT_COURSE: // course context and bellow
|
||||
$SQL = "SELECT *
|
||||
FROM {$CFG->prefix}capabilities
|
||||
WHERE contextlevel IN (".CONTEXT_COURSE.",".CONTEXT_MODULE.",".CONTEXT_BLOCK.")";
|
||||
break;
|
||||
|
||||
case CONTEXT_MODULE: // mod caps
|
||||
$cm = get_record('course_modules', 'id', $context->instanceid);
|
||||
$module = get_record('modules', 'id', $cm->module);
|
||||
|
||||
$SQL = "select * from {$CFG->prefix}capabilities where contextlevel = ".CONTEXT_MODULE."
|
||||
and component = 'mod/$module->name'";
|
||||
$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)";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$SQL = "SELECT *
|
||||
FROM {$CFG->prefix}capabilities
|
||||
WHERE contextlevel = ".CONTEXT_MODULE."
|
||||
AND component = 'mod/$module->name'
|
||||
$extra";
|
||||
break;
|
||||
|
||||
case CONTEXT_BLOCK: // block caps
|
||||
$cb = get_record('block_instance', 'id', $context->instanceid);
|
||||
$block = get_record('block', 'id', $cb->blockid);
|
||||
|
||||
$SQL = "select * from {$CFG->prefix}capabilities where (contextlevel = ".CONTEXT_BLOCK." AND component = 'moodle')
|
||||
OR (component = 'block/$block->name')";
|
||||
$extra = "";
|
||||
if ($blockinstance = block_instance($block->name)) {
|
||||
if ($extracaps = $blockinstance->get_extra_capabilities()) {
|
||||
$extra = implode(',', $extracaps);
|
||||
$extra = "OR name IN ($extra)";
|
||||
}
|
||||
}
|
||||
|
||||
$SQL = "SELECT *
|
||||
FROM {$CFG->prefix}capabilities
|
||||
WHERE (contextlevel = ".CONTEXT_BLOCK."
|
||||
AND component = 'block/$block->name')
|
||||
$extra";
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -3448,50 +3486,6 @@ function fetch_context_capabilities($context) {
|
||||
$records = array();
|
||||
}
|
||||
|
||||
/// the rest of code is a bit hacky, think twice before modifying it :-(
|
||||
|
||||
// special sorting of core system capabiltites and enrollments
|
||||
if (in_array($context->contextlevel, array(CONTEXT_SYSTEM, CONTEXT_COURSECAT, CONTEXT_COURSE))) {
|
||||
$first = array();
|
||||
foreach ($records as $key=>$record) {
|
||||
if (preg_match('|^moodle/|', $record->name) and $record->contextlevel == CONTEXT_SYSTEM) {
|
||||
$first[$key] = $record;
|
||||
unset($records[$key]);
|
||||
} else if (count($first)){
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (count($first)) {
|
||||
$records = $first + $records; // merge the two arrays keeping the keys
|
||||
}
|
||||
} else {
|
||||
$contextindependentcaps = fetch_context_independent_capabilities();
|
||||
$records = array_merge($contextindependentcaps, $records);
|
||||
}
|
||||
|
||||
return $records;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the context-independent capabilities that should be overrridable in
|
||||
* any context.
|
||||
* @return array of capability records from the capabilities table.
|
||||
*/
|
||||
function fetch_context_independent_capabilities() {
|
||||
|
||||
//only CONTEXT_SYSTEM capabilities here or it will break the hack in fetch_context_capabilities()
|
||||
$contextindependentcaps = array(
|
||||
'moodle/site:accessallgroups'
|
||||
);
|
||||
|
||||
$records = array();
|
||||
|
||||
foreach ($contextindependentcaps as $capname) {
|
||||
$record = get_record('capabilities', 'name', $capname);
|
||||
array_push($records, $record);
|
||||
}
|
||||
return $records;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user