[Erp5-report] r12775 - in /spec/debian/unstable/erp5-erp5security: ./ ERP5Security/ ERP5Sec...

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Feb 15 18:21:43 CET 2007


Author: yusei
Date: Thu Feb 15 18:21:37 2007
New Revision: 12775

URL: http://svn.erp5.org?rev=12775&view=rev
Log:
added debian package and workspace.

Added:
    spec/debian/unstable/erp5-erp5security/
    spec/debian/unstable/erp5-erp5security/ERP5Security/
    spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5GroupManager.py
    spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5RoleManager.py
    spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5UserManager.py
    spec/debian/unstable/erp5-erp5security/ERP5Security/MAINTAINERS.txt
    spec/debian/unstable/erp5-erp5security/ERP5Security/VERSION.txt
    spec/debian/unstable/erp5-erp5security/ERP5Security/__init__.py
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/changelog
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/compat
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/control
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/copyright
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/dzproduct
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/postinst
    spec/debian/unstable/erp5-erp5security/ERP5Security/debian/rules   (with props)
    spec/debian/unstable/erp5-erp5security/ERP5Security/refresh.txt
    spec/debian/unstable/erp5-erp5security/ERP5Security/tests/
    spec/debian/unstable/erp5-erp5security/ERP5Security/tests/__init__.py
    spec/debian/unstable/erp5-erp5security/ERP5Security/tests/testERP5Security.py
    spec/debian/unstable/erp5-erp5security/ERP5Security/www/
    spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5GroupManager.zpt
    spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5RoleManager.zpt
    spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5UserManager.zpt
    spec/debian/unstable/erp5-erp5security/ERP5Security/www/portal.gif   (with props)
    spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.diff.gz   (with props)
    spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.dsc
    spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_all.deb   (with props)
    spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.build
    spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.changes
    spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14.orig.tar.gz   (with props)

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5GroupManager.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5GroupManager.py?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5GroupManager.py (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5GroupManager.py Thu Feb 15 18:21:37 2007
@@ -1,0 +1,197 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights
+# Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this
+# distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Classes: ERP5GroupManager
+"""
+
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+from AccessControl.SecurityManagement import newSecurityManager,\
+    getSecurityManager, setSecurityManager
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PluggableAuthService.plugins.BasePlugin import BasePlugin
+from Products.PluggableAuthService.utils import classImplements
+from Products.PluggableAuthService.interfaces.plugins import IGroupsPlugin
+from Products.ERP5Type.Cache import CachingMethod
+from Products.PluggableAuthService.PropertiedUser import PropertiedUser
+from ZODB.POSException import ConflictError
+
+import sys
+
+from zLOG import LOG, WARNING
+
+from ERP5UserManager import SUPER_USER
+
+class ConsistencyError(Exception): pass
+
+manage_addERP5GroupManagerForm = PageTemplateFile(
+    'www/ERP5Security_addERP5GroupManager', globals(),
+    __name__='manage_addERP5GroupManagerForm' )
+
+def addERP5GroupManager( dispatcher, id, title=None, REQUEST=None ):
+  """ Add a ERP5GroupManager to a Pluggable Auth Service. """
+
+  egm = ERP5GroupManager(id, title)
+  dispatcher._setObject(egm.getId(), egm)
+
+  if REQUEST is not None:
+    REQUEST['RESPONSE'].redirect(
+                              '%s/manage_workspace'
+                              '?manage_tabs_message='
+                              'ERP5GroupManager+added.'
+                          % dispatcher.absolute_url())
+
+class ERP5GroupManager(BasePlugin):
+
+  """ PAS plugin for dynamically adding Groups
+  based on Assignments in ERP5
+  """
+  meta_type = 'ERP5 Group Manager'
+
+  security = ClassSecurityInfo()
+
+  def __init__(self, id, title=None):
+
+    self._id = self.id = id
+    self.title = title
+
+  #
+  #   IGroupsPlugin implementation
+  #
+  def getGroupsForPrincipal(self, principal, request=None):
+    """ See IGroupsPlugin.
+    """
+    # If this is the super user, skip the check.
+    if principal.getId() == SUPER_USER:
+      return ()
+
+    def _getGroupsForPrincipal(user_name, path):
+      security_category_dict = {} # key is the base_category_list,
+                                  # value is the list of fetched categories
+      security_group_list = []
+      security_definition_list = ()
+
+      # because we aren't logged in, we have to create our own
+      # SecurityManager to be able to access the Catalog
+      sm = getSecurityManager()
+      if sm.getUser() != SUPER_USER:
+        newSecurityManager(self, self.getUser(SUPER_USER))
+      try:
+        # To get the complete list of groups, we try to call the
+        # ERP5Type_getSecurityCategoryMapping which should return a list
+        # of lists of two elements (script, base_category_list) like :
+        # (
+        #   ('script_1', ['base_category_1', 'base_category_2', ...]),
+        #   ('script_2', ['base_category_1', 'base_category_3', ...])
+        # )
+        #
+        # else, if the script does not exist, falls back to a list containng
+        # only one list :
+        # (('ERP5Type_getSecurityCategoryFromAssignment',
+        #   self.getPortalAssignmentBaseCategoryList() ),)
+
+        mapping_method = getattr(self,
+            'ERP5Type_getSecurityCategoryMapping', None)
+        if mapping_method is None:
+          security_definition_list = ((
+              'ERP5Type_getSecurityCategoryFromAssignment',
+              self.getPortalAssignmentBaseCategoryList()
+          ),)
+        else:
+          security_definition_list = mapping_method()
+
+        # get the person from its reference
+        catalog_result = self.portal_catalog(
+            portal_type="Person", reference=user_name)
+        if len(catalog_result) != 1: # we won't proceed with groups
+          if len(catalog_result) > 1: # configuration is screwed
+            raise ConsistencyError, 'There is more than one Person whose \
+                login is %s : %s' % (user_name,
+                repr([r.getObject() for r in catalog_result]))
+          else: # no person is linked to this user login
+            return ()
+        person_object = catalog_result[0].getObject()
+        person_id = person_object.getId()
+
+        # Fetch category values from defined scripts
+        for (method_name, base_category_list) in \
+            security_definition_list:
+          base_category_list = tuple(base_category_list)
+          method = getattr(self, method_name)
+          security_category_list = security_category_dict.setdefault(
+                                            base_category_list, [])
+          try:
+            security_category_list.extend(
+              method(base_category_list, user_name, person_object, '')
+            )
+          except ConflictError:
+            raise
+          except:
+            LOG('ERP5GroupManager', WARNING,
+                'could not get security categories from %s' % (method_name,),
+                error = sys.exc_info())
+
+        # Get group names from category values
+        group_id_list_generator = getattr(self,
+                                      'ERP5Type_asSecurityGroupIdList', None)
+        if group_id_list_generator is not None:
+          for base_category_list, category_value_list in \
+              security_category_dict.items():
+            for category_dict in category_value_list:
+              try:
+                security_group_list.extend(
+                  group_id_list_generator(category_order=base_category_list,
+                                          **category_dict)
+                )
+              except ConflictError:
+                raise
+              except:
+                LOG('ERP5GroupManager', WARNING,
+                    'could not get security groups from '
+                    'ERP5Type_asSecurityGroupIdList',
+                    error = sys.exc_info())
+        else:
+          group_id_generator = getattr(self, 'ERP5Type_asSecurityGroupId')
+          for base_category_list, category_value_list in \
+              security_category_dict.items():
+            for category_dict in category_value_list:
+              try:
+                security_group_list.append(
+                  group_id_generator(category_order=base_category_list,
+                                      **category_dict)
+                )
+              except ConflictError:
+                raise
+              except:
+                LOG('ERP5GroupManager', WARNING,
+                    'could not get security groups from '
+                    'ERP5Type_asSecurityGroupId',
+                    error = sys.exc_info())
+      finally:
+        setSecurityManager(sm)
+      return tuple(security_group_list)
+
+    _getGroupsForPrincipal = CachingMethod(_getGroupsForPrincipal,
+                                  id='ERP5GroupManager_getGroupsForPrincipal')
+    return _getGroupsForPrincipal(
+                user_name=principal.getId(),
+                path=self.getPhysicalPath())
+
+
+
+classImplements( ERP5GroupManager
+               , IGroupsPlugin
+               )
+
+InitializeClass(ERP5GroupManager)

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5RoleManager.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5RoleManager.py?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5RoleManager.py (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5RoleManager.py Thu Feb 15 18:21:37 2007
@@ -1,0 +1,83 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights
+# Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this
+# distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Classes: ERP5RoleManager
+"""
+
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PluggableAuthService.plugins.BasePlugin import BasePlugin
+from Products.PluggableAuthService.utils import classImplements
+from Products.PluggableAuthService.interfaces.plugins import IRolesPlugin,\
+                                                    IRoleEnumerationPlugin
+
+from ERP5UserManager import SUPER_USER
+
+manage_addERP5RoleManagerForm = PageTemplateFile(
+    'www/ERP5Security_addERP5RoleManager', globals(),
+    __name__='manage_addERP5RoleManagerForm' )
+
+def addERP5RoleManager( dispatcher, id, title=None, REQUEST=None ):
+    """ Add a ERP5RoleManager to a Pluggable Auth Service. """
+
+    erm = ERP5RoleManager(id, title)
+    dispatcher._setObject(erm.getId(), erm)
+
+    if REQUEST is not None:
+        REQUEST['RESPONSE'].redirect(
+                                '%s/manage_workspace'
+                                '?manage_tabs_message='
+                                'ERP5RoleManager+added.'
+                            % dispatcher.absolute_url())
+ 
+class ERP5RoleManager( BasePlugin ):
+
+    """ PAS plugin to add 'Member' as default
+    Role for every user.
+    """
+    meta_type = 'ERP5 Role Manager'
+
+    security = ClassSecurityInfo()
+
+    def __init__(self, id, title=None):
+
+        self._id = self.id = id
+        self.title = title
+
+    #
+    #   IRolesPlugin implementation
+    #
+    security.declarePrivate( 'getRolesForPrincipal' )
+    def getRolesForPrincipal( self, principal, request=None ):
+        """ See IRolesPlugin.
+        We only ever return Member for every principal
+        """
+        if principal.getId() == SUPER_USER:
+          # If this is the super user, give all the roles present in this system.
+          # XXX no API to do this in PAS.
+          rolemakers = self._getPAS().plugins.listPlugins( IRoleEnumerationPlugin )
+          roles = []
+          for rolemaker_id, rolemaker in rolemakers:
+            roles.extend([role['id'] for role in rolemaker.enumerateRoles()])
+          return tuple(roles)
+
+        return ('Member',)
+
+classImplements( ERP5RoleManager
+               , IRolesPlugin
+               )
+
+
+InitializeClass(ERP5RoleManager)

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5UserManager.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5UserManager.py?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5UserManager.py (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/ERP5UserManager.py Thu Feb 15 18:21:37 2007
@@ -1,0 +1,203 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights
+# Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this
+# distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Classes: ERP5UserManager
+"""
+
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+from AccessControl.SecurityManagement import getSecurityManager,\
+    setSecurityManager, newSecurityManager
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PluggableAuthService.PluggableAuthService import _SWALLOWABLE_PLUGIN_EXCEPTIONS
+from Products.PluggableAuthService.plugins.BasePlugin import BasePlugin
+from Products.PluggableAuthService.utils import classImplements
+from Products.PluggableAuthService.interfaces.plugins import IAuthenticationPlugin
+from Products.PluggableAuthService.interfaces.plugins import IUserEnumerationPlugin
+from Products.ERP5Type.Cache import CachingMethod
+from ZODB.POSException import ConflictError
+import sys
+
+from zLOG import LOG
+
+try :
+  from AccessControl.AuthEncoding import pw_validate
+except ImportError:
+  pw_validate = lambda reference, attempt: reference == attempt
+
+# This user is used to bypass all security checks.
+SUPER_USER = '__erp5security-=__'
+
+manage_addERP5UserManagerForm = PageTemplateFile(
+    'www/ERP5Security_addERP5UserManager', globals(),
+    __name__='manage_addERP5UserManagerForm' )
+
+def addERP5UserManager(dispatcher, id, title=None, REQUEST=None):
+    """ Add a ERP5UserManagern to a Pluggable Auth Service. """
+
+    eum = ERP5UserManager(id, title)
+    dispatcher._setObject(eum.getId(), eum)
+
+    if REQUEST is not None:
+        REQUEST['RESPONSE'].redirect(
+                                '%s/manage_workspace'
+                                '?manage_tabs_message='
+                                'ERP5UserManager+added.'
+                            % dispatcher.absolute_url())
+
+class ERP5UserManager(BasePlugin):
+    """ PAS plugin for managing users in ERP5
+    """
+
+    meta_type = 'ERP5 User Manager'
+
+    security = ClassSecurityInfo()
+
+    def __init__(self, id, title=None):
+
+        self._id = self.id = id
+        self.title = title
+
+    #
+    #   IAuthenticationPlugin implementation
+    #
+    security.declarePrivate( 'authenticateCredentials' )
+    def authenticateCredentials(self, credentials):
+        """ See IAuthenticationPlugin.
+
+        o We expect the credentials to be those returned by
+            ILoginPasswordExtractionPlugin.
+        """
+        # Forbidden the usage of the super user.
+        if credentials.get('login') == SUPER_USER:
+          return None
+
+        def _authenticateCredentials(login, password, path):
+            if not login or not password:
+                return None
+
+            user_list = self.getUserByLogin(login)
+
+            if not user_list:
+                return None
+
+            user = user_list[0]
+
+            sm = getSecurityManager()
+            if sm.getUser() != SUPER_USER:
+              newSecurityManager(self, self.getUser(SUPER_USER))
+            try:
+              if pw_validate(user.getPassword(), password) and\
+                  user.getCareerRole() == 'internal':
+                return login, login # use same for user_id and login
+            finally:
+              setSecurityManager(sm)
+
+            return None
+
+        _authenticateCredentials = CachingMethod(_authenticateCredentials,
+                                    id='ERP5UserManager_authenticateCredentials')
+        return _authenticateCredentials(
+                      login=credentials.get('login'),
+                      password=credentials.get('password'),
+                      path=self.getPhysicalPath())
+
+    #
+    #   IUserEnumerationPlugin implementation
+    #
+    security.declarePrivate( 'enumerateUsers' )
+    def enumerateUsers(self, id=None, login=None, exact_match=False,
+                       sort_by=None, max_results=None, **kw):
+        """ See IUserEnumerationPlugin.
+        """
+        def _enumerateUsers(id_tuple, exact_match, path):
+            user_info = []
+            plugin_id = self.getId()
+
+            id_list = []
+            for id in id_tuple:
+              if SUPER_USER == id:
+                info = { 'id' : SUPER_USER
+                        , 'login' : SUPER_USER
+                        , 'pluginid' : plugin_id
+                        }
+                user_info.append(info)
+              else:
+                if exact_match:
+                  id_list.append(id)
+                else:
+                  id_list.append('%%%s%%' % id)
+
+            if id_list:
+              for user in self.getUserByLogin(tuple(id_list)):
+                  info = { 'id' : user.getReference()
+                         , 'login' : user.getReference()
+                         , 'pluginid' : plugin_id
+                         }
+
+                  user_info.append(info)
+
+            return tuple(user_info)
+
+        _enumerateUsers = CachingMethod(_enumerateUsers,
+                                        id='ERP5UserManager_enumerateUsers')
+
+        if id is None:
+          id = login
+        if isinstance(id, str):
+          id = (id,)
+        if isinstance(id, list):
+          id = tuple(id)
+        return _enumerateUsers(id_tuple=id,
+                               exact_match=exact_match,
+                               path=self.getPhysicalPath())
+
+    def getUserByLogin(self, login):
+        """
+        Search the Catalog for login and return a list of person objects
+        login can be a string or a list of strings
+        """
+        if not login:
+          return []
+        # because we aren't logged in, we have to create our own
+        # SecurityManager to be able to access the Catalog
+        sm = getSecurityManager()
+        if sm.getUser() != SUPER_USER:
+          newSecurityManager(self, self.getUser(SUPER_USER))
+
+        try:
+          try:
+            result = self.getPortalObject().portal_catalog(
+                                    portal_type="Person", reference=login)
+          except ConflictError:
+            raise
+          except:
+            LOG('ERP5Security', 0, 'getUserByLogin failed', error=sys.exc_info())
+            # Here we must raise an exception to prevent calers from caching
+            # a result of a degraded situation.
+            # The kind of exception does not matter as long as it's catched by
+            # PAS and causes a lookup using another plugin or user folder.
+            # As PAS does not define explicitely such exception, we must use
+            # the _SWALLOWABLE_PLUGIN_EXCEPTIONS list.
+            raise _SWALLOWABLE_PLUGIN_EXCEPTIONS[0]
+        finally:
+          setSecurityManager(sm)
+        return [item.getObject() for item in result]
+
+classImplements( ERP5UserManager
+               , IAuthenticationPlugin
+               , IUserEnumerationPlugin
+               )
+
+InitializeClass(ERP5UserManager)

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/MAINTAINERS.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/MAINTAINERS.txt?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/MAINTAINERS.txt (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/MAINTAINERS.txt Thu Feb 15 18:21:37 2007
@@ -1,0 +1,2 @@
+alex
+aurel

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/VERSION.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/VERSION.txt?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/VERSION.txt (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/VERSION.txt Thu Feb 15 18:21:37 2007
@@ -1,0 +1,1 @@
+ERP5Security 0.14

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/__init__.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/__init__.py?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/__init__.py (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/__init__.py Thu Feb 15 18:21:37 2007
@@ -1,0 +1,90 @@
+##############################################################################
+#
+# Copyright (c) 2001 Zope Corporation and Contributors. All Rights
+# Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this
+# distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" ERP5Security product initialization.
+"""
+
+from copy import deepcopy
+
+from AccessControl.Permissions import manage_users as ManageUsers
+from Products.PluggableAuthService.PluggableAuthService import registerMultiPlugin
+from Products.PluggableAuthService.permissions import ManageGroups
+
+import ERP5UserManager
+import ERP5GroupManager
+import ERP5RoleManager
+
+def mergedLocalRoles(object):
+    """Returns a merging of object and its ancestors'
+    __ac_local_roles__."""
+    # Modified to take into account _getAcquireLocalRoles
+    merged = {}
+    object = getattr(object, 'aq_inner', object)
+    while 1:
+        if hasattr(object, '__ac_local_roles__'):
+            dict = object.__ac_local_roles__ or {}
+            if callable(dict): dict = dict()
+            for k, v in dict.items():
+                if merged.has_key(k):
+                    merged[k] = merged[k] + v
+                else:
+                    merged[k] = v
+        # block acquisition
+        if hasattr(object, '_getAcquireLocalRoles'):
+            if not object._getAcquireLocalRoles():
+                break
+        if hasattr(object, 'aq_parent'):
+            object=object.aq_parent
+            object=getattr(object, 'aq_inner', object)
+            continue
+        if hasattr(object, 'im_self'):
+            object=object.im_self
+            object=getattr(object, 'aq_inner', object)
+            continue
+        break
+
+    return deepcopy(merged)
+
+registerMultiPlugin(ERP5UserManager.ERP5UserManager.meta_type)
+registerMultiPlugin(ERP5GroupManager.ERP5GroupManager.meta_type)
+registerMultiPlugin(ERP5RoleManager.ERP5RoleManager.meta_type)
+
+def initialize(context):
+
+    context.registerClass( ERP5UserManager.ERP5UserManager
+                         , permission=ManageUsers
+                         , constructors=(
+                            ERP5UserManager.manage_addERP5UserManagerForm, 
+                            ERP5UserManager.addERP5UserManager, )
+                         , visibility=None
+                         , icon='www/portal.gif'
+                         )
+
+    context.registerClass( ERP5GroupManager.ERP5GroupManager
+                         , permission=ManageGroups
+                         , constructors=(
+                            ERP5GroupManager.manage_addERP5GroupManagerForm, 
+                            ERP5GroupManager.addERP5GroupManager, )
+                         , visibility=None
+                         , icon='www/portal.gif'
+                         )
+
+    context.registerClass( ERP5RoleManager.ERP5RoleManager
+                         , permission=ManageUsers
+                         , constructors=(
+                            ERP5RoleManager.manage_addERP5RoleManagerForm,
+                            ERP5RoleManager.addERP5RoleManager, )
+                         , visibility=None
+                         , icon='www/portal.gif'
+                         )

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/changelog
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/changelog?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/changelog (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/changelog Thu Feb 15 18:21:37 2007
@@ -1,0 +1,6 @@
+erp5-erp5security (0.14-1) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Yusei TAHARA <yusei at domen.cx>  Wed, 14 Feb 2007 03:27:56 +0900
+

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/compat
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/compat?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/compat (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/compat Thu Feb 15 18:21:37 2007
@@ -1,0 +1,1 @@
+5

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/control
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/control?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/control (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/control Thu Feb 15 18:21:37 2007
@@ -1,0 +1,15 @@
+Source: erp5-erp5security
+Section: web
+Priority: optional
+Maintainer: Yusei TAHARA
+Build-Depends: debhelper (>= 5.0)
+Build-Depends-Indep: zope-debhelper (>= 0.3.6)
+Standards-Version: 3.7.2
+
+Package: erp5-erp5security
+Architecture: all
+Depends: erp5-zope
+Description: A collection of plugins for Pluggable Auth Service to manage ERP5 security
+ This zope product is a plugin to Pluggable Auth Service, to manage roles,
+ groups and users in ERP5. It also add fine security management features to
+ ERP5.

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/copyright
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/copyright?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/copyright (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/copyright Thu Feb 15 18:21:37 2007
@@ -1,0 +1,2 @@
+ Copyright (c) 2001 Zope Corporation and Contributors. All Rights
+ Reserved.

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/dzproduct
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/dzproduct?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/dzproduct (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/dzproduct Thu Feb 15 18:21:37 2007
@@ -1,0 +1,3 @@
+Name: ERP5Security
+Package: erp5-erp5security
+ZopeVersions: >= 2.7

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/postinst
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/postinst?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/postinst (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/postinst Thu Feb 15 18:21:37 2007
@@ -1,0 +1,7 @@
+#!/bin/sh -e
+
+. /usr/share/debconf/confmodule
+
+#DEBHELPER#
+
+db_stop

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/rules
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/debian/rules?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/debian/rules (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/debian/rules Thu Feb 15 18:21:37 2007
@@ -1,0 +1,44 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+pwd        := $(shell pwd)
+debian     := $(pwd)/debian/erp5-erp5security
+
+build: build-stamp
+build-stamp:
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp configure-stamp
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+	dh_installerp5zope .
+
+binary-indep: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installexamples
+	dh_installchangelogs
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary-arch:
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary install

Propchange: spec/debian/unstable/erp5-erp5security/ERP5Security/debian/rules
------------------------------------------------------------------------------
    svn:executable = 

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/refresh.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/refresh.txt?rev=12775&view=auto
==============================================================================
    (empty)

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/tests/__init__.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/tests/__init__.py?rev=12775&view=auto
==============================================================================
    (empty)

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/tests/testERP5Security.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/tests/testERP5Security.py?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/tests/testERP5Security.py (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/tests/testERP5Security.py Thu Feb 15 18:21:37 2007
@@ -1,0 +1,364 @@
+##############################################################################
+#
+# Copyright (c) 2004 Nexedi SARL and Contributors. All Rights Reserved.
+#                                    Jerome Perrin <jerome at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+"""Tests ERP5 User Management.
+"""
+import os, sys
+if __name__ == '__main__':
+  execfile(os.path.join(sys.path[0], 'framework.py'))
+
+# Needed in order to have a log file inside the current folder
+os.environ['EVENT_LOG_FILE'] = os.path.join(os.getcwd(), 'zLOG.log')
+os.environ['EVENT_LOG_SEVERITY'] = '-300'
+
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase,\
+                                                     get_request
+from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl.SecurityManagement import getSecurityManager
+from zLOG import LOG
+from Products.ERP5Type.Cache import clearCache
+from Products.PluggableAuthService import PluggableAuthService
+try:
+  from Interface.Verify import verifyClass
+except ImportError:
+  from zope.interface.verify import verifyClass
+
+class TestUserManagement(ERP5TypeTestCase):
+  """Tests User Management in ERP5Security.
+  """
+  
+  def getTitle(self):
+    """Title of the test."""
+    return "ERP5Security: User Management"
+  
+  def getBusinessTemplateList(self):
+    """List of BT to install. """
+    return ('erp5_base',)
+  
+  def beforeTearDown(self):
+    """Clears person module and invalidate caches when tests are finished."""
+    clearCache()
+    self.getPersonModule().manage_delObjects([x for x in
+                             self.getPersonModule().objectIds()])
+    get_transaction().commit()
+    self.tic()
+  
+  def login(self):
+    uf = self.getUserFolder()
+    uf._doAddUser('alex', '', ['Manager', 'Assignee', 'Assignor',
+                               'Associate', 'Auditor', 'Author'], [])
+    user = uf.getUserById('alex').__of__(uf)
+    newSecurityManager(None, user)
+
+  def getUserFolder(self):
+    """Returns the acl_users. """
+    return self.getPortal().acl_users
+
+  def test_GroupManagerInterfaces(self):
+    """Tests group manager plugin respects interfaces."""
+    # XXX move to GroupManager test class
+    from Products.PluggableAuthService.interfaces.plugins import IGroupsPlugin
+    from Products.ERP5Security.ERP5GroupManager import ERP5GroupManager
+    verifyClass(IGroupsPlugin, ERP5GroupManager)
+
+  def test_UserManagerInterfaces(self):
+    """Tests user manager plugin respects interfaces."""
+    from Products.PluggableAuthService.interfaces.plugins import\
+                IAuthenticationPlugin, IUserEnumerationPlugin
+    from Products.ERP5Security.ERP5UserManager import ERP5UserManager
+    verifyClass(IAuthenticationPlugin, ERP5UserManager)
+    verifyClass(IUserEnumerationPlugin, ERP5UserManager)
+
+  def test_UserFolder(self):
+    """Tests user folder has correct meta type."""
+    self.failUnless(isinstance(self.getUserFolder(),
+        PluggableAuthService.PluggableAuthService))
+
+  def _makePerson(self, **kw):
+    """Creates a person in person module, and returns the object, after
+    indexing is done. """
+    person_module = self.getPersonModule()
+    new_person = person_module.newContent(
+                     portal_type='Person', **kw)
+    get_transaction().commit()
+    self.tic()
+    return new_person
+
+  def _assertUserExists(self, login, password):
+    """Checks that a user with login and password exists and can log in to the
+    system.
+    """
+    from Products.PluggableAuthService.interfaces.plugins import\
+                                                      IAuthenticationPlugin
+    uf = self.getUserFolder()
+    self.assertNotEquals(uf.getUserById(login, None), None)
+    for plugin_name, plugin in uf._getOb('plugins').listPlugins(
+                                IAuthenticationPlugin ):
+      if plugin.authenticateCredentials(
+                  {'login':login, 'password':password}) is not None:
+        break
+    else:
+      self.fail("No plugin could authenticate '%s' with password '%s'" %
+              (login, password))
+  
+  def _assertUserDoesNotExists(self, login, password):
+    """Checks that a user with login and password does not exists and cannot
+    log in to the system.
+    """
+    from Products.PluggableAuthService.interfaces.plugins import\
+                                                        IAuthenticationPlugin
+    uf = self.getUserFolder()
+    for plugin_name, plugin in uf._getOb('plugins').listPlugins(
+                              IAuthenticationPlugin ):
+      if plugin.authenticateCredentials(
+                {'login':login, 'password':password}) is not None:
+        self.fail(
+           "Plugin %s should not have authenticated '%s' with password '%s'" %
+           (plugin_name, login, password))
+
+  def test_PersonWithLoginPasswordAreUsers(self):
+    """Tests a person with a login & password is a valid user."""
+    p = self._makePerson(reference='the_user', password='secret',
+                        career_role='internal')
+    self._assertUserExists('the_user', 'secret')
+    
+  def test_PersonLoginCaseSensitive(self):
+    """Login/password are case sensitive."""
+    p = self._makePerson(reference='the_user', password='secret',
+                        career_role='internal')
+    self._assertUserDoesNotExists('the_User', 'secret')
+  
+  def test_PersonLoginNonAscii(self):
+    """Login can contain non ascii chars."""
+    p = self._makePerson(reference='j\xc3\xa9', password='secret',
+                        career_role='internal')
+    self._assertUserExists('j\xc3\xa9', 'secret')
+
+  def test_PersonWithLoginWithEmptyPasswordAreNotUsers(self):
+    """Tests a person with a login but no password is not a valid user."""
+    self._makePerson(reference='the_user', career_role='internal')
+    self._assertUserDoesNotExists('the_user', None)
+    self._makePerson(reference='another_user', password='',
+                     career_role='internal')
+    self._assertUserDoesNotExists('another_user', '')
+  
+  def test_PersonWithEmptyLoginAreNotUsers(self):
+    """Tests a person with a login & password is a valid user."""
+    self._makePerson(reference='', password='secret', career_role='internal')
+    self._assertUserDoesNotExists('', 'secret')
+  
+  def test_PersonWithSuperUserLoginCannotBeCreated(self):
+    """Tests one cannot create person with the "super user" special login."""
+    from Products.ERP5Security.ERP5UserManager import SUPER_USER
+    self.assertRaises(RuntimeError, self._makePerson, reference=SUPER_USER)
+  
+  def test_PersonWithSuperUserLogin(self):
+    """Tests one cannot use the "super user" special login."""
+    from Products.ERP5Security.ERP5UserManager import SUPER_USER
+    self._assertUserDoesNotExists(SUPER_USER, '')
+
+  def test_MultiplePersonReference(self):
+    """Tests that it's refused to create two Persons with same reference."""
+    self._makePerson(reference='new_person')
+    self.assertRaises(RuntimeError, self._makePerson, reference='new_person')
+
+  def test_PersonCopyAndPaste(self):
+    """If we copy and paste a person, login must not be copyied."""
+    person = self._makePerson(reference='new_person')
+    person_module = self.getPersonModule()
+    copy_data = person_module.manage_copyObjects([person.getId()])
+    changed, = person_module.manage_pasteObjects(copy_data)
+    self.assertNotEquals(person_module[changed['new_id']].getReference(),
+                         person_module[changed['id']].getReference())
+  
+class TestLocalRoleManagement(ERP5TypeTestCase):
+  """Tests Local Role Management with ERP5Security.
+
+  This test should probably part of ERP5Type ?
+  """
+  def getTitle(self):
+    return "ERP5Security: User Role Management"
+
+  def afterSetUp(self):
+    """Called after setup completed.
+    """
+    self.portal = self.getPortal()
+    # configure group, site, function categories
+    for bc in ['group', 'site', 'function']:
+      base_cat = self.getCategoryTool()[bc]
+      code = bc[0].upper()
+      base_cat.newContent(portal_type='Category',
+                          id='subcat',
+                          codification="%s1" % code)
+    self.defined_category = "group/subcat\n"\
+                            "site/subcat\n"\
+                            "function/subcat"
+    # any member can add organisations
+    self.portal.organisation_module.manage_permission(
+            'Add portal content', roles=['Member', 'Manager'], acquire=1)
+
+    self.username = 'username'
+    # create a user and open an assignement
+    pers = self.getPersonModule().newContent(portal_type='Person',
+                                             career_role='internal',
+                                             reference=self.username,
+                                             password=self.username)
+    assignment = pers.newContent( portal_type='Assignment',
+                                  group='subcat',
+                                  site='subcat',
+                                  function='subcat' )
+    assignment.open()
+    get_transaction().commit()
+    self.tic()
+  
+  def beforeTearDown(self):
+    """Called before teardown."""
+    # clear base categories
+    for bc in ['group', 'site', 'function']:
+      base_cat = self.getCategoryTool()[bc]
+      base_cat.manage_delObjects([x for x in base_cat.objectIds()])
+    # clear role definitions
+    for ti in self.getTypesTool().objectValues(spec=('ERP5 Type Information',)):
+      ti._roles = ()
+    # clear modules
+    for module in self.portal.objectValues(spec=('ERP5 Folder',)):
+      module.manage_delObjects([x for x in module.objectIds()])
+    # commit this
+    get_transaction().commit()
+    self.tic()
+    clearCache()
+
+  def loginAsUser(self, username):
+    uf = self.portal.acl_users
+    user = uf.getUserById(username).__of__(uf)
+    newSecurityManager(None, user)
+  
+  def _getTypeInfo(self):
+    return self.getTypesTool()['Organisation']
+  
+  def _getModuleTypeInfo(self):
+    return self.getTypesTool()['Organisation Module']
+  
+  def _makeOne(self):
+    return self.getOrganisationModule().newContent(portal_type='Organisation')
+  
+  def getBusinessTemplateList(self):
+    """List of BT to install. """
+    return ('erp5_base',)
+  
+  def test_RolesManagerInterfaces(self):
+    """Tests group manager plugin respects interfaces."""
+    from Products.PluggableAuthService.interfaces.plugins import IRolesPlugin
+    from Products.ERP5Security.ERP5RoleManager import ERP5RoleManager
+    verifyClass(IRolesPlugin, ERP5RoleManager)
+
+  def testMemberRole(self):
+    """Test users have the Member role.
+    """
+    self.loginAsUser(self.username)
+    self.failUnless('Member' in
+            getSecurityManager().getUser().getRolesInContext(self.portal))
+    self.failUnless('Member' in
+            getSecurityManager().getUser().getRoles())
+
+  def testSimpleLocalRole(self):
+    """Test simple case of setting a role.
+    """
+    ti = self._getTypeInfo()
+    ti.addRole(id='Assignor', description='desc.',
+           name='an Assignor role for testing',
+           condition='',
+           category=self.defined_category,
+           base_category_script='ERP5Type_getSecurityCategoryFromAssignment',
+           base_category='')
+    obj = self._makeOne()
+    self.assertEquals(['Assignor'], obj.__ac_local_roles__.get('F1_G1_S1'))
+    
+    self.loginAsUser(self.username)
+    self.failUnless('Assignor' in
+            getSecurityManager().getUser().getRolesInContext(obj))
+        
+  def testDynamicLocalRole(self):
+    """Test simple case of setting a dynamic role.
+    The site category is not defined explictly the role, and will have the
+    current site of the user.
+    """
+    return NotImplemented # FIXME: currently this test raises error
+                           
+    ti = self._getTypeInfo()
+    ti.addRole(id='Assignor', description='desc.',
+           name='an Assignor role for testing',
+           condition='',
+           category='group/subcat\nfunction/subcat',
+           base_category_script='ERP5Type_getSecurityCategoryFromAssignment',
+           base_category='site')
+    
+    self.loginAsUser(self.username)
+    obj = self._makeOne()
+    self.assertEquals(['Assignor'], obj.__ac_local_roles__.get('F1_G1_S1'))
+    self.failUnless('Assignor' in
+            getSecurityManager().getUser().getRolesInContext(obj))
+  
+  def testAcquireLocalRoles(self):
+    """Tests that document does not acquire loal roles from their parents if
+    "acquire local roles" is not checked."""
+    ti = self._getTypeInfo()
+    ti.acquire_local_roles = False
+    module_ti = self._getModuleTypeInfo()
+    module_ti.addRole(id='Assignor', description='desc.',
+           name='an Assignor role for testing',
+           condition='',
+           category=self.defined_category,
+           base_category_script='ERP5Type_getSecurityCategoryFromAssignment',
+           base_category='')
+    obj = self._makeOne()
+    module = obj.getParentValue()
+    module.updateLocalRolesOnSecurityGroups()
+    # we said the we do not want acquire local roles.
+    self.failIf(obj._getAcquireLocalRoles())
+    # the local role is set on the module
+    self.assertEquals(['Assignor'], module.__ac_local_roles__.get('F1_G1_S1'))
+    # but not on the document
+    self.assertEquals(None, obj.__ac_local_roles__.get('F1_G1_S1'))
+    # same testing with roles in context.
+    self.loginAsUser(self.username)
+    self.failUnless('Assignor' in
+            getSecurityManager().getUser().getRolesInContext(module))
+    self.failIf('Assignor' in
+            getSecurityManager().getUser().getRolesInContext(obj))
+    
+if __name__ == '__main__':
+  framework()
+else:
+  import unittest
+  def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestUserManagement))
+    suite.addTest(unittest.makeSuite(TestLocalRoleManagement))
+    return suite
+

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5GroupManager.zpt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5GroupManager.zpt?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5GroupManager.zpt (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5GroupManager.zpt Thu Feb 15 18:21:37 2007
@@ -1,0 +1,46 @@
+<h1 tal:replace="structure here/manage_page_header">Header</h1>
+
+<h2 tal:define="form_title string:Add ERP5 Group Manager"
+    tal:replace="structure here/manage_form_title">Form Title</h2>
+
+<p class="form-help">
+ERP5 Group Manager assigns Groups dynamically to users
+based on Assignments in ERP5
+</p>
+
+<form action="addERP5GroupManager" method="post">
+<table cellspacing="0" cellpadding="2" border="0">
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-label">
+    Id
+    </div>
+    </td>
+    <td align="left" valign="top">
+    <input type="text" name="id" size="40" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-optional">
+    Title
+    </div>
+    </td>
+    <td align="left" valign="top">
+    <input type="text" name="title" size="40" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    </td>
+    <td align="left" valign="top">
+    <div class="form-element">
+    <input class="form-element" type="submit" name="submit" 
+     value=" Add " /> 
+    </div>
+    </td>
+  </tr>
+</table>
+</form>
+
+<h1 tal:replace="structure here/manage_page_footer">Footer</h1>

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5RoleManager.zpt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5RoleManager.zpt?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5RoleManager.zpt (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5RoleManager.zpt Thu Feb 15 18:21:37 2007
@@ -1,0 +1,45 @@
+<h1 tal:replace="structure here/manage_page_header">Header</h1>
+
+<h2 tal:define="form_title string:Add ERP5 Role Manager"
+    tal:replace="structure here/manage_form_title">Form Title</h2>
+
+<p class="form-help">
+ERP5 Role Manager adds 'Member' as default Role for every user.
+</p>
+
+<form action="addERP5RoleManager" method="post">
+<table cellspacing="0" cellpadding="2" border="0">
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-label">
+    Id
+    </div>
+    </td>
+    <td align="left" valign="top">
+    <input type="text" name="id" size="40" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-optional">
+    Title
+    </div>
+    </td>
+    <td align="left" valign="top">
+    <input type="text" name="title" size="40" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    </td>
+    <td align="left" valign="top">
+    <div class="form-element">
+    <input class="form-element" type="submit" name="submit" 
+     value=" Add " /> 
+    </div>
+    </td>
+  </tr>
+</table>
+</form>
+
+<h1 tal:replace="structure here/manage_page_footer">Footer</h1>

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5UserManager.zpt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5UserManager.zpt?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5UserManager.zpt (added)
+++ spec/debian/unstable/erp5-erp5security/ERP5Security/www/ERP5Security_addERP5UserManager.zpt Thu Feb 15 18:21:37 2007
@@ -1,0 +1,46 @@
+<h1 tal:replace="structure here/manage_page_header">Header</h1>
+
+<h2 tal:define="form_title string:Add ERP5 User Manager"
+    tal:replace="structure here/manage_form_title">Form Title</h2>
+
+<p class="form-help">
+ERP5 User Manager applys the users managed in ERP5 person moduel
+to the Pluggable Authentication Service
+</p>
+
+<form action="addERP5UserManager" method="post">
+<table cellspacing="0" cellpadding="2" border="0">
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-label">
+    Id
+    </div>
+    </td>
+    <td align="left" valign="top">
+    <input type="text" name="id" size="40" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-optional">
+    Title
+    </div>
+    </td>
+    <td align="left" valign="top">
+    <input type="text" name="title" size="40" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    </td>
+    <td align="left" valign="top">
+    <div class="form-element">
+    <input class="form-element" type="submit" name="submit" 
+     value=" Add " /> 
+    </div>
+    </td>
+  </tr>
+</table>
+</form>
+
+<h1 tal:replace="structure here/manage_page_footer">Footer</h1>

Added: spec/debian/unstable/erp5-erp5security/ERP5Security/www/portal.gif
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/ERP5Security/www/portal.gif?rev=12775&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-erp5security/ERP5Security/www/portal.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.diff.gz
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.diff.gz?rev=12775&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.diff.gz
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.dsc
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.dsc?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.dsc (added)
+++ spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1.dsc Thu Feb 15 18:21:37 2007
@@ -1,0 +1,12 @@
+Format: 1.0
+Source: erp5-erp5security
+Version: 0.14-1
+Binary: erp5-erp5security
+Maintainer: Yusei TAHARA
+Architecture: all
+Standards-Version: 3.7.2
+Build-Depends: debhelper (>= 5.0)
+Build-Depends-Indep: zope-debhelper (>= 0.3.6)
+Files: 
+ 2dbed0c17992f4eb55d844bb45853f25 9668 erp5-erp5security_0.14.orig.tar.gz
+ b124d355f688a5ad887e23b1bea49237 989 erp5-erp5security_0.14-1.diff.gz

Added: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_all.deb
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_all.deb?rev=12775&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_all.deb
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.build
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.build?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.build (added)
+++ spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.build Thu Feb 15 18:21:37 2007
@@ -1,0 +1,34 @@
+ fakeroot debian/rules clean
+dh_testdir
+dh_testroot
+rm -f build-stamp configure-stamp
+dh_clean
+ dpkg-source -b ERP5Security
+dpkg-source: warning: source directory `./ERP5Security' is not <sourcepackage>-<upstreamversion> `erp5-erp5security-0.14'
+dpkg-source: warning: .orig directory name ERP5Security.orig is not <package>-<upstreamversion> (wanted erp5-erp5security-0.14.orig)
+dpkg-source: building erp5-erp5security using existing erp5-erp5security_0.14.orig.tar.gz
+dpkg-source: building erp5-erp5security in erp5-erp5security_0.14-1.diff.gz
+dpkg-source: building erp5-erp5security in erp5-erp5security_0.14-1.dsc
+ debian/rules build
+touch build-stamp
+ fakeroot debian/rules binary
+dh_testdir
+dh_testroot
+dh_clean -k
+dh_installdirs
+dh_installerp5zope .
+dh_testdir
+dh_testroot
+dh_installdocs
+dh_installexamples
+dh_installchangelogs
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dpkg-deb: `../erp5-erp5security_0.14-1_all.deb' ¤Ë¥Ñ¥Ã¥±¡¼¥¸ `erp5-erp5security' ¤ò¹½ÃÛ¤·¤Æ¤¤¤Þ¤¹¡£
+ dpkg-genchanges
+dpkg-genchanges: including full source code in upload
+dpkg-buildpackage (debuild emulation): full upload (original source is included)

Added: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.changes
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.changes?rev=12775&view=auto
==============================================================================
--- spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.changes (added)
+++ spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14-1_i386.changes Thu Feb 15 18:21:37 2007
@@ -1,0 +1,21 @@
+Format: 1.7
+Date: Wed, 14 Feb 2007 03:27:56 +0900
+Source: erp5-erp5security
+Binary: erp5-erp5security
+Architecture: source all
+Version: 0.14-1
+Distribution: unstable
+Urgency: low
+Maintainer: Yusei TAHARA
+Changed-By: Yusei TAHARA <yusei at domen.cx>
+Description: 
+ erp5-erp5security - A collection of plugins for Pluggable Auth Service to manage ERP5
+Changes: 
+ erp5-erp5security (0.14-1) unstable; urgency=low
+ .
+   * Initial Release.
+Files: 
+ 9689ce3192b34492a851bd5a5e0e124c 382 web optional erp5-erp5security_0.14-1.dsc
+ 2dbed0c17992f4eb55d844bb45853f25 9668 web optional erp5-erp5security_0.14.orig.tar.gz
+ b124d355f688a5ad887e23b1bea49237 989 web optional erp5-erp5security_0.14-1.diff.gz
+ 962d10815068b4d0818a430690ac796c 11778 web optional erp5-erp5security_0.14-1_all.deb

Added: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14.orig.tar.gz
URL: http://svn.erp5.org/spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14.orig.tar.gz?rev=12775&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-erp5security/erp5-erp5security_0.14.orig.tar.gz
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream




More information about the Erp5-report mailing list