Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / auth_providers.py @ f6ff3033

History | View | Annotate | Download (22.5 kB)

1 d2633501 Kostas Papadimitriou
# Copyright 2011 GRNET S.A. All rights reserved.
2 d2633501 Kostas Papadimitriou
#
3 d2633501 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 d2633501 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 d2633501 Kostas Papadimitriou
# conditions are met:
6 d2633501 Kostas Papadimitriou
#
7 d2633501 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 d2633501 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 d2633501 Kostas Papadimitriou
#      disclaimer.
10 d2633501 Kostas Papadimitriou
#
11 d2633501 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 d2633501 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 d2633501 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 d2633501 Kostas Papadimitriou
#      provided with the distribution.
15 d2633501 Kostas Papadimitriou
#
16 d2633501 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 d2633501 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 d2633501 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 d2633501 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 d2633501 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 d2633501 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 d2633501 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 d2633501 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 d2633501 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 d2633501 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 d2633501 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 d2633501 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 d2633501 Kostas Papadimitriou
#
29 d2633501 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 d2633501 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 d2633501 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 d2633501 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 d2633501 Kostas Papadimitriou
34 9d20fe23 Kostas Papadimitriou
import copy
35 9d20fe23 Kostas Papadimitriou
import json
36 9d20fe23 Kostas Papadimitriou
37 9d20fe23 Kostas Papadimitriou
from synnefo.lib.ordereddict import OrderedDict
38 d2633501 Kostas Papadimitriou
39 6a80a0ae Kostas Papadimitriou
from django.core.urlresolvers import reverse, NoReverseMatch
40 d2633501 Kostas Papadimitriou
from django.utils.translation import ugettext as _
41 9d20fe23 Kostas Papadimitriou
from django.contrib.auth.models import Group
42 9d20fe23 Kostas Papadimitriou
from django import template
43 d2633501 Kostas Papadimitriou
44 081070a5 Kostas Papadimitriou
from django.conf import settings
45 c4b1a172 Kostas Papadimitriou
46 081070a5 Kostas Papadimitriou
from astakos.im import settings as astakos_settings
47 c4b1a172 Kostas Papadimitriou
from astakos.im import messages as astakos_messages
48 d2633501 Kostas Papadimitriou
49 cbc7a32c Kostas Papadimitriou
from synnefo_branding import utils as branding_utils
50 cbc7a32c Kostas Papadimitriou
51 d2633501 Kostas Papadimitriou
import logging
52 d2633501 Kostas Papadimitriou
53 d2633501 Kostas Papadimitriou
logger = logging.getLogger(__name__)
54 d2633501 Kostas Papadimitriou
55 d2633501 Kostas Papadimitriou
# providers registry
56 6012535a Kostas Papadimitriou
PROVIDERS = {}
57 badcb2a9 Kostas Papadimitriou
REQUIRED_PROVIDERS = {}
58 d2633501 Kostas Papadimitriou
59 9d20fe23 Kostas Papadimitriou
60 d2633501 Kostas Papadimitriou
class AuthProviderBase(type):
61 d2633501 Kostas Papadimitriou
62 d2633501 Kostas Papadimitriou
    def __new__(cls, name, bases, dct):
63 d2633501 Kostas Papadimitriou
        include = False
64 d2633501 Kostas Papadimitriou
        if [b for b in bases if isinstance(b, AuthProviderBase)]:
65 d2633501 Kostas Papadimitriou
            type_id = dct.get('module')
66 d2633501 Kostas Papadimitriou
            if type_id:
67 d2633501 Kostas Papadimitriou
                include = True
68 081070a5 Kostas Papadimitriou
            if type_id in astakos_settings.IM_MODULES:
69 591068ae Kostas Papadimitriou
                if astakos_settings.IM_MODULES.index(type_id) == 0:
70 591068ae Kostas Papadimitriou
                    dct['is_primary'] = True
71 d2633501 Kostas Papadimitriou
                dct['module_enabled'] = True
72 d2633501 Kostas Papadimitriou
73 d2633501 Kostas Papadimitriou
        newcls = super(AuthProviderBase, cls).__new__(cls, name, bases, dct)
74 d2633501 Kostas Papadimitriou
        if include:
75 6012535a Kostas Papadimitriou
            PROVIDERS[type_id] = newcls
76 9d20fe23 Kostas Papadimitriou
            if newcls().get_required_policy:
77 badcb2a9 Kostas Papadimitriou
                REQUIRED_PROVIDERS[type_id] = newcls
78 d2633501 Kostas Papadimitriou
        return newcls
79 d2633501 Kostas Papadimitriou
80 d2633501 Kostas Papadimitriou
81 d2633501 Kostas Papadimitriou
class AuthProvider(object):
82 d2633501 Kostas Papadimitriou
83 d2633501 Kostas Papadimitriou
    __metaclass__ = AuthProviderBase
84 d2633501 Kostas Papadimitriou
85 d2633501 Kostas Papadimitriou
    module = None
86 d2633501 Kostas Papadimitriou
    module_enabled = False
87 591068ae Kostas Papadimitriou
    is_primary = False
88 9d20fe23 Kostas Papadimitriou
89 9d20fe23 Kostas Papadimitriou
    message_tpls = OrderedDict((
90 9d20fe23 Kostas Papadimitriou
        ('title', '{module_title}'),
91 9d20fe23 Kostas Papadimitriou
        ('login_title', '{title} LOGIN'),
92 9d20fe23 Kostas Papadimitriou
        ('method_prompt', '{title} login'),
93 9d20fe23 Kostas Papadimitriou
        ('account_prompt', '{title} account'),
94 9d20fe23 Kostas Papadimitriou
        ('signup_title', '{title}'),
95 9d20fe23 Kostas Papadimitriou
        ('profile_title', '{title}'),
96 9d20fe23 Kostas Papadimitriou
        ('method_details', '{account_prompt}: {identifier}'),
97 9d20fe23 Kostas Papadimitriou
        ('primary_login_prompt', 'Login using '),
98 9d20fe23 Kostas Papadimitriou
        ('required', '{title} is required. You can assign it '
99 9d20fe23 Kostas Papadimitriou
                     'from your profile page'),
100 9d20fe23 Kostas Papadimitriou
        ('login_prompt', ''),
101 9d20fe23 Kostas Papadimitriou
        ('add_prompt', 'Allows you to login using {title}'),
102 9d20fe23 Kostas Papadimitriou
        ('login_extra', ''),
103 9d20fe23 Kostas Papadimitriou
        ('username', '{username}'),
104 cbc7a32c Kostas Papadimitriou
        ('disabled_for_create', 'It seems this is the first time you\'re '
105 cbc7a32c Kostas Papadimitriou
                                'trying to access {service_name}. '
106 cbc7a32c Kostas Papadimitriou
                                'Unfortunately, we are not accepting new '
107 cbc7a32c Kostas Papadimitriou
                                'users at this point.'),
108 9d20fe23 Kostas Papadimitriou
        ('switch_success', 'Account changed successfully.'),
109 9d20fe23 Kostas Papadimitriou
        ('cannot_login', '{title} is not available for login. '
110 9d20fe23 Kostas Papadimitriou
                         'Please use one of your other available methods '
111 9d20fe23 Kostas Papadimitriou
                         'to login ({available_methods_links}'),
112 9d20fe23 Kostas Papadimitriou
113 9d20fe23 Kostas Papadimitriou
        # icons should end with _icon
114 9d20fe23 Kostas Papadimitriou
        ('module_medium_icon', 'im/auth/icons-medium/{module}.png'),
115 9d20fe23 Kostas Papadimitriou
        ('module_icon', 'im/auth/icons/{module}.png'))
116 9d20fe23 Kostas Papadimitriou
    )
