ucs/kolab_sieve.py

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Wed Dec 5 18:19:46 CET 2012


 ucs/kolab_sieve.py |  158 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 158 insertions(+)

New commits:
commit 7672536ac024d22d6457baa1eb76ce94643bf96f
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Wed Dec 5 17:19:27 2012 +0000

    For UCS 3.0, ship a listener handler purely for Sieve Script Management

diff --git a/ucs/kolab_sieve.py b/ucs/kolab_sieve.py
new file mode 100755
index 0000000..b6d0349
--- /dev/null
+++ b/ucs/kolab_sieve.py
@@ -0,0 +1,158 @@
+#!/usr/bin/python
+#
+# Copyright 2010-2012 Kolab Systems AG (http://www.kolabsys.com)
+#
+# Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 3 or, at your option, any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+
+# workaround for PEP 366
+__package__ = ''
+
+import listener
+import logging
+import os
+import sys
+import univention_baseconfig
+import univention.debug as ulog
+
+sys.path = [
+        os.path.abspath(
+                os.path.join(
+                        os.path.dirname(
+                                os.path.realpath(os.path.abspath(__file__))
+                            ),
+                        '..'
+                    )
+            ) ] + sys.path
+
+sys.stderr = open('/dev/null', 'a')
+
+name = 'kolab_sieve'
+description = "Sieve Script Management for Kolab Groupware on UCS"
+
+# The filter has to be composed to make sure only Kolab Groupware
+# related objects are passed along to this listener module.
+filter = '(objectClass=kolabInetOrgPerson)'
+#attributes = [ '*' ]
+
+import pykolab
+from pykolab import constants
+from pykolab import utils
+
+log = pykolab.getLogger('pykolab.listener')
+log.remove_stdout_handler()
+log.setLevel(logging.DEBUG)
+log.debuglevel = 9
+
+conf = pykolab.getConf()
+conf.finalize_conf(fatal=False)
+conf.debuglevel = 9
+
+from pykolab.auth import Auth
+
+def handler(*args, **kw):
+    auth = Auth()
+    auth.connect()
+
+    if len(args) == 4:
+        # moddn, not relevant for Sieve Script Management
+        pass
+
+    elif len(args) == 3:
+        dn = args[0]
+        new = utils.normalize(args[1])
+        old = utils.normalize(args[2])
+
+        if isinstance(old, dict) and len(old.keys()) > 0:
+            # Either the entry changed or was deleted
+
+            if isinstance(new, dict) and len(new.keys()) > 0:
+                # The entry was modified.
+
+                result_attr = conf.get('cyrus-sasl', 'result_attribute')
+
+                if not new.has_key(result_attr):
+                    log.error(
+                            "Entry %r does not have attribute %r" % (
+                                    dn,
+                                    result_attr
+                                )
+                        )
+
+                    return
+
+                # See if the mailserver_attribute exists
+                mailserver_attribute = conf.get('ldap', 'mailserver_attribute').lower()
+
+                if mailserver_attribute == None:
+                    log.error("Mail server attribute is not set")
+                    # TODO: Perhaps, query for IMAP servers. If there is only one,
+                    #       we know what to do.
+                    return
+
+                if new.has_key(mailserver_attribute):
+                    if not new[mailserver_attribute] == constants.fqdn:
+                        log.info(
+                                "The mail server for user %r is set, and it is not me (%r)" % (
+                                        dn,
+                                        new[mailserver_attribute]
+                                    )
+                            )
+
+                        return
+                else:
+                    log.error("Entry %r does not have a mail server set" % (dn))
+                    return
+
+                conf.plugins.exec_hook(
+                        'sieve_mgmt_refresh',
+                        kw = {
+                                'user': new[result_attr]
+                            }
+                    )
+
+            else:
+                # The entry was deleted. This is irrelevant for
+                # Sieve Script Management
+                return
+
+        elif isinstance(new, dict) and len(new.keys()) > 0:
+            # Old is not a dict (or empty), so the entry is just created
+
+            # See if the mailserver_attribute exists
+            mailserver_attribute = conf.get('ldap', 'mailserver_attribute').lower()
+
+            if mailserver_attribute == None:
+                log.error("Mail server attribute is not set")
+                # TODO: Perhaps, query for IMAP servers. If there is only one,
+                #       we know what to do.
+                return
+
+            if new.has_key(mailserver_attribute):
+                if not new[mailserver_attribute] == constants.fqdn:
+                    log.info("The mail server for user %r is set, and it is not me (%r)" % (dn, new[mailserver_attribute]))
+                    return
+
+                conf.plugins.exec_hook(
+                        'sieve_mgmt_refresh',
+                        kw = {
+                                'user': new[result_attr]
+                            }
+                    )
+
+        else:
+            log.info("entry %r changed, but no new or old attributes" % (dn))
+





More information about the commits mailing list