Branch 'pykolab-0.5' - 3 commits - pykolab/imap

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Tue Sep 4 14:14:05 CEST 2012


 pykolab/imap/__init__.py |   85 ++++++++---------------------------------------
 pykolab/imap/cyrus.py    |    7 ++-
 2 files changed, 20 insertions(+), 72 deletions(-)

New commits:
commit 48ffdcd019de3f1c8c2fe8b704648db8b127662f
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Tue Sep 4 13:05:39 2012 +0100

    Cherry-pick changes to pykolab/imap/__init__.py from master

diff --git a/pykolab/imap/__init__.py b/pykolab/imap/__init__.py
index 7391669..cabd059 100644
--- a/pykolab/imap/__init__.py
+++ b/pykolab/imap/__init__.py
@@ -194,8 +194,7 @@ class IMAP(object):
             if self._imap.has_key(server):
                 del self._imap[server]
             else:
-                log.warning(_("Called imap.disconnect() on a server that " + \
-                    "we had no connection to"))
+                log.warning(_("Called imap.disconnect() on a server that we had no connection to."))
 
     def create_folder(self, folder_path, server=None):
         if not server == None:
@@ -314,7 +313,7 @@ class IMAP(object):
         if folder_name.startswith("shared%s" % (self.imap.separator) * 2):
             folder_name = folder_name[7:]
 
-        self.imap._setannotation(folder_name, '/vendor/kolab/folder-type', folder_type)
+        self.set_metadata(folder_name, '/shared/vendor/kolab/folder-type', folder_type)
 
     def shared_mailbox_create(self, mailbox_base_name, server=None):
         """
@@ -402,12 +401,11 @@ class IMAP(object):
 
             if additional_folders[additional_folder].has_key("annotations"):
                 for annotation in additional_folders[additional_folder]["annotations"].keys():
-                    if conf.get('kolab', 'imap_backend') == 'cyrus-imap':
-                        self.imap._setannotation(
-                                folder_name,
-                                "%s" % (annotation),
-                                "%s" % (additional_folders[additional_folder]["annotations"][annotation])
-                            )
+                    self.set_metadata(
+                            folder_name,
+                            "%s" % (annotation),
+                            "%s" % (additional_folders[additional_folder]["annotations"][annotation])
+                        )
 
             if additional_folders[additional_folder].has_key("quota"):
                 self.imap.sq(
@@ -506,15 +504,12 @@ class IMAP(object):
             log.warning(_("Moving INBOX folder %s won't succeed as target folder %s already exists") % (old_name,new_name))
 
     def user_mailbox_server(self, mailbox):
-        self.connect(domain=self.domain)
         return self.imap.find_mailfolder_server(mailbox)
 
     def has_folder(self, folder):
         """
             Check if the environment has a folder named folder.
         """
-        self.connect(domain=self.domain)
-
         folders = self.imap.lm(folder)
         log.debug(_("Looking for folder '%s', we found folders: %r") % (folder,folders), level=8)
         # Greater then one, this folder may have subfolders.
@@ -564,8 +559,6 @@ class IMAP(object):
     """ Blah functions """
 
     def move_user_folders(self, users=[], domain=None):
-        self.connect(domain=domain)
-
         for user in users:
             if type(user) == dict:
                 if user.has_key('old_mail'):
@@ -595,9 +588,6 @@ class IMAP(object):
             Sets the quota in IMAP using the authentication and authorization
             database 'quota' attribute for the users listed in parameter 'users'
         """
-
-        self.connect(domain=primary_domain)
-
         if conf.has_option(primary_domain, 'quota_attribute'):
             _quota_attr = conf.get(primary_domain, 'quota_attribute')
         else:
@@ -675,8 +665,6 @@ class IMAP(object):
                 self.imap._setquota(folder, quota)
 
     def set_user_mailhost(self, users=[], primary_domain=None, secondary_domain=[], folders=[]):
-        self.connect(domain=primary_domain)
-
         if conf.has_option(primary_domain, 'mailserver_attribute'):
             _mailserver_attr = conf.get(primary_domain, 'mailserver_attribute')
         else:
@@ -724,7 +712,6 @@ class IMAP(object):
                 auth.set_user_attribute(primary_domain, user, _mailserver_attr, _current_mailserver)
 
     def parse_mailfolder(self, mailfolder):
-        self.connect()
         return self.imap.parse_mailfolder(mailfolder)
 
     def expunge_user_folders(self, inbox_folders=None):
@@ -745,8 +732,6 @@ class IMAP(object):
 
                 primary_domain, secondary_domains
         """
-        self.connect()
-
         if inbox_folders == None:
             inbox_folders = []
 
@@ -803,8 +788,6 @@ class IMAP(object):
             List the INBOX folders in the IMAP backend. Returns a list of unique
             base folder names.
         """
