From 0468976c9a13b98e2ef5c6353804acff173869a5 Mon Sep 17 00:00:00 2001 From: moodler Date: Mon, 14 Aug 2006 05:55:40 +0000 Subject: [PATCH] SWEEPING CLEANUP The API was changed slightly so that has_capability now takes the whole $context object (we almost always have it anyway) The $kill thing was removed. If you want to assert a capability then use: require_capability('capname', $context); with optional variables to modify the error message Misc bugs here and there also removed and code tidied --- admin/config.php | 2 +- admin/configure.php | 2 +- admin/index.php | 2 +- admin/roles/assign.php | 24 +- admin/roles/manage.php | 74 +++---- admin/user.php | 16 +- admin/users.php | 6 +- blocks/admin/block_admin.php | 24 +- blocks/moodleblock.class.php | 2 +- blocks/participants/block_participants.php | 2 +- blog/edit.php | 6 +- blog/index.php | 14 +- blog/lib.php | 10 +- blog/preferences.php | 2 +- blog/tags.html | 4 +- blog/tags.php | 10 +- course/category.php | 12 +- course/edit.php | 4 +- course/group.php | 2 +- course/groups.php | 2 +- course/index.php | 12 +- course/lib.php | 2 +- course/mod.php | 22 +- course/scales.php | 14 +- lib/accesslib.php | 205 +++++++++--------- lib/moodlelib.php | 37 ++-- mod/assignment/lib.php | 6 +- .../type/online/assignment.class.php | 4 +- .../type/uploadsingle/assignment.class.php | 4 +- mod/chat/gui_header_js/index.php | 8 +- mod/chat/lib.php | 2 +- mod/chat/report.php | 22 +- mod/chat/view.php | 8 +- mod/choice/lib.php | 12 +- mod/choice/report.php | 87 ++++---- mod/choice/view.php | 8 +- mod/data/comment.php | 2 +- mod/data/field.php | 2 +- mod/data/import.php | 4 +- mod/data/lib.php | 14 +- mod/data/tabs.php | 4 +- mod/data/templates.php | 18 +- mod/data/view.php | 16 +- mod/exercise/assessments.php | 30 +-- mod/exercise/view.php | 4 +- mod/forum/discuss.php | 18 +- mod/forum/index.php | 10 +- mod/forum/lib.php | 38 ++-- mod/forum/post.html | 4 +- mod/forum/post.php | 28 +-- mod/forum/rate.php | 4 +- mod/forum/report.php | 4 +- mod/forum/search.php | 4 +- mod/forum/subscribe.php | 8 +- mod/forum/subscribers.php | 4 +- mod/forum/user.php | 2 +- mod/forum/view.php | 16 +- mod/glossary/approve.php | 2 +- mod/glossary/comment.php | 8 +- mod/glossary/comments.php | 2 +- mod/glossary/deleteentry.php | 2 +- mod/glossary/edit.php | 14 +- mod/glossary/editcategories.php | 2 +- mod/glossary/export.php | 2 +- mod/glossary/exportentry.php | 2 +- mod/glossary/exportfile.php | 4 +- mod/glossary/import.php | 2 +- mod/glossary/lib.php | 16 +- mod/glossary/report.php | 4 +- mod/glossary/tabs.html | 8 +- mod/glossary/view.php | 4 +- mod/survey/report.php | 10 +- mod/survey/save.php | 2 +- mod/survey/view.php | 9 +- user/edit.php | 8 +- user/index.php | 2 +- 76 files changed, 483 insertions(+), 527 deletions(-) diff --git a/admin/config.php b/admin/config.php index 0f49a3c928..6a8676f1ca 100644 --- a/admin/config.php +++ b/admin/config.php @@ -8,7 +8,7 @@ if ($site = get_site()) { // If false then this is a new installation require_login(); $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (!has_capability('moodle/site:config', $context->id)) { + if (!has_capability('moodle/site:config', $context)) { error('Only the admin can use this page'); } } diff --git a/admin/configure.php b/admin/configure.php index 1ba23bcbf7..db6efa46c7 100644 --- a/admin/configure.php +++ b/admin/configure.php @@ -5,7 +5,7 @@ require_login(); $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (!has_capability('moodle/site:config', $context->id)) { + if (!has_capability('moodle/site:config', $context)) { error('Only the admin can use this page'); } diff --git a/admin/index.php b/admin/index.php index 9db36729f0..3c11774e9a 100644 --- a/admin/index.php +++ b/admin/index.php @@ -339,7 +339,7 @@ $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (!has_capability('moodle/site:config', $context->id)) { + if (!has_capability('moodle/site:config', $context)) { print_error("permissionconfig", '', "$CFG->wwwroot/login/index.php"); } diff --git a/admin/roles/assign.php b/admin/roles/assign.php index 552a89a8a5..6181dbac11 100755 --- a/admin/roles/assign.php +++ b/admin/roles/assign.php @@ -21,15 +21,16 @@ redirect("$CFG->wwwroot/$CFG->admin/index.php"); } - if (! $context = get_record("context", "id", $contextid)) { + if (! $context = get_context_instance_by_id($contextid)) { error("Context ID was incorrect (can't find it)"); } - if (!has_capability('moodle/role:assign', $context->id)) { - error('You do not have the required permission to assign roles to users.'); - } + + require_login(); + + require_capability('moodle/role:assign', $context); /** - * TO DO: + * TODO XXX: * Permission check to see whether this user can assign people to this role * needs to be: * 1) has the capability to assign @@ -37,7 +38,6 @@ * end of permission checking */ - require_login(); $strassignusers = get_string('assignusers', 'role'); $strpotentialusers = get_string('potentialusers', 'role'); @@ -48,8 +48,6 @@ $strsearch = get_string('search'); $strshowall = get_string('showall'); - $context = get_record('context', 'id', $contextid); - $currenttab = ''; $tabsmode = 'assign'; include_once('tabs.php'); @@ -67,14 +65,14 @@ $timemodified = time(); foreach ($frm->addselect as $adduser) { $adduser = clean_param($adduser, PARAM_INT); - if (! role_assign($roleid, $adduser, 0, $contextid, $timestart, $timeend, $hidden)) { + if (! role_assign($roleid, $adduser, 0, $context->id, $timestart, $timeend, $hidden)) { error("Could not add user with id $adduser to this role!"); } } } else if ($remove and !empty($frm->removeselect) and confirm_sesskey()) { foreach ($frm->removeselect as $removeuser) { $removeuser = clean_param($removeuser, PARAM_INT); - if (! role_unassign($roleid, $removeuser, 0, $contextid)) { + if (! role_unassign($roleid, $removeuser, 0, $context->id)) { error("Could not remove user with id $removeuser from this role!"); } } @@ -88,7 +86,7 @@ /// Get all existing students and teachers for this course. $existinguserarray = array(); - $SQL = "select u.* from {$CFG->prefix}role_assignments r, {$CFG->prefix}user u where contextid = $contextid and roleid = $roleid and u.id = r.userid"; // join now so that we can just use fullname() later + $SQL = "select u.* from {$CFG->prefix}role_assignments r, {$CFG->prefix}user u where contextid = $context->id and roleid = $roleid and u.id = r.userid"; // join now so that we can just use fullname() later if (!$contextusers = get_records_sql($SQL)) { $contextusers = array(); @@ -130,8 +128,8 @@ // prints a form to swap roles print ('
'); - print ('
'.$strcurrentcontext.': '.print_context_name($contextid).'
'); - print (''.$strcurrentrole.': '); + print ('
'.$strcurrentcontext.': '.print_context_name($context).'
'); + print (''.$strcurrentrole.': '); choose_from_menu ($options, 'roleid', $roleid, 'choose', $script='rolesform.submit()'); print ('
'); diff --git a/admin/roles/manage.php b/admin/roles/manage.php index 9f9c2eb156..552c9baa73 100755 --- a/admin/roles/manage.php +++ b/admin/roles/manage.php @@ -12,7 +12,6 @@ $confirm = optional_param('confirm', 0, PARAM_BOOL); $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); - $contextid = $sitecontext->id; if (!isadmin()) { error('Only admins can access this page'); @@ -46,18 +45,18 @@ case 'add': $newrole = create_role($name, $description); - + $ignore = array('roleid', 'sesskey', 'action', 'name', 'description', 'contextid'); - + $data = data_submitted(); - - foreach ($data as $capname => $value) { - if (in_array($capname, $ignore)) { - continue; + + foreach ($data as $capname => $value) { + if (in_array($capname, $ignore)) { + continue; } - assign_capability($capname, $value, $newrole, $contextid); - + assign_capability($capname, $value, $newrole, $sitecontext->id); + } break; @@ -68,38 +67,38 @@ $data = data_submitted(); - foreach ($data as $capname => $value) { - if (in_array($capname, $ignore)) { - continue; + foreach ($data as $capname => $value) { + if (in_array($capname, $ignore)) { + continue; } - + // edit default caps $SQL = "select * from {$CFG->prefix}role_capabilities where - roleid = $roleid and capability = '$capname' and contextid = $contextid"; - + roleid = $roleid and capability = '$capname' and contextid = $sitecontext->id"; + $localoverride = get_record_sql($SQL); - - if ($localoverride) { // update current overrides - - if ($value == 0) { // inherit = delete - - unassign_capability($capname, $roleid, $contextid); - - } else { - - $localoverride->permission = $value; - $localoverride->timemodified = time(); - $localoverride->modifierid = $USER->id; - update_record('role_capabilities', $localoverride); - - } - + + if ($localoverride) { // update current overrides + + if ($value == 0) { // inherit = delete + + unassign_capability($capname, $roleid, $sitecontext->id); + + } else { + + $localoverride->permission = $value; + $localoverride->timemodified = time(); + $localoverride->modifierid = $USER->id; + update_record('role_capabilities', $localoverride); + + } + } else { // insert a record - - assign_capability($capname, $value, $roleid, $contextid); + + assign_capability($capname, $value, $roleid, $sitecontext->id); } - + } // update normal role settings @@ -169,14 +168,11 @@ choose_from_menu ($options, 'roleid', $roleid, 'choose', $script='rolesform1.submit()'); print ('
'); - $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); - $contextid = $sitecontext->id; - // this is the array holding capabilities of this role sorted till this context - $r_caps = role_context_capabilities($roleid, $sitecontext->id); + $r_caps = role_context_capabilities($roleid, $sitecontext); // this is the available capabilities assignable in this context - $capabilities = fetch_context_capabilities($sitecontext->id); + $capabilities = fetch_context_capabilities($sitecontext); print_simple_box_start(); include_once('manage.html'); diff --git a/admin/user.php b/admin/user.php index dd518ef36a..0714fdec8f 100644 --- a/admin/user.php +++ b/admin/user.php @@ -106,7 +106,7 @@ if ($newuser && confirm_sesskey()) { // Create a new user - if (!has_capability('moodle/user:create', $context->id)) { + if (!has_capability('moodle/user:create', $context)) { error('You do not have the required permission to create new users.'); } @@ -130,7 +130,7 @@ } else { // List all users for editing - if (!has_capability('moodle/user:update', $context->id)) { + if (!has_capability('moodle/user:update', $context)) { error('You do not have the required permission to edit users.'); } @@ -172,7 +172,7 @@ } else if ($delete and confirm_sesskey()) { // Delete a selected user, after confirmation - if (!has_capability('moodle/user:delete', $context->id)) { + if (!has_capability('moodle/user:delete', $context)) { error('You do not have the required permission to delete a user.'); } @@ -344,7 +344,7 @@ if ($user->id == $USER->id or $user->username == "changeme") { $deletebutton = ""; } else { - if (has_capability('moodle/user:delete', $context->id)) { + if (has_capability('moodle/user:delete', $context)) { $deletebutton = "id&sesskey=$USER->sesskey\">$strdelete"; } else { $deletebutton =""; } @@ -361,7 +361,7 @@ } $fullname = fullname($user, true); - if (has_capability('moodle/user:edit', $context->id)) { + if (has_capability('moodle/user:edit', $context)) { $table->data[] = array ("id&course=$site->id\">$fullname", "$user->email", @@ -394,7 +394,7 @@ echo ""; echo ""; - if (has_capability('moodle/user:create', $context->id)) { + if (has_capability('moodle/user:create', $context)) { print_heading("sesskey\">".get_string("addnewuser").""); } if (!empty($table)) { @@ -402,7 +402,7 @@ print_paging_bar($usercount, $page, $perpage, "user.php?sort=$sort&dir=$dir&perpage=$perpage". "&firstinitial=$firstinitial&lastinitial=$lastinitial&search=".urlencode(stripslashes($search))."&"); - if (has_capability('moodle/user:create', $context->id)) { + if (has_capability('moodle/user:create', $context)) { print_heading("sesskey\">".get_string("addnewuser").""); } } @@ -411,4 +411,4 @@ print_footer(); } -?> \ No newline at end of file +?> diff --git a/admin/users.php b/admin/users.php index 68d674ee54..60c85193a6 100644 --- a/admin/users.php +++ b/admin/users.php @@ -25,17 +25,17 @@ $table->data[] = array("sesskey\">".get_string("authentication")."", get_string("adminhelpauthentication")); - if (has_capability('moodle/user:update', $context->id)) { + if (has_capability('moodle/user:update', $context)) { $table->data[] = array("".get_string("edituser")."", get_string("adminhelpedituser")); } - if (has_capability('moodle/user:create', $context->id)) { + if (has_capability('moodle/user:create', $context)) { $table->data[] = array("wwwroot/$CFG->admin/user.php?newuser=true&sesskey=$USER->sesskey\">".get_string("addnewuser")."", get_string("adminhelpaddnewuser")); } - if (has_capability('moodle/user:create', $context->id)) { + if (has_capability('moodle/user:create', $context)) { $table->data[] = array("wwwroot/$CFG->admin/uploaduser.php?sesskey=$USER->sesskey\">".get_string("uploadusers")."", get_string("adminhelpuploadusers")); } diff --git a/blocks/admin/block_admin.php b/blocks/admin/block_admin.php index af67a8a512..66764fca9e 100644 --- a/blocks/admin/block_admin.php +++ b/blocks/admin/block_admin.php @@ -33,33 +33,33 @@ class block_admin extends block_list { global $CFG, $USER; $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (has_capability('moodle/site:config', $context->id)) { + if (has_capability('moodle/site:config', $context)) { $this->content->items[] = ''.get_string('configuration').''; $this->content->icons[] = ''; } - if (has_capability('moodle/site:config', $context->id)) { + if (has_capability('moodle/site:config', $context)) { $this->content->items[] = ''.get_string('users').''; $this->content->icons[] = ''; } - if (has_capability('moodle/site:backup', $context->id)) { + if (has_capability('moodle/site:backup', $context)) { $this->content->items[]=''.get_string('backup').''; $this->content->icons[]=''; } - if (has_capability('moodle/site:restore', $context->id)) { + if (has_capability('moodle/site:restore', $context)) { $this->content->items[]=''.get_string('restore').''; $this->content->icons[]=''; } - if (has_capability('moodle/course:create', $context->id)) { + if (has_capability('moodle/course:create', $context)) { $this->content->items[] = ''.get_string('courses').''; $this->content->icons[] = ''; } - if (has_capability('moodle/site:config', $context->id)) { + if (has_capability('moodle/site:config', $context)) { $this->content->items[] = ''.get_string('logs').''; $this->content->icons[] = ''; @@ -111,7 +111,7 @@ class block_admin extends block_list { $isteacheredit = isteacheredit($this->instance->pageid); - if (has_capability('moodle/course:update', $context->id)) { + if (has_capability('moodle/course:update', $context)) { //if (isteacheredit($this->instance->pageid)) { $this->content->icons[]=''; if (isediting($this->instance->pageid)) { @@ -136,7 +136,7 @@ class block_admin extends block_list { $this->content->icons[]=''; /// always need a role assignment link - if (has_capability('moodle/role:assign', $context->id)) { + if (has_capability('moodle/role:assign', $context)) { $this->content->items[]=''.get_string('assignusers', 'roles').''; $this->content->icons[]=''; } @@ -152,12 +152,12 @@ class block_admin extends block_list { $this->content->icons[]=''; } - if (has_capability('moodle/site:backup', $context->id)) { + if (has_capability('moodle/site:backup', $context)) { $this->content->items[]=''.get_string('backup').''; $this->content->icons[]=''; } - if (has_capability('moodle/site:restore', $context->id)) { + if (has_capability('moodle/site:restore', $context)) { $this->content->items[]=''.get_string('restore').''; $this->content->icons[]=''; } @@ -165,7 +165,7 @@ class block_admin extends block_list { $this->content->items[]=''.get_string('import').''; $this->content->icons[]=''; - if (has_capability('moodle/site:import', $context->id)) { + if (has_capability('moodle/site:import', $context)) { $this->content->items[]=''.get_string('reset').''; $this->content->icons[]=''; } @@ -176,7 +176,7 @@ class block_admin extends block_list { $this->content->items[]=''.get_string('questions', 'quiz').''; $this->content->icons[]=''; - if (has_capability('moodle/course:managescales', $context->id)) { + if (has_capability('moodle/course:managescales', $context)) { $this->content->items[]=''.get_string('scales').''; $this->content->icons[]=''; } diff --git a/blocks/moodleblock.class.php b/blocks/moodleblock.class.php index e3c170b178..3503cf7aa6 100644 --- a/blocks/moodleblock.class.php +++ b/blocks/moodleblock.class.php @@ -299,7 +299,7 @@ class block_base { $context = get_context_instance(CONTEXT_COURSE, $this->instance->pageid); } - if (!has_capability('moodle/site:manageblocks', $context->id)) { + if (!has_capability('moodle/site:manageblocks', $context)) { return null; } break; diff --git a/blocks/participants/block_participants.php b/blocks/participants/block_participants.php index db666b641c..639227d0c6 100644 --- a/blocks/participants/block_participants.php +++ b/blocks/participants/block_participants.php @@ -22,7 +22,7 @@ class block_participants extends block_list { $context = get_context_instance(CONTEXT_COURSE, $this->instance->pageid); } - if (!has_capability('moodle/course:viewparticipants', $context->id)) { + if (!has_capability('moodle/course:viewparticipants', $context)) { $this->context = ''; return $this->content; } diff --git a/blog/edit.php b/blog/edit.php index 171304946f..93355f76b1 100755 --- a/blog/edit.php +++ b/blog/edit.php @@ -18,7 +18,7 @@ if (!$referrer = optional_param('referrer','', PARAM_URL)) { $context = get_context_instance(CONTEXT_SYSTEM, SITEID); -if (!has_capability('moodle/blog:readentries', $context->id)) { +if (!has_capability('moodle/blog:readentries', $context)) { error(get_string('nopost', 'blog'), $referrer); } @@ -28,7 +28,7 @@ if ($editid = optional_param('editid', 0, PARAM_INT)) { $blogEntry = get_record('post', 'id', $editid); - if (!blog_user_can_edit_post($blogEntry, $context->id)) { + if (!blog_user_can_edit_post($blogEntry, $context)) { error( get_string('notallowedtoedit', 'blog'), $CFG->wwwroot .'/login/index.php'); } } @@ -155,7 +155,7 @@ function do_delete($postid) { // check ownership $blogEntry = get_record('post','id',$postid); - if (blog_user_can_edit_post($blogEntry, $context->id)) { + if (blog_user_can_edit_post($blogEntry, $context->id)) { /// XXX TODO if (delete_records('post','id',$postid)) { //echo "bloginfo_arg:"; //debug diff --git a/blog/index.php b/blog/index.php index 845ea209f1..f1a4968ccf 100755 --- a/blog/index.php +++ b/blog/index.php @@ -90,7 +90,7 @@ switch ($filtertype) { case 'site': $context = get_context_instance(CONTEXT_SYSTEM, SITEID); if ($CFG->bloglevel < BLOG_SITE_LEVEL && - !has_capability('moodle/site:config', $context->id)) { + !has_capability('moodle/site:config', $context)) { error('Site blogs is not enabled'); } else if ($CFG->bloglevel < BLOG_GLOBAL_LEVEL) { require_login(); @@ -99,10 +99,10 @@ switch ($filtertype) { case 'course': $context = get_context_instance(CONTEXT_COURSE, $courseid); if ($CFG->bloglevel < BLOG_COURSE_LEVEL && - !has_capability('moodle/course:update', $context->id)) { + !has_capability('moodle/course:update', $context)) { error('Course blogs is not enabled'); } - if (!has_capability('moodle/blog:readentry', $context->id)) { + if (!has_capability('moodle/blog:readentry', $context)) { error('You do not have the required permissions to to view course blogs'); } break; @@ -110,10 +110,10 @@ switch ($filtertype) { $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); $coursecontext = get_context_instance(CONTEXT_COURSE, $courseid); if ($CFG->bloglevel < BLOG_GROUP_LEVEL && - !has_capability('moodle/site:config', $sitecontext->id)) { + !has_capability('moodle/site:config', $sitecontext)) { error ('Group blogs is not enabled'); } - if (!has_capability('moodle/course:update', $coursecontext->id) && + if (!has_capability('moodle/course:update', $coursecontext) && groupmode($course) == SEPARATEGROUPS) { if (!ismember($filterselect)) { error ('You are not a member of this group'); @@ -122,13 +122,13 @@ switch ($filtertype) { /// check if user is editting teacher, or if spg, is member break; case 'user': - $context = get_context_instance(CONTEXT_SYSTEM, $context->id); + $context = get_context_instance(CONTEXT_SYSTEM, $context->id); /// XXXXX TODO if ($CFG->bloglevel < BLOG_USER_LEVEL && !has_capability('moodle/site:config', SITEID)) { error ('Blogs is not enabled'); } if ($CFG->bloglevel == BLOG_USER_LEVEL && $USER->id != $filterselect && - !has_capability('moodle/site:config', $context->id)) { + !has_capability('moodle/site:config', $context)) { error ('Under this setting, you can only view your own blogs'); } diff --git a/blog/lib.php b/blog/lib.php index 216bee9060..e0f0b0965d 100755 --- a/blog/lib.php +++ b/blog/lib.php @@ -292,13 +292,13 @@ * the capability moodle/blog:writeentry, or if they have the capability * moodle/blog:manageentries. */ - function blog_user_can_edit_post($blogEntry, $contextid) { + function blog_user_can_edit_post($blogEntry, $context) { global $CFG, $USER; - return ((has_capability('moodle/blog:writeentries', $contextid) && + return ((has_capability('moodle/blog:writeentries', $context) && $blogEntry->userid == $USER->id) || - has_capability('moodle/blog:manageentries', $context->id)); + has_capability('moodle/blog:manageentries', $context)); } @@ -314,7 +314,7 @@ $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (!has_capability('moodle/blog:readentry', $context->id)) { + if (!has_capability('moodle/blog:readentry', $context)) { return false; } @@ -608,4 +608,4 @@ $filtertype.'&filterselect='.$filterselect.'&'; } -?> \ No newline at end of file +?> diff --git a/blog/preferences.php b/blog/preferences.php index 03e2886f9d..599f3d1b82 100755 --- a/blog/preferences.php +++ b/blog/preferences.php @@ -20,7 +20,7 @@ $context = get_context_instance(CONTEXT_SYSTEM, SITEID); // Ensure that the logged in user has the capability to post blog entries. - if (!has_capability('moodle/blog:writepost', $context->id)) { + if (!has_capability('moodle/blog:writepost', $context)) { error(get_string('nopost', 'blog'), $referrer); } $userid = $USER->id; diff --git a/blog/tags.html b/blog/tags.html index c14dc57324..44e7a59ebb 100755 --- a/blog/tags.html +++ b/blog/tags.html @@ -14,7 +14,7 @@ print_heading(get_string('tagmanagement')); id)) { + if (has_capability('moodle/blog:manageofficialtags', $context)) { ?> :
diff --git a/blog/tags.php b/blog/tags.php index 534e0d5240..46a99359e4 100755 --- a/blog/tags.php +++ b/blog/tags.php @@ -12,7 +12,7 @@ $context = get_context_instance(CONTEXT_SYSTEM, SITEID); switch ($mode) { case 'addofficial': /// Adding official tags. - if (!has_capability('moodle/blog:manageofficialtags', $context->id) || !confirm_sesskey()) { + if (!has_capability('moodle/blog:manageofficialtags', $context) || !confirm_sesskey()) { die('you can not add official tags'); } @@ -39,7 +39,7 @@ switch ($mode) { case 'addpersonal': /// Everyone can add personal tags as long as they can write blog entries. if (!confirm_sesskey() || - !has_capability('moodle/blog:writeentries', $context->id) || + !has_capability('moodle/blog:writeentries', $context) || !isset($USER->id)) { error ('you can not add tags'); } @@ -78,7 +78,7 @@ switch ($mode) { // You can only delete your own tags, or you have to have the // moodle/blog:manageofficialtags capability. - if (!has_capability('moodle/blog:manageofficialtags', $context->id) + if (!has_capability('moodle/blog:manageofficialtags', $context) && $USER->id != $blogtag->userid) { notify(get_string('norighttodeletetag','blog', $blogtag->text)); continue; @@ -86,7 +86,7 @@ switch ($mode) { // You can only delete tags that are referenced if you have // the moodle/blog:manageofficialtags capability. - if (!has_capability('moodle/blog:manageofficialtags', $context->id) + if (!has_capability('moodle/blog:manageofficialtags', $context) && get_records('blog_tag_instance','tagid', $tag)) { notify('tag is used by other users, can not delete!'); continue; @@ -130,4 +130,4 @@ include_once('tags.html'); print_footer(); -?> \ No newline at end of file +?> diff --git a/course/category.php b/course/category.php index 30d22eb212..47400c4a8b 100644 --- a/course/category.php +++ b/course/category.php @@ -308,12 +308,12 @@ echo ''. ''.$strassignteachers.' '; - if (has_capability('moodle/course:delete', $context->id)) { + if (has_capability('moodle/course:delete', $context)) { echo ''. ''.$strdelete.' '; } - if (has_capability('moodle/course:visibility', $context->id)) { + if (has_capability('moodle/course:visibility', $context)) { if (!empty($acourse->visible)) { echo ''. @@ -325,12 +325,12 @@ } } - if (has_capability('moodle/site:backup', $context->id)) { + if (has_capability('moodle/site:backup', $context)) { echo ''. ' '; } - if (has_capability('moodle/site:restore', $context->id)) { + if (has_capability('moodle/site:restore', $context)) { echo ''. ' '; @@ -419,7 +419,7 @@ } $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (has_capability('moodle/course:create', $context->id)) { /// Print button to create a new course + if (has_capability('moodle/course:create', $context)) { /// Print button to create a new course unset($options); $options['category'] = $category->id; print_single_button('edit.php', $options, get_string('addnewcourse'), 'get'); @@ -427,7 +427,7 @@ } $context = get_context_instance(CONTEXT_COURSECAT, $id); - if (has_capability('moodle/category:update', $context->id)) { /// Print form to rename the category + if (has_capability('moodle/category:update', $context)) { /// Print form to rename the category $strrename= get_string('rename'); echo '
'; echo ''; diff --git a/course/edit.php b/course/edit.php index 22fe0b3c7e..3b1321df4d 100644 --- a/course/edit.php +++ b/course/edit.php @@ -21,7 +21,7 @@ $context = get_context_instance(CONTEXT_COURSE, $id); - if (!has_capability('moodle/course:update', $context->id)) { + if (!has_capability('moodle/course:update', $context)) { error("You do not currently have editing privileges!"); } @@ -41,7 +41,7 @@ } else { // Admin is creating a new course $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (!has_capability('moodle/course:create',$context->id)) { + if (!has_capability('moodle/course:create',$context)) { error("You do not currently have course creation privileges!"); } diff --git a/course/group.php b/course/group.php index 311bf7f0fd..9c60633e4c 100644 --- a/course/group.php +++ b/course/group.php @@ -27,7 +27,7 @@ $context = get_context_instance(CONTEXT_GROUP, $group->id); // this is really weird - if (!has_capability('moodle/course:managegroups', $context->id)) { + if (!has_capability('moodle/course:managegroups', $context)) { close_window(); } diff --git a/course/groups.php b/course/groups.php index 01021fee9b..b083dca59e 100644 --- a/course/groups.php +++ b/course/groups.php @@ -38,7 +38,7 @@ require_login($course->id); $context = get_context_instance(CONTEXT_COURSE, $course->id); - if (!has_capability('moodle/course:managegroups', $context->id)) { + if (!has_capability('moodle/course:managegroups', $context)) { redirect("group.php?id=$course->id"); // Not allowed to see all groups } diff --git a/course/index.php b/course/index.php index 8d8b0930ff..71583cdbcc 100644 --- a/course/index.php +++ b/course/index.php @@ -99,7 +99,7 @@ /// If data for a new category was submitted, then add it - if ($form = data_submitted() and confirm_sesskey() and has_capability('moodle/category:create', $context->id)) { + if ($form = data_submitted() and confirm_sesskey() and has_capability('moodle/category:create', $context)) { if (!empty($form->addcategory)) { unset($newcategory); $newcategory->name = $form->addcategory; @@ -119,7 +119,7 @@ // context is coursecat, if not present admins should have it set in site level $context = get_context_instance(CONTEXT_COURSECAT, $delete); - if ($deletecat = get_record("course_categories", "id", $delete) and has_capability('moodle/category:delete', $context->id)) { + if ($deletecat = get_record("course_categories", "id", $delete) and has_capability('moodle/category:delete', $context)) { if (!empty($sure) && $sure == md5($deletecat->timemodified)) { /// Send the children categories to live with their grandparent if ($childcats = get_records("course_categories", "parent", $deletecat->id)) { @@ -274,7 +274,7 @@ fix_course_sortorder(); /// Print form for creating new categories - if (has_capability('moodle/category:create', $context->id)) { + if (has_capability('moodle/category:create', $context)) { echo "
"; echo ""; echo ""; @@ -317,7 +317,7 @@ $options["category"] = $category->id; - if (has_capability('moodle/course:create', $context->id)) { + if (has_capability('moodle/course:create', $context)) { print_single_button("edit.php", $options, get_string("addnewcourse"), "get"); } print_single_button('pending.php',NULL, get_string('coursespending'),"get"); @@ -359,12 +359,12 @@ function print_category_edit($category, $displaylist, $parentslist, $depth=-1, $ echo ""; /// Print little icons - if (has_capability('moodle/category:delete', $context->id)) { + if (has_capability('moodle/category:delete', $context)) { echo "delete\" href=\"index.php?delete=$category->id&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" height=\"11\" width=\"11\" border=\"0\" alt=\"\" /> "; } - if (has_capability('moodle/category:visibility', $context->id)) { + if (has_capability('moodle/category:visibility', $context)) { if (!empty($category->visible)) { echo "hide\" href=\"index.php?hide=$category->id&sesskey=$USER->sesskey\">pixpath/t/hide.gif\" height=\"11\" width=\"11\" border=\"0\" alt=\"\" /> "; diff --git a/course/lib.php b/course/lib.php index 675e5f929f..24242926ad 100644 --- a/course/lib.php +++ b/course/lib.php @@ -1501,7 +1501,7 @@ function print_courses($category, $width="100%", $hidesitecourse = false) { } else { print_heading(get_string("nocoursesyet")); $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - if (has_capability('moodle/course:create', $context->id)) { + if (has_capability('moodle/course:create', $context)) { $options = array(); $options['category'] = $category->id; echo '
'; diff --git a/course/mod.php b/course/mod.php index 29737de16e..4c7ddf8aa9 100644 --- a/course/mod.php +++ b/course/mod.php @@ -63,7 +63,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $course->id); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); $mod->course = $course->id; $mod->modulename = clean_param($mod->modulename, PARAM_SAFEDIR); // For safety @@ -242,7 +242,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $section->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); if (!ismoving($section->course)) { error("You need to copy something first!"); @@ -271,7 +271,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $cm->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); $cm->indent += $indent; @@ -297,7 +297,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $cm->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); set_coursemodule_visible($cm->id, 0); @@ -317,7 +317,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $cm->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); if (! $section = get_record("course_sections", "id", $cm->section)) { error("This module doesn't exist"); @@ -348,7 +348,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $cm->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); set_coursemodule_groupmode($cm->id, $groupmode); @@ -368,7 +368,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $cm->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); if (! $section = get_record("course_sections", "id", $cm->section)) { error("This module doesn't exist"); @@ -409,7 +409,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $cm->course); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); if (! $module = get_record("modules", "id", $cm->module)) { error("This module doesn't exist"); @@ -465,7 +465,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $course->id); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); if (! $module = get_record("modules", "id", $cm->module)) { error("This module doesn't exist"); @@ -522,7 +522,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $course->id); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); if (! $module = get_record("modules", "id", $cm->module)) { error("This module doesn't exist"); @@ -620,7 +620,7 @@ } $context = get_context_instance(CONTEXT_COURSE, $course->id); - has_capability('moodle/course:update', $context->id, true); + require_capability('moodle/course:update', $context); $streditinga = get_string("editinga", "moodle", $fullmodulename); $strmodulenameplural = get_string("modulenameplural", $module->name); diff --git a/course/scales.php b/course/scales.php index 0cd5b72ef0..d3f95513d0 100644 --- a/course/scales.php +++ b/course/scales.php @@ -94,7 +94,7 @@ //If action is details, show the popup info if ($action == "details") { //Check for teacher edit - has_capability('moodle/course:managescales', $context->id, true); + require_capability('moodle/course:managescales', $context); //Check for scale if (! $scale = get_record("scale", "id", $scaleid)) { @@ -130,7 +130,7 @@ $sesskey = !empty($USER->id) ? $USER->sesskey : ''; - has_capability('moodle/course:managescales', $context->id, true); + require_capability('moodle/course:managescales', $context); //Check for scale if action = edit if ($action == "edit") { @@ -235,7 +235,7 @@ //If action is delete, do it if ($action == "delete" and confirm_sesskey()) { //Check for teacher edit - has_capability('moodle/course:managescales', $context->id, true); + require_capability('moodle/course:managescales', $context); //Check for scale if action = edit if (! $scale = get_record("scale", "id", $scaleid)) { error("Scale ID was incorrect"); @@ -266,7 +266,7 @@ //If action is down or up, do it if (($action == "down" || $action == "up") and confirm_sesskey()) { //Check for teacher edit - has_capability('moodle/course:managescales', $context->id, true); + require_capability('moodle/course:managescales', $context); //Check for scale if action = edit if (! $scale = get_record("scale", "id", $scaleid)) { error("Scale ID was incorrect"); @@ -296,7 +296,7 @@ } if ($list) { /// Just list the scales (in a helpwindow) - has_capability('moodle/course:viewscales', $context->id, true); + require_capability('moodle/course:viewscales', $context); print_header($strscales); if (!empty($scaleid)) { @@ -339,7 +339,7 @@ } } else { - if (has_capability('moodle/course:managescales', $context->id)) { + if (has_capability('moodle/course:managescales', $context)) { echo "

("; print_string("scalestip"); echo ")

"; @@ -369,7 +369,7 @@ /// The rest is all about editing the scales - has_capability('moodle/course:managescales', $context->id, true); + require_capability('moodle/course:managescales', $context); /// Print out the main page diff --git a/lib/accesslib.php b/lib/accesslib.php index 29e176f92f..3d7cb6dbd5 100755 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -35,14 +35,13 @@ $context_cache_id = array(); // Index to above cache by id /** * This functions get all the course categories in proper order - * @param int $contextid + * @param int $context * @param int $type * @return array of contextids */ -function get_parent_cats($contextid, $type) { +function get_parent_cats($context, $type) { $parents = array(); - $context = get_context_instance_by_id($contextid); switch($type) { @@ -85,36 +84,53 @@ function get_parent_cats($contextid, $type) { /* Functions for Roles & Capabilites */ +/** + * This function checks for a capability assertion being true. If it isn't + * then the page is terminated neatly with a standard error message + * @param string $capability - name of the capability + * @param object $context - a context object (record from context table) + * @param integer $userid - a userid number + * @param string $errorstring - an errorstring + */ +function require_capability($capability, $context=NULL, $userid=NULL, $errormessage="nopermissions", $stringfile='') { + if (!has_capability($capability, $context, $userid)) { + $capabilityname = get_capability_string($capability); + print_error($errormessage, $stringfile, '', $capabilityname); + } +} + + /** * This function returns whether the current user has the capability of performing a function * For example, we can do has_capability('mod/forum:replypost',$cm) in forum * only one of the 4 (moduleinstance, courseid, site, userid) would be set at 1 time * This is a recursive funciton. - * Might change to require_capability, and throw an error if not authorized. * @uses $USER * @param string $capability - name of the capability - * @param int $contextid - * @param kill bool - if set, kill when the user has no capability + * @param object $context - a context object (record from context table) + * @param integer $userid - a userid number * @return bool */ -function has_capability($capability, $contextid=NULL, $kill=false, $userid=NULL) { +function has_capability($capability, $context=NULL, $userid=NULL) { global $USER, $CONTEXT; if ($userid && $userid != $USER->id) { // loading other user's capability - $capabilities = load_user_capability($capability, $contextid, $userid); + $capabilities = load_user_capability($capability, $context, $userid); } else { $capabilities = $USER->capabilities; } - if (empty($contextid)) { + if (empty($context)) { // Use default CONTEXT if none specified if (empty($CONTEXT)) { return false; } else { $context = $CONTEXT; } - } else { - $context = get_context_instance_by_id($contextid); + } else { // A context was given to us + if (empty($CONTEXT)) { + $CONTEXT = $context; // Store FIRST used context in this global as future default + } } // Check site @@ -123,11 +139,11 @@ function has_capability($capability, $contextid=NULL, $kill=false, $userid=NULL) return ($capabilities[$sitecontext->id]['moodle/site:doanything']); } - switch (context_level($contextid)) { + switch ($context->level) { case CONTEXT_COURSECAT: // Check parent cats. - $parentcats = get_parent_cats($contextid, CONTEXT_COURSECAT); + $parentcats = get_parent_cats($context, CONTEXT_COURSECAT); foreach ($parentcats as $parentcat) { if (isset($capabilities[$parentcat]['moodle/site:doanything'])) { return ($capabilities[$parentcat]['moodle/site:doanything']); @@ -137,7 +153,7 @@ function has_capability($capability, $contextid=NULL, $kill=false, $userid=NULL) case CONTEXT_COURSE: // Check parent cat. - $parentcats = get_parent_cats($contextid, CONTEXT_COURSE); + $parentcats = get_parent_cats($context, CONTEXT_COURSE); foreach ($parentcats as $parentcat) { if (isset($capabilities[$parentcat]['do_anything'])) { @@ -209,12 +225,12 @@ function has_capability($capability, $contextid=NULL, $kill=false, $userid=NULL) } // Last: check self. - if (isset($capabilities[$contextid]['do_anything'])) { - return ($capabilities[$contextid]['do_anything']); + if (isset($capabilities[$context->id]['do_anything'])) { + return ($capabilities[$context->id]['do_anything']); } // do_anything has not been set, we now look for it the normal way. - return capability_search($capability, $contextid, $kill, $capabilities); + return capability_search($capability, $context, $capabilities); } @@ -223,76 +239,73 @@ function has_capability($capability, $contextid=NULL, $kill=false, $userid=NULL) * In a separate function so that we won't have to deal with do_anything. * again. Used by function has_capability. * @param $capability - capability string - * @param $contextid - the context id - * @param $kill - boolean. Error out and exit if the user doesn't have the - * capability? + * @param $context - the context object * @param $capabilities - either $USER->capability or loaded array * @return permission (int) */ -function capability_search($capability, $contextid, $kill=false, $capabilities) { +function capability_search($capability, $context, $capabilities) { global $USER, $CFG; - + if ($CFG->debug) { - notify("We are looking for $capability in context $contextid", 'notifytiny'); + notify("Looking for $capability in context $context->id", 'notifytiny'); } - if (isset($capabilities[$contextid][$capability])) { - return ($capabilities[$contextid][$capability]); + if (isset($capabilities[$context->id][$capability])) { + return ($capabilities[$context->id][$capability]); } /* Then, we check the cache recursively */ - $context = get_context_instance_by_id($contextid); $permission = 0; - switch (context_level($contextid)) { + switch ($context->level) { case CONTEXT_SYSTEM: // by now it's a definite an inherit $permission = 0; break; case CONTEXT_PERSONAL: - $parent = get_context_instance(CONTEXT_SYSTEM, SITEID); - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $parentcontext = get_context_instance(CONTEXT_SYSTEM, SITEID); + $permission = capability_search($capability, $parentcontext, $capabilities); break; case CONTEXT_USERID: - $parent = get_context_instance(CONTEXT_SYSTEM, SITEID); - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $parentcontext = get_context_instance(CONTEXT_SYSTEM, SITEID); + $permission = capability_search($capability, $parentcontext, $capabilities); break; case CONTEXT_COURSECAT: // Coursecat -> coursecat or site $coursecat = get_record('course_categories','id',$context->instanceid); - if ($coursecat->parent) { // return parent value if exist - $parent = get_context_instance(CONTEXT_COURSECAT, $coursecat->parent); + if (!empty($coursecat->parent)) { // return parent value if it exists + $parentcontext = get_context_instance(CONTEXT_COURSECAT, $coursecat->parent); } else { // else return site value - $parent = get_context_instance(CONTEXT_SYSTEM, SITEID); + $parentcontext = get_context_instance(CONTEXT_SYSTEM, SITEID); } - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $permission = capability_search($capability, $parentcontext, $capabilities); break; case CONTEXT_COURSE: // 1 to 1 to course cat // find the course cat, and return its value $course = get_record('course','id',$context->instanceid); - $parent = get_context_instance(CONTEXT_COURSECAT, $course->category); - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $parentcontext = get_context_instance(CONTEXT_COURSECAT, $course->category); + $permission = capability_search($capability, $parentcontext, $capabilities); break; case CONTEXT_GROUP: // 1 to 1 to course $group = get_record('groups','id',$context->instanceid); - $parent = get_context_instance(CONTEXT_COURSE, $group->courseid); - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $parentcontext = get_context_instance(CONTEXT_COURSE, $group->courseid); + $permission = capability_search($capability, $parentcontext, $capabilities); break; case CONTEXT_MODULE: // 1 to 1 to course $cm = get_record('course_modules','id',$context->instanceid); - $parent = get_context_instance(CONTEXT_COURSE, $cm->course); - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $parentcontext = get_context_instance(CONTEXT_COURSE, $cm->course); + $permission = capability_search($capability, $parentcontext, $capabilities); break; case CONTEXT_BLOCK: // 1 to 1 to course $block = get_record('block_instance','id',$context->instanceid); - $parent = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check - $permission = (capability_search($capability, $parent->id, false, $capabilities)); + $parentcontext = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check + $permission = capability_search($capability, $parentcontext, $capabilities); break; default: @@ -300,9 +313,6 @@ function capability_search($capability, $contextid, $kill=false, $capabilities) return false; } - if ($kill && ($permission <= 0)) { - error ('You do not have the required capability '.$capability); - } return $permission; } @@ -322,7 +332,7 @@ function capability_search($capability, $contextid, $kill=false, $capabilities) * [273][blah blah] = 1 * [273][blah blah blah] = 2 */ -function load_user_capability($capability='', $contextid ='', $userid='') { +function load_user_capability($capability='', $context ='', $userid='') { global $USER, $CFG; @@ -339,22 +349,18 @@ function load_user_capability($capability='', $contextid ='', $userid='') { } // First we generate a list of all relevant contexts of the user - if ($contextid) { // if context is specified - $context = get_context_instance_by_id($contextid); - - $usercontexts = get_parent_contexts($context->id); + if ($context) { // if context is specified + $usercontexts = get_parent_contexts($context); $listofcontexts = '('.implode(',', $usercontexts).')'; } else { // else, we load everything - $usercontexts = get_records('role_assignments','userid',$userid); - $listofcontexts = '('; - foreach ($usercontexts as $usercontext) { - $listofcontexts .= $usercontext->contextid; - $listofcontexts .= ','; + $userroles = get_records('role_assignments','userid',$userid); + $usercontexts = array(); + foreach ($userroles as $userrole) { + $usercontexts[] = $userrole->contextid; } - $listofcontexts = rtrim ($listofcontexts, ","); - $listofcontexts .= ')'; + $listofcontexts = '('.implode(',', $usercontexts).')'; } - + // Then we use 1 giant SQL to bring out all relevant capabilities. // The first part gets the capabilities of orginal role. // The second part gets the capabilities of overriden roles. @@ -470,9 +476,11 @@ function load_user_capability($capability='', $contextid ='', $userid='') { $usercap = array(); // for other user's capabilities foreach ($capabilities as $capability) { + $context = get_context_instance_by_id($capability->id); + if (!empty($otheruserid)) { // we are pulling out other user's capabilities, do not write to session - if (capability_prohibits($capability->capability, $capability->id, $capability->sum, $usercap)) { + if (capability_prohibits($capability->capability, $context, $capability->sum, $usercap)) { $usercap[$capability->id][$capability->capability] = -9000; continue; } @@ -481,7 +489,7 @@ function load_user_capability($capability='', $contextid ='', $userid='') { } else { - if (capability_prohibits($capability->capability, $capability->id, $capability->sum)) { // if any parent or parent's parent is set to prohibit + if (capability_prohibits($capability->capability, $context, $capability->sum)) { // if any parent or parent's parent is set to prohibit $USER->capabilities[$capability->id][$capability->capability] = -9000; continue; } @@ -518,30 +526,30 @@ function load_user_capability($capability='', $contextid ='', $userid='') { * * @param $capability - capability name * @param $sum - sum of all capabilities values - * @param $contextid - the context id + * @param $context - the context object * @param $array - when loading another user caps, their caps are not stored in session but an array */ -function capability_prohibits($capability, $contextid, $sum='', $array='') { +function capability_prohibits($capability, $context, $sum='', $array='') { global $USER; + if ($sum < -8000) { // If this capability is set to prohibit. return true; } if (isset($array)) { - if (isset($array[$contextid][$capability]) - && $array[$contextid][$capability] < -8000) { + if (isset($array[$context->id][$capability]) + && $array[$context->id][$capability] < -8000) { return true; } } else { // Else if set in session. - if (isset($USER->capabilities[$contextid][$capability]) - && $USER->capabilities[$contextid][$capability] < -8000) { + if (isset($USER->capabilities[$context->id][$capability]) + && $USER->capabilities[$context->id][$capability] < -8000) { return true; } } - $context = get_context_instance_by_id($contextid); - switch (context_level($contextid)) { + switch ($context->level) { case CONTEXT_SYSTEM: // By now it's a definite an inherit. @@ -550,12 +558,12 @@ function capability_prohibits($capability, $contextid, $sum='', $array='') { case CONTEXT_PERSONAL: $parent = get_context_instance(CONTEXT_SYSTEM, SITEID); - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; case CONTEXT_USERID: $parent = get_context_instance(CONTEXT_SYSTEM, SITEID); - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; case CONTEXT_COURSECAT: @@ -568,7 +576,7 @@ function capability_prohibits($capability, $contextid, $sum='', $array='') { // Return site value. $parent = get_context_instance(CONTEXT_SYSTEM, SITEID); } - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; case CONTEXT_COURSE: @@ -576,28 +584,28 @@ function capability_prohibits($capability, $contextid, $sum='', $array='') { // Find the course cat, and return its value. $course = get_record('course','id',$context->instanceid); $parent = get_context_instance(CONTEXT_COURSECAT, $course->category); - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; case CONTEXT_GROUP: // 1 to 1 to course. $group = get_record('groups','id',$context->instanceid); $parent = get_context_instance(CONTEXT_COURSE, $group->courseid); - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; case CONTEXT_MODULE: // 1 to 1 to course. $cm = get_record('course_modules','id',$context->instanceid); $parent = get_context_instance(CONTEXT_COURSE, $cm->course); - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; case CONTEXT_BLOCK: // 1 to 1 to course. $block = get_record('block_instance','id',$context->instanceid); $parent = get_context_instance(CONTEXT_COURSE, $block->pageid); // needs check - return (capability_prohibits($capability, $parent->id)); + return capability_prohibits($capability, $parent); break; default: @@ -816,7 +824,7 @@ function create_context($level, $instanceid) { */ function get_context_instance($level=NULL, $instance=SITEID) { - global $CONTEXT; + global $CONTEXT, $context_cache, $context_cache_id; /// If no level is supplied then return the current global context if there is one if (empty($level)) { @@ -844,6 +852,7 @@ function get_context_instance($level=NULL, $instance=SITEID) { $context_cache[$level][$instance] = $context; // Cache it for later $context_cache_id[$context->id] = $context; // Cache it for later + return $context; } @@ -867,23 +876,11 @@ function get_context_instance_by_id($id) { } -/** - * Looks up the context level. - * @param int $contextid - * @return int - */ -function context_level($contextid) { - if ($context = get_context_instance_by_id($contextid)) { - return $context->level; - } - return false; -} - - /** * Get the local override (if any) for a given capability in a role in a context * @param $roleid - * @param $instance + * @param $contextid + * @param $capability */ function get_local_override($roleid, $contextid, $capability) { return get_record('role_capabilities', 'roleid', $roleid, 'capability', $capability, 'contextid', $contextid); @@ -907,7 +904,6 @@ function create_role($name, $description, $legacy='') { // check for duplicate role name if ($role = get_record('role','name', $name)) { - print_object($role); error('there is already a role with this name!'); } @@ -1222,12 +1218,10 @@ function capabilities_cleanup($component, $newcapdef=NULL) { /** * prints human readable context identifier. */ -function print_context_name($contextid) { +function print_context_name($context) { $name = ''; - $context = get_context_instance_by_id($contextid); - switch ($context->level) { case CONTEXT_SYSTEM: // by now it's a definite an inherit @@ -1295,7 +1289,7 @@ function print_context_name($contextid) { * All case based, example an instance of forum context. * Will fetch all forum related capabilities, while course contexts * Will fetch all capabilities - * @param int contextid + * @param object context * @return array(); * * capabilities @@ -1304,13 +1298,13 @@ function print_context_name($contextid) { * `contextlevel` int(10) NOT NULL, * `component` varchar(100) NOT NULL, */ -function fetch_context_capabilities($contextid) { +function fetch_context_capabilities($context) { global $CFG; $sort = 'ORDER BY contextlevel,component,id'; // To group them sensibly for display - switch (context_level($contextid)) { + switch ($context->level) { case CONTEXT_SYSTEM: // all $SQL = "select * from {$CFG->prefix}capabilities"; @@ -1334,7 +1328,6 @@ function fetch_context_capabilities($contextid) { break; case CONTEXT_MODULE: // mod caps - $context = get_context_instance_by_id($contextid); $cm = get_record('course_modules', 'id', $context->instanceid); $module = get_record('modules', 'id', $cm->module); @@ -1343,7 +1336,6 @@ function fetch_context_capabilities($contextid) { break; case CONTEXT_BLOCK: // block caps - $context = get_context_instance_by_id($contextid); $cb = get_record('block_instance', 'id', $context->instanceid); $block = get_record('block', 'id', $cb->blockid); @@ -1365,20 +1357,19 @@ function fetch_context_capabilities($contextid) { * This function pulls out all the resolved capabilities (overrides and * defaults) of a role used in capability overrieds in contexts at a given * context. - * @param int $contextid + * @param int $context * @param int $roleid * @return array */ -function role_context_capabilities($roleid, $contextid) { +function role_context_capabilities($roleid, $context) { global $CFG; $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); - if ($sitecontext->id == $contextid) { + if ($sitecontext->id == $context->id) { return array(); } // first of all, figure out all parental contexts - $context = get_context_instance_by_id($contextid); $contexts = array_reverse(get_parent_contexts($context)); $contexts = '('.implode(',', $contexts).')'; @@ -1404,7 +1395,7 @@ function role_context_capabilities($roleid, $contextid) { /** - * Recursive function which, given a contextid, find all parent context ids, + * Recursive function which, given a context, find all parent context ids, * and return the array in reverse order, i.e. parent first, then grand * parent, etc. * @param object $context @@ -1414,7 +1405,7 @@ function role_context_capabilities($roleid, $contextid) { function get_parent_contexts($context) { - switch (context_level($context->id)) { + switch ($context->level) { case CONTEXT_SYSTEM: // no parent return null; @@ -1478,7 +1469,6 @@ function get_parent_contexts($context) { * This function gets the capability of a role in a given context. * It is needed when printing override forms. * @param int $contextid - * @param int $roleid // no need? since role is used in extraction in $capability * @param string $capability * @param array $capabilities - array loaded using role_context_capabilities * @return int (allow, prevent, prohibit, inherit) @@ -1490,7 +1480,6 @@ function get_role_context_capability($contextid, $capability, $capabilities) { } -// a big switch statement function get_capability_string($capabilityname) { // Typical capabilityname is: mod/choice:readresponses diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 80d6fb718b..b4a43a33db 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -1606,7 +1606,7 @@ function require_login($courseid=0, $autologinguest=true, $cm=null) { $context = get_context_instance(CONTEXT_COURSE, $courseid); - if (has_capability('moodle/course:view', $context->id)) { + if (has_capability('moodle/course:view', $context)) { if (isset($USER->realuser)) { // Make sure the REAL person can also access this course if (!isteacher($courseid, $USER->realuser)) { print_header(); @@ -1965,21 +1965,19 @@ function isloggedin() { * @return bool */ function isadmin($userid=0) { - global $USER; + global $USER, $CFG; + static $admins, $nonadmins; - if (isset($CFG->rolesactive) && $CFG->rolesactive ===1) { + if (isset($CFG->rolesactive) && $CFG->rolesactive == 1) { - if ($courseid == 0) { - $context = get_context_instance(CONTEXT_SYSTEM, SITEID); - } else { - $context = get_context_instance(CONTEXT_COURSE, $courseid); - } + + $context = get_context_instance(CONTEXT_SYSTEM, SITEID); if (!$userid) { - return has_capability('moodle/legacy:admin', $context->id); + return has_capability('moodle/legacy:admin', $context); } else { - return has_capability('moodle/legacy:admin', $context->id, false, $userid); + return has_capability('moodle/legacy:admin', $context, false, $userid); } } @@ -2023,6 +2021,7 @@ function isadmin($userid=0) { * @param bool $includeadmin If true this function will return true when it encounters an admin user. * @return bool */ + function isteacher($courseid=0, $userid=0, $includeadmin=true) { /// Is the user able to access this course as a teacher? global $USER, $CFG; @@ -2036,13 +2035,13 @@ function isteacher($courseid=0, $userid=0, $includeadmin=true) { } if (!$userid) { - return has_capability('moodle/legacy:teacher', $context->id); + return has_capability('moodle/legacy:teacher', $context); } else { - return has_capability('moodle/legacy:teacher', $context->id, false, $userid); + return has_capability('moodle/legacy:teacher', $context, $userid); } } - // Old code follows, will be removed before 1.7 because it shouldn't run + // Old code follows, will be removed before 1.7 because it shouldn't run XXX TODO if (empty($userid)) { // we are relying on $USER if (empty($USER) or empty($USER->id)) { // not logged in so can't be a teacher @@ -2125,9 +2124,9 @@ function isteacheredit($courseid, $userid=0, $ignorestudentview=false) { } if (!$userid) { - return has_capability('moodle/legacy:edittingteacher', $context->id); + return has_capability('moodle/legacy:edittingteacher', $context); } else { - return has_capability('moodle/legacy:edittingteacher', $context->id, false, $userid); + return has_capability('moodle/legacy:edittingteacher', $context, false, $userid); } } @@ -2172,9 +2171,9 @@ function iscreator ($userid=0) { } if (!$userid) { - return has_capability('moodle/legacy:coursecreator', $context->id); + return has_capability('moodle/legacy:coursecreator', $context); } else { - return has_capability('moodle/legacy:coursecreator', $context->id, false, $userid); + return has_capability('moodle/legacy:coursecreator', $context, false, $userid); } } @@ -2216,9 +2215,9 @@ function isstudent($courseid, $userid=0) { } if (!$userid) { - return has_capability('moodle/legacy:student', $context->id); + return has_capability('moodle/legacy:student', $context); } else { - return has_capability('moodle/legacy:student', $context->id, false, $userid); + return has_capability('moodle/legacy:student', $context, false, $userid); } } diff --git a/mod/assignment/lib.php b/mod/assignment/lib.php index bb86767887..c17ce77dc9 100644 --- a/mod/assignment/lib.php +++ b/mod/assignment/lib.php @@ -108,7 +108,7 @@ class assignment_base { function view() { $context = get_context_instance(CONTEXT_MODULE,$this->cm->id); - has_capability('mod/assignment:view', $context->id, true); + require_capability('mod/assignment:view', $context); add_to_log($this->course->id, "assignment", "view", "view.php?id={$this->cm->id}", $this->assignment->id, $this->cm->id); @@ -277,7 +277,7 @@ class assignment_base { $submitted = ''; $context = get_context_instance(CONTEXT_MODULE,$this->cm->id); - if (has_capability('mod/assignment:grade', $context->id) && (groupmode($this->course, $this->cm) == SEPARATEGROUPS)) { + if (has_capability('mod/assignment:grade', $context) && (groupmode($this->course, $this->cm) == SEPARATEGROUPS)) { // if this user can mark and is put in a group // then he can only see/mark submission in his own groups @@ -2358,7 +2358,7 @@ function assignment_print_overview($courses, &$htmlarray) { // if (isteacher($assignment->course)) { $context = get_context_instance(CONTEXT_MODULE,$this->cm->id); - if (has_capability('mod/assignment:grade', $context->id)) { + if (has_capability('mod/assignment:grade', $context)) { $submissions = count_records_sql("SELECT COUNT(*) FROM {$CFG->prefix}assignment_submissions a, {$CFG->prefix}user_students s, diff --git a/mod/assignment/type/online/assignment.class.php b/mod/assignment/type/online/assignment.class.php index a84eaf4132..d2a9a25d6a 100644 --- a/mod/assignment/type/online/assignment.class.php +++ b/mod/assignment/type/online/assignment.class.php @@ -15,7 +15,7 @@ class assignment_online extends assignment_base { global $USER; $context = get_context_instance(CONTEXT_MODULE,$this->cm->id); - has_capability('mod/assignment:view', $context->id, true); + require_capability('mod/assignment:view', $context); $submission = $this->get_submission(); @@ -59,7 +59,7 @@ class assignment_online extends assignment_base { notify(get_string('submissionsaved', 'assignment')); } - if (has_capability('mod/assignment:submit', $context->id)) { + if (has_capability('mod/assignment:submit', $context)) { print_simple_box_start('center', '70%', '', '', 'generalbox', 'online'); if ($editmode) { $this->view_edit_form($submission); diff --git a/mod/assignment/type/uploadsingle/assignment.class.php b/mod/assignment/type/uploadsingle/assignment.class.php index 7d076cd383..dfbbb261a5 100644 --- a/mod/assignment/type/uploadsingle/assignment.class.php +++ b/mod/assignment/type/uploadsingle/assignment.class.php @@ -49,7 +49,7 @@ class assignment_uploadsingle extends assignment_base { global $USER; $context = get_context_instance(CONTEXT_MODULE,$this->cm->id); - has_capability('mod/assignment:view', $context->id, true); + require_capability('mod/assignment:view', $context); add_to_log($this->course->id, "assignment", "view", "view.php?id={$this->cm->id}", $this->assignment->id, $this->cm->id); @@ -69,7 +69,7 @@ class assignment_uploadsingle extends assignment_base { } } - if (has_capability('mod/assignment:submit', $context->id) && $this->isopen() && (!$filecount || $this->assignment->resubmit || !$submission->timemarked)) { + if (has_capability('mod/assignment:submit', $context) && $this->isopen() && (!$filecount || $this->assignment->resubmit || !$submission->timemarked)) { $this->view_upload_form(); } diff --git a/mod/chat/gui_header_js/index.php b/mod/chat/gui_header_js/index.php index 6c35be3ee2..632940a7e7 100644 --- a/mod/chat/gui_header_js/index.php +++ b/mod/chat/gui_header_js/index.php @@ -22,12 +22,8 @@ require_login($course->id, false, $cm); - has_capability('mod/chat:chat',$context->id, true); - /* - if (isguest()) { - error('Guest does not have access to chat rooms'); - } - */ + require_capability('mod/chat:chat',$context); + if (!$cm->visible and !isteacher($course->id)) { print_header(); notice(get_string("activityiscurrentlyhidden")); diff --git a/mod/chat/lib.php b/mod/chat/lib.php index 0052d558e5..c98b83e305 100644 --- a/mod/chat/lib.php +++ b/mod/chat/lib.php @@ -210,7 +210,7 @@ function chat_print_recent_activity($course, $isteacher, $timestart) { $context = get_context_instance(CONTEXT_MODULE, $cm->id); // needs to be fixed - if (!(has_capability('mod/chat:readlog', $context->id) or instance_is_visible('chat', $chat))) { // Chat hidden to students + if (!(has_capability('mod/chat:readlog', $context) or instance_is_visible('chat', $chat))) { // Chat hidden to students //if (!($isteacher or instance_is_visible('chat', $chat))) { // Chat hidden to students continue; } diff --git a/mod/chat/report.php b/mod/chat/report.php index 8f9ec6a370..02faa08c1c 100644 --- a/mod/chat/report.php +++ b/mod/chat/report.php @@ -24,13 +24,7 @@ $context = get_context_instance(CONTEXT_MODULE, $cm->id); require_login($course->id, false, $cm); - $isteacher = isteacher($course->id); - $isteacheredit = isteacheredit($course->id); - - //if (isguest() or (!$isteacher and !$chat->studentlogs)) { - //error('You can not view these chat reports'); - //} - has_capability('mod/chat:readlog', $context->id, true); // if can't even read, kill + require_capability('mod/chat:readlog', $context); add_to_log($course->id, 'chat', 'report', "report.php?id=$cm->id", $chat->id, $cm->id); @@ -64,8 +58,7 @@ $groupselect = ""; } - //if ($deletesession and $isteacheredit) { - if ($deletesession and has_capability('mod/chat:deletelog', $context->id)) { + if ($deletesession and has_capability('mod/chat:deletelog', $context)) { notice_yesno(get_string('deletesessionsure', 'chat'), "report.php?id=$cm->id&deletesession=1&confirmdelete=1&start=$start&end=$end&sesskey=$USER->sesskey", "report.php?id=$cm->id"); @@ -89,8 +82,7 @@ print_simple_box_end('center'); } - if (!$deletesession or !has_capability('mod/chat:deletelog', $context->id)) { - //if (!$deletesession or !$isteacheredit) { + if (!$deletesession or !has_capability('mod/chat:deletelog', $context)) { print_continue("report.php?id=$cm->id"); } @@ -124,8 +116,7 @@ /// Delete a session if one has been specified - if ($deletesession and has_capability('mod/chat:deletelog', $context->id) and $confirmdelete and $start and $end and confirm_sesskey()) { - //if ($deletesession and $isteacheredit and $confirmdelete and $start and $end and confirm_sesskey()) { + if ($deletesession and has_capability('mod/chat:deletelog', $context) and $confirmdelete and $start and $end and confirm_sesskey()) { delete_records_select('chat_messages', "chatid = $chat->id AND timestamp >= '$start' AND timestamp <= '$end' $groupselect"); @@ -186,15 +177,14 @@ foreach ($sessionusers as $sessionuser => $usermessagecount) { if ($user = get_record('user', 'id', $sessionuser)) { print_user_picture($user->id, $course->id, $user->picture); - echo ' '.fullname($user, $isteacher); // need to fix this + echo ' '.fullname($user, true); // XXX TODO use capability instead of true echo " ($usermessagecount)
"; } } echo '

'; echo "id&start=$sessionstart&end=$sessionend\">$strseesession"; - //if ($isteacheredit) - if (has_capability('mod/chat:deletelog', $context->id)) { + if (has_capability('mod/chat:deletelog', $context)) { echo "
id&start=$sessionstart&end=$sessionend&deletesession=1\">$strdeletesession"; } echo '

'; diff --git a/mod/chat/view.php b/mod/chat/view.php index 5d96bd9543..d50ad4ced5 100644 --- a/mod/chat/view.php +++ b/mod/chat/view.php @@ -76,8 +76,7 @@ echo ''; - if ($chat->studentlogs or has_capability('mod/chat:readlog',$context->id)) { - //if (($chat->studentlogs or isteacher($course->id)) and !isguest()) { + if ($chat->studentlogs or has_capability('mod/chat:readlog',$context)) { echo '