117 9d20fe23 Kostas Papadimitriou
118 9d20fe23 Kostas Papadimitriou
    messages = {}
119 9d20fe23 Kostas Papadimitriou
    module_urls = {}
120 9d20fe23 Kostas Papadimitriou
121 564a2292 Kostas Papadimitriou
    remote_authenticate = True
122 564a2292 Kostas Papadimitriou
    remote_logout_url = None
123 d2633501 Kostas Papadimitriou
124 9d20fe23 Kostas Papadimitriou
    # templates
125 9d20fe23 Kostas Papadimitriou
    primary_login_template = 'im/auth/generic_primary_login.html'
126 9d20fe23 Kostas Papadimitriou
    login_template = 'im/auth/generic_login.html'
127 9d20fe23 Kostas Papadimitriou
    signup_template = 'im/signup.html'
128 9d20fe23 Kostas Papadimitriou
    login_prompt_template = 'im/auth/generic_login_prompt.html'
129 9d20fe23 Kostas Papadimitriou
    signup_prompt_template = 'im/auth/signup_prompt.html'
130 9d20fe23 Kostas Papadimitriou
131 9d20fe23 Kostas Papadimitriou
    default_policies = {
132 9d20fe23 Kostas Papadimitriou
        'login': True,
133 9d20fe23 Kostas Papadimitriou
        'create': True,
134 9d20fe23 Kostas Papadimitriou
        'add': True,
135 9d20fe23 Kostas Papadimitriou
        'remove': True,
136 9d20fe23 Kostas Papadimitriou
        'limit': 1,
137 9d20fe23 Kostas Papadimitriou
        'switch': True,
138 9d20fe23 Kostas Papadimitriou
        'add_groups': [],
139 9d20fe23 Kostas Papadimitriou
        'creation_groups': [],
140 9d20fe23 Kostas Papadimitriou
        'required': False,
141 9d20fe23 Kostas Papadimitriou
        'automoderate': not astakos_settings.MODERATION_ENABLED
142 9d20fe23 Kostas Papadimitriou
    }
143 9d20fe23 Kostas Papadimitriou
144 9d20fe23 Kostas Papadimitriou
    policies = {}
145 9d20fe23 Kostas Papadimitriou
146 9d20fe23 Kostas Papadimitriou
    def __init__(self, user=None, identifier=None, **provider_params):
147 9d20fe23 Kostas Papadimitriou
        """
148 9d20fe23 Kostas Papadimitriou
        3 ways to initialize (no args, user, user and identifier).
149 9d20fe23 Kostas Papadimitriou

150 9d20fe23 Kostas Papadimitriou
        no args: Used for anonymous unauthenticated users.
151 9d20fe23 Kostas Papadimitriou
        >>> p = auth_providers.get_provider('local')
152 9d20fe23 Kostas Papadimitriou
        >>> # check that global settings allows us to create a new account
153 9d20fe23 Kostas Papadimitriou
        >>> # using `local` provider.
154 9d20fe23 Kostas Papadimitriou
        >>> print p.is_available_for_create()
155 9d20fe23 Kostas Papadimitriou

156 9d20fe23 Kostas Papadimitriou
        user and identifier: Used to provide details about a user's specific
157 9d20fe23 Kostas Papadimitriou
        login method.
158 97246b51 Kostas Papadimitriou
        >>> p = auth_providers.get_provider('google', user,
159 97246b51 Kostas Papadimitriou
        >>>                                 identifier='1421421')
160 9d20fe23 Kostas Papadimitriou
        >>> # provider (google) details prompt
161 9d20fe23 Kostas Papadimitriou
        >>> print p.get_method_details()
162 9d20fe23 Kostas Papadimitriou
        "Google account: 1421421"
163 9d20fe23 Kostas Papadimitriou
        """
164 9d20fe23 Kostas Papadimitriou
165 9d20fe23 Kostas Papadimitriou
        # handle AnonymousUser instance
166 9d20fe23 Kostas Papadimitriou
        self.user = None
167 9d20fe23 Kostas Papadimitriou
        if user and hasattr(user, 'pk') and user.pk:
168 9d20fe23 Kostas Papadimitriou
            self.user = user
169 c4b1a172 Kostas Papadimitriou
170 9d20fe23 Kostas Papadimitriou
        self.identifier = identifier
171 9d20fe23 Kostas Papadimitriou
        self._instance = None
172 9d20fe23 Kostas Papadimitriou
        if 'instance' in provider_params:
173 9d20fe23 Kostas Papadimitriou
            self._instance = provider_params['instance']
174 9d20fe23 Kostas Papadimitriou
            del provider_params['instance']
175 9d20fe23 Kostas Papadimitriou
176 9d20fe23 Kostas Papadimitriou
        # initialize policies
177 9d20fe23 Kostas Papadimitriou
        self.module_policies = copy.copy(self.default_policies)
178 9d20fe23 Kostas Papadimitriou
        self.module_policies['automoderate'] = not \
179 9d20fe23 Kostas Papadimitriou
            astakos_settings.MODERATION_ENABLED
180 bc8bede2 Kostas Papadimitriou
        for policy, value in self.policies.iteritems():
