From 20aeb4b8e327857c02e74d4cecb98f7175d4f5d5 Mon Sep 17 00:00:00 2001 From: toyomoyo Date: Fri, 1 Sep 2006 09:25:34 +0000 Subject: [PATCH] utf8 migrate support for site with roles active, resolved isstudent legacy problem, implemented $CFG->notloggedinroleid --- admin/index.php | 1 - admin/utfdbmigrate.php | 39 ++++++-- lib/accesslib.php | 208 +++++++++++++++++++++++------------------ lib/datalib.php | 11 +-- lib/moodlelib.php | 30 +++--- 5 files changed, 171 insertions(+), 118 deletions(-) diff --git a/admin/index.php b/admin/index.php index e152dbc3782..2148c194f08 100644 --- a/admin/index.php +++ b/admin/index.php @@ -23,7 +23,6 @@ require_once('../config.php'); include_once($CFG->dirroot.'/lib/adminlib.php'); // Contains various admin-only functions - include_once($CFG->dirroot.'/lib/ddllib.php'); // Install/upgrade related db functions $id = optional_param('id', '', PARAM_ALPHANUM); diff --git a/admin/utfdbmigrate.php b/admin/utfdbmigrate.php index b58fbad97c5..746e560ffa6 100755 --- a/admin/utfdbmigrate.php +++ b/admin/utfdbmigrate.php @@ -863,19 +863,40 @@ function get_main_teacher_lang($courseid) { global $CFG; static $mainteachercache; + if ($courseid == SITEID || $courseid==0) { + $admin = get_admin(); + $mainteachercache[$courseid] = $admin->lang; + return $admin->lang; + } + if (!isset($mainteachercache[$courseid])) { - $SQL = 'SELECT u.lang from '.$CFG->prefix.'user_teachers ut, - '.$CFG->prefix.'course c, - '.$CFG->prefix.'user u WHERE - c.id = ut.course AND ut.course = '.$courseid.' AND u.id = ut.userid ORDER BY ut.authority ASC'; - - if ($teacher = get_record_sql($SQL, true)) { + + /// this is a worse guess + if (!empty($CFG->rolesactive)) { + + $context = get_context_instance(CONTEXT_COURSE, $courseid); + $teachers = get_users_by_capability($context, 'moodle/legacy:editingteacher', 'distinct u.*', ' ORDER BY ra.id ASC ', sql_paging_limit(0,1)); // only need first one + $teacher = array_shift($teachers); $mainteachercache[$courseid] = $teacher->lang; + return $teacher->lang; + + /// this is a better guess } else { - $admin = get_admin(); - $mainteachercache[$courseid] = $admin->lang; - return $admin->lang; + + $SQL = 'SELECT u.lang from '.$CFG->prefix.'user_teachers ut, + '.$CFG->prefix.'course c, + '.$CFG->prefix.'user u WHERE + c.id = ut.course AND ut.course = '.$courseid.' AND u.id = ut.userid ORDER BY ut.authority ASC'; + + if ($teacher = get_record_sql($SQL, true)) { + $mainteachercache[$courseid] = $teacher->lang; + return $teacher->lang; + } else { + $admin = get_admin(); + $mainteachercache[$courseid] = $admin->lang; + return $admin->lang; + } } } else { return $mainteachercache[$courseid]; diff --git a/lib/accesslib.php b/lib/accesslib.php index 5ef5189fb23..107d5af9e67 100755 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -32,6 +32,23 @@ define('CONTEXT_BLOCK', 80); $context_cache = array(); // Cache of all used context objects for performance (by level and instance) $context_cache_id = array(); // Index to above cache by id +function load_notloggedin_role() { + global $CFG, $USER; + + $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); + // load default not logged in role capabilities when user is not logged in + + $SQL = "select * from {$CFG->prefix}role_capabilities where roleid=$CFG->notloggedinroleid + AND contextid = $sitecontext->id"; + + $capabilities = get_records_sql($SQL); + + foreach ($capabilities as $capability) { + $USER->capabilities[$sitecontext->id][$capability->capability] = $capability->permission; + } + + return true; +} /** * This functions get all the course categories in proper order @@ -140,13 +157,18 @@ function require_capability($capability, $context=NULL, $userid=NULL, $errormess * @param string $capability - name of the capability * @param object $context - a context object (record from context table) * @param integer $userid - a userid number + * @param bool $doanything - if false, ignore do anything * @return bool */ -function has_capability($capability, $context=NULL, $userid=NULL) { +function has_capability($capability, $context=NULL, $userid=NULL, $doanything='true') { - global $USER, $CONTEXT; + global $USER, $CONTEXT, $CFG; - if ($userid) { + if (!isloggedin() && !isset($USER->capabilities)) { + load_notloggedin_role(); + } + + if ($userid && $userid != $USER->id) { if (empty($USER->id) or ($userid != $USER->id)) { $capabilities = load_user_capability($capability, $context, $userid); } else { //$USER->id == $userid @@ -168,102 +190,103 @@ function has_capability($capability, $context=NULL, $userid=NULL) { } } - // Check site - $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (isset($capabilities[$sitecontext->id]['moodle/site:doanything'])) { - return (0 < $capabilities[$sitecontext->id]['moodle/site:doanything']); - } + if ($doanything) { + // Check site + $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); + if (isset($capabilities[$sitecontext->id]['moodle/site:doanything'])) { + return (0 < $capabilities[$sitecontext->id]['moodle/site:doanything']); + } - switch ($context->aggregatelevel) { + switch ($context->aggregatelevel) { - case CONTEXT_COURSECAT: - // Check parent cats. - $parentcats = get_parent_cats($context, CONTEXT_COURSECAT); - foreach ($parentcats as $parentcat) { - if (isset($capabilities[$parentcat]['moodle/site:doanything'])) { - return (0 < $capabilities[$parentcat]['moodle/site:doanything']); + case CONTEXT_COURSECAT: + // Check parent cats. + $parentcats = get_parent_cats($context, CONTEXT_COURSECAT); + foreach ($parentcats as $parentcat) { + if (isset($capabilities[$parentcat]['moodle/site:doanything'])) { + return (0 < $capabilities[$parentcat]['moodle/site:doanything']); + } } - } - break; + break; - case CONTEXT_COURSE: - // Check parent cat. - $parentcats = get_parent_cats($context, CONTEXT_COURSE); + case CONTEXT_COURSE: + // Check parent cat. + $parentcats = get_parent_cats($context, CONTEXT_COURSE); - foreach ($parentcats as $parentcat) { - if (isset($capabilities[$parentcat]['do_anything'])) { - return (0 < $capabilities[$parentcat]['do_anything']); - } - } - break; - - case CONTEXT_GROUP: - // Find course. - $group = get_record('groups','id',$context->instanceid); - $courseinstance = get_context_instance(CONTEXT_COURSE, $group->courseid); - - $parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE); - foreach ($parentcats as $parentcat) { - if (isset($capabilities[$parentcat->id]['do_anything'])) { - return (0 < $capabilities[$parentcat->id]['do_anything']); - } - } - - $coursecontext = ''; - if (isset($capabilities[$courseinstance->id]['do_anything'])) { - return (0 < $capabilities[$courseinstance->id]['do_anything']); - } - - break; - - case CONTEXT_MODULE: - // Find course. - $cm = get_record('course_modules', 'id', $context->instanceid); - $courseinstance = get_context_instance(CONTEXT_COURSE, $cm->course); - - if ($parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE)) { foreach ($parentcats as $parentcat) { if (isset($capabilities[$parentcat]['do_anything'])) { return (0 < $capabilities[$parentcat]['do_anything']); } } - } + break; - if (isset($capabilities[$courseinstance->id]['do_anything'])) { - return (0 < $capabilities[$courseinstance->id]['do_anything']); - } + case CONTEXT_GROUP: + // Find course. + $group = get_record('groups','id',$context->instanceid); + $courseinstance = get_context_instance(CONTEXT_COURSE, $group->courseid); - break; - - case CONTEXT_BLOCK: - // 1 to 1 to course. - // Find course. - $block = get_record('block_instance','id',$context->instanceid); - $courseinstance = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check - - $parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE); - foreach ($parentcats as $parentcat) { - if (isset($capabilities[$parentcat]['do_anything'])) { - return (0 < $capabilities[$parentcat]['do_anything']); + $parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE); + foreach ($parentcats as $parentcat) { + if (isset($capabilities[$parentcat->id]['do_anything'])) { + return (0 < $capabilities[$parentcat->id]['do_anything']); + } } - } - if (isset($capabilities[$courseinstance->id]['do_anything'])) { - return (0 < $capabilities[$courseinstance->id]['do_anything']); - } - break; + $coursecontext = ''; + if (isset($capabilities[$courseinstance->id]['do_anything'])) { + return (0 < $capabilities[$courseinstance->id]['do_anything']); + } - default: - // CONTEXT_SYSTEM: CONTEXT_PERSONAL: CONTEXT_USERID: - // Do nothing. - break; + break; + + case CONTEXT_MODULE: + // Find course. + $cm = get_record('course_modules', 'id', $context->instanceid); + $courseinstance = get_context_instance(CONTEXT_COURSE, $cm->course); + + if ($parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE)) { + foreach ($parentcats as $parentcat) { + if (isset($capabilities[$parentcat]['do_anything'])) { + return (0 < $capabilities[$parentcat]['do_anything']); + } + } + } + + if (isset($capabilities[$courseinstance->id]['do_anything'])) { + return (0 < $capabilities[$courseinstance->id]['do_anything']); + } + + break; + + case CONTEXT_BLOCK: + // 1 to 1 to course. + // Find course. + $block = get_record('block_instance','id',$context->instanceid); + $courseinstance = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check + + $parentcats = get_parent_cats($courseinstance, CONTEXT_COURSE); + foreach ($parentcats as $parentcat) { + if (isset($capabilities[$parentcat]['do_anything'])) { + return (0 < $capabilities[$parentcat]['do_anything']); + } + } + + if (isset($capabilities[$courseinstance->id]['do_anything'])) { + return (0 < $capabilities[$courseinstance->id]['do_anything']); + } + break; + + default: + // CONTEXT_SYSTEM: CONTEXT_PERSONAL: CONTEXT_USERID: + // Do nothing. + break; + } + + // Last: check self. + if (isset($capabilities[$context->id]['do_anything'])) { + return (0 < $capabilities[$context->id]['do_anything']); + } } - - // Last: check self. - if (isset($capabilities[$context->id]['do_anything'])) { - return (0 < $capabilities[$context->id]['do_anything']); - } - // do_anything has not been set, we now look for it the normal way. return (0 < capability_search($capability, $context, $capabilities)); @@ -279,9 +302,9 @@ function has_capability($capability, $context=NULL, $userid=NULL) { * @return permission (int) */ function capability_search($capability, $context, $capabilities) { + global $USER, $CFG; - if (isset($capabilities[$context->id][$capability])) { if ($CFG->debug > 15) { notify("Found $capability in context $context->id at level $context->aggregatelevel: ".$capabilities[$context->id][$capability], 'notifytiny'); @@ -374,6 +397,11 @@ function load_user_capability($capability='', $context ='', $userid='') { global $USER, $CFG; + // make sure it's cleaned when loaded (again) + if (!empty($USER->capabilities)) { + unset($USER->capabilities); + } + if (empty($userid)) { $userid = $USER->id; } else { @@ -1509,11 +1537,11 @@ function role_context_capabilities($roleid, $context, $cap='') { $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); if ($sitecontext->id == $context->id) { - return array(); + $contexts = array($sitecontext->id); + } else { + // first of all, figure out all parental contexts + $contexts = array_reverse(get_parent_contexts($context)); } - - // first of all, figure out all parental contexts - $contexts = array_reverse(get_parent_contexts($context)); $contexts = '('.implode(',', $contexts).')'; if ($cap) { @@ -1903,7 +1931,7 @@ function get_overridable_roles ($context) { * @param $fields - fields to be pulled * @param $sort - the sort order */ -function get_users_by_capability($context, $capability, $fields='distinct u.*', $sort='') { +function get_users_by_capability($context, $capability, $fields='distinct u.*', $sort='', $limit='') { global $CFG; @@ -1930,7 +1958,7 @@ function get_users_by_capability($context, $capability, $fields='distinct u.*', $from = ' FROM '.$CFG->prefix.'user u LEFT JOIN '.$CFG->prefix.'role_assignments ra ON ra.userid = u.id '; $where = ' WHERE (ra.contextid = '.$context->id.' OR ra.contextid in '.$listofcontexts.') AND u.deleted = 0 AND ra.roleid in '.$roleids.' '; - return get_records_sql($select.$from.$where); + return get_records_sql($select.$from.$where.$sort.$limit); } ?> diff --git a/lib/datalib.php b/lib/datalib.php index 1e957b7f966..48a935cb049 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -47,7 +47,7 @@ function get_guest() { /** * Returns $user object of the main admin user - * + * primary admin = admin with lowest role_assignment id among admins * @uses $CFG * @return object(admin) An associative array representing the admin user. * @todo Verify documentation of this function @@ -74,12 +74,11 @@ function get_admin () { function get_admins() { global $CFG; + + $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - return get_records_sql("SELECT u.*, a.id as adminid - FROM {$CFG->prefix}user u, - {$CFG->prefix}user_admins a - WHERE a.userid = u.id - ORDER BY a.id ASC"); + return get_users_by_capability($context, 'moodle/legacy:admin', 'distinct u.*, ra.id as adminid', ' ORDER BY ra.id ASC '); // only need first one + } /** diff --git a/lib/moodlelib.php b/lib/moodlelib.php index b0087a5ff7c..af9a10cbaab 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -1983,9 +1983,9 @@ function isadmin($userid=0) { $context = get_context_instance(CONTEXT_SYSTEM, SITEID); if (!$userid) { - return has_capability('moodle/legacy:admin', $context); + return has_capability('moodle/legacy:admin', $context, $USER->id, false); } else { - return has_capability('moodle/legacy:admin', $context, false, $userid); + return has_capability('moodle/legacy:admin', $context, false, $userid, false); } } @@ -2044,11 +2044,13 @@ function isteacher($courseid=0, $userid=0, $includeadmin=true) { if (!$userid) { - return (has_capability('moodle/legacy:teacher', $context) - or has_capability('moodle/legacy:editingteacher', $context)); + return (has_capability('moodle/legacy:teacher', $context, $USER->id, false) + or has_capability('moodle/legacy:editingteacher', $context, $USER->id, false) + or has_capability('moodle/legacy:admin', $context, $USER->id, false)); } else { - return (has_capability('moodle/legacy:teacher', $context, $userid) - or has_capability('moodle/legacy:editingteacher', $context, $userid)); + return (has_capability('moodle/legacy:teacher', $context, $userid, false) + or has_capability('moodle/legacy:editingteacher', $context, $userid, false) + or has_capability('moodle/legacy:admin', $context, $userid, false)); } } @@ -2135,9 +2137,11 @@ function isteacheredit($courseid, $userid=0, $ignorestudentview=false) { } if (!$userid) { - return has_capability('moodle/legacy:editingteacher', $context); + return (has_capability('moodle/legacy:editingteacher', $context, $USER->id, false) + or has_capability('moodle/legacy:admin', $context, $USER->id, false)); } else { - return has_capability('moodle/legacy:editingteacher', $context, $userid); + return (has_capability('moodle/legacy:editingteacher', $context, $userid, false) + or has_capability('moodle/legacy:admin', $context, $userid, false)); } } // we can't edit in studentview @@ -2177,9 +2181,11 @@ function iscreator ($userid=0) { $context = get_context_instance(CONTEXT_SYSTEM, SITEID); if (!$userid) { - return has_capability('moodle/legacy:coursecreator', $context); + return (has_capability('moodle/legacy:coursecreator', $context, $USER->id, false) + or has_capability('moodle/legacy:admin', $context, $USER->id, false)); } else { - return has_capability('moodle/legacy:coursecreator', $context, $userid); + return (has_capability('moodle/legacy:coursecreator', $context, $userid, false) + or has_capability('moodle/legacy:admin', $context, $userid, false)); } } @@ -2221,9 +2227,9 @@ function isstudent($courseid, $userid=0) { } if (!$userid) { - return has_capability('moodle/legacy:student', $context); + return has_capability('moodle/legacy:student', $context, $USER->id, false); } else { - return has_capability('moodle/legacy:student', $context, $userid); + return has_capability('moodle/legacy:student', $context, $userid, false); } }