Branch 'pykolab-0.4' - pykolab/auth

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Thu Sep 13 17:36:19 CEST 2012


 pykolab/auth/ldap/__init__.py |   97 ++++++++++++++++++++++++++++++------------
 1 file changed, 71 insertions(+), 26 deletions(-)

New commits:
commit 4a82ec72aae5e82cc1dcf4ad7b9b497670de3698
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Sep 13 16:35:42 2012 +0100

    Initial fixes for syncrepl compatibility

diff --git a/pykolab/auth/ldap/__init__.py b/pykolab/auth/ldap/__init__.py
index 58035bf..fd3aee4 100644
--- a/pykolab/auth/ldap/__init__.py
+++ b/pykolab/auth/ldap/__init__.py
@@ -1444,34 +1444,75 @@ class LDAP(pykolab.base.Base):
         self.connect()
 
     def _synchronize_callback(self, *args, **kw):
-        change_type = None
+        if kw.has_key('change_type'):
+            change_type = None
 
-        change_dict = {
-                'change_type': kw['change_type'],
-                'previous_dn': kw['previous_dn'],
-                'change_number': kw['change_number'],
-                'dn': kw['dn']
-            }
+            change_dict = {
+                    'change_type': kw['change_type'],
+                    'previous_dn': kw['previous_dn'],
+                    'change_number': kw['change_number'],
+                    'dn': kw['dn']
+                }
 
-        entry = utils.normalize(kw['entry'])
-        entry['dn'] = kw['dn']
+            entry = utils.normalize(kw['entry'])
+            entry['dn'] = kw['dn']
 
-        unique_attr = self.config_get('unique_attribute')
-        entry['id'] = entry[unique_attr]
+            unique_attr = self.config_get('unique_attribute')
+            entry['id'] = entry[unique_attr]
 
-        try:
-            entry['type'] = self._entry_type(entry)
-        except:
-            entry['type'] = "unknown"
+            try:
+                entry['type'] = self._entry_type(entry)
+            except:
+                entry['type'] = "unknown"
 
-        log.debug(_("Entry type: %s") % (entry['type']), level=8)
+            log.debug(_("Entry type: %s") % (entry['type']), level=8)
 
-        if change_dict['change_type'] == None:
-            # This entry was in the start result set
-            eval("self._change_none_%s(entry, change_dict)" % (entry['type']))
-        else:
-            change = psearch.CHANGE_TYPES_STR[change_dict['change_type']].lower()
-            eval("self._change_%s_%s(entry, change_dict)" % (change, entry['type']))
+            if change_dict['change_type'] == None:
+                # This entry was in the start result set
+                eval("self._change_none_%s(entry, change_dict)" % (entry['type']))
+            else:
+                change = psearch.CHANGE_TYPES_STR[change_dict['change_type']].lower()
+                eval("self._change_%s_%s(entry, change_dict)" % (change, entry['type']))
+
+        # Typical for Paged Results Control
+        elif kw.has_key('entry') and isinstance(kw['entry'], list):
+            for entry_dn,entry_attrs in kw['entry']:
+                entry = { 'dn': entry_dn }
+                entry_attrs = utils.normalize(entry_attrs)
+                for attr in entry_attrs.keys():
+                    entry[attr.lower()] = entry_attrs[attr]
+
+                unique_attr = self.config_get('unique_attribute')
+                entry['id'] = entry[unique_attr]
+
+                try:
+                    entry['type'] = self._entry_type(entry)
+                except:
+                    entry['type'] = "unknown"
+
+                log.debug(_("Entry type: %s") % (entry['type']), level=8)
+
+                eval("self._change_none_%s(entry, None)" % (entry['type']))
+
+#                result_attribute = conf.get('cyrus-sasl', 'result_attribute')
+#
+#                rcpt_addrs = self.recipient_policy(entry)
+#
+#                log.debug(_("Recipient Addresses: %r") % (rcpt_addrs), level=9)
+#
+#                for key in rcpt_addrs.keys():
+#                    entry[key] = rcpt_addrs[key]
+#
+#                cache.get_entry(self.domain, entry)
+#
+#                self.imap.connect(domain=self.domain)
+#
+#                if not self.imap.user_mailbox_exists(entry[result_attribute]):
+#                    folder = self.imap.user_mailbox_create(
+#                            entry[result_attribute]
+#                        )
+#
+#                    server = self.imap.user_mailbox_server(folder)
 
     def _unbind(self):
         """
@@ -1687,20 +1728,24 @@ class LDAP(pykolab.base.Base):
             secondary_domains=[]
         ):
 
+        import ldapurl
         import syncrepl
 
+        ldap_url = ldapurl.LDAPUrl(self.config_get('ldap_uri'))
+
         ldap_sync_conn = syncrepl.DNSync(
-                '/var/lib/pykolab/syncrepl.db',
+                '/var/lib/kolab/syncrepl_%s.db' % (self.domain),
                 ldap_url.initializeUrl(),
-                trace_level=ldapmodule_trace_level,
-                trace_file=ldapmodule_trace_file
+                trace_level=2,
+                callback=self._synchronize_callback
             )
 
         msgid = ldap_sync_conn.syncrepl_search(
                 base_dn,
                 scope,
                 mode='refreshAndPersist',
-                filterstr=filterstr
+                filterstr=filterstr,
+                attrlist=attrlist,
             )
 
         try:





More information about the commits mailing list