181 9d20fe23 Kostas Papadimitriou
            setting_key = "%s_POLICY" % policy.upper()
182 9d20fe23 Kostas Papadimitriou
            if self.has_setting(setting_key):
183 9d20fe23 Kostas Papadimitriou
                self.module_policies[policy] = self.get_setting(setting_key)
184 7bb081f5 Kostas Papadimitriou
            else:
185 7bb081f5 Kostas Papadimitriou
                self.module_policies[policy] = value
186 9d20fe23 Kostas Papadimitriou
187 9d20fe23 Kostas Papadimitriou
        # messages cache
188 9d20fe23 Kostas Papadimitriou
        self.message_tpls_compiled = OrderedDict()
189 9d20fe23 Kostas Papadimitriou
190 9d20fe23 Kostas Papadimitriou
        # module specific messages
191 9d20fe23 Kostas Papadimitriou
        self.message_tpls = OrderedDict(self.message_tpls)
192 9d20fe23 Kostas Papadimitriou
        for key, value in self.messages.iteritems():
193 9d20fe23 Kostas Papadimitriou
            self.message_tpls[key] = value
194 9d20fe23 Kostas Papadimitriou
195 9d20fe23 Kostas Papadimitriou
        self._provider_details = provider_params
196 9d20fe23 Kostas Papadimitriou
197 9d20fe23 Kostas Papadimitriou
        self.resolve_available_methods = True
198 9d20fe23 Kostas Papadimitriou
199 9d20fe23 Kostas Papadimitriou
    def get_provider_model(self):
200 9d20fe23 Kostas Papadimitriou
        from astakos.im.models import AstakosUserAuthProvider as AuthProvider
201 9d20fe23 Kostas Papadimitriou
        return AuthProvider
202 9d20fe23 Kostas Papadimitriou
203 9d20fe23 Kostas Papadimitriou
    def remove_from_user(self):
204 9d20fe23 Kostas Papadimitriou
        if not self.get_remove_policy:
205 9d20fe23 Kostas Papadimitriou
            raise Exception("Provider cannot be removed")
206 9d20fe23 Kostas Papadimitriou
207 5d91dccb Kostas Papadimitriou
        for group_name in self.get_add_groups_policy:
208 5d91dccb Kostas Papadimitriou
            group = Group.objects.get(name=group_name)
209 5d91dccb Kostas Papadimitriou
            self.user.groups.remove(group)
210 5d91dccb Kostas Papadimitriou
            self.log('removed from group due to add_groups_policy %s',
211 5d91dccb Kostas Papadimitriou
                     group.name)
212 5d91dccb Kostas Papadimitriou
213 9d20fe23 Kostas Papadimitriou
        self._instance.delete()
214 5d91dccb Kostas Papadimitriou
        self.log('removed')
215 9d20fe23 Kostas Papadimitriou
216 9d20fe23 Kostas Papadimitriou
    def add_to_user(self, **params):
217 9d20fe23 Kostas Papadimitriou
        if self._instance:
218 9d20fe23 Kostas Papadimitriou
            raise Exception("Cannot add an existing provider")
219 9d20fe23 Kostas Papadimitriou
220 9d20fe23 Kostas Papadimitriou
        create = False
221 9d20fe23 Kostas Papadimitriou
        if self.get_user_providers().count() == 0:
222 9d20fe23 Kostas Papadimitriou
            create = True
223 9d20fe23 Kostas Papadimitriou
224 9d20fe23 Kostas Papadimitriou
        if create and not self.get_create_policy:
225 9d20fe23 Kostas Papadimitriou
            raise Exception("Provider not available for create")
226 9d20fe23 Kostas Papadimitriou
227 9d20fe23 Kostas Papadimitriou
        if not self.get_add_policy:
228 9d20fe23 Kostas Papadimitriou
            raise Exception("Provider cannot be added")
229 9d20fe23 Kostas Papadimitriou
230 9d20fe23 Kostas Papadimitriou
        if create:
231 9d20fe23 Kostas Papadimitriou
            for group_name in self.get_creation_groups_policy:
232 9d20fe23 Kostas Papadimitriou
                group, created = Group.objects.get_or_create(name=group_name)
233 9d20fe23 Kostas Papadimitriou
                self.user.groups.add(group)
234 97246b51 Kostas Papadimitriou
                self.log("added to %s group due to creation_groups_policy",
235 97246b51 Kostas Papadimitriou
                         group_name)
236 9d20fe23 Kostas Papadimitriou
237 9d20fe23 Kostas Papadimitriou
        for group_name in self.get_add_groups_policy:
238 9d20fe23 Kostas Papadimitriou
            group, created = Group.objects.get_or_create(name=group_name)
239 9d20fe23 Kostas Papadimitriou
            self.user.groups.add(group)
240 97246b51 Kostas Papadimitriou
            self.log("added to %s group due to add_groups_policy",
241 97246b51 Kostas Papadimitriou
                     group_name)
242 9d20fe23 Kostas Papadimitriou
243 9d20fe23 Kostas Papadimitriou
        if self.identifier:
244 9d20fe23 Kostas Papadimitriou
            pending = self.get_provider_model().objects.unverified(
245 9d20fe23 Kostas Papadimitriou
                self.module, identifier=self.identifier)
246 9d20fe23 Kostas Papadimitriou
247 9d20fe23 Kostas Papadimitriou
            if pending:
248 9d20fe23 Kostas Papadimitriou
                pending._instance.delete()
249 9d20fe23 Kostas Papadimitriou
250 9d20fe23 Kostas Papadimitriou
        create_params = {
251 9d20fe23 Kostas Papadimitriou
            'module': self.module,
252 9d20fe23 Kostas Papadimitriou
            'info_data': json.dumps(self.provider_details.get('info', {})),
253 9d20fe23 Kostas Papadimitriou
            'active': True,
254 9d20fe23 Kostas Papadimitriou
            'identifier': self.identifier
255 9d20fe23 Kostas Papadimitriou
        }
256 9d20fe23 Kostas Papadimitriou
        if 'info' in self.provider_details:
257 9d20fe23 Kostas Papadimitriou
            del self.provider_details['info']
258 9d20fe23 Kostas Papadimitriou
259 9d20fe23 Kostas Papadimitriou
        create_params.update(self.provider_details)
260 9d20fe23 Kostas Papadimitriou
        create_params.update(params)
261 97246b51 Kostas Papadimitriou
        create = self.user.auth_providers.create(**create_params)
