Commit graph

28321 commits

Author SHA1 Message Date
martinlanghoff
343effbede accesslib: intro load_temp_role() for temporary guest access
Loads a "ghost" role assignment, and all the needed rdef data
into an accessinfo array.

Also minor phpdoc update on get_role_access()
2007-09-19 07:16:29 +00:00
martinlanghoff
3ac81bd159 accesslib: drop rdef mangling for default role - check in has_cap_fad()
There are some exceptions when checking for caps that are inherited
from the default role. Move the check into has_cap_fad() and stop
mangling the data we put in $ad[rdef].

We now also set $ad[dr] to record default roles added.

This will later allow us to share rdef across many users in $ACCESS.

Affects:
  load_user_accessdata()
  has_cap_fad()

While at it, document has_cap_fad() a bit.
2007-09-19 07:16:18 +00:00
martinlanghoff
33b6014f72 accesslib:load_all_capabilities() - fix guest user setup for multi-enrol
When setting things up for the guest user, the RA entry in accessdata
was not multi-enrol-friendly. Must have glossed it over in the
multi-enrol rework.
2007-09-19 07:16:04 +00:00
martinlanghoff
51be70d2e2 accesslib/moodlelib: check $USER->access[rsw] for roleswitches 2007-09-19 07:15:50 +00:00
martinlanghoff
0e801c6c9d course/unenrol: check $USER->access[rsw] for role switches 2007-09-19 07:15:38 +00:00
martinlanghoff
92e531681d accesslib: Document accessdata, public api, stale accessdata 2007-09-19 07:15:27 +00:00
martinlanghoff
31c2de8234 accesslib: rename "sess" and "accessinfo" to accessdata
The name for new data structure holding access control data
is "accessdata". And we have a new moniker "fad", short for
"from accessdata".

So
 - has_cap_fromsess()    -> has_cap_fad()
 - access_inaccessdata() -> path_inaccessdata()
 - aggr_roles_fromsess() -> aggr_roles_fad()
 - $sess   -> $ad
 - $access -> $ad

Consistency, save typing, shorter codelines...
2007-09-19 07:15:12 +00:00
martinlanghoff
0c24aa1929 accesslib:require_capability() revamp to check for USER->access
$USER->capabilities is deprecated.
2007-09-19 07:14:59 +00:00
martinlanghoff
0d8a77c978 accesslib:context_moved() remove debugging msgs 2007-09-19 07:14:48 +00:00
martinlanghoff
88903eeab9 course/index: Move categories around using move_category()
Use the newfangled move_category() when moving categories
around, to ensure we Do The Right Thing in the backend,
decoupled from UI stuff.
2007-09-19 07:14:34 +00:00
martinlanghoff
19f601d178 course/lib: move_courses() calls content_moved(), intro move_category()
move_courses() now calls content_moved() which will take care of any
accesslib-required changes. And introducing move_category() which
also calls content_moved() when needed.
2007-09-19 07:14:23 +00:00
martinlanghoff
b4ab7f2ec9 accesslib:content_moved() fix bug in depth handling
the depth was getting a bit out-of-control when moving
up the tree. Fix it...
2007-09-19 07:14:11 +00:00
martinlanghoff
a372aab507 course: Changing a course cat from course/edit calls context_moved()
Changes to course cat from the main course settings form now calls
context_moved(), and accesslib data is properly maintained.
2007-09-19 07:13:57 +00:00
martinlanghoff
ca92b39158 accesslib: create_context() fix to also populate the depth
Set the depth field correctly.
2007-09-19 07:13:45 +00:00
martinlanghoff
e4fec27340 accesslib: Introducing context_moved() - call after moving courses/coursecats
With the new accesslib, moving courses and categories has a major
impact on enrolments and unenrolments.

At _least_ we need to signal accesslib that it has happened. So here
is context_moved() for exactly that.

Open to refactoring later into something along the lines of

 - move_course()
 - move_category()

However, at this stage the most important of those two: move_course()
does not fit very well with the code in course/edit. So keep it simple
for now.
2007-09-19 07:13:33 +00:00
martinlanghoff
c633af7a5a course/edit: mark the course contextpath as dirty to force a reload
Combined with the path creation in create_context() we can now create
a course, enter and edit it immediately. Amazing.

Like - 21st century technology.
2007-09-19 07:13:20 +00:00
martinlanghoff
e40413befa accesslib: create_context() now populates the path of new contexts
... and it populates the context cache too.

Unfortunately, it needs an INSERT followed by an UPDATE. Other than
a stored procedure, I don't know how to deal with this better.

