470 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
martinlanghoff
6a8d9a387d accesslib: has_cap_from_sess() now supports role switching
With this commit we now have very fast support for
roleswitching, based on $sess[rsw] entries.

And a bit of phpdoc. This is function, and the
datastructure it walks, is the heart of of it.
2007-09-19 07:05:48 +00:00
martinlanghoff
6f1bce30b1 accesslib - role_switch() revamp, introduce get_role_access_bycontext()
First stage of role_switch() rewrite - role_switch() sets up
a rsw entry in $USER->access, and makes sure we have the
appropriate role definitions in rdef.

That is where get_role_access_bycontext() comes into play -
gets all the rdef entries in one cheap sql query.

... though there may be many of them...

TODO:

 - fix callers of role_switch()
 - teach has_cap_fromsess() to read the rsw entries
2007-09-19 07:05:32 +00:00
martinlanghoff
b5a645b4eb accesslib: Draft get_context_users_byrole()
Draft - use for the course participants list page

 Uses 1 DB query (cheap too - 2~7ms).

 TODO:
 - implement additional where clauses
 - sorting
 - get course participants list to use it!

 returns a users array, both sorted _and_ keyed
 on id (as get_my_courses() does)

 as a bonus, every user record comes with its own
 personal context, as our callers need it straight away
 {save 1 dbquery per user! yay!}
2007-09-19 07:05:21 +00:00
martinlanghoff
352f6f74fc get_my_courses() and get_user_courses_bycap() field handling and caching
- Field handling moves back to get_my_courses() and now we have
  almost all the fields that the old get_my_courses() did
  (except for summary, which is *huge*) so get_my_courses() asks
  for a lot of fields, but the get_user_courses_bycap() defaults
  are _much_ leaner now.

  I think this makes sense ;-)

- get_my_courses() now caches the course ids for the currently logged in
  user in $USER->mycourses -- as a _string_. This is magnitudes more efficient
  than having it as an array.

The cache makes a difference, but it's not very visible on
normal pageloads (with my courses block, for example).

However, over 100 iterations, for a user with 50 enrolments in a site
with 6K courses, we go from 4.3s to 0.6s. And the DB queries are *cheap*.

            $tt = microtime(true);
            for($n=0;$n<100;$n++) {
                get_my_courses($USER->id, 'sortorder ASC');
            }
            error_log("took " .  (microtime(true) - $tt));
2007-09-19 07:04:59 +00:00
martinlanghoff
2e059c7709 accesslib: get_user_courses_bycap() - make $doanything work in the optimised path
OMG! Bugfix!
2007-09-19 07:04:37 +00:00
martinlanghoff
573674bf47 accesslib: get_user_courses_bycap() is less of a piggy now...
get_user_courses_bycap() replaces get_courses_bycap_fromsess().

Using a combination of in-DB enrolments and in-session capability
checks, we narrow down the courses we fetch from the DB for checking.

This patch adds a small DB query, and has has a moderate impact on
the timings observable on my laptop (~300ms?), but reduces
*significantly* the bandwidth used, which in cluster environments
with frontends separate from backends has a serious impact.
2007-09-19 07:04:23 +00:00
martinlanghoff
aeb3916b7a datalib: get_my_courses() - some fixes to the data we return
strangely, get_my_courses() is expected to return the
array keyed on id, which messes up the sorting

So let's do it ;-)
2007-09-19 07:04:10 +00:00
martinlanghoff
e1d5e5c181 accesslib: get_my_courses() rework, new get_courses_bycap_fromsess()
get_my_courses() goes from a bazillion queries (500 in some sample
cases) to 1 for the logged-in user, and 4 for a non-logged-in user.

One of those queries brings a *lot* of data across (all rows from
mdl_course) so there is room for serious optimisation.

  However, this clocks at ~300 ms on my laptop, costly, but not
  the end of the world. If your PHP-DB link has bandwidth probs
  it might be a problem.