262 97246b51 Kostas Papadimitriou
        self.log("created %r" % create_params)
263 97246b51 Kostas Papadimitriou
        return create
264 9d20fe23 Kostas Papadimitriou
265 9d20fe23 Kostas Papadimitriou
    def __repr__(self):
266 9d20fe23 Kostas Papadimitriou
        r = "'%s' module" % self.__class__.__name__
267 9d20fe23 Kostas Papadimitriou
        if self.user:
268 9d20fe23 Kostas Papadimitriou
            r += ' (user: %s)' % self.user
269 9d20fe23 Kostas Papadimitriou
        if self.identifier:
270 97246b51 Kostas Papadimitriou
            r += '(identifier: %s)' % self.identifier
271 9d20fe23 Kostas Papadimitriou
        return r
272 9d20fe23 Kostas Papadimitriou
273 9d20fe23 Kostas Papadimitriou
    def _message_params(self, **extra_params):
274 9d20fe23 Kostas Papadimitriou
        """
275 9d20fe23 Kostas Papadimitriou
        Retrieve message formating parameters.
276 9d20fe23 Kostas Papadimitriou
        """
277 9d20fe23 Kostas Papadimitriou
        params = {'module': self.module, 'module_title': self.module.title()}
278 9d20fe23 Kostas Papadimitriou
        if self.identifier:
279 9d20fe23 Kostas Papadimitriou
            params['identifier'] = self.identifier
280 c4b1a172 Kostas Papadimitriou
281 9d20fe23 Kostas Papadimitriou
        if self.user:
282 9d20fe23 Kostas Papadimitriou
            for key, val in self.user.__dict__.iteritems():
283 9d20fe23 Kostas Papadimitriou
                params["user_%s" % key.lower()] = val
284 9d20fe23 Kostas Papadimitriou
285 9d20fe23 Kostas Papadimitriou
        if self.provider_details:
286 9d20fe23 Kostas Papadimitriou
            for key, val in self.provider_details.iteritems():
287 9d20fe23 Kostas Papadimitriou
                params["provider_%s" % key.lower()] = val
288 9d20fe23 Kostas Papadimitriou
289 9d20fe23 Kostas Papadimitriou
            if 'info' in self.provider_details:
290 9d20fe23 Kostas Papadimitriou
                if isinstance(self.provider_details['info'], basestring):
291 9d20fe23 Kostas Papadimitriou
                    self.provider_details['info'] = \
292 9d20fe23 Kostas Papadimitriou
                        json.loads(self.provider_details['info'])
293 9d20fe23 Kostas Papadimitriou
                for key, val in self.provider_details['info'].iteritems():
294 cbc7a32c Kostas Papadimitriou
                    params['provider_info_%s' % key.lower()] = val
295 9d20fe23 Kostas Papadimitriou
296 9d20fe23 Kostas Papadimitriou
        # resolve username, handle unexisting defined username key
297 9d20fe23 Kostas Papadimitriou
        if self.user and self.username_key in params:
298 9d20fe23 Kostas Papadimitriou
            params['username'] = params[self.username_key]
299 9d20fe23 Kostas Papadimitriou
        else:
300 9d20fe23 Kostas Papadimitriou
            params['username'] = self.identifier
301 9d20fe23 Kostas Papadimitriou
302 0656aaa7 Giorgos Korfiatis
        branding_params = dict(
303 0656aaa7 Giorgos Korfiatis
            map(lambda k: (k[0].lower(), k[1]),
304 0656aaa7 Giorgos Korfiatis
                branding_utils.get_branding_dict().iteritems()))
305 cbc7a32c Kostas Papadimitriou
        params.update(branding_params)
306 cbc7a32c Kostas Papadimitriou
307 9d20fe23 Kostas Papadimitriou
        if not self.message_tpls_compiled:
308 9d20fe23 Kostas Papadimitriou
            for key, message_tpl in self.message_tpls.iteritems():
309 9d20fe23 Kostas Papadimitriou
                msg = self.messages.get(key, self.message_tpls.get(key))
310 9d20fe23 Kostas Papadimitriou
                override_in_settings = self.get_setting(key)
311 9d20fe23 Kostas Papadimitriou
                if override_in_settings is not None:
312 9d20fe23 Kostas Papadimitriou
                    msg = override_in_settings
313 9d20fe23 Kostas Papadimitriou
                try:
314 9d20fe23 Kostas Papadimitriou
                    self.message_tpls_compiled[key] = msg.format(**params)
315 9d20fe23 Kostas Papadimitriou
                    params.update(self.message_tpls_compiled)
316 9d20fe23 Kostas Papadimitriou
                except KeyError, e:
317 9d20fe23 Kostas Papadimitriou
                    continue
318 9d20fe23 Kostas Papadimitriou
        else:
319 9d20fe23 Kostas Papadimitriou
            params.update(self.message_tpls_compiled)
320 9d20fe23 Kostas Papadimitriou
321 9d20fe23 Kostas Papadimitriou
        for key, value in self.urls.iteritems():
322 9d20fe23 Kostas Papadimitriou
            params['%s_url' % key] = value
323 9d20fe23 Kostas Papadimitriou
324 9d20fe23 Kostas Papadimitriou
        if self.user and self.resolve_available_methods:
325 9d20fe23 Kostas Papadimitriou
            available_providers = self.user.get_enabled_auth_providers()
326 9d20fe23 Kostas Papadimitriou
            for p in available_providers:
327 9d20fe23 Kostas Papadimitriou
                p.resolve_available_methods = False
328 9d20fe23 Kostas Papadimitriou
                if p.module == self.module and p.identifier == self.identifier:
329 9d20fe23 Kostas Papadimitriou
                    available_providers.remove(p)
330 9d20fe23 Kostas Papadimitriou
331 9d20fe23 Kostas Papadimitriou
            get_msg = lambda p: p.get_method_prompt_msg
332 9d20fe23 Kostas Papadimitriou
            params['available_methods'] = \
333 9d20fe23 Kostas Papadimitriou
                ','.join(map(get_msg, available_providers))
334 9d20fe23 Kostas Papadimitriou
335 9d20fe23 Kostas Papadimitriou
            get_msg = lambda p: "<a href='%s'>%s</a>" % \
336 97246b51 Kostas Papadimitriou
                (p.get_login_url, p.get_method_prompt_msg)
337 9d20fe23 Kostas Papadimitriou
338 9d20fe23 Kostas Papadimitriou
            params['available_methods_links'] = \
