[Erp5-report] r12783 - in /spec/debian/unstable/erp5-ldapmultiplugins: ./ LDAPMultiPlugins/...

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Feb 15 18:27:35 CET 2007


Author: yusei
Date: Thu Feb 15 18:27:31 2007
New Revision: 12783

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

Added:
    spec/debian/unstable/erp5-ldapmultiplugins/
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/ActiveDirectoryMultiPlugin.py
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/CHANGES.txt
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/COPYRIGHT.txt
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/INSTALL.txt
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPMultiPlugin.py
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPPluginBase.py
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LICENSE.txt
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/README.txt
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/VERSION.txt
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/__init__.py
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/changelog
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/compat
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/control
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/copyright
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/dzproduct
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/postinst
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/rules   (with props)
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addActiveDirectoryMultiPlugin.dtml
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addLDAPMultiPlugin.dtml
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/admultiplugin.png   (with props)
    spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/ldapmultiplugin.png   (with props)
    spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.diff.gz   (with props)
    spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.dsc
    spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_all.deb   (with props)
    spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.build
    spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.changes
    spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1.orig.tar.gz   (with props)

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/ActiveDirectoryMultiPlugin.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/ActiveDirectoryMultiPlugin.py?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/ActiveDirectoryMultiPlugin.py (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/ActiveDirectoryMultiPlugin.py Thu Feb 15 18:27:31 2007
@@ -1,0 +1,423 @@
+##############################################################################
+#
+# ActiveDirectoryMultiPlugin   Shim to use the LDAPUserFolder with the
+#                   PluggableAuthenticationService w/ AD
+#
+##############################################################################
+
+__doc__     = """ ActiveDirectoryUserFolder shim module """
+__version__ = '$Revision: 1258 $'[11:-2]
+
+# General Python imports
+import os, operator
+from urllib import quote_plus
+
+# Zope imports
+from Acquisition import aq_base
+from Globals import InitializeClass, DTMLFile, package_home
+from AccessControl import ClassSecurityInfo
+import zLOG
+from Products.LDAPUserFolder import manage_addLDAPUserFolder
+
+from Products.PluggableAuthService.interfaces.plugins import \
+     IUserEnumerationPlugin, IGroupsPlugin, IGroupEnumerationPlugin, \
+     IRoleEnumerationPlugin
+from Products.PluggableAuthService.utils import classImplements
+from Products.PluggableAuthService.utils import implementedBy
+
+from LDAPPluginBase import LDAPPluginBase
+
+_dtmldir = os.path.join(package_home(globals()), 'dtml')
+addActiveDirectoryMultiPluginForm = DTMLFile('addActiveDirectoryMultiPlugin',
+                                             _dtmldir)
+
+def manage_addActiveDirectoryMultiPlugin( self, id, title, LDAP_server
+                             , login_attr
+                             , uid_attr, users_base, users_scope, roles
+                             , groups_base, groups_scope, binduid, bindpwd
+                             , binduid_usage=1, rdn_attr='cn', local_groups=0
+                             , use_ssl=0 , encryption='SHA', read_only=0
+                             , REQUEST=None
+                             ):
+    """ Factory method to instantiate a ActiveDirectoryMultiPlugin """
+    # Make sure we really are working in our container (the 
+    # PluggableAuthService object)
+    self = self.this()
+
+    # Instantiate the folderish adapter object
+    lmp = ActiveDirectoryMultiPlugin(id, title=title)
+    self._setObject(id, lmp)
+    lmp = getattr(aq_base(self), id)
+    lmp_base = aq_base(lmp)
+
+    # Put the "real" LDAPUserFolder inside it
+    manage_addLDAPUserFolder(lmp)
+    luf = getattr(lmp_base, 'acl_users')
+
+    host_elems = LDAP_server.split(':')
+    host = host_elems[0]
+    if len(host_elems) > 1:
+        port = host_elems[1]
+    else:
+        port = '389'
+
+    luf.manage_addServer(host, port=port)
+    luf.manage_edit( title
+                   , login_attr
+                   , uid_attr
+                   , users_base
+                   , users_scope
+                   , roles
+                   , groups_base
+                   , groups_scope
+                   , binduid
+                   , bindpwd
+                   , binduid_usage=binduid_usage
+                   , rdn_attr=rdn_attr
+                   , local_groups=local_groups
+                   , encryption=encryption
+                   , read_only=read_only
+                   , REQUEST=None
+                   )              
+
+    # clean out the __allow_groups__ bit because it is not needed here
+    # and potentially harmful
+    if hasattr(lmp_base, '__allow_groups__'):
+        del lmp_base.__allow_groups__
+
+    uf = lmp.acl_users
+    uf._ldapschema =   { 'cn' : { 'ldap_name' : 'cn'
+                                , 'friendly_name' : 'Canonical Name'
+                                , 'multivalued' : ''
+                                , 'public_name' : ''
+                                }
+                       , 'sn' : { 'ldap_name' : 'sn'
+                                , 'friendly_name' : 'Last Name'
+                                , 'multivalued' : ''
+                                , 'public_name' : 'last_name'
+                                }
+                       }
+    uf.manage_addLDAPSchemaItem('dn', 'Distinguished Name',
+                                public_name='dn')
+    uf.manage_addLDAPSchemaItem('sAMAccountName', 'Windows Login Name',
+                                public_name='windows_login_name')
+    uf.manage_addLDAPSchemaItem('objectGUID', 'AD Object GUID',
+                                public_name='objectGUID')
+    uf.manage_addLDAPSchemaItem('givenName', 'First Name',
+                                public_name='first_name')
+    uf.manage_addLDAPSchemaItem('sn', 'Last Name',
+                                public_name='last_name')
+    uf.manage_addLDAPSchemaItem('memberOf',
+                                'Group DNs',
+                                public_name='memberOf',
+                                multivalued=True)
+
+    if REQUEST is not None:
+        REQUEST.RESPONSE.redirect('%s/manage_main' % self.absolute_url())
+
+class ActiveDirectoryMultiPlugin(LDAPPluginBase):
+    """ The adapter that mediates between the PAS and the LDAPUserFolder """
+    security = ClassSecurityInfo()
+    meta_type = 'ActiveDirectory Multi Plugin'
+
+    _properties = LDAPPluginBase._properties + (
+        {'id':'groupid_attr', 'type':'string', 'mode':'w'},
+        {'id':'grouptitle_attr', 'type':'string', 'mode':'w'},
+        {'id':'group_class', 'type':'string', 'mode':'w'},
+        {'id':'group_recurse', 'type':'int', 'mode':'w'},
+        )
+
+    groupid_attr = 'objectGUID'
+    grouptitle_attr = 'cn'
+    group_class = 'group'
+    group_recurse = 1
+
+    def __init__(self, id, title='', groupid_attr='objectGUID',
+                 grouptitle_attr='cn', group_class='group', group_recurse=1):
+        """ Initialize a new instance """
+        self.id = id
+        self.title = title
+        self.groupid_attr = groupid_attr
+        self.grouptitle_attr = grouptitle_attr
+        self.group_class = group_class
+        self.group_recurse = group_recurse
+
+    security.declarePublic('getGroupsForPrincipal')
+    def getGroupsForPrincipal(self, user, request=None, attr=None):
+        """ Fulfill GroupsPlugin requirements """
+        if attr is None:
+            attr = self.groupid_attr
+
+        acl = self._getLDAPUserFolder()
+
+        if acl is None:
+            return ()
+
+        view_name = self.getId() + '_getGroupsForPrincipal'
+        criteria = {'user_id':user.getId(), 'attr':attr}
+
+        cached_info = self.ZCacheable_get(view_name = view_name,
+                                          keywords = criteria,
+                                          default = None)
+
+        if cached_info is not None:
+            zLOG.LOG('ADMP', zLOG.INFO,
+                     'returning cached results from getGroupsForPrincipal')
+            return cached_info
+
+        unmangled_userid = self._demangle(user.getId())
+        if unmangled_userid is None:
+            return ()
+
+        ldap_user = acl.getUserById(unmangled_userid)
+        if ldap_user is None:
+            return ()
+
+        cns = [ x.split(',')[0] for x in (ldap_user.memberOf or []) ]
+        if not cns:
+            return ()
+        cns = [ '(%s)' % x for x in cns ]
+        filt = '(&(objectClass=%s)(|%s))' % (self.group_class, ''.join(cns))
+
+        delegate = acl._delegate
+        R = delegate.search(acl.groups_base, acl.groups_scope, filter=filt)
+
+        if R['exception']:
+            raise RuntimeError, R['exception']
+        if self.group_recurse:
+            groups = self._recurseGroups(R['results'])
+        else:
+            groups = R['results']
+
+        results = [ x[attr][0] for x in groups]
+
+        self.ZCacheable_set(results, view_name=view_name, keywords=criteria)
+
+        return results
+
+    def _recurseGroups(self, ldap_results, temp=None, seen=None):
+        """ Given a set of LDAP result data for a group search, return
+        the recursive group memberships for each group: arbitrarily
+        expensive """
+        if seen is None:
+            seen = {}
+        if temp is None:
+            temp = []
+        for result in ldap_results:
+            dn = result['dn']
+            if seen.has_key(dn):
+                continue
+            temp.append(result)
+            seen[dn] = 1
+            
+            filt = '(&(objectClass=%s)(memberOf=%s))' % (self.group_class, dn)
+            acl = self.acl_users
+            delegate = acl._delegate
+            R = delegate.search(acl.groups_base, acl.groups_scope, filter=filt)
+            if R['exception']:
+                raise RuntimeError, R['exception']
+            self._recurseGroups(R['results'], temp, seen)
+
+        return temp
+
+    security.declarePrivate('enumerateUsers')
+    def enumerateUsers( self
+                      , id=None
+                      , login=None
+                      , exact_match=0
+                      , sort_by=None
+                      , max_results=None
+                      , **kw
+                      ):
+        """ Fulfill the UserEnumerationPlugin requirements """
+        view_name = self.getId() + '_enumerateUsers'
+        criteria = {'id':id, 'login':login, 'exact_match':exact_match,
+                    'sort_by':sort_by, 'max_results':max_results}
+        criteria.update(kw)
+
+        cached_info = self.ZCacheable_get(view_name = view_name,
+                                          keywords = criteria,
+                                          default = None)
+
+        if cached_info is not None:
+            zLOG.LOG('ADMP', zLOG.INFO,
+                     'returning cached results from enumerateUsers')
+            return cached_info
+        
+        result = []
+        acl = self._getLDAPUserFolder()
+        login_attr = acl.getProperty('_login_attr')
+        uid_attr = acl.getProperty('_uid_attr')
+        plugin_id = self.getId()
+        edit_url = '%s/%s/manage_userrecords' % (plugin_id, acl.getId())
+
+        if acl is None:
+            return ()
+
+        if exact_match:
+            if id:
+                ldap_user = acl.getUserById(id)
+            elif login:
+                ldap_user = acl.getUser(login)
+            else:
+                msg = 'Exact Match specified but no ID or Login given'
+                raise ValueError, msg
+
+            if ldap_user is not None:
+                qs = 'user_dn=%s' % quote_plus(ldap_user.getUserDN())
+                result.append( { 'id' : ldap_user.getId()
+                               , 'login' : ldap_user.getProperty(login_attr)
+                               , 'pluginid' : plugin_id
+                               , 'title': ldap_user.getProperty(login_attr)
+                               , 'editurl' : '%s?%s' % (edit_url, qs)
+                               } ) 
+        elif id or login:
+            l_results = []
+            seen = []
+
+            if id:
+                l_results.extend(acl.findUser(uid_attr, id))
+
+            if login:
+                l_results.extend(acl.findUser(login_attr, login))
+
+            for key, val in kw.items():
+                if key not in (login_attr, uid_attr):
+                    l_results.extend(acl.findUser(key, val))
+
+            for l_res in l_results:
+                if l_res['dn'] not in seen:
+                    l_res['id'] = l_res[uid_attr]
+                    l_res['login'] = l_res[login_attr]
+                    l_res['pluginid'] = plugin_id
+                    quoted_dn = quote_plus(l_res['dn'])
+                    l_res['editurl'] = '%s?user_dn=%s' % (edit_url, quoted_dn)
+                    result.append(l_res)
+                    seen.append(quoted_dn)
+
+            if sort_by is not None:
+                result.sort(lambda a, b: cmp( a.get(sort_by, '').lower()
+                                            , b.get(sort_by, '').lower()
+                                            ) )
+
+            if isinstance(max_results, int) and len(result) > max_results:
+                result = result[:max_results-1]
+
+        else:
+            result = []
+            for uid, name in acl.getUserIdsAndNames():
+                tmp = {}
+                tmp['id'] = uid
+                tmp['login'] = name
+                tmp['pluginid'] = plugin_id
+                tmp['editurl'] = None
+                result.append(tmp)
+
+            if sort_by is not None:
+                result.sort(lambda a, b: cmp( a.get(sort_by, '').lower()
+                                            , b.get(sort_by, '').lower()
+                                            ) )
+
+            if isinstance(max_results, int) and len(result) > max_results:
+                result = result[:max_results-1]
+
+        result =  tuple(result)
+
+        self.ZCacheable_set(result, view_name=view_name, keywords=criteria)
+
+        return result
+
+    security.declarePrivate('enumerateGroups')
+    def enumerateGroups( self
+                       , id=None
+                       , exact_match=0
+                       , sort_by=None
+                       , max_results=None
+                       , **kw
+                       ):
+        """ Fulfill the RoleEnumerationPlugin requirements """
+        view_name = self.getId() + '_enumerateGroups'
+        criteria = {'id':id, 'exact_match':exact_match,
+                    'sort_by':sort_by, 'max_results':max_results}
+        criteria.update(kw)
+
+        cached_info = self.ZCacheable_get(view_name = view_name,
+                                          keywords = criteria,
+                                          default = None)
+
+        if cached_info is not None:
+            zLOG.LOG('ADMP', zLOG.INFO,
+                     'returning cached results from enumerateGroups')
+            return cached_info
+
+        acl = self._getLDAPUserFolder()
+
+        if acl is None:
+            return ()
+
+        if id is None and exact_match != 0:
+            raise ValueError, 'Exact Match requested but no id provided'
+        elif id is None:
+            id = ''
+            
+        test_id = id.lower()
+        plugin_id = self.getId()
+
+        filt = '(objectClass=%s)' % self.group_class
+
+        delegate = acl._delegate
+        R = delegate.search(acl.groups_base, acl.groups_scope, filter=filt)
+
+        if R['exception']:
+            raise RuntimeError, R['exception']
+
+        groups = R['results']
+
+        if exact_match:
+            tester = operator.eq
+        else:
+            tester = operator.contains
+
+        results = []
+        for group in groups:
+            tmp = {}
+            tmp['title'] = '(Group) ' + group[self.grouptitle_attr][0]
+            id = tmp['id'] = group[self.groupid_attr][0]
+            tmp['pluginid'] = plugin_id
+            if tester(id.lower(), test_id):
+                results.append(tmp)
+
+        if sort_by is not None:
+            results.sort(lambda a, b: cmp( a.get(sort_by, '').lower()
+                                          , b.get(sort_by, '').lower()
+                                            ) )
+        if isinstance(max_results, int) and len(results) > max_results:
+            results = results[:max_results+1]
+
+        results =  tuple(results)
+
+        self.ZCacheable_set(results, view_name=view_name, keywords=criteria)
+
+        return results
+
+    security.declarePrivate('enumerateRoles')
+    def enumerateRoles( self
+                      , id=None
+                      , exact_match=0
+                      , sort_by=None
+                      , max_results=None
+                      , **kw
+                      ):
+        """ Fulfill the RoleEnumerationPlugin requirements """
+        return []
+
+classImplements( ActiveDirectoryMultiPlugin
+               , IUserEnumerationPlugin
+               , IGroupsPlugin
+               , IGroupEnumerationPlugin
+               , IRoleEnumerationPlugin
+               , *implementedBy(LDAPPluginBase)
+               )
+
+InitializeClass(ActiveDirectoryMultiPlugin)
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/CHANGES.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/CHANGES.txt?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/CHANGES.txt (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/CHANGES.txt Thu Feb 15 18:27:31 2007
@@ -1,0 +1,61 @@
+Change log for the LDAPMultiPlugins product
+
+  1.1 (2005/10/29)
+
+    Bugs fixed
+
+      * The LDAPMultiPlugins ignored default roles configured on the
+        LDAPUserFolder and would not add it to the set of roles
+        computed (seen by Sidnei da Silva).
+
+      * enumerateUsers now allows you to do exact-match searches on 
+        attributes other than just the user ID and login (patch
+        by Sidnei da Silva). **Note**: This code now requires
+        LDAPUserFolder versions 2.6 or higher, which support exact 
+        match searches using LDAPUserFolder.findUsers.
+
+
+  1.0 (2005/08/18)
+
+    Other
+
+      * The interface machinery expected by the PluggableAuthService has
+        been changed to use Zope 3-style interfaces. Thanks go to Leonardo 
+        Rochael Almeida who provided a patch to fix the resulting breakage.
+
+      * Changed the initialization code for the plugins to conform to the
+        changed initialization code in the LDAPUserFolder product versions
+        2.6beta3 and up.
+
+
+  1.0beta3
+
+    Other
+
+      * Changes to the way the user IDs are mangled/unmangled to be in line
+        with the changes in the latest PluggableAuthService code
+        (Patch provided by Mark Hammond)
+
+
+  1.0beta2
+
+    Bugs fixed
+
+      * When retrieving properties for a user, None values have to be
+        converted to an empty string to prevent the user propertysheet
+        machinery from blowing up trying to guess what kind of 
+        property a None value could represent.
+
+
+  1.0beta1
+
+    Bugs fixed
+
+      * Role retrieval was broken, small fix involves changing a call to the
+        LDAPUserFolder
+
+
+  LDAPMultiPlugins 0.9
+
+    First public release
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/COPYRIGHT.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/COPYRIGHT.txt?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/COPYRIGHT.txt (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/COPYRIGHT.txt Thu Feb 15 18:27:31 2007
@@ -1,0 +1,9 @@
+Copyright (c) 2004 Zope Corporation, Chris McDonough and Jens Vagelpohl.
+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.

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/INSTALL.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/INSTALL.txt?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/INSTALL.txt (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/INSTALL.txt Thu Feb 15 18:27:31 2007
@@ -1,0 +1,25 @@
+Installing the LDAPMultiPlugins Product
+
+    It is assumed that you have installed the PluggableAuthService and
+    PluginRegistry products already. They are available from cvs.zope.org.
+
+    This product does not require any special handling after unzipping
+    and untarring it in the Zope Products directory. You should do 
+    something like::
+
+        $ cp LDAPMultiPlugins-xyz.tgz <zope_root>/lib/python/Products
+        $ cd <zope_root>/lib/python/Products
+        $ tar zxvf LDAPMultiPlugins-xyz.tgz
+        <watch files being decompressed>
+
+    Windows users can use WinZip or similar, it can handle tarred 
+    gzip files. Make sure to move the extracted LDAPMultiPlugins 
+    folder to your Zope installation's lib/python/Products-folder.
+
+    That's all. Do not forget to restart Zope afterwards. You will then
+    be able to select the "LDAP Multi Plugin" and the "Active Directory
+    Multi Plugin" from the list of plugins on the PluggableAuthService 
+    "Contents" tab in the Zope Management Interface (ZMI).
+
+    See README.txt for any other dependencies and requirements.
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPMultiPlugin.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPMultiPlugin.py?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPMultiPlugin.py (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPMultiPlugin.py Thu Feb 15 18:27:31 2007
@@ -1,0 +1,304 @@
+##############################################################################
+#
+# LDAPMultiPlugin   Shim to use the LDAPUserFolder with the
+#                   PluggableAuthenticationService
+#
+# This software is governed by a license. See
+# LICENSE.txt for the terms of this license.
+#
+##############################################################################
+
+__doc__     = """ LDAPUserFolder shim module """
+__version__ = '$Revision: 1257 $'[11:-2]
+
+# General Python imports
+import copy, os, operator
+from urllib import quote_plus
+
+# Zope imports
+import zLOG
+from Acquisition import aq_base
+from Globals import InitializeClass, DTMLFile, package_home
+from AccessControl import ClassSecurityInfo
+from Products.LDAPUserFolder import manage_addLDAPUserFolder
+
+from Products.PluggableAuthService.interfaces.plugins import \
+     IUserEnumerationPlugin, IGroupsPlugin, IGroupEnumerationPlugin, \
+     IRoleEnumerationPlugin
+from Products.PluggableAuthService.utils import classImplements
+from Products.PluggableAuthService.utils import implementedBy
+
+from LDAPPluginBase import LDAPPluginBase
+
+
+_dtmldir = os.path.join(package_home(globals()), 'dtml')
+addLDAPMultiPluginForm = DTMLFile('addLDAPMultiPlugin', _dtmldir)
+
+def manage_addLDAPMultiPlugin( self, id, title, LDAP_server, login_attr
+                             , uid_attr, users_base, users_scope, roles
+                             , groups_base, groups_scope, binduid, bindpwd
+                             , binduid_usage=1, rdn_attr='cn', local_groups=0
+                             , use_ssl=0 , encryption='SHA', read_only=0
+                             , REQUEST=None
+                             ):
+    """ Factory method to instantiate a LDAPMultiPlugin """
+    # Make sure we really are working in our container (the 
+    # PluggableAuthService object)
+    self = self.this()
+
+    # Instantiate the folderish adapter object
+    lmp = LDAPMultiPlugin(id, title=title)
+    self._setObject(id, lmp)
+    lmp = getattr(aq_base(self), id)
+    lmp_base = aq_base(lmp)
+
+    # Put the "real" LDAPUserFolder inside it
+    manage_addLDAPUserFolder(lmp)
+    luf = getattr(lmp_base, 'acl_users')
+    
+    host_elems = LDAP_server.split(':')
+    host = host_elems[0]
+    if len(host_elems) > 1:
+        port = host_elems[1]
+    else:
+        port = '389'
+    
+    luf.manage_addServer(host, port=port)
+    luf.manage_edit( title
+                   , login_attr
+                   , uid_attr
+                   , users_base
+                   , users_scope
+                   , roles
+                   , groups_base
+                   , groups_scope
+                   , binduid
+                   , bindpwd
+                   , binduid_usage=binduid_usage
+                   , rdn_attr=rdn_attr
+                   , local_groups=local_groups
+                   , encryption=encryption
+                   , read_only=read_only
+                   , REQUEST=None
+                   )
+
+    # clean out the __allow_groups__ bit because it is not needed here
+    # and potentially harmful
+    lmp_base = aq_base(lmp)
+    if hasattr(lmp_base, '__allow_groups__'):
+        del lmp_base.__allow_groups__
+
+    if REQUEST is not None:
+        REQUEST.RESPONSE.redirect('%s/manage_main' % self.absolute_url())
+
+
+
+class LDAPMultiPlugin(LDAPPluginBase):
+    """ The adapter that mediates between the PAS and the LDAPUserFolder """
+    security = ClassSecurityInfo()
+    meta_type = 'LDAP Multi Plugin'
+
+    security.declarePrivate('getGroupsForPrincipal')
+    def getGroupsForPrincipal(self, user, request=None, attr=None):
+        """ Fulfill GroupsPlugin requirements """
+        acl = self._getLDAPUserFolder()
+
+        if acl is None:
+            return ()
+
+        unmangled_userid = self._demangle(user.getId())
+        if unmangled_userid is None:
+            return ()
+
+        ldap_user = acl.getUserById(unmangled_userid)
+
+        if ldap_user is None:
+            return ()
+
+        groups = acl.getGroups(ldap_user.getUserDN(), attr=attr)
+
+        return tuple([x[0] for x in groups])
+
+
+    security.declarePrivate('enumerateUsers')
+    def enumerateUsers( self
+                      , id=None
+                      , login=None
+                      , exact_match=0
+                      , sort_by=None
+                      , max_results=None
+                      , **kw
+                      ):
+        """ Fulfill the UserEnumerationPlugin requirements """
+        view_name = self.getId() + '_enumerateUsers'
+        criteria = {'id':id, 'login':login, 'exact_match':exact_match,
+                    'sort_by':sort_by, 'max_results':max_results}
+        criteria.update(kw)
+
+        cached_info = self.ZCacheable_get(view_name = view_name,
+                                          keywords = criteria,
+                                          default = None)
+
+        if cached_info is not None:
+            zLOG.LOG('LDAPMP', zLOG.DEBUG,
+                     'returning cached results from enumerateUsers')
+            return cached_info
+
+        result = []
+        acl = self._getLDAPUserFolder()
+        login_attr = acl.getProperty('_login_attr')
+        uid_attr = acl.getProperty('_uid_attr')
+        rdn_attr = acl.getProperty('_rdnattr')
+        plugin_id = self.getId()
+        edit_url = '%s/%s/manage_userrecords' % (plugin_id, acl.getId())
+
+        if acl is None:
+            return ()
+
+        if exact_match and (id or login):
+            if id:
+                ldap_user = acl.getUserById(id)
+            elif login:
+                ldap_user = acl.getUser(login)
+
+            if ldap_user is not None:
+                qs = 'user_dn=%s' % quote_plus(ldap_user.getUserDN())
+                result.append( { 'id' : ldap_user.getId()
+                               , 'login' : ldap_user.getProperty(login_attr)
+                               , 'pluginid' : plugin_id
+                               , 'editurl' : '%s?%s' % (edit_url, qs)
+                               } ) 
+        else:
+            l_results = []
+            seen = []
+
+            if id:
+                if uid_attr == 'dn':
+                    # Workaround: Due to the way findUser reacts when a DN
+                    # is searched for I need to hack around it... This 
+                    # limits the usefulness of searching by ID if the user
+                    # folder uses the full DN aas user ID.
+                    l_results.extend(acl.findUser(rdn_attr, id))
+                else:
+                    l_results.extend(acl.findUser(uid_attr, id))
+
+            if login:
+                l_results.extend(acl.findUser(login_attr, login))
+
+            for key, val in kw.items():
+                if key not in (login_attr, uid_attr):
+                    l_results.extend( acl.findUser( key
+                                                  , val
+                                                  , exact_match=exact_match
+                                                  ) )
+
+            for l_res in l_results:
+                if l_res['dn'] not in seen:
+                    l_res['id'] = l_res[uid_attr]
+                    l_res['login'] = l_res[login_attr]
+                    l_res['pluginid'] = plugin_id
+                    quoted_dn = quote_plus(l_res['dn'])
+                    l_res['editurl'] = '%s?user_dn=%s' % (edit_url, quoted_dn)
+                    result.append(l_res)
+                    seen.append(quoted_dn)
+
+            if sort_by is not None:
+                result.sort(lambda a, b: cmp( a.get(sort_by, '').lower()
+                                            , b.get(sort_by, '').lower()
+                                            ) )
+
+            if isinstance(max_results, int) and len(result) > max_results:
+                result = result[:max_results-1]
+
+        result = tuple(result)
+        self.ZCacheable_set(result, view_name=view_name, keywords=criteria)
+
+        return result
+
+
+    security.declarePrivate('enumerateGroups')
+    def enumerateGroups( self
+                       , id=None
+                       , exact_match=0
+                       , sort_by=None
+                       , max_results=None
+                       , **kw
+                       ):
+        """ Fulfill the GroupEnumerationPlugin requirements """
+        view_name = self.getId() + '_enumerateGroups'
+        criteria = {'id':id, 'exact_match':exact_match,
+                    'sort_by':sort_by, 'max_results':max_results}
+        criteria.update(kw)
+
+        cached_info = self.ZCacheable_get(view_name = view_name,
+                                          keywords = criteria,
+                                          default = None)
+
+        if cached_info is not None:
+            zLOG.LOG('LDAPMP', zLOG.DEBUG,
+                     'returning cached results from enumerateGroups')
+            return cached_info
+
+        acl = self._getLDAPUserFolder()
+
+        if acl is None:
+            return ()
+
+        if id is None and exact_match != 0:
+            raise ValueError, 'Exact Match requested but no id provided'
+        elif id is None:
+            id = ''
+            
+        test_id = id.lower()
+        plugin_id = self.getId()
+        groups = acl.getGroups(dn='*', attr='cn')
+
+        if exact_match != 0:
+            tester = operator.eq
+        else:
+            tester = operator.contains
+
+        matches = [x for x in groups if tester(x.lower(), test_id)]
+        matches.sort()
+        results = []
+
+        for match in matches:
+            results.append({'id' : match, 'pluginid': plugin_id})
+
+        if isinstance(max_results, int) and len(results) > max_results:
+            results = results[:max_results+1]
+
+        results =  tuple(results)
+        self.ZCacheable_set(results, view_name=view_name, keywords=criteria)
+
+        return results
+
+
+    security.declarePrivate('enumerateRoles')
+    def enumerateRoles( self
+                      , id=None
+                      , exact_match=0
+                      , sort_by=None
+                      , max_results=None
+                      , **kw
+                      ):
+        """ Fulfill the RoleEnumerationPlugin requirements """
+        # For LDAP, roles and groups are really one and the same thing.
+        # We can simply call enumerateGroups here.
+        return self.enumerateGroups( id=id
+                                   , exact_match=exact_match
+                                   , sort_by=sort_by
+                                   , max_results=max_results
+                                   , **kw
+                                   )
+
+classImplements( LDAPMultiPlugin
+               , IUserEnumerationPlugin
+               , IGroupsPlugin
+               , IGroupEnumerationPlugin
+               , IRoleEnumerationPlugin
+               , *implementedBy(LDAPPluginBase)
+               )
+
+InitializeClass(LDAPMultiPlugin)
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPPluginBase.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPPluginBase.py?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPPluginBase.py (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LDAPPluginBase.py Thu Feb 15 18:27:31 2007
@@ -1,0 +1,153 @@
+##############################################################################
+#
+# LDAPPluginBase    Base class for LDAP-based PAS-Plugins
+#
+##############################################################################
+
+__doc__     = """ LDAPPluginBase module """
+__version__ = '$Revision: 595 $'[11:-2]
+
+# General Python imports
+import copy, os, operator
+from urllib import quote_plus
+
+# Zope imports
+from Acquisition import aq_base
+from OFS.Folder import Folder
+from OFS.Cache import Cacheable
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+from AccessControl.SecurityManagement import getSecurityManager
+import zLOG
+
+from Products.PluggableAuthService.plugins.BasePlugin import BasePlugin
+from Products.PluggableAuthService.interfaces.plugins import \
+     IAuthenticationPlugin, IRolesPlugin, ICredentialsUpdatePlugin, \
+     ICredentialsResetPlugin, IPropertiesPlugin
+from Products.PluggableAuthService.utils import classImplements
+
+
+class LDAPPluginBase(Folder, BasePlugin, Cacheable):
+    """ Base class for LDAP-based PAS plugins """
+    security = ClassSecurityInfo()
+
+    manage_options = ( BasePlugin.manage_options[:1]
+                     + Folder.manage_options 
+                     + Cacheable.manage_options
+                     )
+
+    _properties = BasePlugin._properties + Folder._properties
+
+
+    def __init__(self, id, title=''):
+        """ Initialize a new instance """
+        self.id = id
+        self.title = title
+
+
+    security.declarePrivate('_getLDAPUserFolder')
+    def _getLDAPUserFolder(self):
+        """ Safely retrieve a LDAPUserFolder to work with """
+        embedded_luf = getattr(aq_base(self), 'acl_users', None)
+
+        return embedded_luf
+
+
+    security.declarePrivate('authenticateCredentials')
+    def authenticateCredentials(self, credentials):
+        """ Fulfill AuthenticationPlugin requirements """
+        acl = self._getLDAPUserFolder()
+        login = credentials.get('login')
+        password = credentials.get('password')
+
+        if not acl or not login or not password:
+            return None, None
+
+        user = acl.getUser(login, pwd=password)
+
+        if user is None:
+            return None, None
+
+        return (user.getId(), user.getUserName())
+
+
+    security.declarePrivate('updateCredentials')
+    def updateCredentials(self, request, response, login, new_password):
+        """ Fulfill CredentialsUpdatePlugin requirements """
+        acl = self._getLDAPUserFolder()
+
+        if acl is not None:
+            user = acl.getUser(login)
+            
+            if user is not None:
+                user_dn = user.getUserDN()
+                acl.manage_editUserPassword(user_dn, new_password)
+
+
+    security.declarePrivate('resetCredentials')
+    def resetCredentials(self, request, response):
+        """ Fulfill CredentialsResetPlugin requirements """
+        user = getSecurityManager().getUser()
+        acl = self._getLDAPUserFolder()
+
+        if user:
+            acl._expireUser(user)
+
+
+    security.declarePrivate('getPropertiesForUser')
+    def getPropertiesForUser(self, user, request=None):
+        """ Fullfill PropertiesPlugin requirements """
+        acl = self._getLDAPUserFolder()
+
+        if acl is None:
+            return {}
+
+        unmangled_userid = self._demangle(user.getId())
+        if unmangled_userid is None:
+            return {}
+
+        ldap_user = acl.getUserById(unmangled_userid)
+
+        if ldap_user is None:
+            return {}
+
+        # XXX Direct attribute access. Waaa!
+        properties = copy.deepcopy(ldap_user._properties)
+
+        # Need to clean up: The propertysheet mechanism will
+        # blow up if "None" is encountered
+        for key, val in properties.items():
+            if val is None:
+                properties[key] = ''
+
+        return properties
+
+
+    security.declarePrivate('getRolesForPrincipal')
+    def getRolesForPrincipal(self, user, request=None):
+        """ Fullfill RolesPlugin requirements """
+        acl = self._getLDAPUserFolder()
+        groups = self.getGroupsForPrincipal(user, request)
+        roles = list(acl._mapRoles(groups))
+        roles.extend(acl._roles)
+
+        return tuple(roles)
+
+
+    security.declarePrivate('_demangle')
+    def _demangle(self, princid):
+        # User must start with our prefix (which is likely to be blank anyway)
+        if not princid.startswith(self.prefix):
+            return None
+        return princid[len(self.prefix):]
+
+
+classImplements( LDAPPluginBase
+               , IAuthenticationPlugin
+               , ICredentialsUpdatePlugin
+               , ICredentialsResetPlugin
+               , IPropertiesPlugin
+               , IRolesPlugin
+               )
+
+InitializeClass(LDAPPluginBase)

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LICENSE.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LICENSE.txt?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LICENSE.txt (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/LICENSE.txt Thu Feb 15 18:27:31 2007
@@ -1,0 +1,54 @@
+Zope Public License (ZPL) Version 2.1
+
+A copyright notice accompanies this license document that
+identifies the copyright holders.
+
+This license has been certified as open source. It has also
+been designated as GPL compatible by the Free Software
+Foundation (FSF).
+
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions in source code must retain the
+   accompanying copyright notice, this list of conditions,
+   and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the accompanying
+   copyright notice, this list of conditions, and the
+   following disclaimer in the documentation and/or other
+   materials provided with the distribution.
+
+3. Names of the copyright holders must not be used to
+   endorse or promote products derived from this software
+   without prior written permission from the copyright
+   holders.
+
+4. The right to distribute this software or to use it for
+   any purpose does not give you the right to use
+   Servicemarks (sm) or Trademarks (tm) of the copyright
+   holders. Use of them is covered by separate agreement
+   with the copyright holders.
+
+5. If any files are modified, you must cause the modified
+   files to carry prominent notices stating that you changed
+   the files and the date of any change.
+
+Disclaimer
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS''
+  AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+  NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+  NO EVENT SHALL THE COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+  DAMAGE.
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/README.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/README.txt?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/README.txt (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/README.txt Thu Feb 15 18:27:31 2007
@@ -1,0 +1,49 @@
+README for the Zope LDAPMultiPlugins Product
+
+  The LDAPMultiPlugins provides PluggableAuthService plugins that use 
+  LDAP as the backend for the services they provide. The 
+  PluggableAuthService is a Zope user folder product that can be extended 
+  in modular fashion using various plugins.
+
+
+  **Requirements and Dependencies**
+
+    In order for this product to run you will need to provide the 
+    following items:
+
+    * the PluggableAuthService product (-> cvs.zope.org) version
+      1.1beta or later
+    * the PluginRegistry products (-> cvs.zope.org)
+    * the LDAPUserFolder product (-> www.dataflake.org) versions 2.6 or
+      later
+
+    Please also note the separate requirements and dependencies for the
+    LDAPUserFolder product by consulting its README file.
+
+
+  **Tested Platforms**
+
+    This version of the LDAPMultiPlugins has been written on and for 
+    Zope 2.7.3 and up, and with LDAPUserFolder version 2.6 and up.
+
+
+  **Special features - Active Directory Multi Plugin**
+  
+    * Properties of the ADMultiPlugin instance:
+    
+      * groupid_attr - the LDAP attribute used for group ids.
+    
+      * grouptitle_attr - the LDAP attribute used to compose group titles.
+    
+      * group_class - the LDAP class of group objects.
+    
+      * group_recurse - boolean indicating whether to determine group
+        memberships of a user by unrolling nested group relationships
+        (expensive).
+    
+    * If an object implementing the cache manager interface is acquirable,
+      you can configure the AD MultiPlugin to use the cache, which will
+      speed up queries at the expense of freshness (the details of that
+      tradeoff are determined by the cache manager).  Do this via the
+      Cache tab of the ADMP instance.
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/VERSION.txt
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/VERSION.txt?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/VERSION.txt (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/VERSION.txt Thu Feb 15 18:27:31 2007
@@ -1,0 +1,1 @@
+1.1

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/__init__.py
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/__init__.py?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/__init__.py (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/__init__.py Thu Feb 15 18:27:31 2007
@@ -1,0 +1,53 @@
+##############################################################################
+#
+# __init__.py	Initialization code for the LDAP Multi Plugins
+#
+# This software is governed by a license. See
+# LICENSE.txt for the terms of this license.
+#
+##############################################################################
+
+__doc__     = """ LDAPUserFolder shims initialization module """
+__version__ = '$Revision: 592 $'[11:-2]
+
+from AccessControl.Permissions import add_user_folders
+from Products.PluggableAuthService.PluggableAuthService import \
+        registerMultiPlugin
+from LDAPMultiPlugin import LDAPMultiPlugin, \
+                            manage_addLDAPMultiPlugin, \
+                            addLDAPMultiPluginForm
+from ActiveDirectoryMultiPlugin import ActiveDirectoryMultiPlugin, \
+                            manage_addActiveDirectoryMultiPlugin, \
+                            addActiveDirectoryMultiPluginForm
+
+def initialize(context):
+    """ Initialize the LDAPMultiPlugin """
+    try:
+        from Products.LDAPUserFolder import LDAPUserFolder
+
+        registerMultiPlugin(LDAPMultiPlugin.meta_type)
+        registerMultiPlugin(ActiveDirectoryMultiPlugin.meta_type)
+
+        context.registerClass( LDAPMultiPlugin
+                             , permission=add_user_folders
+                             , constructors=( addLDAPMultiPluginForm
+                                            , manage_addLDAPMultiPlugin
+                                            )
+                             , icon='www/ldapmultiplugin.png'
+                             , visibility=None
+                             )
+
+        context.registerClass( ActiveDirectoryMultiPlugin
+                             , permission=add_user_folders
+                             , constructors=( addActiveDirectoryMultiPluginForm
+                                         , manage_addActiveDirectoryMultiPlugin
+                                         )
+                             , icon='www/admultiplugin.png'
+                             , visibility=None
+                             )
+
+    except ImportError:
+        # If we don't have the LDAPUserFolder installed (and installed
+        # correctly) then there is no point in exposing this plugin.
+        pass
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/changelog
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/changelog?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/changelog (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/changelog Thu Feb 15 18:27:31 2007
@@ -1,0 +1,6 @@
+erp5-ldapmultiplugins (1.1-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-ldapmultiplugins/LDAPMultiPlugins/debian/compat
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/compat?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/compat (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/compat Thu Feb 15 18:27:31 2007
@@ -1,0 +1,1 @@
+5

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/control
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/control?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/control (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/control Thu Feb 15 18:27:31 2007
@@ -1,0 +1,14 @@
+Source: erp5-ldapmultiplugins
+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-ldapmultiplugins
+Architecture: all
+Depends: erp5-zope
+Description: A Zope product that provide support of LDAP to PluggableAuthService
+ The LDAPMultiPlugins provides PluggableAuthService plugins that
+ interoperate with LDAP.

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/copyright
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/copyright?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/copyright (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/copyright Thu Feb 15 18:27:31 2007
@@ -1,0 +1,9 @@
+Copyright (c) 2004 Zope Corporation, Chris McDonough and Jens Vagelpohl.
+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.

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/dzproduct
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/dzproduct?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/dzproduct (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/dzproduct Thu Feb 15 18:27:31 2007
@@ -1,0 +1,3 @@
+Name: LDAPMultiPlugins
+Package: erp5-ldapmultiplugins
+ZopeVersions: >= 2.7

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

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/rules
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/rules?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/rules (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/debian/rules Thu Feb 15 18:27:31 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-ldapmultiplugins
+
+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-ldapmultiplugins/LDAPMultiPlugins/debian/rules
------------------------------------------------------------------------------
    svn:executable = 

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addActiveDirectoryMultiPlugin.dtml
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addActiveDirectoryMultiPlugin.dtml?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addActiveDirectoryMultiPlugin.dtml (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addActiveDirectoryMultiPlugin.dtml Thu Feb 15 18:27:31 2007
@@ -1,0 +1,199 @@
+<dtml-var manage_page_header>
+
+
+<dtml-var "manage_form_title(this(), _,
+           form_title='Add Active Directory Multi Plugin to the PluggabbleAuthService',
+           help_product='ActiveDirectoryMultiPlugin',
+           )">
+
+<p class="form-help">
+  Add a new Active Directory Multi Plugin to the PluggableAuthService with this form.
+</p>
+
+<form action="manage_addActiveDirectoryMultiPlugin" method="POST">
+
+  <table cellspacing="0" cellpadding="3">
+
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        ID
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <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" colspan="3">
+        <input type="text" name="title" size="40" />
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        LDAP Server[:port]
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="LDAP_server" size="40" 
+               value="my.ldap.server" />
+      </td>
+      <td align="left" valign="top"><div class="form-label">
+        Use SSL&nbsp;<input type="checkbox" name="use_ssl" />
+      </div></td>
+      <td align="left" valign="top"><div class="form-label">
+        Read-only&nbsp;<input type="checkbox" name="read_only" />
+      </div></td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Login Name Attribute
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <select name="login_attr">
+          <option value="sAMAccountName">Windows Login Name (sAMAccountName)
+            </option>
+          <option value="cn">Canonical Name (cn)</option>
+          <option value="sn">Last Name (sn)</option>
+          <option value="givenName">First Name (givenName)</option>
+          <option value="dn">Distinguished Name (dn)</option>
+          <option value="objectGUID">Object GUID (objectGUID)</option>
+        </select>
+      </td>
+    </tr>
+
+    <tr>
+      <td align="LEFT" valign="TOP"><div class="form-label">
+        User ID Attribute
+      </div></td>
+      <td align="LEFT" valign="TOP" colspan="3">
+        <select name="uid_attr">
+          <option value="objectGUID">Object GUID (objectGUID)</option>
+          <option value="cn">Canonical Name (cn)</option>
+          <option value="givenName">First Name (givenName)</option>
+          <option value="sn">Last Name (sn)</option>
+          <option value="dn">Distinguished Name (dn)</option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        RDN Attribute
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <select name="rdn_attr">
+          <option value="cn">Canonical Name (cn)</option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Users Base DN
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="users_base" size="40"
+               value="ou=people,o=Organization,c=US" />
+      </td>
+      <td align="left" valign="top"><div class="form-label">
+        Scope
+      </div></td>
+      <td align="left" valign="top">
+        <select name="users_scope:int">
+          <option value="0"> BASE </option>
+  	      <option value="1"> ONELEVEL </option>
+  	      <option value="2" selected> SUBTREE </options>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Group storage
+      </div></td>
+      <td align="left" valign="top">
+        <select name="local_groups:int">
+          <option value="0" selected>
+            Groups stored on LDAP server
+          </option>
+          <option value="1">
+            Groups not stored on LDAP server
+          </option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Groups Base DN
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="groups_base" size="40" 
+               value="ou=groups,o=Organization,c=US" />
+      </td>
+      <td align="left" valign="top"><div class="form-label">
+        Scope
+      </div></td>
+      <td align="left" valign="top">
+        <select name="groups_scope:int">
+          <option value="0"> BASE </option>
+          <option value="1"> ONELEVEL </option>
+          <option value="2" selected> SUBTREE </option>
+        </select></td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-optional">
+        Manager DN
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="binduid:string" size="40" />
+      </td>
+      <td align="left" valign="top"><div class="form-optional">
+        Password
+      </div></td>
+      <td align="left" valign="top">
+        <input type="password" name="bindpwd:string" size="13" />
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        User password encryption
+      </div></td>
+      <td align="left" valign="top">
+        <select name="encryption">
+          <option selected> SHA </option>
+          <option> SSHA </option>
+          <option> crypt </option>
+          <option> clear </option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Default User Roles
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <input type="text" name="roles" size="40" value="Anonymous" />
+      </td>
+    </tr>
+  
+    <tr>
+      <td>&nbsp;</td>
+      <td colspan="3">
+        <br>
+        <input type="submit" value=" Add ">
+      </td>
+    </tr>
+  
+  </table>
+</form>
+
+<dtml-var manage_page_footer>
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addLDAPMultiPlugin.dtml
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addLDAPMultiPlugin.dtml?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addLDAPMultiPlugin.dtml (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/dtml/addLDAPMultiPlugin.dtml Thu Feb 15 18:27:31 2007
@@ -1,0 +1,195 @@
+<dtml-var manage_page_header>
+
+<dtml-var "manage_form_title(this(), _,
+           form_title='Add LDAP Multi Plugin to the PluggabbleAuthService',
+           help_product='LDAPMultiPlugin',
+           )">
+
+<p class="form-help">
+  Add a new LDAP Multi Plugin to the PluggableAuthService with this form.
+</p>
+
+<form action="manage_addLDAPMultiPlugin" method="POST">
+
+  <table cellspacing="0" cellpadding="3">
+
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        ID
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <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" colspan="3">
+        <input type="text" name="title" size="40" />
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        LDAP Server[:port]
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="LDAP_server" size="40" 
+               value="my.ldap.server" />
+      </td>
+      <td align="left" valign="top"><div class="form-label">
+        Use SSL&nbsp;<input type="checkbox" name="use_ssl" />
+      </div></td>
+      <td align="left" valign="top"><div class="form-label">
+        Read-only&nbsp;<input type="checkbox" name="read_only" />
+      </div></td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Login Name Attribute
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <select name="login_attr">
+          <option value="cn">Canonical Name (cn)</option>
+          <option value="uid">UID (uid)</option>
+          <option value="sn">Surname (sn)</option>
+          <option value="dn">Distinguished Name (dn)</option>
+        </select>
+      </td>
+    </tr>
+
+    <tr>
+      <td align="LEFT" valign="TOP"><div class="form-label">
+        User ID Attribute
+      </div></td>
+      <td align="LEFT" valign="TOP" colspan="3">
+        <select name="uid_attr">
+          <option value="cn">Canonical Name (cn)</option>
+          <option value="uid">UID (uid)</option>
+          <option value="sn">Surname (sn)</option>
+          <option value="dn">Distinguished Name (dn)</option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        RDN Attribute
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <select name="rdn_attr">
+          <option value="cn">Canonical Name (cn)</option>
+          <option value="uid">UID (uid)</option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Users Base DN
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="users_base" size="40"
+               value="ou=people,o=Organization,c=US" />
+      </td>
+      <td align="left" valign="top"><div class="form-label">
+        Scope
+      </div></td>
+      <td align="left" valign="top">
+        <select name="users_scope:int">
+          <option value="0"> BASE </option>
+  	      <option value="1"> ONELEVEL </option>
+  	      <option value="2" selected> SUBTREE </options>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Group storage
+      </div></td>
+      <td align="left" valign="top">
+        <select name="local_groups:int">
+          <option value="0" selected>
+            Groups stored on LDAP server
+          </option>
+          <option value="1">
+            Groups not stored on LDAP server
+          </option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Groups Base DN
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="groups_base" size="40" 
+               value="ou=groups,o=Organization,c=US" />
+      </td>
+      <td align="left" valign="top"><div class="form-label">
+        Scope
+      </div></td>
+      <td align="left" valign="top">
+        <select name="groups_scope:int">
+          <option value="0"> BASE </option>
+          <option value="1"> ONELEVEL </option>
+          <option value="2" selected> SUBTREE </option>
+        </select></td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-optional">
+        Manager DN
+      </div></td>
+      <td align="left" valign="top">
+        <input type="text" name="binduid:string" size="40" />
+      </td>
+      <td align="left" valign="top"><div class="form-optional">
+        Password
+      </div></td>
+      <td align="left" valign="top">
+        <input type="password" name="bindpwd:string" size="13" />
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        User password encryption
+      </div></td>
+      <td align="left" valign="top">
+        <select name="encryption">
+          <option selected> SHA </option>
+          <option> SSHA </option>
+          <option> crypt </option>
+          <option> clear </option>
+        </select>
+      </td>
+    </tr>
+  
+    <tr>
+      <td align="left" valign="top"><div class="form-label">
+        Default User Roles
+      </div></td>
+      <td align="left" valign="top" colspan="3">
+        <input type="text" name="roles" size="40" value="Anonymous" />
+      </td>
+    </tr>
+  
+    <tr>
+      <td>&nbsp;</td>
+      <td colspan="3">
+        <br>
+        <input type="submit" value=" Add ">
+      </td>
+    </tr>
+  
+  </table>
+</form>
+
+<dtml-var manage_page_footer>
+

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/admultiplugin.png
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/admultiplugin.png?rev=12783&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/admultiplugin.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/ldapmultiplugin.png
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/ldapmultiplugin.png?rev=12783&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-ldapmultiplugins/LDAPMultiPlugins/www/ldapmultiplugin.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.diff.gz
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.diff.gz?rev=12783&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.diff.gz
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.dsc
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.dsc?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.dsc (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1.dsc Thu Feb 15 18:27:31 2007
@@ -1,0 +1,12 @@
+Format: 1.0
+Source: erp5-ldapmultiplugins
+Version: 1.1-1
+Binary: erp5-ldapmultiplugins
+Maintainer: Yusei TAHARA
+Architecture: all
+Standards-Version: 3.7.2
+Build-Depends: debhelper (>= 5.0)
+Build-Depends-Indep: zope-debhelper (>= 0.3.6)
+Files: 
+ 958e9108ce59a87b4f9ad3672d533210 11814 erp5-ldapmultiplugins_1.1.orig.tar.gz
+ 80859f726ff3a0084a58cc0fbb192104 1231 erp5-ldapmultiplugins_1.1-1.diff.gz

Added: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_all.deb
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_all.deb?rev=12783&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_all.deb
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.build
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.build?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.build (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.build Thu Feb 15 18:27:31 2007
@@ -1,0 +1,34 @@
+ fakeroot debian/rules clean
+dh_testdir
+dh_testroot
+rm -f build-stamp configure-stamp
+dh_clean
+ dpkg-source -b LDAPMultiPlugins
+dpkg-source: warning: source directory `./LDAPMultiPlugins' is not <sourcepackage>-<upstreamversion> `erp5-ldapmultiplugins-1.1'
+dpkg-source: warning: .orig directory name LDAPMultiPlugins.orig is not <package>-<upstreamversion> (wanted erp5-ldapmultiplugins-1.1.orig)
+dpkg-source: building erp5-ldapmultiplugins using existing erp5-ldapmultiplugins_1.1.orig.tar.gz
+dpkg-source: building erp5-ldapmultiplugins in erp5-ldapmultiplugins_1.1-1.diff.gz
+dpkg-source: building erp5-ldapmultiplugins in erp5-ldapmultiplugins_1.1-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-ldapmultiplugins_1.1-1_all.deb' ¤Ë¥Ñ¥Ã¥±¡¼¥¸ `erp5-ldapmultiplugins' ¤ò¹½ÃÛ¤·¤Æ¤¤¤Þ¤¹¡£
+ 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-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.changes
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.changes?rev=12783&view=auto
==============================================================================
--- spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.changes (added)
+++ spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1-1_i386.changes Thu Feb 15 18:27:31 2007
@@ -1,0 +1,21 @@
+Format: 1.7
+Date: Wed, 14 Feb 2007 03:27:56 +0900
+Source: erp5-ldapmultiplugins
+Binary: erp5-ldapmultiplugins
+Architecture: source all
+Version: 1.1-1
+Distribution: unstable
+Urgency: low
+Maintainer: Yusei TAHARA
+Changed-By: Yusei TAHARA <yusei at domen.cx>
+Description: 
+ erp5-ldapmultiplugins - A Zope product that provide support of LDAP to PluggableAuthServi
+Changes: 
+ erp5-ldapmultiplugins (1.1-1) unstable; urgency=low
+ .
+   * Initial Release.
+Files: 
+ 6b2ce8e02c4e78b7e550a244a0cbb273 397 web optional erp5-ldapmultiplugins_1.1-1.dsc
+ 958e9108ce59a87b4f9ad3672d533210 11814 web optional erp5-ldapmultiplugins_1.1.orig.tar.gz
+ 80859f726ff3a0084a58cc0fbb192104 1231 web optional erp5-ldapmultiplugins_1.1-1.diff.gz
+ 5804c6554ed7723dcaf460fcef4a1175 14026 web optional erp5-ldapmultiplugins_1.1-1_all.deb

Added: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1.orig.tar.gz
URL: http://svn.erp5.org/spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1.orig.tar.gz?rev=12783&view=auto
==============================================================================
Binary file - no diff available.

Propchange: spec/debian/unstable/erp5-ldapmultiplugins/erp5-ldapmultiplugins_1.1.orig.tar.gz
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream




More information about the Erp5-report mailing list