summaryrefslogtreecommitdiffstats
path: root/pykolab/plugins/recipientpolicy/__init__.py
blob: 23ba863f228f053668d3eb6008f29f3312f4c338 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# -*- coding: utf-8 -*-
# Copyright 2010-2013 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, either version 3 of the License, 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 General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

import pykolab

from pykolab import utils
from pykolab.translate import _

conf = pykolab.getConf()
log = pykolab.getLogger('pykolab.plugins.recipientpolicy')

class KolabRecipientpolicy(object):
    """
        Example plugin making quota adjustments given arbitrary conditions.
    """

    def __init__(self):
        pass

    def add_options(self, *args,  **kw):
        pass

    #def mail_domain_space_policy_check(self, kw={}, args=()):
        #(mail, alternative_mail, domain_name, domain_root_dn) = args

        ## Your actions go here. For example:
        #return (mail, alternative_mail)

    def set_primary_mail(self, *args, **kw):
        """
            The arguments passed to the 'set_user_attrs_mail' hook:

            primary_mail - the policy
            user_attrs - the current user attributes
            primary_domain - the domain to use in the primary mail attribute
            secondary_domains - the secondary domains that are aliases

            Return the new primary mail address
        """

        user_attrs = utils.normalize(kw['entry'])

        if not user_attrs.has_key('domain'):
            user_attrs['domain'] = kw['primary_domain']
        elif not user_attrs['domain'] == kw['primary_domain']:
            user_attrs['domain'] = kw['primary_domain']

        if not user_attrs.has_key('preferredlanguage'):
            default_locale = conf.get(user_attrs['domain'], 'default_locale')
            if default_locale == None:
                default_locale = conf.get('kolab', 'default_locale')
            if default_locale == None:
                default_locale = 'en_US'

            user_attrs['preferredlanguage'] = default_locale

        try:
            mail = kw['primary_mail'] % user_attrs
            mail = utils.translate(mail, user_attrs['preferredlanguage'])
            mail = mail.lower()
            return mail
        except KeyError, e:
            log.warning(_("Attribute substitution for 'mail' failed in Recipient Policy"))
            if user_attrs.has_key('mail'):
                return user_attrs['mail']
            else:
                return None

    def set_secondary_mail(self, *args, **kw):
        """
            The arguments passed to the 'set_user_attrs_alternative_mail' hook:

            primary_mail - the policy
            user_attrs - the current user attributes
            primary_domain - the domain to use in the primary mail attribute
            secondary_domains - the secondary domains that are aliases

            Return a list of secondary mail addresses
        """

        user_attrs = utils.normalize(kw['entry'])

        if not user_attrs.has_key('domain'):
            user_attrs['domain'] = kw['primary_domain']
        elif not user_attrs['domain'] == kw['primary_domain']:
            user_attrs['domain'] = kw['primary_domain']

        if not user_attrs.has_key('preferredlanguage'):
            default_locale = conf.get(user_attrs['domain'], 'default_locale')
            if default_locale == None:
                default_locale = conf.get(user_attrs['domain'], 'default_locale')
            if default_locale == None:
                default_locale = 'en_US'

            user_attrs['preferredlanguage'] = default_locale

        try:
            exec("alternative_mail_routines = %s" % kw['secondary_mail'])
        except Exception, e:
            log.error(_("Could not parse the alternative mail routines"))

        alternative_mail = []

        log.debug(_("Alternative mail routines: %r") % (alternative_mail_routines), level=8)
        _domains = [ kw['primary_domain'] ] + kw['secondary_domains']

        for attr in [ 'givenname', 'sn', 'surname' ]:
            try:
                user_attrs[attr] = utils.translate(user_attrs[attr], user_attrs['preferredlanguage'])
            except Exception, errmsg:
                log.error(_("An error occurred in composing the secondary mail attribute for entry %r") % (user_attrs['id']))
                if conf.debuglevel > 8:
                    import traceback
                    traceback.print_exc()
                return []

        for number in alternative_mail_routines.keys():
            for routine in alternative_mail_routines[number].keys():
                try:
                    exec("retval = '%s'.%s" % (routine,alternative_mail_routines[number][routine] % user_attrs))

                    log.debug(_("Appending additional mail address: %s") % (retval), level=8)
                    alternative_mail.append(retval)

                except Exception, errmsg:
                    log.error(_("Policy for secondary email address failed: %r") % (errmsg))
                    if conf.debuglevel > 8:
                        import traceback
                        traceback.print_exc()
                    return []

                for _domain in kw['secondary_domains']:
                    user_attrs['domain'] = _domain
                    try:
                        exec("retval = '%s'.%s" % (routine,alternative_mail_routines[number][routine] % user_attrs))

                        log.debug(_("Appending additional mail address: %s") % (retval), level=8)
                        alternative_mail.append(retval)

                    except KeyError, e:
                        log.warning(_("Attribute substitution for 'alternative_mail' failed in Recipient Policy"))

        alternative_mail = utils.normalize(alternative_mail)

        alternative_mail = list(set(alternative_mail))

        return alternative_mail