339 9d20fe23 Kostas Papadimitriou
                ','.join(map(get_msg, available_providers))
340 9d20fe23 Kostas Papadimitriou
341 9d20fe23 Kostas Papadimitriou
        params.update(extra_params)
342 9d20fe23 Kostas Papadimitriou
        return params
343 9d20fe23 Kostas Papadimitriou
344 9d20fe23 Kostas Papadimitriou
    def get_template(self, tpl):
345 9d20fe23 Kostas Papadimitriou
        tpls = ['im/auth/%s_%s.html' % (self.module, tpl),
346 9d20fe23 Kostas Papadimitriou
                getattr(self, '%s_template' % tpl)]
347 9d20fe23 Kostas Papadimitriou
        found = None
348 9d20fe23 Kostas Papadimitriou
        for tpl in tpls:
349 9d20fe23 Kostas Papadimitriou
            try:
350 9d20fe23 Kostas Papadimitriou
                found = template.loader.get_template(tpl)
351 9d20fe23 Kostas Papadimitriou
                return tpl
352 9d20fe23 Kostas Papadimitriou
            except template.TemplateDoesNotExist:
353 9d20fe23 Kostas Papadimitriou
                continue
354 9d20fe23 Kostas Papadimitriou
        if not found:
355 9d20fe23 Kostas Papadimitriou
            raise template.TemplateDoesNotExist
356 9d20fe23 Kostas Papadimitriou
        return tpl
357 9d20fe23 Kostas Papadimitriou
358 9d20fe23 Kostas Papadimitriou
    def get_username(self):
359 9d20fe23 Kostas Papadimitriou
        return self.get_username_msg
360 9d20fe23 Kostas Papadimitriou
361 9d20fe23 Kostas Papadimitriou
    def get_user_providers(self):
362 680c383d Kostas Papadimitriou
        return self.user.auth_providers.active().filter(
363 680c383d Kostas Papadimitriou
            module__in=astakos_settings.IM_MODULES)
364 9d20fe23 Kostas Papadimitriou
365 9d20fe23 Kostas Papadimitriou
    def get_user_module_providers(self):
366 9d20fe23 Kostas Papadimitriou
        return self.user.auth_providers.active().filter(module=self.module)
367 9d20fe23 Kostas Papadimitriou
368 9d20fe23 Kostas Papadimitriou
    def get_existing_providers(self):
369 9d20fe23 Kostas Papadimitriou
        return ""
370 9d20fe23 Kostas Papadimitriou
371 9d20fe23 Kostas Papadimitriou
    def verified_exists(self):
372 9d20fe23 Kostas Papadimitriou
        return self.get_provider_model().objects.verified(
373 9d20fe23 Kostas Papadimitriou
            self.module, identifier=self.identifier)
374 9d20fe23 Kostas Papadimitriou
375 97246b51 Kostas Papadimitriou
    def resolve_policy(self, policy, default=None):
376 9d20fe23 Kostas Papadimitriou
377 9d20fe23 Kostas Papadimitriou
        if policy == 'switch' and default and not self.get_add_policy:
378 9d20fe23 Kostas Papadimitriou
            return not self.get_policy('remove')
379 9d20fe23 Kostas Papadimitriou
380 9d20fe23 Kostas Papadimitriou
        if not self.user:
381 9d20fe23 Kostas Papadimitriou
            return default
382 9d20fe23 Kostas Papadimitriou
383 9d20fe23 Kostas Papadimitriou
        if policy == 'remove' and default is True:
384 9d20fe23 Kostas Papadimitriou
            return self.get_user_providers().count() > 1
385 9d20fe23 Kostas Papadimitriou
386 9d20fe23 Kostas Papadimitriou
        if policy == 'add' and default is True:
387 9d20fe23 Kostas Papadimitriou
            limit = self.get_policy('limit')
388 9d20fe23 Kostas Papadimitriou
            if limit <= self.get_user_module_providers().count():
389 9d20fe23 Kostas Papadimitriou
                return False
390 9d20fe23 Kostas Papadimitriou
391 9d20fe23 Kostas Papadimitriou
            if self.identifier:
392 9d20fe23 Kostas Papadimitriou
                if self.verified_exists():
393 9d20fe23 Kostas Papadimitriou
                    return False
394 9d20fe23 Kostas Papadimitriou
395 9d20fe23 Kostas Papadimitriou
        return default
396 9d20fe23 Kostas Papadimitriou
397 9d20fe23 Kostas Papadimitriou
    def get_user_policies(self):
398 9d20fe23 Kostas Papadimitriou
        from astakos.im.models import AuthProviderPolicyProfile
399 9d20fe23 Kostas Papadimitriou
        return AuthProviderPolicyProfile.objects.for_user(self.user,
400 9d20fe23 Kostas Papadimitriou
                                                          self.module)
401 9d20fe23 Kostas Papadimitriou
402 9d20fe23 Kostas Papadimitriou
    def get_policy(self, policy):
403 9d20fe23 Kostas Papadimitriou
        module_default = self.module_policies.get(policy)
404 9d20fe23 Kostas Papadimitriou
        settings_key = '%s_POLICY' % policy.upper()
405 9d20fe23 Kostas Papadimitriou
        settings_default = self.get_setting(settings_key, module_default)
406 9d20fe23 Kostas Papadimitriou
407 9d20fe23 Kostas Papadimitriou
        if self.user:
408 9d20fe23 Kostas Papadimitriou
            user_policies = self.get_user_policies()
409 9d20fe23 Kostas Papadimitriou
            settings_default = user_policies.get(policy, settings_default)
410 9d20fe23 Kostas Papadimitriou
411 97246b51 Kostas Papadimitriou
        return self.resolve_policy(policy, settings_default)
412 9d20fe23 Kostas Papadimitriou
413 9d20fe23 Kostas Papadimitriou
    def get_message(self, msg, **extra_params):
414 9d20fe23 Kostas Papadimitriou
        """
415 9d20fe23 Kostas Papadimitriou
        Retrieve an auth provider message
416 9d20fe23 Kostas Papadimitriou
        """
417 9d20fe23 Kostas Papadimitriou
        if msg.endswith('_msg'):
418 9d20fe23 Kostas Papadimitriou
            msg = msg.replace('_msg', '')
419 9d20fe23 Kostas Papadimitriou
        params = self._message_params(**extra_params)
420 9d20fe23 Kostas Papadimitriou
421 9d20fe23 Kostas Papadimitriou
        # is message ???
