El jue, 26-07-2007 a las 15:32 -0400, Erik Bray escribió:
> PermissionSystem.store is an ExtensionOption, and can't (and
> shouldn't) be set like that, as you've already discovered.  What this
> means is that it's an option you set in your trac.ini file.
> Specifically, you should set 'permission_store = SuperUserPlugin' in
> the [trac] section.
> 
> That way, your PermissionSystem will use the correct IPermissionStore
> implementation.

Thanks, I noticed, but I wanted a way to make it transparent to the
user. Just install the plugin, and keep the current permission_store
setting

> Also, instead of self.default_store...., just have your
> SuperUserPlugin inherit from DefaultPermissionStore.  For example:
> 
> class SuperUserPlugin(DefaultPermissionStore):
>     def get_user_permissions(self, username):
>         if username == 'admin':
>             return ['TRAC_ADMIN']
>         return DefaultPermissionStore.get_user_permissions(self, username)

Yes, but if the user has permission_store = AnotherPermissionStore, I
want my plugin to wrap that AnotherPermissionStore, not
DefaultPermissionStore. That's why I do the self.default_store trick.

> And so on and so forth.  Something along those lines should work.

Thanks, I got it working without the transparent PermissionStore
replacement, manually setting permission_store = SuperUserPlugin, and a
new setting: wrapper_permission_store = DefaultPermissionStore

I'll upload this and other plugins we've been working on to track-hacks,
including:

 * SearchAllProjects: adds a new filter to search in all projects in the
parent path. Similar to MetaSearch, but opening the environments instead
of using XMLRPC
 * CustomCSS: Allows to insert a custom CSS sheet in every request, to
override trac.css style settings.

Thanks very much.

> On 7/26/07, Álvaro J. Iradier Muro <[EMAIL PROTECTED]> wrote:
> > Hi,
> >
> > I'm working on a small plugin for Trac. We user AccountManager and an
> > external htusers.digest file for storing users and passwords for all
> > available projects.
> >
> > I want to have an 'admin' superuser which has TRAC_ADMIN permissions
> > without having to give the permission in every existing project.
> >
> > This is my approach. I'm creating a plugin that implements
> > IPermissionStore. I want my plugin to replace the current
> > PermissionStore (set on trac.ini), whatever it is. All methods in my
> > permission store call the previous permission store methods, except for
> > get_user_permissions(), where I check if the username is 'admin', then
> > always return 'TRAC_ADMIN'. Also, in get_all_permissions(), I add the
> > tuple ('admin', 'TRAC_ADMIN') to the permissions list.
> >
> > In the __init__ method I try to save the previous PermissionStore, and
> > set a new one in PermissionSystem.store, but apparently it doesn't
> > work.
> >
> > Summary:
> >
> > 1. In trac.ini, permission_store = DefaultPermissionStore (or any
> > others, not my own PermissionStore)
> > 2. When my plugin loads, save PermissionSystem.store as old_store, and
> > set my own PermissionStore (SuperUserPlugin) which will wrap the current
> > store methods.
> > 3. When IPermissionStore methods are called, my wrapper will invoke the
> > old_store methods after checking some conditions.
> >
> > Problem is: Apparently, the plugin is loaded and active
> >
> > The code for the plugin is:
> >
> > -------------- Begin code ------------------
> >
> > class SuperUserPlugin(Component):
> >     """ Adds a superuser with TRAC_ADMIN permissions """
> >     implements(IPermissionStore)
> >
> >     def __init__(self):
> >
> >         #Replace current PermissionStore
> >         perm_system = PermissionSystem(self.env)
> >         self.default_store = getattr(perm_system,'store')
> >         setattr(perm_system, 'store', self)
> >
> >         #The following will fail with "Attribute can't be set"
> >         #perm_system.store = self
> >
> >     def get_user_permissions(self, username):
> >         if username == 'admin':
> >             return ['TRAC_ADMIN']
> >         return self.default_store.get_user_permissions(username)
> >
> >     def get_all_permissions(self):
> >         return self.default_store.get_all_permissions() \
> >             + ('admin', 'TRAC_ADMIN')
> >
> >     def grant_permission(self, username, action):
> >         return self.default_store.grant_permission(username, action)
> >
> >     def revoke_permission(self, username, action):
> >         return self.default_store.revoke_permission(username, action)
> >
> > -------------- End code ------------------
> >
> > Thanks very much, any help will be appreciated.
> >
> > --
> > --------------------------------------
> >
> >         Álvaro J. Iradier Muro
> >      [EMAIL PROTECTED]
> >
> >    AM&B - Dept. de Desarrollo e I+D
> >
> >
> 
> --~--~---------~--~----~------------~-------~--~----~
> You received this message because you are subscribed to the Google Groups 
> "Trac Development" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to [EMAIL PROTECTED]
> For more options, visit this group at 
> http://groups.google.com/group/trac-dev?hl=en
> -~----------~----~----~----~------~----~------~--~---
> 
-- 
--------------------------------------

        Álvaro J. Iradier Muro
     [EMAIL PROTECTED]

   AM&B - Dept. de Desarrollo e I+D

Attachment: signature.asc
Description: Esta parte del mensaje está firmada digitalmente

Reply via email to