[development] The static $perm variable in user_access reset erroneously

David Metzler metzlerd at metzlerd.com
Sat Nov 1 03:55:45 UTC 2008


I downloaded and looked at the code for user_access and I have one  
idea.  I've had some problem intializing static structures to arrays  
or objects in certain versions of php.  Try changing the definition  
of $perm as follows:

static $perm = '';
if (!$perm) $perm = array();

See if that changes the caching behavior in your php rev.

Dave


On Oct 31, 2008, at 11:38 AM, Ron Parker wrote:

> On Fri, Oct 31, 2008 at 12:27 AM, David Metzler  
> <metzlerd at metzlerd.com>wrote:
>
> > It sounds like you're suggesting that $perm, a static variable  
> within
> > user_access() is being modified without user_access being called,  
> but within
> > a single page load.   That doesn't seem possible in PHP, unless  
> there is a
> > PHP bug.  Static variables are supposed to be local in scope to the
> > functions that create them. To prove beyond a shadow of doubt,  
> put a $debug
> > statement in at the very beginning of the function user_access  
> and another
> > at the very end of the function.  (just before the return).  If  
> what you're
>
> This is exactly what I'm suggesting.  I put debug statements in  
> user_access, node_content_access, and my OGUR function so that I  
> would see every time they were accessed, and what was in them.
>
> To briefly summarize, I have a role "GroupAdmin" which is  
> dynamically added to the $user object.  It contains the "create  
> story content" permission.
>
> I issue the command to clear the $perm cache: user_access 
> ('ClearCache', NULL, TRUE)
>
> This is followed by a module_invoke command (which, in turn will  
> again call user_access):
> module_invoke('node_content', 'access', 'create', 'story', $user)
>
> The problem is that the $perm variable in the second user_access  
> call should contain the values from the first user_access call, and  
> it doesn't.  It is still set, as it should be, but the variables  
> are different.  Here are the results of my debugging:
>
> I noticed that even when my hook_init() clears the $perm variable:
> user_access('', NULL, TRUE)
> ogur roles loaded into user object (hook_init)
> user_access | string =
> user_access | static $perm is NOT already set
> user_access | $perm set for uid 3 (test01)
> user_access | string = | $perm values =  
> 0,1,2,0,1,2,4,5,7,8,9,10,4,5,6,7,8,9,10,0,0,1,2,3,4
> user_access | roles returned: (authenticated user,Devel,Group  
> Member,Group Contributor,Group Admin)
> user_access | permissions returned: (access comments,access  
> content,view uploaded files,view advanced help index,view advanced  
> help popup,view advanced help topic,post comments,post comments  
> without approval,search content,use advanced search,subscribe to  
> newsletters,view links in block,create page content,create story  
> content,delete own page content,delete own story content,edit own  
> page content,edit own story content,upload files,configure member  
> roles,access devel information,display source code,execute php  
> code,switch users,view devel_node_access information)
> The very next call to user_access does NOT contain the correct  
> permissions:
> user_access('access content')
> user_access | string = access content | $perm values =  
> 0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4 (note that all the permmissions  
> from above are NOT here - the only ones missing are those granted  
> by the dynamically assigned roles)
> user_access | static $perm is already set
> user_access | roles returned: (authenticated user,Devel,Group  
> Member,Group Contributor,Group Admin)
> user_access | permissions returned: (view advanced help index,view  
> advanced help popup,view advanced help topic,access comments,post  
> comments,post comments without approval,access content,search  
> content,use advanced search,subscribe to newsletters,view links in  
> block,access devel information,display source code,execute php  
> code,switch users,view devel_node_access information)
> Another test:
>
> This is the page loaded:
>
> http://mysite.com/node/ognodeadd?type=story&gids[]=24
>
> User should be able to create story. This is what debug returns:
> ogur roles loaded into user object (ognodeadd)
> ogur | ognodeadd roles returned: (authenticated user,Devel,Group  
> Member,Group Contributor,Group Admin)  These are the correct roles  
> for this user in this group.
> ogur | module to call = node_content | type = story
> ogur | Preparing to call module_invoke
> ogur | Calling user_access('ClearCache', NULL, TRUE)
> user_access | string = ClearCache
> user_access | static $perm is NOT already set
> user_access | $perm set for uid 3 (test01)
> user_access | string = ClearCache | $perm values =  
> 0,1,2,0,1,2,4,5,7,8,9,10,4,5,6,7,8,9,10,0,0,1,2,3,4
> user_access | roles returned: (authenticated user,Devel,Group  
> Member,Group Contributor,Group Admin)  This is correct.
> user_access | permissions returned: (access comments,access  
> content,view uploaded files,view advanced help index,view advanced  
> help popup,view advanced help topic,post comments,post comments  
> without approval,search content,use advanced search,subscribe to  
> newsletters,view links in block,create page content,create story  
> content,delete own page content,delete own story content,edit own  
> page content,edit own story content,upload files,configure member  
> roles,access devel information,display source code,execute php  
> code,switch users,view devel_node_access information)
>
> The above are the permissions that $perm should have the next time  
> user_access is ran.  It will run again when module_invoke() is  
> called. Below is what comes back the very next time user_access is  
> called.
> ogur | Calling module_invoke('node_content', 'access', 'create',  
> 'story', $user)
> node_content_access | type = story | op = create
> node_content_access | roles returned: (authenticated  
> user,Devel,Group Member,Group Contributor,Group Admin)
> user_access | string = create story content | $perm values =  
> 0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4
> user_access | static $perm is already set
> user_access | roles returned: (authenticated user,Devel,Group  
> Member,Group Contributor,Group Admin) This is correct.
> user_access | permissions returned: (view advanced help index,view  
> advanced help popup,view advanced help topic,access comments,post  
> comments,post comments without approval,access content,search  
> content,use advanced search,subscribe to newsletters,view links in  
> block,access devel information,display source code,execute php  
> code,switch users,view devel_node_access information)
> Note that the "Group Admin" role permissions are not included here.  
> They should be the same as from from the ClearCache user_access  
> command above. It appears that the above permissions have been  
> cached somewhere else.
> ogur | module_invoke called
> ogur | ognodeadd roles returned: (authenticated user,Devel,Group  
> Member,Group Contributor,Group Admin)
> ogur | module_invoke access returns false
> Access should be true here.
> Installed devel module.  There are four user_access SQL queries  
> that appear on this page:
> 1.16	1	user_access	SELECT p.perm FROM role r INNER JOIN permission  
> p ON p.rid = r.rid WHERE r.rid IN (2,8)
> 0.77	3	user_access	SELECT p.perm FROM role r INNER JOIN permission  
> p ON p.rid = r.rid WHERE r.rid IN (2,8,3,4,7)
> 0.76	3	user_access	SELECT p.perm FROM role r INNER JOIN permission  
> p ON p.rid = r.rid WHERE r.rid IN (2,8,3,4,7)
> 0.72	3	user_access	SELECT p.perm FROM role r INNER JOIN permission  
> p ON p.rid = r.rid WHERE r.rid IN (2,8,3,4,7)
>
>
>
>
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/development/attachments/20081031/c22756a9/attachment-0001.htm 


More information about the development mailing list