422 9d20fe23 Kostas Papadimitriou
        tpl = self.message_tpls_compiled.get(msg.lower(), None)
423 9d20fe23 Kostas Papadimitriou
        if not tpl:
424 9d20fe23 Kostas Papadimitriou
            msg_key = 'AUTH_PROVIDER_%s' % msg.upper()
425 9d20fe23 Kostas Papadimitriou
            try:
426 9d20fe23 Kostas Papadimitriou
                tpl = getattr(astakos_messages, msg_key)
427 9d20fe23 Kostas Papadimitriou
            except AttributeError, e:
428 9d20fe23 Kostas Papadimitriou
                try:
429 9d20fe23 Kostas Papadimitriou
                    msg_key = msg.upper()
430 9d20fe23 Kostas Papadimitriou
                    tpl = getattr(astakos_messages, msg_key)
431 9d20fe23 Kostas Papadimitriou
                except AttributeError, e:
432 9d20fe23 Kostas Papadimitriou
                    tpl = ''
433 9d20fe23 Kostas Papadimitriou
434 9d20fe23 Kostas Papadimitriou
        in_settings = self.get_setting(msg)
435 9d20fe23 Kostas Papadimitriou
        if in_settings:
436 9d20fe23 Kostas Papadimitriou
            tpl = in_settings
437 9d20fe23 Kostas Papadimitriou
438 9d20fe23 Kostas Papadimitriou
        return tpl.format(**params)
439 dd5f8f4d Kostas Papadimitriou
440 0e79735c Kostas Papadimitriou
    @property
441 9d20fe23 Kostas Papadimitriou
    def urls(self):
442 9d20fe23 Kostas Papadimitriou
        urls = {
443 9d20fe23 Kostas Papadimitriou
            'login': reverse(self.login_view),
444 9d20fe23 Kostas Papadimitriou
            'add': reverse(self.login_view),
445 9d20fe23 Kostas Papadimitriou
            'profile': reverse('edit_profile'),
446 9d20fe23 Kostas Papadimitriou
        }
447 0e79735c Kostas Papadimitriou
        if self.user:
448 9d20fe23 Kostas Papadimitriou
            urls.update({
449 9d20fe23 Kostas Papadimitriou
                'resend_activation': self.user.get_resend_activation_url(),
450 9d20fe23 Kostas Papadimitriou
            })
451 9d20fe23 Kostas Papadimitriou
        if self.identifier and self._instance:
452 9d20fe23 Kostas Papadimitriou
            urls.update({
453 cbc7a32c Kostas Papadimitriou
                'switch': reverse(self.login_view) + '?switch_from=%d' %
454 cbc7a32c Kostas Papadimitriou
                self._instance.pk,
455 9d20fe23 Kostas Papadimitriou
                'remove': reverse('remove_auth_provider',
456 9d20fe23 Kostas Papadimitriou
                                  kwargs={'pk': self._instance.pk})
457 9d20fe23 Kostas Papadimitriou
            })
458 9d20fe23 Kostas Papadimitriou
        urls.update(self.module_urls)
459 9d20fe23 Kostas Papadimitriou
        return urls
460 9d20fe23 Kostas Papadimitriou
461 9d20fe23 Kostas Papadimitriou
    def get_setting_key(self, name):
462 9d20fe23 Kostas Papadimitriou
        return 'ASTAKOS_AUTH_PROVIDER_%s_%s' % (self.module.upper(),
463 9d20fe23 Kostas Papadimitriou
                                                name.upper())
464 9d20fe23 Kostas Papadimitriou
465 9d20fe23 Kostas Papadimitriou
    def get_global_setting_key(self, name):
466 9d20fe23 Kostas Papadimitriou
        return 'ASTAKOS_AUTH_PROVIDERS_%s' % name.upper()
467 9d20fe23 Kostas Papadimitriou
468 9d20fe23 Kostas Papadimitriou
    def has_global_setting(self, name):
469 9d20fe23 Kostas Papadimitriou
        return hasattr(settings, self.get_global_setting_key(name))
470 9d20fe23 Kostas Papadimitriou
471 9d20fe23 Kostas Papadimitriou
    def has_setting(self, name):
472 9d20fe23 Kostas Papadimitriou
        return hasattr(settings, self.get_setting_key(name))
473 0e79735c Kostas Papadimitriou
474 9d20fe23 Kostas Papadimitriou
    def get_setting(self, name, default=None):
475 9d20fe23 Kostas Papadimitriou
        attr = self.get_setting_key(name)
476 9d20fe23 Kostas Papadimitriou
        if not self.has_setting(name):
477 9d20fe23 Kostas Papadimitriou
            return self.get_global_setting(name, default)
478 9d20fe23 Kostas Papadimitriou
        return getattr(settings, attr, default)
479 0e79735c Kostas Papadimitriou
480 9d20fe23 Kostas Papadimitriou
    def get_global_setting(self, name, default=None):
481 9d20fe23 Kostas Papadimitriou
        attr = self.get_global_setting_key(name)
482 9d20fe23 Kostas Papadimitriou
        if not self.has_global_setting(name):
483 9d20fe23 Kostas Papadimitriou
            return default
484 9d20fe23 Kostas Papadimitriou
        return getattr(settings, attr, default)
485 9d20fe23 Kostas Papadimitriou
486 9d20fe23 Kostas Papadimitriou
    @property
487 9d20fe23 Kostas Papadimitriou
    def provider_details(self):
488 9d20fe23 Kostas Papadimitriou
        if self._provider_details:
489 9d20fe23 Kostas Papadimitriou
            return self._provider_details
490 564a2292 Kostas Papadimitriou
491 9d20fe23 Kostas Papadimitriou
        self._provider_details = {}
492 64492c49 Kostas Papadimitriou
493 9d20fe23 Kostas Papadimitriou
        if self._instance:
494 9d20fe23 Kostas Papadimitriou
            self._provider_details = self._instance.__dict__
495 bd0f516a Kostas Papadimitriou
496 9d20fe23 Kostas Papadimitriou
        if self.user and self.identifier:
497 9d20fe23 Kostas Papadimitriou
            if self.identifier:
498 9d20fe23 Kostas Papadimitriou
                try:
499 9d20fe23 Kostas Papadimitriou
                    self._provider_details = \
500 9d20fe23 Kostas Papadimitriou
                        self.user.get_auth_providers().get(
501 9d20fe23 Kostas Papadimitriou
                            module=self.module,
502 9d20fe23 Kostas Papadimitriou
                            identifier=self.identifier).__dict__