A few important changes to get_my_courses()

 - (Compat ALERT!) the default fields are less than before --
   (will be followed by patches that fix the callers!) our defaults
   had grown to quite a bit because of the crazy caching scheme it had

 - the $fields parameter is to name _additional_ fields you need, and
   ideally wants them passed as an array. Will cope with old-style
   strings too.

 - the returned courses have an extra property "context" that is
   a fully valid context object, so if the caller needs to perform
   further accesslib checks, we save a query per course down the road

The work is done in the newfangled get_courses_bycap_fromsess()
which is brute-force but fast. I'm sure we can optimise the common
cases a lot in it if we try. It'd be worthwhile to

  - reduce the rows we grab - that's really boneheaded

  - if we copy and tweak the logic of has_cap_fromsess() in it
    it can be made even faster
2007-09-19 07:03:49 +00:00
martinlanghoff
13a794757e accesslib: has_capability() - useful debugging bit... 2007-09-19 07:03:34 +00:00
martinlanghoff
018d4b52b7 accesslib: get_user_access_bycontext() fetches overrides in subcontexts, intro aggr_roles_fromsess()
The main thing here is that overrides in subcontexts are
now read correctly (and still cheaply) into the access array.

Also

 - introducing aggr_roles_fromsess() with gives you a list of
   the relevant roles that affect the user in this context

 - we clear out $USER->access on login/logout

 - get_user_access_bycontext() gets a few optimisations too...
2007-09-19 07:03:19 +00:00
martinlanghoff
e0376a6241 accesslib: default, guest and notloggedin roles work properly now
Changes around load_user_capability() and has_capability() to make
the default role fallbacks and guest/nonloggedin roles work.

This commit also introduces the concept of having a magic
context next to the root context in $USER->access[ra], as

 $USER->access[ra][/1] = 1 (admin roleid)
 $USER->access[ra][/1:def] = 7 (loggedinuser roleid)

and has_cap_fromsess() now checks for that magic context
as well.
2007-09-19 07:02:57 +00:00
martinlanghoff
74ac5b66cb accesslib: has_capability() now works for the logged in user
With this commit, the new has_capability works for the logged
in user correctly.

 - load_all_capabilities() no longer calls load_user_capability()!
   6K dbqueries less on login... ;-)

 - When delving into a context we haven't loaded yet, we call
   get_user_access_bycontext()

 - Introduce: get_user_access_bycontext()

 - Several fixes in get_user_access_sitewide()
   (renamed from get_user_sitewide_access())

 - Fixes in has_cap_fromsess()

 - Introduce access_insess() to check if we have to call
   get_user_access_bycontext() for the context
2007-09-19 07:02:44 +00:00
martinlanghoff
7f97ea29bf accesslib: initial has_capability() rewrite
- has_capability() renamed has_capability_old() and we fallback
   when we cannot answer the question

 - has_capability() works great for the course-and-above contexts
   for the logged in user - does not touch the DB

 - works based on $USER->access which has a pretty compact view
   of the user's access rights...

TODO:

 - deal with contexts below the course - here we need to
   trigger the role-assignment and role-defs load when needed

 - deal with "other" contexts that hang from the system context

 - deal with global roleswitch, local roleswitch
2007-09-19 07:02:31 +00:00
martinlanghoff
a9bee37ea1 accesslib: Introducing get_user_sitewide_access($userid)
This function carefully fetches all the data needed to
handle site/category/course access for a given user
as cheaply as possible.

It currently takes 3 db queries.
2007-09-19 07:02:04 +00:00
martinlanghoff
1f3c9d097f accesslib: Introducing build_context_path()
which populates the context.path and context.depth fields
2007-09-19 07:01:27 +00:00
martinlanghoff
19bb8a0517 accesslib:get_child_contexts() reworked to use context.path
Using context.path, now get_child_contexts...

 - always takes 1 query
 - populated the context_cache
 - returns full records
 - when called with an category, it won't
   recurse into the children of courses

Also

 - All callers in accesslib changed to the new
   calling convention