(We could save the SELECT though! that's a thought...)

OTOH, we are getting so much mileage out of the path field
that it's probably a hit we have to take in the chin and move on.
2007-09-19 07:13:08 +00:00
martinlanghoff
4881f2d329 accesslib: simplify and speedup create_context()
Callers _must_ do their homework before calling create_context().
This allows us to save 2/3 queries per call (!!!).

As it stands, callers are all in accesslib anyway.
2007-09-19 07:12:56 +00:00
martinlanghoff
3d3def3a4e course/unenrol codepaths mark the context dirty - bugfix
Oops. one if() branch was missing the mark_context_dirty(). Fixed.
2007-09-19 07:12:43 +00:00
martinlanghoff
54f9d9aee7 accesslib:reload_all_capabilities() - force a reload of mycourses
unset $USER->mycourses to force a reload of mycourses too.
2007-09-19 07:12:33 +00:00
martinlanghoff
d32dd61154 enrol/paypal: mark the contextpath as dirty on unenrolment
so the unenrolment is effective immediately.
2007-09-19 07:12:22 +00:00
martinlanghoff
f055618837 enrol/mnet: mark context as dirty after unenrol
So the unenrolment is effective immediately.
2007-09-19 07:12:10 +00:00
martinlanghoff
2d0de2d88b deprecatedlib: Legacy interactive enrol/unenrol codepaths mark the context dirty
My heart is not so cold. These old buddies also need love and care...
2007-09-19 07:11:56 +00:00
martinlanghoff
a9d4ea7849 All interactive enrol/unenrol codepaths mark the context dirty
Manually enrolling and unenrolling self, and other users should
transparently set the context dirty. So walk all callers to
role_assign() and role_unassign() and mark the context dirty
where appropriate.

OTOH, most automated-backend enrol/unenrol mechanisms should not.
The backend lookups that happen when you login are well covered
by the login/enrolment process, and don't need to be marked dirty.
2007-09-19 07:11:42 +00:00
martinlanghoff
df75ca2289 cron: call cleanup_dirty_contexts() 2007-09-19 07:11:31 +00:00
martinlanghoff
ef989bd95e accesslib: Introduce (and use) reload_all_capabilities()
If accessinfo is stale, we need to reload it without losing
out "interesting" state -- transparently for the end user.

That means preserving active role switches, loginas (site and course
level), etc. The logic for that is encapsulated in
reload_all_capabilities().

Also affected:
 - has_capability() which now calls reload_all_capabilities()
 - role_switch() - minor tidyup
2007-09-19 07:11:18 +00:00
martinlanghoff
2123166d62 accesslib: get_user_courses_bycap() fix bug introduced by refactor
The refactor that created make_context_subobj() triggered a bug.
Smack in the hand to the sloppy programmer using variables outside
of the context they were meant to be used in!
2007-09-19 07:11:04 +00:00
martinlanghoff
e6560e39d7 admin/roles: context-specific role changes mark the context as dirty
And will force a reload of $USER->access for logged-in users that need
to read _this_ context. Much lower impact - still not a great idea to
edit assignments/caps on very busy courses, but impact should be low.
2007-09-19 07:10:52 +00:00
martinlanghoff
b3dc845cab admin/roles: sitewide role changes mark site context as dirty
And will force a reload of $USER->access for all logged-in users
on their next request.

We will have to tell admins of large sites to avoid making role changes
at busy times, as it does generate extra load.
2007-09-19 07:10:37 +00:00
martinlanghoff
148eb2a749 accesslib: Introduce $DIRTYCONTEXTS, $USER->access[time],is_contextpath_clean()
has_capability() now (ab)uses a new global: DIRTYCONTEXTS where we
load the contexts that have changed since since $USER->access[time]

The shallow/easy checks are done in has_capability(), deeper checks
go into the newfangled is_contextpath_clean().

The only complication now is to reload the relevant caps without losing
switches, loginas, etc...
2007-09-19 07:10:24 +00:00
martinlanghoff
0d25cd3a81 accesslib: Introduce functions to deal with dirty contexts
The accessinfo held in $USER->access can easily get out of
sync with reality if and admin has removed our access,
or expanded it after we loaded our accessinfo.

To handle this, we'll use the config_plugins table with an
'accesslib/dirtycontexts' plugin signature to store the paths of
recently changed contexts. To handle those dirrrty entries, here
we introduce

  get_dirty_contexts() - for lib/setup
  mark_context_dirty()
  cleanup_dirty_contexts() - for cron
2007-09-19 07:10:09 +00:00
martinlanghoff
690c946c15 get_role_users() callers rework to use the new $gethidden 2007-09-19 07:09:50 +00:00
martinlanghoff
47b18c1c12 group/assign: fixed performance of assigning users to groups
- page would not display on a course with 600 users
2007-09-19 07:09:36 +00:00
martinlanghoff
3bf13d05f5 course/lib:print_course() smarter calling of get_role_users()
And saves a few dbqueries too...
2007-09-19 07:09:24 +00:00
martinlanghoff
867f957fc5 accesslib:get_role_users() revamp
Now get_role_users() joins with contexts and roles too, so we can
push more work into it, and simplify the callers.

One important change is that the $view flag gets reworked into
$gethidden, pushing the cap check to the caller.

This commit is followed by a cleanup of the callers...
2007-09-19 07:09:13 +00:00
martinlanghoff
8fe9c4de51 datalib: get_courses_search() remove dead code 2007-09-19 07:09:01 +00:00
martinlanghoff
026579bbc3 course/search.php: smarter about contexts, bugfix in pagination
Save a ton of queries about contexts, and a bugfix in how we are
calling the pagination for get_courses_search().
2007-09-19 07:08:50 +00:00
martinlanghoff
2c64f65cd3 datalib: get_courses_search() learns to be smart about contexts...
Join against contexts, save bazillion context lookups...
2007-09-19 07:08:37 +00:00
martinlanghoff
679b617967 categories: Categories page and get_courses_page() - smarter about context
This patch saves 1600 context lookups on a 1600 course category. rcache
does help a bit with small categories, but on large setups, this is
not sustainable.

And it's not needed either. We have the data right at our fingertips.
Just get it when it's cheap...
2007-09-19 07:08:24 +00:00
martinlanghoff
c1b7a5e537 accesslib: introducing make_context_subobj() - and refactor callers
We had many copies of the subcontext building bit. Time to
abstract it, and fix callers...
2007-09-19 07:08:12 +00:00
martinlanghoff
d0009dff7d accesslib: Fix dup enrolment entries in get_user_access_bycontext() and get_user_access_sitewide()
Avoid duplicate entries in the ra array. Now it works too!
2007-09-19 07:07:59 +00:00
martinlanghoff
4d8ab2749e accesslib: get_context_users_bycap() draft for course participants...
Introducing get_context_users_bycap() which gets the data in
2 DB queries, takes around 10ms on my laptop, and returns
the records with a nice context property attached.

Note Note Note: right now, some user recs do not have a context
associated, so are _not_ returned. So this awaits Matt's fix
to contexts maintenance to be 100% accurate...
2007-09-19 07:07:45 +00:00
martinlanghoff
fe3141e00b get_my_courses() - bugfix in sitewide-login-as support.
Oops. The supportfor login-as was buggy now with sitewide
loginas. Now works in both.
2007-09-19 07:07:34 +00:00
martinlanghoff
ae1555ae2e get_my_courses(): Support course-level login as
A walkthrough of course-login-as functionality shows that is
Just Works, except that get_my_courses() was showing all the
courses. So we fix it.

And cleanup load_all_capabilities() - things just work
transparently.
2007-09-19 07:07:21 +00:00
martinlanghoff
2219374865 accesslib: remove some functions we do not need anymore
This is *the* scary commit. No more scaffolding, no more
training wheels. Remove the legacy has_capabilty_old() and
several supporting functions.

   has_capability_old()
   capability_search()
   is_parent_context()
   roles_context_cmp()
   load_user_capability()
   capability_prohibits()

I've grepped far and wide. Noone else uses the supporting
functions anywhere in-the-known-universe. If I could not
find it, it does not exist.

[Thankful that cvs/git/whatever will hold on to them
 if I end up having to regret this.]
2007-09-19 07:07:08 +00:00
martinlanghoff
204a369c1e accesslib: Intro global $ACCESS and load_user_accessdata()
This patch introduces a new global $ACCESS that will cache
accessdata (our ra/rdef array) for users that are _not_ the
logged in user.

Most of the time it will be empty (luckily).

Each new user we have to get "in" costs us 3 or 4 cheap
dbqueries at the moment, so it is not that bad.

has_capability() now calls load_user_accessdata() if the
call is for a non-logged-user. So $ACCESS is autopopulated
transparently.

This also means that has_capability no longer calls
has_capability_old(). Yay!

With this patch, user/view.php for looking at a user in a course...

  Before: 62 dbqueries, 10.3MB, 0.7s
  After:  49 dbqueries,  8.5MB, 0.3s
2007-09-19 07:06:55 +00:00
martinlanghoff
d7d4b0e572 course/view: roleswitch checks moved to the course page
Implemented all the relevant checks for role_switch().

accesslib's role_switch() doesn't do any UI-related checks any more,
being a backend lib call. These belong here.
2007-09-19 07:06:44 +00:00
martinlanghoff
6cc59cb21b accesslib: add support for multi-enrolments
I had dropped support for multi-enrolments on the same context.

 Oops!

This patch reinstates it, changing the semantics of the 'ra'
array leaves from an int to an array of ints.

So no instead of

   $USER->access['ra']['/1/12/543'] = 5

we have

   $USER->access['ra']['/1/12/543'] = array(5)

the functions that build the array, and the array walkers have
been updated. This touches...

  Writing RAs
    load_all_capabilities()
    get_user_access_sitewide()
    get_user_access_bycontext()

  Reading RAs
    has_cap_fromsess()
    aggr_roles_fromsess()

Thanks to Matt Clarkson for mentioning multi-enrolments!
2007-09-19 07:06:30 +00:00
martinlanghoff
b1178725a8 weblib: switchroles_form() user_login_string() handle the new switchroles
The switched role data bits have moved to a
different place in the session. Trivial to fix here.
2007-09-19 07:06:17 +00:00
martinlanghoff
1c886b238d accesslib: role_switch() supports unswitching by passing $roleid=0
It is a good idea, silly of me to remove it...
2007-09-19 07:06:03 +00:00