503 9d20fe23 Kostas Papadimitriou
                except Exception:
504 9d20fe23 Kostas Papadimitriou
                    return {}
505 9d20fe23 Kostas Papadimitriou
        return self._provider_details
506 d0632ab1 Olga Brani
507 081070a5 Kostas Papadimitriou
    def __getattr__(self, key):
508 081070a5 Kostas Papadimitriou
        if not key.startswith('get_'):
509 6974e526 Kostas Papadimitriou
            return super(AuthProvider, self).__getattribute__(key)
510 081070a5 Kostas Papadimitriou
511 9d20fe23 Kostas Papadimitriou
        key = key.replace('get_', '')
512 9d20fe23 Kostas Papadimitriou
        if key.endswith('_msg'):
513 9d20fe23 Kostas Papadimitriou
            return self.get_message(key)
514 91bbc1a4 Kostas Papadimitriou
515 9d20fe23 Kostas Papadimitriou
        if key.endswith('_policy'):
516 9d20fe23 Kostas Papadimitriou
            return self.get_policy(key.replace('_policy', ''))
517 d2633501 Kostas Papadimitriou
518 9d20fe23 Kostas Papadimitriou
        if key.endswith('_url'):
519 9d20fe23 Kostas Papadimitriou
            key = key.replace('_url', '')
520 9d20fe23 Kostas Papadimitriou
            return self.urls.get(key)
521 e9e692be Kostas Papadimitriou
522 9d20fe23 Kostas Papadimitriou
        if key.endswith('_icon'):
523 9d20fe23 Kostas Papadimitriou
            key = key.replace('_msg', '_icon')
524 9d20fe23 Kostas Papadimitriou
            return settings.MEDIA_URL + self.get_message(key)
525 d2633501 Kostas Papadimitriou
526 9d20fe23 Kostas Papadimitriou
        if key.endswith('_setting'):
527 9d20fe23 Kostas Papadimitriou
            key = key.replace('_setting', '')
528 9d20fe23 Kostas Papadimitriou
            return self.get_message(key)
529 d2633501 Kostas Papadimitriou
530 9d20fe23 Kostas Papadimitriou
        if key.endswith('_template'):
531 9d20fe23 Kostas Papadimitriou
            key = key.replace('_template', '')
532 9d20fe23 Kostas Papadimitriou
            return self.get_template(key)
533 d2633501 Kostas Papadimitriou
534 9d20fe23 Kostas Papadimitriou
        return super(AuthProvider, self).__getattribute__(key)
535 badcb2a9 Kostas Papadimitriou
536 d2633501 Kostas Papadimitriou
    def is_active(self):
537 9d20fe23 Kostas Papadimitriou
        return self.module_enabled
538 d2633501 Kostas Papadimitriou
539 97246b51 Kostas Papadimitriou
    @property
540 97246b51 Kostas Papadimitriou
    def log_display(self):
541 97246b51 Kostas Papadimitriou
        dsp = "%sAuth" % self.module.title()
542 97246b51 Kostas Papadimitriou
        if self.user:
543 97246b51 Kostas Papadimitriou
            dsp += "[%s]" % self.user.log_display
544 97246b51 Kostas Papadimitriou
            if self.identifier:
545 97246b51 Kostas Papadimitriou
                dsp += '[%s]' % self.identifier
546 97246b51 Kostas Papadimitriou
                if self._instance and self._instance.pk:
547 97246b51 Kostas Papadimitriou
                    dsp += '[%d]' % self._instance.pk
548 97246b51 Kostas Papadimitriou
        return dsp
549 97246b51 Kostas Papadimitriou
550 97246b51 Kostas Papadimitriou
    def log(self, msg, *args, **kwargs):
551 97246b51 Kostas Papadimitriou
        level = kwargs.pop('level', logging.INFO)
552 97246b51 Kostas Papadimitriou
        message = '%s: %s' % (self.log_display, msg)
553 97246b51 Kostas Papadimitriou
        logger.log(level, message, *args, **kwargs)
554 97246b51 Kostas Papadimitriou
555 d2633501 Kostas Papadimitriou
556 d2633501 Kostas Papadimitriou
class LocalAuthProvider(AuthProvider):
557 d2633501 Kostas Papadimitriou
    module = 'local'
558 9d20fe23 Kostas Papadimitriou
559 6a80a0ae Kostas Papadimitriou
    login_view = 'login'
560 564a2292 Kostas Papadimitriou
    remote_authenticate = False
561 9d20fe23 Kostas Papadimitriou
    username_key = 'user_email'
562 081070a5 Kostas Papadimitriou
563 9d20fe23 Kostas Papadimitriou
    messages = {
564 9d20fe23 Kostas Papadimitriou
        'title': _('Classic'),
565 9d20fe23 Kostas Papadimitriou
        'login_prompt': _('Classic login (username/password)'),
566 9d20fe23 Kostas Papadimitriou
        'login_success': _('Logged in successfully.'),
567 9d20fe23 Kostas Papadimitriou
        'method_details': 'Username: {username}',
568 9d20fe23 Kostas Papadimitriou
        'logout_success_extra': ' '
569 9d20fe23 Kostas Papadimitriou
    }
570 d2633501 Kostas Papadimitriou
571 bc8bede2 Kostas Papadimitriou
    policies = {
572 7bb081f5 Kostas Papadimitriou
        'limit': 1,
573 7bb081f5 Kostas Papadimitriou
        'switch': False
574 bc8bede2 Kostas Papadimitriou
    }
575 bc8bede2 Kostas Papadimitriou
576 d2633501 Kostas Papadimitriou
    @property
577 9d20fe23 Kostas Papadimitriou
    def urls(self):
578 9d20fe23 Kostas Papadimitriou
        urls = super(LocalAuthProvider, self).urls
579 6a80a0ae Kostas Papadimitriou
580 6a80a0ae Kostas Papadimitriou
        password_change_url = None
581 6a80a0ae Kostas Papadimitriou
        try:
582 6a80a0ae Kostas Papadimitriou
            password_change_url = reverse('password_change')
583 6a80a0ae Kostas Papadimitriou
        except NoReverseMatch:
584 6a80a0ae Kostas Papadimitriou
            pass
585 6a80a0ae Kostas Papadimitriou
586 6a80a0ae Kostas Papadimitriou
        urls['change_password'] = password_change_url