A normal course page with a std blocks and a few
activities sees around 100 queries less with this patch.

Note: this commit is slightly different on HEAD/19 and on
MOODLE_18_STABLE, as groups-related tables have changed.
2007-09-19 06:52:34 +00:00
martinlanghoff
17b0efae11 accesslib: Introducing cleanup_contexts() and use it in cron
The newly minted cleanup_contexts() walks the context table
matching contexts with the tables they are referencing and
clearing any leftover contexts.
2007-09-19 06:50:53 +00:00
nicolasconnault
c421ad4b2e MDL-11233 Corrected typo in grader report lib, and added a second sort parameter for lastname and firstname sorts, to add consistency to result sets. Non-students no longer appear in the list 2007-09-13 13:44:35 +00:00
mattc-catalyst
38553f9754 MDL-10888: groupings - fix SQL error 2007-08-27 03:54:59 +00:00
skodak
dda6370707 MDL-10635 fixed incorrect capability value check in has_capability_including_child_contetxt() 2007-08-26 16:55:46 +00:00
skodak
47ba005d0d MDL-10995 course parents cache size now limited 2007-08-26 07:58:20 +00:00
moodler
5464c36277 Fixes for grade plugincapability names MDL-10989 2007-08-26 05:49:59 +00:00
skodak
3bf618ce0d MDL-10995 implemented caching of course and category parents - eliminates substantial number of db queries - mostly during login and on course page 2007-08-25 19:25:17 +00:00
skodak
5785266f9e MDL-10995 removing previous patch; testing a better one just now 2007-08-25 14:35:54 +00:00
skodak
8496a9c911 MDL-10995 improved capability_search():
* eliminated fetching of course - $COURSE used if id matches
* parent category structure is cached in static array
2007-08-25 12:22:15 +00:00
skodak
e6260a456b MDL-10635 improved performance of update_course_icon() and friends; fixed parameter of iseditting() - removed $userid which was not used and did not make much sense there anyway 2007-08-25 11:28:37 +00:00
skodak
c331cf23c5 MDL-10945 fixed block capability checks in switch role mode 2007-08-22 19:20:20 +00:00
skodak
5bf243d131 MDL-10383 - groups/groupings refactoring nearly finished ;-) 2007-08-16 11:06:48 +00:00
toyomoyo
baea72ec48 some changes for better capabilities list display 2007-08-16 08:48:53 +00:00
skodak
2c386f82e5 MDL-10383 - deprecated get_groups(), user_group() and ismember() 2007-08-15 20:21:01 +00:00
poltawski
7e874772a3 MDL-10573 - Added a capability for viewing blocks, this allows role-based control of block
display.

Changed context capability check so that CONTEXT_BLOCK capabilities can also come from the
moodle core capability definitions
2007-08-13 10:08:15 +00:00
poltawski
be23993798 MDL-10624 Reverting forum part of last commit - it wasn't needed, I wasn't testing
correctly. merged from 18_STABLE
2007-08-06 19:17:36 +00:00
poltawski
87c2d37d82 Fixed typo in previous commit 2007-08-06 18:47:57 +00:00
poltawski
2515adf9ea MDL-9431 & MDL-10624 - we're not removing some tracking records from the
database when we unassign roles - remove forum_subscriptions & user_lastaccess

Merged from MOODLE_18_STABLE
2007-08-06 18:45:35 +00:00
stronk7
6cdd0f9c93 Adding Id tag + copyright notice.
Merged from MOODLE_18_STABLE
2007-08-06 17:55:44 +00:00
toyomoyo
c345bb584a MDL-10679, improvement to context_rel table and load_user_capability 2007-08-02 08:28:29 +00:00
toyomoyo
3527464679 when unassign users in course, if user has no more course:view capability left, he should be removed from all groups in course 2007-07-27 05:43:05 +00:00
skodak
89bd8357e9 MDL-10579 capabilities for grade export plugins 2007-07-24 08:51:45 +00:00