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:
skodak
2008-07-24 21:58:05 +00:00
parent 1b5b25b498
commit 3e79b6e37a
25 changed files with 224 additions and 94 deletions
+53 -59
View File
@@ -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;
}