587 9d20fe23 Kostas Papadimitriou
        if self.user:
588 6a80a0ae Kostas Papadimitriou
            urls['add'] = password_change_url
589 9d20fe23 Kostas Papadimitriou
        if self._instance:
590 9d20fe23 Kostas Papadimitriou
            urls.update({
591 9d20fe23 Kostas Papadimitriou
                'remove': reverse('remove_auth_provider',
592 9d20fe23 Kostas Papadimitriou
                                  kwargs={'pk': self._instance.pk})
593 9d20fe23 Kostas Papadimitriou
            })
594 9d20fe23 Kostas Papadimitriou
            if 'switch' in urls:
595 9d20fe23 Kostas Papadimitriou
                del urls['switch']
596 9d20fe23 Kostas Papadimitriou
        return urls
597 9d20fe23 Kostas Papadimitriou
598 9d20fe23 Kostas Papadimitriou
    def remove_from_user(self):
599 9d20fe23 Kostas Papadimitriou
        super(LocalAuthProvider, self).remove_from_user()
600 9d20fe23 Kostas Papadimitriou
        self.user.set_unusable_password()
601 9d20fe23 Kostas Papadimitriou
        self.user.save()
602 d2633501 Kostas Papadimitriou
603 74796dd8 Kostas Papadimitriou
604 d2633501 Kostas Papadimitriou
class ShibbolethAuthProvider(AuthProvider):
605 d2633501 Kostas Papadimitriou
    module = 'shibboleth'
606 70e11eaa Sofia Papagiannaki
    login_view = 'astakos.im.views.target.shibboleth.login'
607 830747d2 Kostas Papadimitriou
    username_key = 'provider_info_eppn'
608 d2633501 Kostas Papadimitriou
609 7bb081f5 Kostas Papadimitriou
    policies = {
610 7bb081f5 Kostas Papadimitriou
        'switch': False
611 7bb081f5 Kostas Papadimitriou
    }
612 7bb081f5 Kostas Papadimitriou
613 9d20fe23 Kostas Papadimitriou
    messages = {
614 9d20fe23 Kostas Papadimitriou
        'title': _('Academic'),
615 6a80a0ae Kostas Papadimitriou
        'method_details': '{account_prompt}: {provider_info_eppn}',
616 9d20fe23 Kostas Papadimitriou
        'login_description': _('If you are a student, professor or researcher'
617 9d20fe23 Kostas Papadimitriou
                               ' you can login using your academic account.'),
618 cbc7a32c Kostas Papadimitriou
        'add_prompt': _('Allows you to login using your Academic '
619 cbc7a32c Kostas Papadimitriou
                        'account'),
620 9d20fe23 Kostas Papadimitriou
        'method_details': 'Account: {username}',
621 cbc7a32c Kostas Papadimitriou
        'logout_success_extra': _('You may still be logged in at your Academic'
622 cbc7a32c Kostas Papadimitriou
                                  ' account though. Consider logging out '
623 cbc7a32c Kostas Papadimitriou
                                  'from there too by closing all browser '
624 cbc7a32c Kostas Papadimitriou
                                  'windows')
625 9d20fe23 Kostas Papadimitriou
    }
626 ca5148f2 Kostas Papadimitriou
627 d2633501 Kostas Papadimitriou
628 c101b32b Kostas Papadimitriou
class TwitterAuthProvider(AuthProvider):
629 c101b32b Kostas Papadimitriou
    module = 'twitter'
630 70e11eaa Sofia Papagiannaki
    login_view = 'astakos.im.views.target.twitter.login'
631 9d20fe23 Kostas Papadimitriou
    username_key = 'provider_info_screen_name'
632 c101b32b Kostas Papadimitriou
633 9d20fe23 Kostas Papadimitriou
    messages = {
634 9d20fe23 Kostas Papadimitriou
        'title': _('Twitter'),
635 9d20fe23 Kostas Papadimitriou
        'method_details': 'Screen name: {username}',
636 9d20fe23 Kostas Papadimitriou
    }
637 c101b32b Kostas Papadimitriou
638 74796dd8 Kostas Papadimitriou
639 74796dd8 Kostas Papadimitriou
class GoogleAuthProvider(AuthProvider):
640 74796dd8 Kostas Papadimitriou
    module = 'google'
641 70e11eaa Sofia Papagiannaki
    login_view = 'astakos.im.views.target.google.login'
642 9d20fe23 Kostas Papadimitriou
    username_key = 'provider_info_email'
643 74796dd8 Kostas Papadimitriou
644 9d20fe23 Kostas Papadimitriou
    messages = {
645 9d20fe23 Kostas Papadimitriou
        'title': _('Google'),
646 9d20fe23 Kostas Papadimitriou
        'method_details': 'Email: {username}',
647 9d20fe23 Kostas Papadimitriou
    }
648 74796dd8 Kostas Papadimitriou
649 74796dd8 Kostas Papadimitriou
650 74796dd8 Kostas Papadimitriou
class LinkedInAuthProvider(AuthProvider):
651 74796dd8 Kostas Papadimitriou
    module = 'linkedin'
652 70e11eaa Sofia Papagiannaki
    login_view = 'astakos.im.views.target.linkedin.login'
653 9d20fe23 Kostas Papadimitriou
    username_key = 'provider_info_email'
654 74796dd8 Kostas Papadimitriou
655 9d20fe23 Kostas Papadimitriou
    messages = {
656 9d20fe23 Kostas Papadimitriou
        'title': _('LinkedIn'),
657 9d20fe23 Kostas Papadimitriou
        'method_details': 'Email: {username}',
658 9d20fe23 Kostas Papadimitriou
    }
659 74796dd8 Kostas Papadimitriou
660 74796dd8 Kostas Papadimitriou
661 9d20fe23 Kostas Papadimitriou
# Utility method
662 9d20fe23 Kostas Papadimitriou
def get_provider(module, user_obj=None, identifier=None, **params):
663 d2633501 Kostas Papadimitriou
    """
664 d2633501 Kostas Papadimitriou
    Return a provider instance from the auth providers registry.
665 d2633501 Kostas Papadimitriou
    """
666 9d20fe23 Kostas Papadimitriou
    if not module in PROVIDERS:
667 9d20fe23 Kostas Papadimitriou
        raise Exception('Invalid auth provider "%s"' % id)
668 d2633501 Kostas Papadimitriou
669 9d20fe23 Kostas Papadimitriou
    return PROVIDERS.get(module)(user_obj, identifier, **params)