[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 <input type="checkbox" name="use_ssl" />
+ </div></td>
+ <td align="left" valign="top"><div class="form-label">
+ Read-only <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> </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 <input type="checkbox" name="use_ssl" />
+ </div></td>
+ <td align="left" valign="top"><div class="form-label">
+ Read-only <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> </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