Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / target / shibboleth.py @ 764d99c4

History | View | Annotate | Download (5.9 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 5ce3ce4f Sofia Papagiannaki
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 5ce3ce4f Sofia Papagiannaki
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 5ce3ce4f Sofia Papagiannaki
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 5ce3ce4f Sofia Papagiannaki
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 5ce3ce4f Sofia Papagiannaki
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 64cd4730 Antony Chazapis
34 c630fee6 Kostas Papadimitriou
import json
35 c630fee6 Kostas Papadimitriou
36 9d20fe23 Kostas Papadimitriou
from django.conf import settings as global_settings
37 64cd4730 Antony Chazapis
from django.http import HttpResponseBadRequest
38 18ffbee1 Sofia Papagiannaki
from django.utils.translation import ugettext as _
39 18ffbee1 Sofia Papagiannaki
from django.contrib import messages
40 18ffbee1 Sofia Papagiannaki
from django.template import RequestContext
41 dda2e499 Sofia Papagiannaki
from django.views.decorators.http import require_http_methods
42 ef20ea07 Sofia Papagiannaki
from django.http import HttpResponseRedirect
43 ef20ea07 Sofia Papagiannaki
from django.core.urlresolvers import reverse
44 c0b26605 Sofia Papagiannaki
from django.core.exceptions import ImproperlyConfigured
45 d2633501 Kostas Papadimitriou
from django.shortcuts import get_object_or_404
46 d2633501 Kostas Papadimitriou
47 d2633501 Kostas Papadimitriou
from urlparse import urlunsplit, urlsplit
48 64cd4730 Antony Chazapis
49 dd5f8f4d Kostas Papadimitriou
from astakos.im.util import prepare_response, get_context, login_url
50 73fbaec4 Sofia Papagiannaki
from astakos.im.views import (
51 73fbaec4 Sofia Papagiannaki
    requires_anonymous, render_response, requires_auth_provider)
52 ef20ea07 Sofia Papagiannaki
from astakos.im.settings import ENABLE_LOCAL_ACCOUNT_MIGRATION, BASEURL
53 ef20ea07 Sofia Papagiannaki
from astakos.im.models import AstakosUser, PendingThirdPartyUser
54 4e30244e Sofia Papagiannaki
from astakos.im.forms import LoginForm
55 4e30244e Sofia Papagiannaki
from astakos.im.activation_backends import get_backend, SimpleBackend
56 c630fee6 Kostas Papadimitriou
from astakos.im import auth_providers
57 d2633501 Kostas Papadimitriou
from astakos.im import settings
58 dd5f8f4d Kostas Papadimitriou
from astakos.im.target import add_pending_auth_provider, get_pending_key, \
59 0e79735c Kostas Papadimitriou
    handle_third_party_signup, handle_third_party_login, init_third_party_session
60 64cd4730 Antony Chazapis
61 ae497612 Olga Brani
import astakos.im.messages as astakos_messages
62 ef20ea07 Sofia Papagiannaki
import logging
63 ef20ea07 Sofia Papagiannaki
64 ef20ea07 Sofia Papagiannaki
logger = logging.getLogger(__name__)
65 ef20ea07 Sofia Papagiannaki
66 dd5f8f4d Kostas Papadimitriou
67 64cd4730 Antony Chazapis
class Tokens:
68 64cd4730 Antony Chazapis
    # these are mapped by the Shibboleth SP software
69 5ce3ce4f Sofia Papagiannaki
    SHIB_EPPN = "HTTP_EPPN"  # eduPersonPrincipalName
70 64cd4730 Antony Chazapis
    SHIB_NAME = "HTTP_SHIB_INETORGPERSON_GIVENNAME"
71 64cd4730 Antony Chazapis
    SHIB_SURNAME = "HTTP_SHIB_PERSON_SURNAME"
72 64cd4730 Antony Chazapis
    SHIB_CN = "HTTP_SHIB_PERSON_COMMONNAME"
73 64cd4730 Antony Chazapis
    SHIB_DISPLAYNAME = "HTTP_SHIB_INETORGPERSON_DISPLAYNAME"
74 64cd4730 Antony Chazapis
    SHIB_EP_AFFILIATION = "HTTP_SHIB_EP_AFFILIATION"
75 64cd4730 Antony Chazapis
    SHIB_SESSION_ID = "HTTP_SHIB_SESSION_ID"
76 ca828a10 Sofia Papagiannaki
    SHIB_MAIL = "HTTP_SHIB_MAIL"
77 64cd4730 Antony Chazapis
78 dd5f8f4d Kostas Papadimitriou
79 9d20fe23 Kostas Papadimitriou
@requires_auth_provider('shibboleth')
80 dda2e499 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
81 ef20ea07 Sofia Papagiannaki
def login(
82 ef20ea07 Sofia Papagiannaki
    request,
83 d2633501 Kostas Papadimitriou
    template='im/third_party_check_local.html',
84 73fbaec4 Sofia Papagiannaki
    extra_context=None):
85 73fbaec4 Sofia Papagiannaki
86 0e79735c Kostas Papadimitriou
    init_third_party_session(request)
87 ef20ea07 Sofia Papagiannaki
    extra_context = extra_context or {}
88 ef20ea07 Sofia Papagiannaki
89 4e30244e Sofia Papagiannaki
    tokens = request.META
90 dd5f8f4d Kostas Papadimitriou
    third_party_key = get_pending_key(request)
91 d2633501 Kostas Papadimitriou
92 a53ee093 Kostas Papadimitriou
    shibboleth_headers = {}
93 a53ee093 Kostas Papadimitriou
    for token in dir(Tokens):
94 a53ee093 Kostas Papadimitriou
        if token == token.upper():
95 f3463a00 Kostas Papadimitriou
            shibboleth_headers[token] = request.META.get(token, 'NOT_SET')
96 f3463a00 Kostas Papadimitriou
97 a53ee093 Kostas Papadimitriou
    # log shibboleth headers
98 a53ee093 Kostas Papadimitriou
    # TODO: info -> debug
99 a53ee093 Kostas Papadimitriou
    logger.info("shibboleth request: %r" % shibboleth_headers)
100 a53ee093 Kostas Papadimitriou
101 564a2292 Kostas Papadimitriou
    try:
102 564a2292 Kostas Papadimitriou
        eppn = tokens.get(Tokens.SHIB_EPPN)
103 9d20fe23 Kostas Papadimitriou
        if global_settings.DEBUG and not eppn:
104 9d20fe23 Kostas Papadimitriou
            eppn = getattr(global_settings, 'SHIBBOLETH_TEST_EPPN', None)
105 9d20fe23 Kostas Papadimitriou
            realname = getattr(global_settings, 'SHIBBOLETH_TEST_REALNAME',
106 9d20fe23 Kostas Papadimitriou
                               None)
107 9d20fe23 Kostas Papadimitriou
108 564a2292 Kostas Papadimitriou
        if not eppn:
109 564a2292 Kostas Papadimitriou
            raise KeyError(_(astakos_messages.SHIBBOLETH_MISSING_EPPN) % {
110 564a2292 Kostas Papadimitriou
                'domain': settings.BASEURL,
111 31bc3a62 Kostas Papadimitriou
                'contact_email': settings.CONTACT_EMAIL
112 564a2292 Kostas Papadimitriou
            })
113 564a2292 Kostas Papadimitriou
        if Tokens.SHIB_DISPLAYNAME in tokens:
114 564a2292 Kostas Papadimitriou
            realname = tokens[Tokens.SHIB_DISPLAYNAME]
115 564a2292 Kostas Papadimitriou
        elif Tokens.SHIB_CN in tokens:
116 564a2292 Kostas Papadimitriou
            realname = tokens[Tokens.SHIB_CN]
117 564a2292 Kostas Papadimitriou
        elif Tokens.SHIB_NAME in tokens and Tokens.SHIB_SURNAME in tokens:
118 564a2292 Kostas Papadimitriou
            realname = tokens[Tokens.SHIB_NAME] + ' ' + tokens[Tokens.SHIB_SURNAME]
119 564a2292 Kostas Papadimitriou
        else:
120 564a2292 Kostas Papadimitriou
            if settings.SHIBBOLETH_REQUIRE_NAME_INFO:
121 564a2292 Kostas Papadimitriou
                raise KeyError(_(astakos_messages.SHIBBOLETH_MISSING_NAME))
122 564a2292 Kostas Papadimitriou
            else:
123 564a2292 Kostas Papadimitriou
                realname = ''
124 564a2292 Kostas Papadimitriou
125 564a2292 Kostas Papadimitriou
    except KeyError, e:
126 564a2292 Kostas Papadimitriou
        # invalid shibboleth headers, redirect to login, display message
127 564a2292 Kostas Papadimitriou
        messages.error(request, e.message)
128 564a2292 Kostas Papadimitriou
        return HttpResponseRedirect(login_url(request))
129 564a2292 Kostas Papadimitriou
130 564a2292 Kostas Papadimitriou
    affiliation = tokens.get(Tokens.SHIB_EP_AFFILIATION, 'Shibboleth')
131 564a2292 Kostas Papadimitriou
    email = tokens.get(Tokens.SHIB_MAIL, '')
132 4a1e3e53 Kostas Papadimitriou
    provider_info = {'eppn': eppn, 'email': email, 'name': realname}
133 dd5f8f4d Kostas Papadimitriou
    userid = eppn
134 d2633501 Kostas Papadimitriou
135 a53ee093 Kostas Papadimitriou
136 64cd4730 Antony Chazapis
    try:
137 c8d89a3c Kostas Papadimitriou
        return handle_third_party_login(request, 'shibboleth',
138 c8d89a3c Kostas Papadimitriou
                                        eppn, provider_info,
139 c8d89a3c Kostas Papadimitriou
                                        affiliation, third_party_key)
140 8f5a3a06 Sofia Papagiannaki
    except AstakosUser.DoesNotExist, e:
141 c8d89a3c Kostas Papadimitriou
        third_party_key = get_pending_key(request)
142 dd5f8f4d Kostas Papadimitriou
        user_info = {'affiliation': affiliation, 'realname': realname}
143 dd5f8f4d Kostas Papadimitriou
        return handle_third_party_signup(request, userid, 'shibboleth',
144 dd5f8f4d Kostas Papadimitriou
                                         third_party_key,
145 dd5f8f4d Kostas Papadimitriou
                                         provider_info,
146 dd5f8f4d Kostas Papadimitriou
                                         user_info,
147 dd5f8f4d Kostas Papadimitriou
                                         template,
148 dd5f8f4d Kostas Papadimitriou
                                         extra_context)