-        self.connect(domain=primary_domain)
-
         _folders = self.imap.lm("user/%")
         # TODO: Replace the .* below with a regex representing acceptable DNS
         # domain names.


commit 8dd7946abde86de2ddc99396b22a8486f1fa0519
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Tue Sep 4 12:35:36 2012 +0100

    Make sure we don't attempt to parse a mailbox path in full, while we are logged in as a user

diff --git a/pykolab/imap/cyrus.py b/pykolab/imap/cyrus.py
index 02a49b4..bc2a13e 100644
--- a/pykolab/imap/cyrus.py
+++ b/pykolab/imap/cyrus.py
@@ -224,12 +224,13 @@ class Cyrus(cyruslib.CYRUS):
         """
             Login to the actual backend server, then set annotation.
         """
-        server = self.find_mailfolder_server(mailfolder)
+        try:
+            server = self.find_mailfolder_server(mailfolder)
+        except:
+            server = self.server
 
         log.debug(_("Setting annotation %s on folder %s") % (annotation,mailfolder), level=8)
 
-        #if annotation.startswith('/private'):
-
         try:
             self.setannotation(mailfolder, annotation, value, shared)
         except cyruslib.CYRUSError, e:


commit 9c4c10371707bdd20a7696387617f7b8d7116228
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Tue Sep 4 12:34:57 2012 +0100

    Remove setting / removing cyrus-admin privileges before setting annotations, as we now login in as the user before setting any annotations

diff --git a/pykolab/imap/__init__.py b/pykolab/imap/__init__.py
index 3eb6de4..7391669 100644
--- a/pykolab/imap/__init__.py
+++ b/pykolab/imap/__init__.py
@@ -276,35 +276,11 @@ class IMAP(object):
             shared = False
             metadata_path = metadata_path.replace('/private/', '/')
 
-        backend = conf.get('kolab', 'imap_backend')
-
-        if not self.domain == None:
-            if conf.has_section(self.domain) and conf.has_option(self.domain, 'imap_backend'):
-                backend = conf.get(self.domain, 'imap_backend')
-
         if not shared:
             log.warning(_("Private annotations need to be set using the appropriate user account."))
 
-        admin_login = conf.get(backend, 'admin_login')
-
-        admin_acl = None
-
-        acls = self.list_acls(folder)
-        if acls.has_key(admin_login):
-            admin_acl = acls[admin_login]
-
-        if admin_acl == None:
-            self.set_acl(folder, admin_login, 'lrsipwa')
-        elif not 'w' in admin_acl:
-            self.set_acl(folder, admin_login, '%sw' % (admin_acl))
-
         self.imap._setannotation(folder, metadata_path, metadata_value, shared)
 
-        if admin_acl == None:
-            self.set_acl(folder, admin_login, '')
-        elif not 'w' in admin_acl:
-            self.set_acl(folder, admin_login, admin_acl)
-
     def shared_folder_create(self, folder_path, server=None):
         """
             Create a shared folder.
@@ -406,22 +382,18 @@ class IMAP(object):
                 level=8
             )
 
+        backend = conf.get('kolab', 'imap_backend')
+
+        admin_login = conf.get(backend, 'admin_login')
+        admin_password = conf.get(backend, 'admin_password')
+
+        self.connect(login=False)
+        self.login_plain(admin_login, admin_password, folder)
+
         for additional_folder in additional_folders.keys():
             _add_folder = {}
 
-            if len(folder.split('@')) > 1:
-                folder_name = "user%(separator)s%(username)s%(separator)s%(additional_folder_name)s@%(domainname)s"
-                _add_folder['username'] = folder.split('@')[0]
-                _add_folder['domainname'] = folder.split('@')[1]
-                _add_folder['additional_folder_name'] = additional_folder
-                _add_folder['separator'] = self.imap.separator
-                folder_name = folder_name % _add_folder
-            else:
-                folder_name = "user%(separator)s%(username)s%(separator)s%(additional_folder_name)s" % {
-                        "username": folder,
-                        "separator": self.imap.separator,
-                        "additional_folder_name": additional_folder
-                    }
+            folder_name = additional_folder
 
             try:
                 self.imap.cm(folder_name)
@@ -451,8 +423,6 @@ class IMAP(object):
                             "%s" % (additional_folders[additional_folder]["acls"][acl])
                         )
 
-        backend = conf.get('kolab', 'imap_backend')
-
         if len(folder.split('@')) > 1:
             domain = folder.split('@')[1]
             domain_suffix = "@%s" % (domain)
@@ -470,12 +440,6 @@ class IMAP(object):
                 uri = None
 
         log.debug(_("Subscribing user to the additional folders"), level=8)
-        # Get the credentials
-        admin_login = conf.get(backend, 'admin_login')
-        admin_password = conf.get(backend, 'admin_password')
-
-        self.connect(login=False)
-        self.login_plain(admin_login, admin_password, folder)
 
         _tests = []
 





More information about the commits mailing list