Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / tests / auth.py @ c1f65a1e

History | View | Annotate | Download (61.2 kB)

1 a661dfb2 Kostas Papadimitriou
# -*- coding: utf-8 -*-
2 d2633501 Kostas Papadimitriou
# Copyright 2011 GRNET S.A. All rights reserved.
3 d2633501 Kostas Papadimitriou
#
4 d2633501 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
5 d2633501 Kostas Papadimitriou
# without modification, are permitted provided that the following
6 d2633501 Kostas Papadimitriou
# conditions are met:
7 d2633501 Kostas Papadimitriou
#
8 d2633501 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
9 d2633501 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
10 d2633501 Kostas Papadimitriou
#      disclaimer.
11 d2633501 Kostas Papadimitriou
#
12 d2633501 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
13 d2633501 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
14 d2633501 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
15 d2633501 Kostas Papadimitriou
#      provided with the distribution.
16 d2633501 Kostas Papadimitriou
#
17 d2633501 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 d2633501 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 d2633501 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 d2633501 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 d2633501 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 d2633501 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 d2633501 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 d2633501 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 d2633501 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 d2633501 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 d2633501 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 d2633501 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
29 d2633501 Kostas Papadimitriou
#
30 d2633501 Kostas Papadimitriou
# The views and conclusions contained in the software and
31 d2633501 Kostas Papadimitriou
# documentation are those of the authors and should not be
32 d2633501 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
33 d2633501 Kostas Papadimitriou
# or implied, of GRNET S.A.
34 d2633501 Kostas Papadimitriou
35 5b65fb47 Kostas Papadimitriou
import urlparse
36 5b65fb47 Kostas Papadimitriou
import urllib
37 5b65fb47 Kostas Papadimitriou
38 1ac3349d Kostas Papadimitriou
from astakos.im.tests.common import *
39 d2633501 Kostas Papadimitriou
40 5f28aa14 Kostas Papadimitriou
ui_url = lambda url: '/' + astakos_settings.BASE_PATH + '/ui/%s' % url
41 5f28aa14 Kostas Papadimitriou
42 d2633501 Kostas Papadimitriou
43 d2633501 Kostas Papadimitriou
class ShibbolethTests(TestCase):
44 d2633501 Kostas Papadimitriou
    """
45 d2633501 Kostas Papadimitriou
    Testing shibboleth authentication.
46 d2633501 Kostas Papadimitriou
    """
47 d2633501 Kostas Papadimitriou
48 d2633501 Kostas Papadimitriou
    def setUp(self):
49 d2633501 Kostas Papadimitriou
        self.client = ShibbolethClient()
50 9d20fe23 Kostas Papadimitriou
        astakos_settings.IM_MODULES = ['local', 'shibboleth']
51 9d20fe23 Kostas Papadimitriou
        astakos_settings.MODERATION_ENABLED = True
52 d2633501 Kostas Papadimitriou
53 baa9073a Kostas Papadimitriou
    def tearDown(self):
54 baa9073a Kostas Papadimitriou
        AstakosUser.objects.all().delete()
55 baa9073a Kostas Papadimitriou
56 0a7a4104 Kostas Papadimitriou
    @im_settings(FORCE_PROFILE_UPDATE=False)
57 d2633501 Kostas Papadimitriou
    def test_create_account(self):
58 ba50648c Kostas Papadimitriou
59 d2633501 Kostas Papadimitriou
        client = ShibbolethClient()
60 d2633501 Kostas Papadimitriou
61 d2633501 Kostas Papadimitriou
        # shibboleth views validation
62 d2633501 Kostas Papadimitriou
        # eepn required
63 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url('login/shibboleth?'), follow=True)
64 e24d0e0d Kostas Papadimitriou
        self.assertContains(r, messages.SHIBBOLETH_MISSING_EPPN % {
65 a248ebbb Kostas Papadimitriou
            'domain': astakos_settings.BASE_HOST,
66 31bc3a62 Kostas Papadimitriou
            'contact_email': settings.CONTACT_EMAIL
67 e24d0e0d Kostas Papadimitriou
        })
68 d2633501 Kostas Papadimitriou
        client.set_tokens(eppn="kpapeppn")
69 ba50648c Kostas Papadimitriou
70 31fdafa8 Kostas Papadimitriou
        astakos_settings.SHIBBOLETH_REQUIRE_NAME_INFO = True
71 d2633501 Kostas Papadimitriou
        # shibboleth user info required
72 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url('login/shibboleth?'), follow=True)
73 2e90e3ec Kostas Papadimitriou
        self.assertContains(r, messages.SHIBBOLETH_MISSING_NAME)
74 31fdafa8 Kostas Papadimitriou
        astakos_settings.SHIBBOLETH_REQUIRE_NAME_INFO = False
75 d2633501 Kostas Papadimitriou
76 d2633501 Kostas Papadimitriou
        # shibboleth logged us in
77 e7cb4085 Kostas Papadimitriou
        client.set_tokens(mail="kpap@synnefo.org", eppn="kpapeppn",
78 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou",
79 ba50648c Kostas Papadimitriou
                          ep_affiliation="Test Affiliation")
80 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url('login/shibboleth?'), follow=True)
81 9d20fe23 Kostas Papadimitriou
        token = PendingThirdPartyUser.objects.get().token
82 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('signup?third_party_token=%s' % token))
83 ba50648c Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
84 d2633501 Kostas Papadimitriou
85 d2633501 Kostas Papadimitriou
        # a new pending user created
86 d2633501 Kostas Papadimitriou
        pending_user = PendingThirdPartyUser.objects.get(
87 d2633501 Kostas Papadimitriou
            third_party_identifier="kpapeppn")
88 d2633501 Kostas Papadimitriou
        self.assertEqual(PendingThirdPartyUser.objects.count(), 1)
89 ba50648c Kostas Papadimitriou
        # keep the token for future use
90 d2633501 Kostas Papadimitriou
        token = pending_user.token
91 d2633501 Kostas Papadimitriou
        # from now on no shibboleth headers are sent to the server
92 d2633501 Kostas Papadimitriou
        client.reset_tokens()
93 d2633501 Kostas Papadimitriou
94 ba50648c Kostas Papadimitriou
        # this is the old way, it should fail, to avoid pending user take over
95 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url('shibboleth/signup/%s' % pending_user.username))
96 d2633501 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
97 d2633501 Kostas Papadimitriou
98 9d20fe23 Kostas Papadimitriou
        # this is the signup unique url associated with the pending user
99 9d20fe23 Kostas Papadimitriou
        # created
100 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url('signup/?third_party_token=%s' % token))
101 9d20fe23 Kostas Papadimitriou
        identifier = pending_user.third_party_identifier
102 9d20fe23 Kostas Papadimitriou
        post_data = {'third_party_identifier': identifier,
103 d2633501 Kostas Papadimitriou
                     'first_name': 'Kostas',
104 d2633501 Kostas Papadimitriou
                     'third_party_token': token,
105 d2633501 Kostas Papadimitriou
                     'last_name': 'Mitroglou',
106 9d20fe23 Kostas Papadimitriou
                     'provider': 'shibboleth'}
107 ba50648c Kostas Papadimitriou
108 0a7a4104 Kostas Papadimitriou
        signup_url = reverse('signup')
109 0a7a4104 Kostas Papadimitriou
110 ba50648c Kostas Papadimitriou
        # invlid email
111 ba50648c Kostas Papadimitriou
        post_data['email'] = 'kpap'
112 0a7a4104 Kostas Papadimitriou
        r = client.post(signup_url, post_data)
113 8ab484ea Kostas Papadimitriou
        self.assertContains(r, token)
114 ba50648c Kostas Papadimitriou
115 ba50648c Kostas Papadimitriou
        # existing email
116 ba50648c Kostas Papadimitriou
        existing_user = get_local_user('test@test.com')
117 ba50648c Kostas Papadimitriou
        post_data['email'] = 'test@test.com'
118 0a7a4104 Kostas Papadimitriou
        r = client.post(signup_url, post_data)
119 ba50648c Kostas Papadimitriou
        self.assertContains(r, messages.EMAIL_USED)
120 ba50648c Kostas Papadimitriou
        existing_user.delete()
121 ba50648c Kostas Papadimitriou
122 ba50648c Kostas Papadimitriou
        # and finally a valid signup
123 e7cb4085 Kostas Papadimitriou
        post_data['email'] = 'kpap@synnefo.org'
124 0a7a4104 Kostas Papadimitriou
        r = client.post(signup_url, post_data, follow=True)
125 e7cb4085 Kostas Papadimitriou
        self.assertContains(r, messages.VERIFICATION_SENT)
126 ba50648c Kostas Papadimitriou
127 e7cb4085 Kostas Papadimitriou
        # entires commited as expected
128 d2633501 Kostas Papadimitriou
        self.assertEqual(AstakosUser.objects.count(), 1)
129 d2633501 Kostas Papadimitriou
        self.assertEqual(AstakosUserAuthProvider.objects.count(), 1)
130 ba50648c Kostas Papadimitriou
        self.assertEqual(PendingThirdPartyUser.objects.count(), 0)
131 d2633501 Kostas Papadimitriou
132 ba50648c Kostas Papadimitriou
        # provider info stored
133 ba50648c Kostas Papadimitriou
        provider = AstakosUserAuthProvider.objects.get(module="shibboleth")
134 ba50648c Kostas Papadimitriou
        self.assertEqual(provider.affiliation, 'Test Affiliation')
135 830747d2 Kostas Papadimitriou
        self.assertEqual(provider.info['email'], u'kpap@synnefo.org')
136 830747d2 Kostas Papadimitriou
        self.assertEqual(provider.info['eppn'], u'kpapeppn')
137 830747d2 Kostas Papadimitriou
        self.assertEqual(provider.info['name'], u'Kostas Papadimitriou')
138 830747d2 Kostas Papadimitriou
        self.assertTrue('headers' in provider.info)
139 d2633501 Kostas Papadimitriou
140 e7cb4085 Kostas Papadimitriou
        # login (not activated yet)
141 e7cb4085 Kostas Papadimitriou
        client.set_tokens(mail="kpap@synnefo.org", eppn="kpapeppn",
142 830747d2 Kostas Papadimitriou
                          cn="Kostas Papadimitriou")
143 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
144 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, 'is pending moderation')
145 d2633501 Kostas Papadimitriou
146 e7cb4085 Kostas Papadimitriou
        # admin activates the user
147 e7cb4085 Kostas Papadimitriou
        u = AstakosUser.objects.get(username="kpap@synnefo.org")
148 e7cb4085 Kostas Papadimitriou
        backend = activation_backends.get_backend()
149 e7cb4085 Kostas Papadimitriou
        activation_result = backend.verify_user(u, u.verification_code)
150 e7cb4085 Kostas Papadimitriou
        activation_result = backend.accept_user(u)
151 e7cb4085 Kostas Papadimitriou
        self.assertFalse(activation_result.is_error())
152 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(activation_result, u)
153 d2633501 Kostas Papadimitriou
        self.assertEqual(u.is_active, True)
154 d2633501 Kostas Papadimitriou
155 ba50648c Kostas Papadimitriou
        # we see our profile
156 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
157 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('landing'))
158 ba50648c Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
159 d2633501 Kostas Papadimitriou
160 d2633501 Kostas Papadimitriou
    def test_existing(self):
161 ba50648c Kostas Papadimitriou
        """
162 ba50648c Kostas Papadimitriou
        Test adding of third party login to an existing account
163 ba50648c Kostas Papadimitriou
        """
164 ba50648c Kostas Papadimitriou
165 ba50648c Kostas Papadimitriou
        # this is our existing user
166 e7cb4085 Kostas Papadimitriou
        existing_user = get_local_user('kpap@synnefo.org')
167 e7cb4085 Kostas Papadimitriou
        existing_inactive = get_local_user('kpap-inactive@synnefo.org')
168 478ece6c Kostas Papadimitriou
        existing_inactive.is_active = False
169 478ece6c Kostas Papadimitriou
        existing_inactive.save()
170 478ece6c Kostas Papadimitriou
171 e7cb4085 Kostas Papadimitriou
        existing_unverified = get_local_user('kpap-unverified@synnefo.org')
172 478ece6c Kostas Papadimitriou
        existing_unverified.is_active = False
173 478ece6c Kostas Papadimitriou
        existing_unverified.activation_sent = None
174 478ece6c Kostas Papadimitriou
        existing_unverified.email_verified = False
175 478ece6c Kostas Papadimitriou
        existing_unverified.is_verified = False
176 478ece6c Kostas Papadimitriou
        existing_unverified.save()
177 d2633501 Kostas Papadimitriou
178 d2633501 Kostas Papadimitriou
        client = ShibbolethClient()
179 d2633501 Kostas Papadimitriou
        # shibboleth logged us in, notice that we use different email
180 e5966bd9 Kostas Papadimitriou
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
181 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou", )
182 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
183 d2633501 Kostas Papadimitriou
184 d2633501 Kostas Papadimitriou
        # a new pending user created
185 d2633501 Kostas Papadimitriou
        pending_user = PendingThirdPartyUser.objects.get()
186 9d20fe23 Kostas Papadimitriou
        token = pending_user.token
187 d2633501 Kostas Papadimitriou
        self.assertEqual(PendingThirdPartyUser.objects.count(), 1)
188 d2633501 Kostas Papadimitriou
        pending_key = pending_user.token
189 d2633501 Kostas Papadimitriou
        client.reset_tokens()
190 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url("signup?third_party_token=%s" % token))
191 d2633501 Kostas Papadimitriou
192 e585664e Christos Stavrakakis
        form = r.context['login_form']
193 9d20fe23 Kostas Papadimitriou
        signupdata = copy.copy(form.initial)
194 e7cb4085 Kostas Papadimitriou
        signupdata['email'] = 'kpap@synnefo.org'
195 9d20fe23 Kostas Papadimitriou
        signupdata['third_party_token'] = token
196 9d20fe23 Kostas Papadimitriou
        signupdata['provider'] = 'shibboleth'
197 2a88057d Christos Stavrakakis
        signupdata.pop('id', None)
198 d2633501 Kostas Papadimitriou
199 478ece6c Kostas Papadimitriou
        # the email exists to another user
200 5f28aa14 Kostas Papadimitriou
        r = client.post(ui_url("signup"), signupdata)
201 478ece6c Kostas Papadimitriou
        self.assertContains(r, "There is already an account with this email "
202 478ece6c Kostas Papadimitriou
                               "address")
203 478ece6c Kostas Papadimitriou
        # change the case, still cannot create
204 e7cb4085 Kostas Papadimitriou
        signupdata['email'] = 'KPAP@synnefo.org'
205 5f28aa14 Kostas Papadimitriou
        r = client.post(ui_url("signup"), signupdata)
206 478ece6c Kostas Papadimitriou
        self.assertContains(r, "There is already an account with this email "
207 478ece6c Kostas Papadimitriou
                               "address")
208 478ece6c Kostas Papadimitriou
        # inactive user
209 e7cb4085 Kostas Papadimitriou
        signupdata['email'] = 'KPAP-inactive@synnefo.org'
210 5f28aa14 Kostas Papadimitriou
        r = client.post(ui_url("signup"), signupdata)
211 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, "There is already an account with this email "
212 9d20fe23 Kostas Papadimitriou
                               "address")
213 d2633501 Kostas Papadimitriou
214 478ece6c Kostas Papadimitriou
        # unverified user, this should pass, old entry will be deleted
215 e7cb4085 Kostas Papadimitriou
        signupdata['email'] = 'KAPAP-unverified@synnefo.org'
216 5f28aa14 Kostas Papadimitriou
        r = client.post(ui_url("signup"), signupdata)
217 478ece6c Kostas Papadimitriou
218 d2633501 Kostas Papadimitriou
        post_data = {'password': 'password',
219 e7cb4085 Kostas Papadimitriou
                     'username': 'kpap@synnefo.org'}
220 5f28aa14 Kostas Papadimitriou
        r = client.post(ui_url('local'), post_data, follow=True)
221 9d20fe23 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
222 9d20fe23 Kostas Papadimitriou
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
223 9d20fe23 Kostas Papadimitriou
                          cn="Kostas Papadimitriou", )
224 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
225 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, "enabled for this account")
226 9d20fe23 Kostas Papadimitriou
        client.reset_tokens()
227 9d20fe23 Kostas Papadimitriou
228 9d20fe23 Kostas Papadimitriou
        user = existing_user
229 9d20fe23 Kostas Papadimitriou
        self.assertTrue(user.has_auth_provider('shibboleth'))
230 9d20fe23 Kostas Papadimitriou
        self.assertTrue(user.has_auth_provider('local',
231 9d20fe23 Kostas Papadimitriou
                                               auth_backend='astakos'))
232 d2633501 Kostas Papadimitriou
        client.logout()
233 d2633501 Kostas Papadimitriou
234 d2633501 Kostas Papadimitriou
        # look Ma, i can login with both my shibboleth and local account
235 e5966bd9 Kostas Papadimitriou
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
236 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou")
237 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
238 d2633501 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
239 e7cb4085 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.email == "kpap@synnefo.org")
240 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('landing'))
241 ba50648c Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
242 d2633501 Kostas Papadimitriou
        client.logout()
243 d2633501 Kostas Papadimitriou
        client.reset_tokens()
244 ba50648c Kostas Papadimitriou
245 ba50648c Kostas Papadimitriou
        # logged out
246 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("profile"), follow=True)
247 d2633501 Kostas Papadimitriou
        self.assertFalse(r.context['request'].user.is_authenticated())
248 d2633501 Kostas Papadimitriou
249 ba50648c Kostas Papadimitriou
        # login with local account also works
250 d2633501 Kostas Papadimitriou
        post_data = {'password': 'password',
251 e7cb4085 Kostas Papadimitriou
                     'username': 'kpap@synnefo.org'}
252 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), post_data, follow=True)
253 d2633501 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
254 e7cb4085 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.email == "kpap@synnefo.org")
255 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('landing'))
256 ba50648c Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
257 d2633501 Kostas Papadimitriou
258 ba50648c Kostas Papadimitriou
        # cannot add the same eppn
259 e5966bd9 Kostas Papadimitriou
        client.set_tokens(mail="secondary@shibboleth.gr", eppn="kpapeppn",
260 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou", )
261 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
262 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('landing'))
263 ba50648c Kostas Papadimitriou
        self.assertTrue(r.status_code, 200)
264 ba50648c Kostas Papadimitriou
        self.assertEquals(existing_user.auth_providers.count(), 2)
265 d2633501 Kostas Papadimitriou
266 9d20fe23 Kostas Papadimitriou
        # only one allowed by default
267 ba50648c Kostas Papadimitriou
        client.set_tokens(mail="secondary@shibboleth.gr", eppn="kpapeppn2",
268 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou", ep_affiliation="affil2")
269 9d20fe23 Kostas Papadimitriou
        prov = auth_providers.get_provider('shibboleth')
270 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
271 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, "Failed to add")
272 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('profile'))
273 ba50648c Kostas Papadimitriou
        self.assertTrue(r.status_code, 200)
274 9d20fe23 Kostas Papadimitriou
        self.assertEquals(existing_user.auth_providers.count(), 2)
275 d2633501 Kostas Papadimitriou
        client.logout()
276 ba50648c Kostas Papadimitriou
        client.reset_tokens()
277 ba50648c Kostas Papadimitriou
278 ba50648c Kostas Papadimitriou
        # cannot login with another eppn
279 e7cb4085 Kostas Papadimitriou
        client.set_tokens(mail="kpap@synnefo.org", eppn="kpapeppninvalid",
280 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou")
281 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
282 d2633501 Kostas Papadimitriou
        self.assertFalse(r.context['request'].user.is_authenticated())
283 d2633501 Kostas Papadimitriou
284 478ece6c Kostas Papadimitriou
        # cannot
285 478ece6c Kostas Papadimitriou
286 f432088a Kostas Papadimitriou
        # lets remove local password
287 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(username="kpap@synnefo.org",
288 e7cb4085 Kostas Papadimitriou
                                       email="kpap@synnefo.org")
289 9d20fe23 Kostas Papadimitriou
        remove_local_url = user.get_auth_provider('local').get_remove_url
290 9d20fe23 Kostas Papadimitriou
        remove_shibbo_url = user.get_auth_provider('shibboleth',
291 9d20fe23 Kostas Papadimitriou
                                                   'kpapeppn').get_remove_url
292 e5966bd9 Kostas Papadimitriou
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
293 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimtriou")
294 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
295 f432088a Kostas Papadimitriou
        client.reset_tokens()
296 ba50648c Kostas Papadimitriou
297 17138f12 Kostas Papadimitriou
        # only POST is allowed (for CSRF protection)
298 17138f12 Kostas Papadimitriou
        r = client.get(remove_local_url, follow=True)
299 17138f12 Kostas Papadimitriou
        self.assertEqual(r.status_code, 405)
300 17138f12 Kostas Papadimitriou
301 17138f12 Kostas Papadimitriou
        r = client.post(remove_local_url, follow=True)
302 ba50648c Kostas Papadimitriou
        # 2 providers left
303 f432088a Kostas Papadimitriou
        self.assertEqual(user.auth_providers.count(), 1)
304 ba50648c Kostas Papadimitriou
        # cannot remove last provider
305 17138f12 Kostas Papadimitriou
        r = client.post(remove_shibbo_url)
306 f432088a Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
307 f432088a Kostas Papadimitriou
        self.client.logout()
308 ba50648c Kostas Papadimitriou
309 ba50648c Kostas Papadimitriou
        # cannot login using local credentials (notice we use another client)
310 f432088a Kostas Papadimitriou
        post_data = {'password': 'password',
311 e7cb4085 Kostas Papadimitriou
                     'username': 'kpap@synnefo.org'}
312 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), post_data, follow=True)
313 f432088a Kostas Papadimitriou
        self.assertFalse(r.context['request'].user.is_authenticated())
314 f432088a Kostas Papadimitriou
315 ba50648c Kostas Papadimitriou
        # we can reenable the local provider by setting a password
316 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("password_change"), follow=True)
317 5f28aa14 Kostas Papadimitriou
        r = client.post(ui_url("password_change"), {'new_password1': '111',
318 8fb8d0cf Giorgos Korfiatis
                                                    'new_password2': '111'},
319 f432088a Kostas Papadimitriou
                        follow=True)
320 f432088a Kostas Papadimitriou
        user = r.context['request'].user
321 f432088a Kostas Papadimitriou
        self.assertTrue(user.has_auth_provider('local'))
322 f432088a Kostas Papadimitriou
        self.assertTrue(user.has_auth_provider('shibboleth'))
323 f432088a Kostas Papadimitriou
        self.assertTrue(user.check_password('111'))
324 f432088a Kostas Papadimitriou
        self.assertTrue(user.has_usable_password())
325 36f1eabb Kostas Papadimitriou
326 36f1eabb Kostas Papadimitriou
        # change password via profile form
327 36f1eabb Kostas Papadimitriou
        r = client.post(ui_url("profile"), {
328 36f1eabb Kostas Papadimitriou
            'old_password': '111',
329 36f1eabb Kostas Papadimitriou
            'new_password': '',
330 36f1eabb Kostas Papadimitriou
            'new_password2': '',
331 36f1eabb Kostas Papadimitriou
            'change_password': 'on',
332 36f1eabb Kostas Papadimitriou
        }, follow=False)
333 36f1eabb Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
334 36f1eabb Kostas Papadimitriou
        self.assertFalse(r.context['profile_form'].is_valid())
335 36f1eabb Kostas Papadimitriou
336 f432088a Kostas Papadimitriou
        self.client.logout()
337 ba50648c Kostas Papadimitriou
338 ba50648c Kostas Papadimitriou
        # now we can login
339 f432088a Kostas Papadimitriou
        post_data = {'password': '111',
340 e7cb4085 Kostas Papadimitriou
                     'username': 'kpap@synnefo.org'}
341 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), post_data, follow=True)
342 f432088a Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
343 f432088a Kostas Papadimitriou
344 ba50648c Kostas Papadimitriou
        client.reset_tokens()
345 f432088a Kostas Papadimitriou
346 ba50648c Kostas Papadimitriou
        # we cannot take over another shibboleth identifier
347 e7cb4085 Kostas Papadimitriou
        user2 = get_local_user('another@synnefo.org')
348 f432088a Kostas Papadimitriou
        user2.add_auth_provider('shibboleth', identifier='existingeppn')
349 ba50648c Kostas Papadimitriou
        # login
350 e5966bd9 Kostas Papadimitriou
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
351 e5966bd9 Kostas Papadimitriou
                          cn="Kostas Papadimitriou")
352 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
353 ba50648c Kostas Papadimitriou
        # try to assign existing shibboleth identifier of another user
354 9d20fe23 Kostas Papadimitriou
        client.set_tokens(mail="kpap_second@shibboleth.gr",
355 9d20fe23 Kostas Papadimitriou
                          eppn="existingeppn", cn="Kostas Papadimitriou")
356 5f28aa14 Kostas Papadimitriou
        r = client.get(ui_url("login/shibboleth?"), follow=True)
357 c34abd9c Kostas Papadimitriou
        self.assertContains(r, "is already in use")
358 2e90e3ec Kostas Papadimitriou
359 d2633501 Kostas Papadimitriou
360 478ece6c Kostas Papadimitriou
class TestLocal(TestCase):
361 d2633501 Kostas Papadimitriou
362 2e90e3ec Kostas Papadimitriou
    def setUp(self):
363 e7cb4085 Kostas Papadimitriou
        settings.ADMINS = (('admin', 'support@cloud.synnefo.org'),)
364 e7cb4085 Kostas Papadimitriou
        settings.SERVER_EMAIL = 'no-reply@synnefo.org'
365 9d20fe23 Kostas Papadimitriou
        self._orig_moderation = astakos_settings.MODERATION_ENABLED
366 9d20fe23 Kostas Papadimitriou
        settings.ASTAKOS_MODERATION_ENABLED = True
367 9d20fe23 Kostas Papadimitriou
368 9d20fe23 Kostas Papadimitriou
    def tearDown(self):
369 9d20fe23 Kostas Papadimitriou
        settings.ASTAKOS_MODERATION_ENABLED = self._orig_moderation
370 baa9073a Kostas Papadimitriou
        AstakosUser.objects.all().delete()
371 2e90e3ec Kostas Papadimitriou
372 a661dfb2 Kostas Papadimitriou
    @im_settings(RECAPTCHA_ENABLED=True, RATELIMIT_RETRIES_ALLOWED=3)
373 a661dfb2 Kostas Papadimitriou
    def test_login_ratelimit(self):
374 a661dfb2 Kostas Papadimitriou
        credentials = {'username': 'γιού τι έφ', 'password': 'password'}
375 a661dfb2 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), credentials, follow=True)
376 a661dfb2 Kostas Papadimitriou
        fields = r.context['login_form'].fields.keyOrder
377 a661dfb2 Kostas Papadimitriou
        self.assertFalse('recaptcha_challenge_field' in fields)
378 a661dfb2 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), credentials, follow=True)
379 a661dfb2 Kostas Papadimitriou
        fields = r.context['login_form'].fields.keyOrder
380 a661dfb2 Kostas Papadimitriou
        self.assertFalse('recaptcha_challenge_field' in fields)
381 a661dfb2 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), credentials, follow=True)
382 a661dfb2 Kostas Papadimitriou
        fields = r.context['login_form'].fields.keyOrder
383 a661dfb2 Kostas Papadimitriou
        self.assertTrue('recaptcha_challenge_field' in fields)
384 a661dfb2 Kostas Papadimitriou
385 7233d542 Kostas Papadimitriou
    def test_no_moderation(self):
386 ba50648c Kostas Papadimitriou
        # disable moderation
387 7233d542 Kostas Papadimitriou
        astakos_settings.MODERATION_ENABLED = False
388 ba50648c Kostas Papadimitriou
389 ba50648c Kostas Papadimitriou
        # create a new user
390 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url("signup"))
391 7233d542 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
392 e7cb4085 Kostas Papadimitriou
        data = {'email': 'kpap@synnefo.org', 'password1': 'password',
393 9d20fe23 Kostas Papadimitriou
                'password2': 'password', 'first_name': 'Kostas',
394 7233d542 Kostas Papadimitriou
                'last_name': 'Mitroglou', 'provider': 'local'}
395 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url("signup"), data)
396 ba50648c Kostas Papadimitriou
397 ba50648c Kostas Papadimitriou
        # user created
398 7233d542 Kostas Papadimitriou
        self.assertEqual(AstakosUser.objects.count(), 1)
399 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(username="kpap@synnefo.org",
400 e7cb4085 Kostas Papadimitriou
                                       email="kpap@synnefo.org")
401 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.username, 'kpap@synnefo.org')
402 7233d542 Kostas Papadimitriou
        self.assertEqual(user.has_auth_provider('local'), True)
403 7233d542 Kostas Papadimitriou
        self.assertFalse(user.is_active)
404 7233d542 Kostas Papadimitriou
405 ba50648c Kostas Papadimitriou
        # user (but not admin) gets notified
406 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('support@cloud.synnefo.org')), 0)
407 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
408 7233d542 Kostas Papadimitriou
        astakos_settings.MODERATION_ENABLED = True
409 d2633501 Kostas Papadimitriou
410 e5966bd9 Kostas Papadimitriou
    def test_email_case(self):
411 e5966bd9 Kostas Papadimitriou
        data = {
412 e7cb4085 Kostas Papadimitriou
            'email': 'kPap@synnefo.org',
413 9d20fe23 Kostas Papadimitriou
            'password1': '1234',
414 9d20fe23 Kostas Papadimitriou
            'password2': '1234'
415 e5966bd9 Kostas Papadimitriou
        }
416 e5966bd9 Kostas Papadimitriou
417 e5966bd9 Kostas Papadimitriou
        form = forms.LocalUserCreationForm(data)
418 e5966bd9 Kostas Papadimitriou
        self.assertTrue(form.is_valid())
419 e5966bd9 Kostas Papadimitriou
        user = form.save()
420 e5966bd9 Kostas Papadimitriou
        form.store_user(user, {})
421 e5966bd9 Kostas Papadimitriou
422 9d20fe23 Kostas Papadimitriou
        u = AstakosUser.objects.get()
423 e7cb4085 Kostas Papadimitriou
        self.assertEqual(u.email, 'kPap@synnefo.org')
424 e7cb4085 Kostas Papadimitriou
        self.assertEqual(u.username, 'kpap@synnefo.org')
425 e5966bd9 Kostas Papadimitriou
        u.is_active = True
426 e5966bd9 Kostas Papadimitriou
        u.email_verified = True
427 e5966bd9 Kostas Papadimitriou
        u.save()
428 e5966bd9 Kostas Papadimitriou
429 e7cb4085 Kostas Papadimitriou
        data = {'username': 'kpap@synnefo.org', 'password': '1234'}
430 e5966bd9 Kostas Papadimitriou
        login = forms.LoginForm(data=data)
431 e5966bd9 Kostas Papadimitriou
        self.assertTrue(login.is_valid())
432 e5966bd9 Kostas Papadimitriou
433 e7cb4085 Kostas Papadimitriou
        data = {'username': 'KpaP@synnefo.org', 'password': '1234'}
434 e5966bd9 Kostas Papadimitriou
        login = forms.LoginForm(data=data)
435 e5966bd9 Kostas Papadimitriou
        self.assertTrue(login.is_valid())
436 e5966bd9 Kostas Papadimitriou
437 e5966bd9 Kostas Papadimitriou
        data = {
438 e7cb4085 Kostas Papadimitriou
            'email': 'kpap@synnefo.org',
439 9d20fe23 Kostas Papadimitriou
            'password1': '1234',
440 9d20fe23 Kostas Papadimitriou
            'password2': '1234'
441 e5966bd9 Kostas Papadimitriou
        }
442 e5966bd9 Kostas Papadimitriou
        form = forms.LocalUserCreationForm(data)
443 e5966bd9 Kostas Papadimitriou
        self.assertFalse(form.is_valid())
444 e5966bd9 Kostas Papadimitriou
445 ba27316a Kostas Papadimitriou
    @im_settings(HELPDESK=(('support', 'support@synnefo.org'),),
446 e7cb4085 Kostas Papadimitriou
                 FORCE_PROFILE_UPDATE=False, MODERATION_ENABLED=True)
447 d2633501 Kostas Papadimitriou
    def test_local_provider(self):
448 19a992e3 Kostas Papadimitriou
        self.helpdesk_email = astakos_settings.HELPDESK[0][1]
449 ba50648c Kostas Papadimitriou
450 ba50648c Kostas Papadimitriou
        # create a user
451 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url("signup"))
452 d2633501 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
453 e7cb4085 Kostas Papadimitriou
        data = {'email': 'kpap@synnefo.org', 'password1': 'password',
454 9d20fe23 Kostas Papadimitriou
                'password2': 'password', 'first_name': 'Kostas',
455 d2633501 Kostas Papadimitriou
                'last_name': 'Mitroglou', 'provider': 'local'}
456 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url("signup"), data)
457 ba50648c Kostas Papadimitriou
458 ba50648c Kostas Papadimitriou
        # user created
459 d2633501 Kostas Papadimitriou
        self.assertEqual(AstakosUser.objects.count(), 1)
460 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(username="kpap@synnefo.org",
461 e7cb4085 Kostas Papadimitriou
                                       email="kpap@synnefo.org")
462 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.username, 'kpap@synnefo.org')
463 d2633501 Kostas Papadimitriou
        self.assertEqual(user.has_auth_provider('local'), True)
464 9d20fe23 Kostas Papadimitriou
        self.assertFalse(user.is_active)  # not activated
465 9d20fe23 Kostas Papadimitriou
        self.assertFalse(user.email_verified)  # not verified
466 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)  # activation automatically sent
467 e7cb4085 Kostas Papadimitriou
        self.assertFalse(user.moderated)
468 e7cb4085 Kostas Papadimitriou
        self.assertFalse(user.email_verified)
469 d2633501 Kostas Papadimitriou
470 ba50648c Kostas Papadimitriou
        # admin gets notified and activates the user from the command line
471 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
472 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), {'username': 'kpap@synnefo.org',
473 8fb8d0cf Giorgos Korfiatis
                                               'password': 'password'},
474 e7cb4085 Kostas Papadimitriou
                             follow=True)
475 e7cb4085 Kostas Papadimitriou
        self.assertContains(r, messages.VERIFICATION_SENT)
476 e7cb4085 Kostas Papadimitriou
        backend = activation_backends.get_backend()
477 e7cb4085 Kostas Papadimitriou
478 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(username="kpap@synnefo.org")
479 e7cb4085 Kostas Papadimitriou
        backend.send_user_verification_email(user)
480 d2633501 Kostas Papadimitriou
481 ba50648c Kostas Papadimitriou
        # user activation fields updated and user gets notified via email
482 d2633501 Kostas Papadimitriou
        user = AstakosUser.objects.get(pk=user.pk)
483 d2633501 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
484 d2633501 Kostas Papadimitriou
        self.assertFalse(user.email_verified)
485 f47ecf6b Kostas Papadimitriou
        self.assertFalse(user.is_active)
486 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 2)
487 d2633501 Kostas Papadimitriou
488 d2633501 Kostas Papadimitriou
        # user forgot she got registered and tries to submit registration
489 d2633501 Kostas Papadimitriou
        # form. Notice the upper case in email
490 e7cb4085 Kostas Papadimitriou
        data = {'email': 'KPAP@synnefo.org', 'password1': 'password',
491 9d20fe23 Kostas Papadimitriou
                'password2': 'password', 'first_name': 'Kostas',
492 d2633501 Kostas Papadimitriou
                'last_name': 'Mitroglou', 'provider': 'local'}
493 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url("signup"), data, follow=True)
494 1ecda536 Kostas Papadimitriou
        self.assertRedirects(r, reverse('login'))
495 e7cb4085 Kostas Papadimitriou
        self.assertContains(r, messages.VERIFICATION_SENT)
496 564a2292 Kostas Papadimitriou
497 9d20fe23 Kostas Papadimitriou
        user = AstakosUser.objects.get()
498 564a2292 Kostas Papadimitriou
        # previous user replaced
499 564a2292 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
500 564a2292 Kostas Papadimitriou
        self.assertFalse(user.email_verified)
501 564a2292 Kostas Papadimitriou
        self.assertFalse(user.is_active)
502 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 1)
503 d2633501 Kostas Papadimitriou
504 f47ecf6b Kostas Papadimitriou
        # hmmm, email exists; lets request a password change
505 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('local/password_reset'))
506 d2633501 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
507 e7cb4085 Kostas Papadimitriou
        data = {'email': 'kpap@synnefo.org'}
508 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local/password_reset'), data, follow=True)
509 d2633501 Kostas Papadimitriou
        # she can't because account is not active yet
510 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, 'pending activation')
511 d2633501 Kostas Papadimitriou
512 9d20fe23 Kostas Papadimitriou
        # moderation is enabled and an activation email has already been sent
513 9d20fe23 Kostas Papadimitriou
        # so user can trigger resend of the activation email
514 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('send/activation/%d' % user.pk),
515 5f28aa14 Kostas Papadimitriou
                            follow=True)
516 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, 'has been sent to your email address.')
517 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 2)
518 ba50648c Kostas Papadimitriou
519 d2633501 Kostas Papadimitriou
        # also she cannot login
520 e7cb4085 Kostas Papadimitriou
        data = {'username': 'kpap@synnefo.org', 'password': 'password'}
521 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), data, follow=True)
522 d2633501 Kostas Papadimitriou
        self.assertContains(r, 'Resend activation')
523 d2633501 Kostas Papadimitriou
        self.assertFalse(r.context['request'].user.is_authenticated())
524 d2633501 Kostas Papadimitriou
        self.assertFalse('_pithos2_a' in self.client.cookies)
525 ba50648c Kostas Papadimitriou
526 d2633501 Kostas Papadimitriou
        # user sees the message and resends activation
527 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('send/activation/%d' % user.pk),
528 5f28aa14 Kostas Papadimitriou
                            follow=True)
529 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 3)
530 d2633501 Kostas Papadimitriou
531 e7cb4085 Kostas Papadimitriou
        # logged in user cannot activate another account
532 e7cb4085 Kostas Papadimitriou
        tmp_user = get_local_user("test_existing_user@synnefo.org")
533 e7cb4085 Kostas Papadimitriou
        tmp_client = Client()
534 e7cb4085 Kostas Papadimitriou
        tmp_client.login(username="test_existing_user@synnefo.org",
535 e7cb4085 Kostas Papadimitriou
                         password="password")
536 e7cb4085 Kostas Papadimitriou
        r = tmp_client.get(user.get_activation_url(), follow=True)
537 e7cb4085 Kostas Papadimitriou
        self.assertContains(r, messages.LOGGED_IN_WARNING)
538 e7cb4085 Kostas Papadimitriou
539 e7cb4085 Kostas Papadimitriou
        r = self.client.get(user.get_activation_url(), follow=True)
540 e7cb4085 Kostas Papadimitriou
        # previous code got invalidated
541 e7cb4085 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
542 e7cb4085 Kostas Papadimitriou
543 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(pk=user.pk)
544 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 0)
545 d2633501 Kostas Papadimitriou
        r = self.client.get(user.get_activation_url(), follow=True)
546 1ecda536 Kostas Papadimitriou
        self.assertRedirects(r, reverse('login'))
547 e7cb4085 Kostas Papadimitriou
        # user sees that account is pending approval from admins
548 e7cb4085 Kostas Papadimitriou
        self.assertContains(r, messages.NOTIFICATION_SENT)
549 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 1)
550 e7cb4085 Kostas Papadimitriou
551 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(email="KPAP@synnefo.org")
552 e7cb4085 Kostas Papadimitriou
        result = backend.handle_moderation(user)
553 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
554 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 4)
555 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 2)
556 e7cb4085 Kostas Papadimitriou
557 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(email="KPAP@synnefo.org")
558 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('profile'), follow=True)
559 e7cb4085 Kostas Papadimitriou
        self.assertFalse(r.context['request'].user.is_authenticated())
560 e7cb4085 Kostas Papadimitriou
        self.assertFalse('_pithos2_a' in self.client.cookies)
561 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 4)
562 d2633501 Kostas Papadimitriou
563 d2633501 Kostas Papadimitriou
        user = AstakosUser.objects.get(pk=user.pk)
564 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), {'username': 'kpap@synnefo.org',
565 5f28aa14 Kostas Papadimitriou
                                               'password': 'password'},
566 e7cb4085 Kostas Papadimitriou
                             follow=True)
567 d2633501 Kostas Papadimitriou
        # user activated and logged in, token cookie set
568 d2633501 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
569 d2633501 Kostas Papadimitriou
        self.assertTrue('_pithos2_a' in self.client.cookies)
570 d2633501 Kostas Papadimitriou
        cookies = self.client.cookies
571 9d20fe23 Kostas Papadimitriou
        self.assertTrue(quote(user.auth_token) in
572 9d20fe23 Kostas Papadimitriou
                        cookies.get('_pithos2_a').value)
573 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('logout'), follow=True)
574 1ecda536 Kostas Papadimitriou
        r = self.client.get(ui_url(''), follow=True)
575 1ecda536 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('login'))
576 d2633501 Kostas Papadimitriou
        # user logged out, token cookie removed
577 d2633501 Kostas Papadimitriou
        self.assertFalse(r.context['request'].user.is_authenticated())
578 d2633501 Kostas Papadimitriou
        self.assertFalse(self.client.cookies.get('_pithos2_a').value)
579 9d20fe23 Kostas Papadimitriou
580 9d20fe23 Kostas Papadimitriou
        #https://docs.djangoproject.com/en/dev/topics/testing/#persistent-state
581 d2633501 Kostas Papadimitriou
        del self.client.cookies['_pithos2_a']
582 d2633501 Kostas Papadimitriou
583 d2633501 Kostas Papadimitriou
        # user can login
584 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), {'username': 'kpap@synnefo.org',
585 5f28aa14 Kostas Papadimitriou
                                               'password': 'password'},
586 9d20fe23 Kostas Papadimitriou
                             follow=True)
587 d2633501 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
588 d2633501 Kostas Papadimitriou
        self.assertTrue('_pithos2_a' in self.client.cookies)
589 d2633501 Kostas Papadimitriou
        cookies = self.client.cookies
590 9d20fe23 Kostas Papadimitriou
        self.assertTrue(quote(user.auth_token) in
591 9d20fe23 Kostas Papadimitriou
                        cookies.get('_pithos2_a').value)
592 5f28aa14 Kostas Papadimitriou
        self.client.get(ui_url('logout'), follow=True)
593 d2633501 Kostas Papadimitriou
594 d2633501 Kostas Papadimitriou
        # user forgot password
595 d2633501 Kostas Papadimitriou
        old_pass = user.password
596 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('local/password_reset'))
597 d2633501 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
598 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local/password_reset'),
599 5f28aa14 Kostas Papadimitriou
                             {'email': 'kpap@synnefo.org'})
600 d2633501 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
601 d2633501 Kostas Papadimitriou
        # email sent
602 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 5)
603 d2633501 Kostas Papadimitriou
604 d2633501 Kostas Papadimitriou
        # user visits change password link
605 126f6a55 Christos Stavrakakis
        user = AstakosUser.objects.get(pk=user.pk)
606 d2633501 Kostas Papadimitriou
        r = self.client.get(user.get_password_reset_url())
607 d2633501 Kostas Papadimitriou
        r = self.client.post(user.get_password_reset_url(),
608 9d20fe23 Kostas Papadimitriou
                             {'new_password1': 'newpass',
609 9d20fe23 Kostas Papadimitriou
                              'new_password2': 'newpass'})
610 d2633501 Kostas Papadimitriou
611 d2633501 Kostas Papadimitriou
        user = AstakosUser.objects.get(pk=user.pk)
612 d2633501 Kostas Papadimitriou
        self.assertNotEqual(old_pass, user.password)
613 d2633501 Kostas Papadimitriou
614 d2633501 Kostas Papadimitriou
        # old pass is not usable
615 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), {'username': 'kpap@synnefo.org',
616 5f28aa14 Kostas Papadimitriou
                                               'password': 'password'})
617 31fdafa8 Kostas Papadimitriou
        self.assertContains(r, 'Please enter a correct username and password')
618 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local'), {'username': 'kpap@synnefo.org',
619 5f28aa14 Kostas Papadimitriou
                                               'password': 'newpass'},
620 478ece6c Kostas Papadimitriou
                             follow=True)
621 d2633501 Kostas Papadimitriou
        self.assertTrue(r.context['request'].user.is_authenticated())
622 d2633501 Kostas Papadimitriou
        self.client.logout()
623 d2633501 Kostas Papadimitriou
624 d2633501 Kostas Papadimitriou
        # tests of special local backends
625 d2633501 Kostas Papadimitriou
        user = AstakosUser.objects.get(pk=user.pk)
626 d2633501 Kostas Papadimitriou
        user.auth_providers.filter(module='local').update(auth_backend='ldap')
627 d2633501 Kostas Papadimitriou
        user.save()
628 d2633501 Kostas Papadimitriou
629 d2633501 Kostas Papadimitriou
        # non astakos local backends do not support password reset
630 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('local/password_reset'))
631 d2633501 Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
632 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local/password_reset'),
633 5f28aa14 Kostas Papadimitriou
                             {'email': 'kpap@synnefo.org'})
634 d2633501 Kostas Papadimitriou
        # she can't because account is not active yet
635 9d20fe23 Kostas Papadimitriou
        self.assertContains(r, "Changing password is not")
636 9d20fe23 Kostas Papadimitriou
637 9d20fe23 Kostas Papadimitriou
638 34a76cdb Kostas Papadimitriou
class UserActionsTests(TestCase):
639 34a76cdb Kostas Papadimitriou
640 34a76cdb Kostas Papadimitriou
    def test_email_change(self):
641 34a76cdb Kostas Papadimitriou
        # to test existing email validation
642 e7cb4085 Kostas Papadimitriou
        get_local_user('existing@synnefo.org')
643 34a76cdb Kostas Papadimitriou
644 34a76cdb Kostas Papadimitriou
        # local user
645 e7cb4085 Kostas Papadimitriou
        user = get_local_user('kpap@synnefo.org')
646 34a76cdb Kostas Papadimitriou
647 34a76cdb Kostas Papadimitriou
        # login as kpap
648 e7cb4085 Kostas Papadimitriou
        self.client.login(username='kpap@synnefo.org', password='password')
649 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('profile'), follow=True)
650 34a76cdb Kostas Papadimitriou
        user = r.context['request'].user
651 34a76cdb Kostas Papadimitriou
        self.assertTrue(user.is_authenticated())
652 34a76cdb Kostas Papadimitriou
653 34a76cdb Kostas Papadimitriou
        # change email is enabled
654 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('email_change'))
655 34a76cdb Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
656 34a76cdb Kostas Papadimitriou
        self.assertFalse(user.email_change_is_pending())
657 34a76cdb Kostas Papadimitriou
658 34a76cdb Kostas Papadimitriou
        # request email change to an existing email fails
659 e7cb4085 Kostas Papadimitriou
        data = {'new_email_address': 'existing@synnefo.org'}
660 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('email_change'), data)
661 34a76cdb Kostas Papadimitriou
        self.assertContains(r, messages.EMAIL_USED)
662 34a76cdb Kostas Papadimitriou
663 34a76cdb Kostas Papadimitriou
        # proper email change
664 34a76cdb Kostas Papadimitriou
        data = {'new_email_address': 'kpap@gmail.com'}
665 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('email_change'), data, follow=True)
666 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('profile'))
667 34a76cdb Kostas Papadimitriou
        self.assertContains(r, messages.EMAIL_CHANGE_REGISTERED)
668 34a76cdb Kostas Papadimitriou
        change1 = EmailChange.objects.get()
669 34a76cdb Kostas Papadimitriou
670 34a76cdb Kostas Papadimitriou
        # user sees a warning
671 5f28aa14 Kostas Papadimitriou
        r = self.client.get(ui_url('email_change'))
672 34a76cdb Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
673 34a76cdb Kostas Papadimitriou
        self.assertContains(r, messages.PENDING_EMAIL_CHANGE_REQUEST)
674 34a76cdb Kostas Papadimitriou
        self.assertTrue(user.email_change_is_pending())
675 34a76cdb Kostas Papadimitriou
676 34a76cdb Kostas Papadimitriou
        # link was sent
677 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 0)
678 34a76cdb Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@gmail.com')), 1)
679 34a76cdb Kostas Papadimitriou
680 34a76cdb Kostas Papadimitriou
        # proper email change
681 34a76cdb Kostas Papadimitriou
        data = {'new_email_address': 'kpap@yahoo.com'}
682 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('email_change'), data, follow=True)
683 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('profile'))
684 34a76cdb Kostas Papadimitriou
        self.assertContains(r, messages.EMAIL_CHANGE_REGISTERED)
685 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 0)
686 34a76cdb Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@yahoo.com')), 1)
687 34a76cdb Kostas Papadimitriou
        change2 = EmailChange.objects.get()
688 34a76cdb Kostas Papadimitriou
689 34a76cdb Kostas Papadimitriou
        r = self.client.get(change1.get_url())
690 0b817216 Kostas Papadimitriou
        self.assertEquals(r.status_code, 404)
691 34a76cdb Kostas Papadimitriou
        self.client.logout()
692 34a76cdb Kostas Papadimitriou
693 0b817216 Kostas Papadimitriou
        invalid_client = Client()
694 5f28aa14 Kostas Papadimitriou
        r = invalid_client.post(ui_url('local?'),
695 0b817216 Kostas Papadimitriou
                                {'username': 'existing@synnefo.org',
696 0b817216 Kostas Papadimitriou
                                 'password': 'password'})
697 0b817216 Kostas Papadimitriou
        r = invalid_client.get(change2.get_url(), follow=True)
698 0b817216 Kostas Papadimitriou
        self.assertEquals(r.status_code, 403)
699 0b817216 Kostas Papadimitriou
700 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local?next=' + change2.get_url()),
701 e7cb4085 Kostas Papadimitriou
                             {'username': 'kpap@synnefo.org',
702 34a76cdb Kostas Papadimitriou
                              'password': 'password',
703 34a76cdb Kostas Papadimitriou
                              'next': change2.get_url()},
704 34a76cdb Kostas Papadimitriou
                             follow=True)
705 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('profile'))
706 34a76cdb Kostas Papadimitriou
        user = r.context['request'].user
707 34a76cdb Kostas Papadimitriou
        self.assertEquals(user.email, 'kpap@yahoo.com')
708 34a76cdb Kostas Papadimitriou
        self.assertEquals(user.username, 'kpap@yahoo.com')
709 34a76cdb Kostas Papadimitriou
710 34a76cdb Kostas Papadimitriou
        self.client.logout()
711 5f28aa14 Kostas Papadimitriou
        r = self.client.post(ui_url('local?next=' + change2.get_url()),
712 e7cb4085 Kostas Papadimitriou
                             {'username': 'kpap@synnefo.org',
713 34a76cdb Kostas Papadimitriou
                              'password': 'password',
714 34a76cdb Kostas Papadimitriou
                              'next': change2.get_url()},
715 34a76cdb Kostas Papadimitriou
                             follow=True)
716 34a76cdb Kostas Papadimitriou
        self.assertContains(r, "Please enter a correct username and password")
717 34a76cdb Kostas Papadimitriou
        self.assertEqual(user.emailchanges.count(), 0)
718 34a76cdb Kostas Papadimitriou
719 5f28aa14 Kostas Papadimitriou
        AstakosUser.objects.all().delete()
720 5f28aa14 Kostas Papadimitriou
        Group.objects.all().delete()
721 5f28aa14 Kostas Papadimitriou
722 9d20fe23 Kostas Papadimitriou
723 478ece6c Kostas Papadimitriou
class TestAuthProviderViews(TestCase):
724 478ece6c Kostas Papadimitriou
725 baa9073a Kostas Papadimitriou
    def tearDown(self):
726 baa9073a Kostas Papadimitriou
        AstakosUser.objects.all().delete()
727 baa9073a Kostas Papadimitriou
728 ba27316a Kostas Papadimitriou
    @shibboleth_settings(CREATION_GROUPS_POLICY=['academic-login'],
729 ba27316a Kostas Papadimitriou
                         AUTOMODERATE_POLICY=True)
730 ba27316a Kostas Papadimitriou
    @im_settings(IM_MODULES=['shibboleth', 'local'], MODERATION_ENABLED=True,
731 ba27316a Kostas Papadimitriou
                 FORCE_PROFILE_UPDATE=False)
732 478ece6c Kostas Papadimitriou
    def test_user(self):
733 478ece6c Kostas Papadimitriou
        Profile = AuthProviderPolicyProfile
734 478ece6c Kostas Papadimitriou
        Pending = PendingThirdPartyUser
735 478ece6c Kostas Papadimitriou
        User = AstakosUser
736 478ece6c Kostas Papadimitriou
737 e7cb4085 Kostas Papadimitriou
        User.objects.create(email="newuser@synnefo.org")
738 e7cb4085 Kostas Papadimitriou
        get_local_user("olduser@synnefo.org")
739 478ece6c Kostas Papadimitriou
        cl_olduser = ShibbolethClient()
740 e7cb4085 Kostas Papadimitriou
        get_local_user("olduser2@synnefo.org")
741 0a7a4104 Kostas Papadimitriou
        ShibbolethClient()
742 478ece6c Kostas Papadimitriou
        cl_newuser = ShibbolethClient()
743 478ece6c Kostas Papadimitriou
        cl_newuser2 = Client()
744 478ece6c Kostas Papadimitriou
745 478ece6c Kostas Papadimitriou
        academic_group, created = Group.objects.get_or_create(
746 478ece6c Kostas Papadimitriou
            name='academic-login')
747 478ece6c Kostas Papadimitriou
        academic_users = academic_group.user_set
748 478ece6c Kostas Papadimitriou
        assert created
749 478ece6c Kostas Papadimitriou
        policy_only_academic = Profile.objects.add_policy('academic_strict',
750 478ece6c Kostas Papadimitriou
                                                          'shibboleth',
751 478ece6c Kostas Papadimitriou
                                                          academic_group,
752 478ece6c Kostas Papadimitriou
                                                          exclusive=True,
753 478ece6c Kostas Papadimitriou
                                                          login=False,
754 478ece6c Kostas Papadimitriou
                                                          add=False)
755 478ece6c Kostas Papadimitriou
756 478ece6c Kostas Papadimitriou
        # new academic user
757 e7cb4085 Kostas Papadimitriou
        self.assertFalse(academic_users.filter(email='newuser@synnefo.org'))
758 c1f65a1e Kostas Papadimitriou
        cl_newuser.set_tokens(eppn="newusereppn", mail="newuser@synnefo.org",
759 c1f65a1e Kostas Papadimitriou
                              surname="Lastname")
760 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.get(ui_url('login/shibboleth?'), follow=True)
761 c1f65a1e Kostas Papadimitriou
        initial = r.context['signup_form'].initial
762 478ece6c Kostas Papadimitriou
        pending = Pending.objects.get()
763 c1f65a1e Kostas Papadimitriou
        self.assertEqual(initial.get('last_name'), 'Lastname')
764 c1f65a1e Kostas Papadimitriou
        self.assertEqual(initial.get('email'), 'newuser@synnefo.org')
765 478ece6c Kostas Papadimitriou
        identifier = pending.third_party_identifier
766 478ece6c Kostas Papadimitriou
        signup_data = {'third_party_identifier': identifier,
767 478ece6c Kostas Papadimitriou
                       'first_name': 'Academic',
768 478ece6c Kostas Papadimitriou
                       'third_party_token': pending.token,
769 478ece6c Kostas Papadimitriou
                       'last_name': 'New User',
770 478ece6c Kostas Papadimitriou
                       'provider': 'shibboleth'}
771 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.post(ui_url('signup'), signup_data)
772 478ece6c Kostas Papadimitriou
        self.assertContains(r, "This field is required", )
773 e7cb4085 Kostas Papadimitriou
        signup_data['email'] = 'olduser@synnefo.org'
774 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.post(ui_url('signup'), signup_data)
775 478ece6c Kostas Papadimitriou
        self.assertContains(r, "already an account with this email", )
776 e7cb4085 Kostas Papadimitriou
        signup_data['email'] = 'newuser@synnefo.org'
777 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.post(ui_url('signup'), signup_data, follow=True)
778 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.post(ui_url('signup'), signup_data, follow=True)
779 478ece6c Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
780 e7cb4085 Kostas Papadimitriou
        newuser = User.objects.get(email="newuser@synnefo.org")
781 478ece6c Kostas Papadimitriou
        activation_link = newuser.get_activation_url()
782 e7cb4085 Kostas Papadimitriou
        self.assertTrue(academic_users.get(email='newuser@synnefo.org'))
783 478ece6c Kostas Papadimitriou
784 478ece6c Kostas Papadimitriou
        # new non-academic user
785 478ece6c Kostas Papadimitriou
        signup_data = {'first_name': 'Non Academic',
786 478ece6c Kostas Papadimitriou
                       'last_name': 'New User',
787 478ece6c Kostas Papadimitriou
                       'provider': 'local',
788 478ece6c Kostas Papadimitriou
                       'password1': 'password',
789 478ece6c Kostas Papadimitriou
                       'password2': 'password'}
790 e7cb4085 Kostas Papadimitriou
        signup_data['email'] = 'olduser@synnefo.org'
791 5f28aa14 Kostas Papadimitriou
        r = cl_newuser2.post(ui_url('signup'), signup_data)
792 478ece6c Kostas Papadimitriou
        self.assertContains(r, 'There is already an account with this '
793 478ece6c Kostas Papadimitriou
                               'email address')
794 e7cb4085 Kostas Papadimitriou
        signup_data['email'] = 'newuser@synnefo.org'
795 5f28aa14 Kostas Papadimitriou
        r = cl_newuser2.post(ui_url('signup/'), signup_data)
796 e7cb4085 Kostas Papadimitriou
        self.assertFalse(academic_users.filter(email='newuser@synnefo.org'))
797 478ece6c Kostas Papadimitriou
        r = self.client.get(activation_link, follow=True)
798 e7cb4085 Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
799 e7cb4085 Kostas Papadimitriou
        newuser = User.objects.get(email="newuser@synnefo.org")
800 e7cb4085 Kostas Papadimitriou
        self.assertTrue(newuser.activation_sent)
801 478ece6c Kostas Papadimitriou
802 e7cb4085 Kostas Papadimitriou
        # activation sent, user didn't open verification url so additional
803 e7cb4085 Kostas Papadimitriou
        # registrations invalidate the previous signups.
804 e7cb4085 Kostas Papadimitriou
        self.assertFalse(academic_users.filter(email='newuser@synnefo.org'))
805 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.get(ui_url('login/shibboleth?'), follow=True)
806 478ece6c Kostas Papadimitriou
        pending = Pending.objects.get()
807 478ece6c Kostas Papadimitriou
        identifier = pending.third_party_identifier
808 478ece6c Kostas Papadimitriou
        signup_data = {'third_party_identifier': identifier,
809 478ece6c Kostas Papadimitriou
                       'first_name': 'Academic',
810 478ece6c Kostas Papadimitriou
                       'third_party_token': pending.token,
811 478ece6c Kostas Papadimitriou
                       'last_name': 'New User',
812 478ece6c Kostas Papadimitriou
                       'provider': 'shibboleth'}
813 e7cb4085 Kostas Papadimitriou
        signup_data['email'] = 'newuser@synnefo.org'
814 5f28aa14 Kostas Papadimitriou
        r = cl_newuser.post(ui_url('signup'), signup_data)
815 e7cb4085 Kostas Papadimitriou
        self.assertEqual(r.status_code, 302)
816 e7cb4085 Kostas Papadimitriou
        newuser = User.objects.get(email="newuser@synnefo.org")
817 478ece6c Kostas Papadimitriou
        self.assertTrue(newuser.activation_sent)
818 478ece6c Kostas Papadimitriou
        activation_link = newuser.get_activation_url()
819 e7cb4085 Kostas Papadimitriou
        self.assertTrue(academic_users.get(email='newuser@synnefo.org'))
820 478ece6c Kostas Papadimitriou
        r = cl_newuser.get(newuser.get_activation_url(), follow=True)
821 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('landing'))
822 e7cb4085 Kostas Papadimitriou
        newuser = User.objects.get(email="newuser@synnefo.org")
823 478ece6c Kostas Papadimitriou
        self.assertEqual(newuser.is_active, True)
824 478ece6c Kostas Papadimitriou
        self.assertEqual(newuser.email_verified, True)
825 478ece6c Kostas Papadimitriou
        cl_newuser.logout()
826 478ece6c Kostas Papadimitriou
827 478ece6c Kostas Papadimitriou
        # cannot reactivate if suspended
828 478ece6c Kostas Papadimitriou
        newuser.is_active = False
829 478ece6c Kostas Papadimitriou
        newuser.save()
830 478ece6c Kostas Papadimitriou
        r = cl_newuser.get(newuser.get_activation_url())
831 e7cb4085 Kostas Papadimitriou
        newuser = User.objects.get(email="newuser@synnefo.org")
832 478ece6c Kostas Papadimitriou
        self.assertFalse(newuser.is_active)
833 478ece6c Kostas Papadimitriou
834 478ece6c Kostas Papadimitriou
        # release suspension
835 478ece6c Kostas Papadimitriou
        newuser.is_active = True
836 478ece6c Kostas Papadimitriou
        newuser.save()
837 478ece6c Kostas Papadimitriou
838 5f28aa14 Kostas Papadimitriou
        cl_newuser.get(ui_url('login/shibboleth?'), follow=True)
839 478ece6c Kostas Papadimitriou
        local = auth.get_provider('local', newuser)
840 478ece6c Kostas Papadimitriou
        self.assertEqual(local.get_add_policy, False)
841 478ece6c Kostas Papadimitriou
        self.assertEqual(local.get_login_policy, False)
842 478ece6c Kostas Papadimitriou
        r = cl_newuser.get(local.get_add_url, follow=True)
843 5f28aa14 Kostas Papadimitriou
        self.assertRedirects(r, ui_url('profile'))
844 478ece6c Kostas Papadimitriou
        self.assertContains(r, 'disabled for your')
845 478ece6c Kostas Papadimitriou
846 e7cb4085 Kostas Papadimitriou
        cl_olduser.login(username='olduser@synnefo.org', password="password")
847 5f28aa14 Kostas Papadimitriou
        r = cl_olduser.get(ui_url('profile'), follow=True)
848 478ece6c Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
849 5f28aa14 Kostas Papadimitriou
        r = cl_olduser.get(ui_url('login/shibboleth?'), follow=True)
850 478ece6c Kostas Papadimitriou
        self.assertContains(r, 'Your request is missing a unique token')
851 478ece6c Kostas Papadimitriou
        cl_olduser.set_tokens(eppn="newusereppn")
852 5f28aa14 Kostas Papadimitriou
        r = cl_olduser.get(ui_url('login/shibboleth?'), follow=True)
853 c34abd9c Kostas Papadimitriou
        self.assertContains(r, 'already in use')
854 478ece6c Kostas Papadimitriou
        cl_olduser.set_tokens(eppn="oldusereppn")
855 5f28aa14 Kostas Papadimitriou
        r = cl_olduser.get(ui_url('login/shibboleth?'), follow=True)
856 478ece6c Kostas Papadimitriou
        self.assertContains(r, 'Academic login enabled for this account')
857 478ece6c Kostas Papadimitriou
858 e7cb4085 Kostas Papadimitriou
        user = User.objects.get(email="olduser@synnefo.org")
859 478ece6c Kostas Papadimitriou
        shib_provider = user.get_auth_provider('shibboleth', 'oldusereppn')
860 478ece6c Kostas Papadimitriou
        local_provider = user.get_auth_provider('local')
861 478ece6c Kostas Papadimitriou
        self.assertEqual(shib_provider.get_remove_policy, True)
862 478ece6c Kostas Papadimitriou
        self.assertEqual(local_provider.get_remove_policy, True)
863 478ece6c Kostas Papadimitriou
864 478ece6c Kostas Papadimitriou
        policy_only_academic = Profile.objects.add_policy('academic_strict2',
865 478ece6c Kostas Papadimitriou
                                                          'shibboleth',
866 478ece6c Kostas Papadimitriou
                                                          academic_group,
867 478ece6c Kostas Papadimitriou
                                                          remove=False)
868 478ece6c Kostas Papadimitriou
        user.groups.add(academic_group)
869 478ece6c Kostas Papadimitriou
        shib_provider = user.get_auth_provider('shibboleth', 'oldusereppn')
870 478ece6c Kostas Papadimitriou
        local_provider = user.get_auth_provider('local')
871 478ece6c Kostas Papadimitriou
        self.assertEqual(shib_provider.get_remove_policy, False)
872 478ece6c Kostas Papadimitriou
        self.assertEqual(local_provider.get_remove_policy, True)
873 478ece6c Kostas Papadimitriou
        self.assertEqual(local_provider.get_login_policy, False)
874 478ece6c Kostas Papadimitriou
875 478ece6c Kostas Papadimitriou
        cl_olduser.logout()
876 0b817216 Kostas Papadimitriou
        login_data = {'username': 'olduser@synnefo.org',
877 0b817216 Kostas Papadimitriou
                      'password': 'password'}
878 5f28aa14 Kostas Papadimitriou
        r = cl_olduser.post(ui_url('local'), login_data, follow=True)
879 5f28aa14 Kostas Papadimitriou
        self.assertContains(r, "login/shibboleth'>Academic login")
880 39e16ecc Kostas Papadimitriou
        Group.objects.all().delete()
881 9d20fe23 Kostas Papadimitriou
882 9d20fe23 Kostas Papadimitriou
883 478ece6c Kostas Papadimitriou
class TestAuthProvidersAPI(TestCase):
884 478ece6c Kostas Papadimitriou
    """
885 478ece6c Kostas Papadimitriou
    Test auth_providers module API
886 478ece6c Kostas Papadimitriou
    """
887 478ece6c Kostas Papadimitriou
888 c34abd9c Kostas Papadimitriou
    def tearDown(self):
889 c34abd9c Kostas Papadimitriou
        Group.objects.all().delete()
890 c34abd9c Kostas Papadimitriou
891 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
892 9d20fe23 Kostas Papadimitriou
    def test_create(self):
893 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.create(email="kpap@synnefo.org")
894 e7cb4085 Kostas Papadimitriou
        user2 = AstakosUser.objects.create(email="kpap2@synnefo.org")
895 9d20fe23 Kostas Papadimitriou
896 9d20fe23 Kostas Papadimitriou
        module = 'shibboleth'
897 9d20fe23 Kostas Papadimitriou
        identifier = 'SHIB_UUID'
898 9d20fe23 Kostas Papadimitriou
        provider_params = {
899 9d20fe23 Kostas Papadimitriou
            'affiliation': 'UNIVERSITY',
900 9d20fe23 Kostas Papadimitriou
            'info': {'age': 27}
901 9d20fe23 Kostas Papadimitriou
        }
902 9d20fe23 Kostas Papadimitriou
        provider = auth.get_provider(module, user2, identifier,
903 9d20fe23 Kostas Papadimitriou
                                     **provider_params)
904 9d20fe23 Kostas Papadimitriou
        provider.add_to_user()
905 9d20fe23 Kostas Papadimitriou
        provider = auth.get_provider(module, user, identifier,
906 9d20fe23 Kostas Papadimitriou
                                     **provider_params)
907 9d20fe23 Kostas Papadimitriou
        provider.add_to_user()
908 9d20fe23 Kostas Papadimitriou
        user.email_verified = True
909 9d20fe23 Kostas Papadimitriou
        user.save()
910 9d20fe23 Kostas Papadimitriou
        self.assertRaises(Exception, provider.add_to_user)
911 9d20fe23 Kostas Papadimitriou
        provider = user.get_auth_provider(module, identifier)
912 9d20fe23 Kostas Papadimitriou
        self.assertEqual(user.get_auth_provider(
913 9d20fe23 Kostas Papadimitriou
            module, identifier)._instance.info.get('age'), 27)
914 9d20fe23 Kostas Papadimitriou
915 9d20fe23 Kostas Papadimitriou
        module = 'local'
916 9d20fe23 Kostas Papadimitriou
        identifier = None
917 9d20fe23 Kostas Papadimitriou
        provider_params = {'auth_backend': 'ldap', 'info':
918 9d20fe23 Kostas Papadimitriou
                          {'office': 'A1'}}
919 9d20fe23 Kostas Papadimitriou
        provider = auth.get_provider(module, user, identifier,
920 9d20fe23 Kostas Papadimitriou
                                     **provider_params)
921 9d20fe23 Kostas Papadimitriou
        provider.add_to_user()
922 9d20fe23 Kostas Papadimitriou
        self.assertFalse(provider.get_add_policy)
923 9d20fe23 Kostas Papadimitriou
        self.assertRaises(Exception, provider.add_to_user)
924 9d20fe23 Kostas Papadimitriou
925 9d20fe23 Kostas Papadimitriou
        shib = user.get_auth_provider('shibboleth',
926 9d20fe23 Kostas Papadimitriou
                                      'SHIB_UUID')
927 9d20fe23 Kostas Papadimitriou
        self.assertTrue(shib.get_remove_policy)
928 9d20fe23 Kostas Papadimitriou
929 9d20fe23 Kostas Papadimitriou
        local = user.get_auth_provider('local')
930 9d20fe23 Kostas Papadimitriou
        self.assertTrue(local.get_remove_policy)
931 9d20fe23 Kostas Papadimitriou
932 9d20fe23 Kostas Papadimitriou
        local.remove_from_user()
933 9d20fe23 Kostas Papadimitriou
        self.assertFalse(shib.get_remove_policy)
934 9d20fe23 Kostas Papadimitriou
        self.assertRaises(Exception, shib.remove_from_user)
935 9d20fe23 Kostas Papadimitriou
936 478ece6c Kostas Papadimitriou
        provider = user.get_auth_providers()[0]
937 478ece6c Kostas Papadimitriou
        self.assertRaises(Exception, provider.add_to_user)
938 478ece6c Kostas Papadimitriou
939 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
940 ba27316a Kostas Papadimitriou
    @shibboleth_settings(ADD_GROUPS_POLICY=['group1', 'group2'],
941 ba27316a Kostas Papadimitriou
                         CREATION_GROUPS_POLICY=['group-create', 'group1',
942 478ece6c Kostas Papadimitriou
                                                 'group2'])
943 ba27316a Kostas Papadimitriou
    @localauth_settings(ADD_GROUPS_POLICY=['localgroup'],
944 ba27316a Kostas Papadimitriou
                        CREATION_GROUPS_POLICY=['localgroup-create',
945 478ece6c Kostas Papadimitriou
                                                'group-create'])
946 478ece6c Kostas Papadimitriou
    def test_add_groups(self):
947 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.create(email="kpap@synnefo.org")
948 478ece6c Kostas Papadimitriou
        provider = auth.get_provider('shibboleth', user, 'test123')
949 478ece6c Kostas Papadimitriou
        provider.add_to_user()
950 478ece6c Kostas Papadimitriou
        user = AstakosUser.objects.get()
951 2a88057d Christos Stavrakakis
        self.assertEqual(sorted(user.groups.values_list('name', flat=True)),
952 8fb8d0cf Giorgos Korfiatis
                         sorted([u'group1', u'group2', u'group-create']))
953 478ece6c Kostas Papadimitriou
954 478ece6c Kostas Papadimitriou
        local = auth.get_provider('local', user)
955 478ece6c Kostas Papadimitriou
        local.add_to_user()
956 478ece6c Kostas Papadimitriou
        provider = user.get_auth_provider('shibboleth')
957 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_add_groups_policy, ['group1', 'group2'])
958 478ece6c Kostas Papadimitriou
        provider.remove_from_user()
959 478ece6c Kostas Papadimitriou
        user = AstakosUser.objects.get()
960 478ece6c Kostas Papadimitriou
        self.assertEqual(len(user.get_auth_providers()), 1)
961 2a88057d Christos Stavrakakis
        self.assertEqual(sorted(user.groups.values_list('name', flat=True)),
962 8fb8d0cf Giorgos Korfiatis
                         sorted([u'group-create', u'localgroup']))
963 478ece6c Kostas Papadimitriou
964 478ece6c Kostas Papadimitriou
        local = user.get_auth_provider('local')
965 478ece6c Kostas Papadimitriou
        self.assertRaises(Exception, local.remove_from_user)
966 478ece6c Kostas Papadimitriou
        provider = auth.get_provider('shibboleth', user, 'test123')
967 478ece6c Kostas Papadimitriou
        provider.add_to_user()
968 478ece6c Kostas Papadimitriou
        user = AstakosUser.objects.get()
969 2a88057d Christos Stavrakakis
        self.assertEqual(sorted(user.groups.values_list('name', flat=True)),
970 8fb8d0cf Giorgos Korfiatis
                         sorted([u'group-create', u'group1', u'group2',
971 8fb8d0cf Giorgos Korfiatis
                                 u'localgroup']))
972 39e16ecc Kostas Papadimitriou
        Group.objects.all().delete()
973 e7cb4085 Kostas Papadimitriou
974 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
975 9d20fe23 Kostas Papadimitriou
    def test_policies(self):
976 9d20fe23 Kostas Papadimitriou
        group_old, created = Group.objects.get_or_create(name='olduser')
977 9d20fe23 Kostas Papadimitriou
978 9d20fe23 Kostas Papadimitriou
        astakos_settings.MODERATION_ENABLED = True
979 9d20fe23 Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_CREATION_GROUPS_POLICY = \
980 9d20fe23 Kostas Papadimitriou
            ['academic-user']
981 9d20fe23 Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_GOOGLE_ADD_GROUPS_POLICY = \
982 9d20fe23 Kostas Papadimitriou
            ['google-user']
983 9d20fe23 Kostas Papadimitriou
984 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.create(email="kpap@synnefo.org")
985 9d20fe23 Kostas Papadimitriou
        user.groups.add(group_old)
986 9d20fe23 Kostas Papadimitriou
        user.add_auth_provider('local')
987 9d20fe23 Kostas Papadimitriou
988 e7cb4085 Kostas Papadimitriou
        user2 = AstakosUser.objects.create(email="kpap2@synnefo.org")
989 9d20fe23 Kostas Papadimitriou
        user2.add_auth_provider('shibboleth', identifier='shibid')
990 9d20fe23 Kostas Papadimitriou
991 e7cb4085 Kostas Papadimitriou
        user3 = AstakosUser.objects.create(email="kpap3@synnefo.org")
992 9d20fe23 Kostas Papadimitriou
        user3.groups.add(group_old)
993 9d20fe23 Kostas Papadimitriou
        user3.add_auth_provider('local')
994 9d20fe23 Kostas Papadimitriou
        user3.add_auth_provider('shibboleth', identifier='1234')
995 9d20fe23 Kostas Papadimitriou
996 9d20fe23 Kostas Papadimitriou
        self.assertTrue(user2.groups.get(name='academic-user'))
997 9d20fe23 Kostas Papadimitriou
        self.assertFalse(user2.groups.filter(name='olduser').count())
998 9d20fe23 Kostas Papadimitriou
999 9d20fe23 Kostas Papadimitriou
        local = auth_providers.get_provider('local')
1000 9d20fe23 Kostas Papadimitriou
        self.assertTrue(local.get_add_policy)
1001 9d20fe23 Kostas Papadimitriou
1002 9d20fe23 Kostas Papadimitriou
        academic_group = Group.objects.get(name='academic-user')
1003 9d20fe23 Kostas Papadimitriou
        AuthProviderPolicyProfile.objects.add_policy('academic', 'shibboleth',
1004 9d20fe23 Kostas Papadimitriou
                                                     academic_group,
1005 9d20fe23 Kostas Papadimitriou
                                                     exclusive=True,
1006 9d20fe23 Kostas Papadimitriou
                                                     add=False,
1007 9d20fe23 Kostas Papadimitriou
                                                     login=False)
1008 9d20fe23 Kostas Papadimitriou
        AuthProviderPolicyProfile.objects.add_policy('academic', 'shibboleth',
1009 9d20fe23 Kostas Papadimitriou
                                                     academic_group,
1010 9d20fe23 Kostas Papadimitriou
                                                     exclusive=True,
1011 9d20fe23 Kostas Papadimitriou
                                                     login=False,
1012 9d20fe23 Kostas Papadimitriou
                                                     add=False)
1013 9d20fe23 Kostas Papadimitriou
        # no duplicate entry gets created
1014 9d20fe23 Kostas Papadimitriou
        self.assertEqual(academic_group.authpolicy_profiles.count(), 1)
1015 9d20fe23 Kostas Papadimitriou
1016 9d20fe23 Kostas Papadimitriou
        self.assertEqual(user2.authpolicy_profiles.count(), 0)
1017 9d20fe23 Kostas Papadimitriou
        AuthProviderPolicyProfile.objects.add_policy('academic', 'shibboleth',
1018 9d20fe23 Kostas Papadimitriou
                                                     user2,
1019 9d20fe23 Kostas Papadimitriou
                                                     remove=False)
1020 9d20fe23 Kostas Papadimitriou
        self.assertEqual(user2.authpolicy_profiles.count(), 1)
1021 9d20fe23 Kostas Papadimitriou
1022 9d20fe23 Kostas Papadimitriou
        local = auth_providers.get_provider('local', user2)
1023 9d20fe23 Kostas Papadimitriou
        google = auth_providers.get_provider('google', user2)
1024 9d20fe23 Kostas Papadimitriou
        shibboleth = auth_providers.get_provider('shibboleth', user2)
1025 9d20fe23 Kostas Papadimitriou
        self.assertTrue(shibboleth.get_login_policy)
1026 9d20fe23 Kostas Papadimitriou
        self.assertFalse(shibboleth.get_remove_policy)
1027 9d20fe23 Kostas Papadimitriou
        self.assertFalse(local.get_add_policy)
1028 9d20fe23 Kostas Papadimitriou
        self.assertFalse(local.get_add_policy)
1029 9d20fe23 Kostas Papadimitriou
        self.assertFalse(google.get_add_policy)
1030 9d20fe23 Kostas Papadimitriou
1031 9d20fe23 Kostas Papadimitriou
        user2.groups.remove(Group.objects.get(name='academic-user'))
1032 9d20fe23 Kostas Papadimitriou
        self.assertTrue(local.get_add_policy)
1033 9d20fe23 Kostas Papadimitriou
        self.assertTrue(google.get_add_policy)
1034 9d20fe23 Kostas Papadimitriou
        user2.groups.add(Group.objects.get(name='academic-user'))
1035 9d20fe23 Kostas Papadimitriou
1036 9d20fe23 Kostas Papadimitriou
        AuthProviderPolicyProfile.objects.add_policy('academic', 'shibboleth',
1037 9d20fe23 Kostas Papadimitriou
                                                     user2,
1038 9d20fe23 Kostas Papadimitriou
                                                     exclusive=True,
1039 9d20fe23 Kostas Papadimitriou
                                                     add=True)
1040 9d20fe23 Kostas Papadimitriou
        self.assertTrue(local.get_add_policy)
1041 9d20fe23 Kostas Papadimitriou
        self.assertTrue(google.get_add_policy)
1042 9d20fe23 Kostas Papadimitriou
1043 9d20fe23 Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_AUTOMODERATE_POLICY = True
1044 9d20fe23 Kostas Papadimitriou
        self.assertFalse(local.get_automoderate_policy)
1045 9d20fe23 Kostas Papadimitriou
        self.assertFalse(google.get_automoderate_policy)
1046 9d20fe23 Kostas Papadimitriou
        self.assertTrue(shibboleth.get_automoderate_policy)
1047 9d20fe23 Kostas Papadimitriou
1048 9d20fe23 Kostas Papadimitriou
        for s in ['SHIBBOLETH_CREATION_GROUPS_POLICY',
1049 9d20fe23 Kostas Papadimitriou
                  'GOOGLE_ADD_GROUPS_POLICY']:
1050 9d20fe23 Kostas Papadimitriou
            delattr(settings, 'ASTAKOS_AUTH_PROVIDER_%s' % s)
1051 478ece6c Kostas Papadimitriou
1052 478ece6c Kostas Papadimitriou
    @shibboleth_settings(CREATE_POLICY=True)
1053 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1054 478ece6c Kostas Papadimitriou
    def test_create_http(self):
1055 478ece6c Kostas Papadimitriou
        # this should be wrapped inside a transaction
1056 478ece6c Kostas Papadimitriou
        user = AstakosUser(email="test@test.com")
1057 478ece6c Kostas Papadimitriou
        user.save()
1058 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth', user,
1059 478ece6c Kostas Papadimitriou
                                               'test@academia.test')
1060 478ece6c Kostas Papadimitriou
        provider.add_to_user()
1061 478ece6c Kostas Papadimitriou
        user.get_auth_provider('shibboleth', 'test@academia.test')
1062 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('local', user)
1063 478ece6c Kostas Papadimitriou
        provider.add_to_user()
1064 478ece6c Kostas Papadimitriou
        user.get_auth_provider('local')
1065 478ece6c Kostas Papadimitriou
1066 478ece6c Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_CREATE_POLICY = False
1067 478ece6c Kostas Papadimitriou
        user = AstakosUser(email="test2@test.com")
1068 478ece6c Kostas Papadimitriou
        user.save()
1069 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth', user,
1070 478ece6c Kostas Papadimitriou
                                               'test@shibboleth.com',
1071 478ece6c Kostas Papadimitriou
                                               **{'info': {'name':
1072 8fb8d0cf Giorgos Korfiatis
                                                           'User Test'}})
1073 478ece6c Kostas Papadimitriou
        self.assertFalse(provider.get_create_policy)
1074 478ece6c Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_CREATE_POLICY = True
1075 478ece6c Kostas Papadimitriou
        self.assertTrue(provider.get_create_policy)
1076 478ece6c Kostas Papadimitriou
        academic = provider.add_to_user()
1077 478ece6c Kostas Papadimitriou
1078 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1079 478ece6c Kostas Papadimitriou
    @shibboleth_settings(LIMIT_POLICY=2)
1080 478ece6c Kostas Papadimitriou
    def test_policies(self):
1081 e7cb4085 Kostas Papadimitriou
        user = get_local_user('kpap@synnefo.org')
1082 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='1234')
1083 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='12345')
1084 478ece6c Kostas Papadimitriou
1085 478ece6c Kostas Papadimitriou
        # default limit is 1
1086 478ece6c Kostas Papadimitriou
        local = user.get_auth_provider('local')
1087 478ece6c Kostas Papadimitriou
        self.assertEqual(local.get_add_policy, False)
1088 478ece6c Kostas Papadimitriou
1089 478ece6c Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_LIMIT_POLICY = 3
1090 478ece6c Kostas Papadimitriou
        academic = user.get_auth_provider('shibboleth',
1091 478ece6c Kostas Papadimitriou
                                          identifier='1234')
1092 478ece6c Kostas Papadimitriou
        self.assertEqual(academic.get_add_policy, False)
1093 478ece6c Kostas Papadimitriou
        newacademic = auth_providers.get_provider('shibboleth', user,
1094 478ece6c Kostas Papadimitriou
                                                  identifier='123456')
1095 478ece6c Kostas Papadimitriou
        self.assertEqual(newacademic.get_add_policy, True)
1096 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='123456')
1097 478ece6c Kostas Papadimitriou
        self.assertEqual(academic.get_add_policy, False)
1098 478ece6c Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_LIMIT_POLICY = 1
1099 478ece6c Kostas Papadimitriou
1100 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1101 478ece6c Kostas Papadimitriou
    @shibboleth_settings(LIMIT_POLICY=2)
1102 478ece6c Kostas Papadimitriou
    def test_messages(self):
1103 e7cb4085 Kostas Papadimitriou
        user = get_local_user('kpap@synnefo.org')
1104 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='1234')
1105 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='12345')
1106 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth')
1107 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_message('title'), 'Academic')
1108 478ece6c Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_TITLE = 'New title'
1109 478ece6c Kostas Papadimitriou
        # regenerate messages cache
1110 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth')
1111 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_message('title'), 'New title')
1112 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_message('login_title'),
1113 478ece6c Kostas Papadimitriou
                         'New title LOGIN')
1114 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_login_title_msg, 'New title LOGIN')
1115 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_module_icon,
1116 478ece6c Kostas Papadimitriou
                         settings.MEDIA_URL + 'im/auth/icons/shibboleth.png')
1117 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_module_medium_icon,
1118 478ece6c Kostas Papadimitriou
                         settings.MEDIA_URL +
1119 478ece6c Kostas Papadimitriou
                         'im/auth/icons-medium/shibboleth.png')
1120 478ece6c Kostas Papadimitriou
1121 478ece6c Kostas Papadimitriou
        settings.ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_TITLE = None
1122 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth', user, '12345')
1123 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_method_details_msg,
1124 478ece6c Kostas Papadimitriou
                         'Account: 12345')
1125 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth', user, '1234')
1126 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_method_details_msg,
1127 478ece6c Kostas Papadimitriou
                         'Account: 1234')
1128 478ece6c Kostas Papadimitriou
1129 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth', user, '1234')
1130 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_not_active_msg,
1131 478ece6c Kostas Papadimitriou
                         "'Academic login' is disabled.")
1132 478ece6c Kostas Papadimitriou
1133 478ece6c Kostas Papadimitriou
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1134 478ece6c Kostas Papadimitriou
    @shibboleth_settings(LIMIT_POLICY=2)
1135 478ece6c Kostas Papadimitriou
    def test_templates(self):
1136 e7cb4085 Kostas Papadimitriou
        user = get_local_user('kpap@synnefo.org')
1137 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='1234')
1138 478ece6c Kostas Papadimitriou
        user.add_auth_provider('shibboleth', identifier='12345')
1139 478ece6c Kostas Papadimitriou
1140 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('shibboleth')
1141 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_template('login'),
1142 478ece6c Kostas Papadimitriou
                         'im/auth/shibboleth_login.html')
1143 478ece6c Kostas Papadimitriou
        provider = auth_providers.get_provider('google')
1144 478ece6c Kostas Papadimitriou
        self.assertEqual(provider.get_template('login'),
1145 478ece6c Kostas Papadimitriou
                         'im/auth/generic_login.html')
1146 478ece6c Kostas Papadimitriou
1147 478ece6c Kostas Papadimitriou
1148 e7cb4085 Kostas Papadimitriou
class TestActivationBackend(TestCase):
1149 e7cb4085 Kostas Papadimitriou
1150 e7cb4085 Kostas Papadimitriou
    def setUp(self):
1151 e7cb4085 Kostas Papadimitriou
        # dummy call to pass through logging middleware
1152 5f28aa14 Kostas Papadimitriou
        self.client.get(ui_url(''))
1153 e7cb4085 Kostas Papadimitriou
1154 e7cb4085 Kostas Papadimitriou
    @im_settings(RE_USER_EMAIL_PATTERNS=['.*@synnefo.org'])
1155 e7cb4085 Kostas Papadimitriou
    @shibboleth_settings(AUTOMODERATE_POLICY=True)
1156 e7cb4085 Kostas Papadimitriou
    def test_policies(self):
1157 e7cb4085 Kostas Papadimitriou
        backend = activation_backends.get_backend()
1158 e7cb4085 Kostas Papadimitriou
1159 e7cb4085 Kostas Papadimitriou
        # email matches RE_USER_EMAIL_PATTERNS
1160 e7cb4085 Kostas Papadimitriou
        user1 = get_local_user('kpap@synnefo.org', moderated=False,
1161 e7cb4085 Kostas Papadimitriou
                               is_active=False, email_verified=False)
1162 e7cb4085 Kostas Papadimitriou
        backend.handle_verification(user1, user1.verification_code)
1163 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user1.accepted_policy, 'email')
1164 e7cb4085 Kostas Papadimitriou
1165 e7cb4085 Kostas Papadimitriou
        # manually moderated
1166 e7cb4085 Kostas Papadimitriou
        user2 = get_local_user('kpap@synnefo-bad.org', moderated=False,
1167 e7cb4085 Kostas Papadimitriou
                               is_active=False, email_verified=False)
1168 e7cb4085 Kostas Papadimitriou
1169 e7cb4085 Kostas Papadimitriou
        backend.handle_verification(user2, user2.verification_code)
1170 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user2.moderated, False)
1171 e7cb4085 Kostas Papadimitriou
        backend.handle_moderation(user2)
1172 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user2.moderated, True)
1173 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user2.accepted_policy, 'manual')
1174 e7cb4085 Kostas Papadimitriou
1175 e7cb4085 Kostas Papadimitriou
        # autoaccept due to provider automoderate policy
1176 e7cb4085 Kostas Papadimitriou
        user3 = get_local_user('kpap2@synnefo-bad.org', moderated=False,
1177 e7cb4085 Kostas Papadimitriou
                               is_active=False, email_verified=False)
1178 e7cb4085 Kostas Papadimitriou
        user3.auth_providers.all().delete()
1179 e7cb4085 Kostas Papadimitriou
        user3.add_auth_provider('shibboleth', identifier='shib123')
1180 e7cb4085 Kostas Papadimitriou
        backend.handle_verification(user3, user3.verification_code)
1181 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user3.moderated, True)
1182 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user3.accepted_policy, 'auth_provider_shibboleth')
1183 e7cb4085 Kostas Papadimitriou
1184 e7cb4085 Kostas Papadimitriou
    @im_settings(MODERATION_ENABLED=False,
1185 e7cb4085 Kostas Papadimitriou
                 MANAGERS=(('Manager',
1186 e7cb4085 Kostas Papadimitriou
                            'manager@synnefo.org'),),
1187 e7cb4085 Kostas Papadimitriou
                 HELPDESK=(('Helpdesk',
1188 e7cb4085 Kostas Papadimitriou
                            'helpdesk@synnefo.org'),),
1189 e7cb4085 Kostas Papadimitriou
                 ADMINS=(('Admin', 'admin@synnefo.org'), ))
1190 e7cb4085 Kostas Papadimitriou
    def test_without_moderation(self):
1191 e7cb4085 Kostas Papadimitriou
        backend = activation_backends.get_backend()
1192 e7cb4085 Kostas Papadimitriou
        form = backend.get_signup_form('local')
1193 e7cb4085 Kostas Papadimitriou
        self.assertTrue(isinstance(form, forms.LocalUserCreationForm))
1194 e7cb4085 Kostas Papadimitriou
1195 e7cb4085 Kostas Papadimitriou
        user_data = {
1196 e7cb4085 Kostas Papadimitriou
            'email': 'kpap@synnefo.org',
1197 e7cb4085 Kostas Papadimitriou
            'first_name': 'Kostas Papas',
1198 e7cb4085 Kostas Papadimitriou
            'password1': '123',
1199 e7cb4085 Kostas Papadimitriou
            'password2': '123'
1200 e7cb4085 Kostas Papadimitriou
        }
1201 e7cb4085 Kostas Papadimitriou
        form = backend.get_signup_form('local', user_data)
1202 e7cb4085 Kostas Papadimitriou
        user = form.save(commit=False)
1203 e7cb4085 Kostas Papadimitriou
        form.store_user(user)
1204 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, False)
1205 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, False)
1206 e7cb4085 Kostas Papadimitriou
1207 e7cb4085 Kostas Papadimitriou
        # step one, registration
1208 e7cb4085 Kostas Papadimitriou
        result = backend.handle_registration(user)
1209 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1210 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, False)
1211 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, False)
1212 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.verification_code)
1213 e7cb4085 Kostas Papadimitriou
        self.assertEqual(result.status, backend.Result.PENDING_VERIFICATION)
1214 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
1215 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
1216 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(mail.outbox), 1)
1217 e7cb4085 Kostas Papadimitriou
1218 e7cb4085 Kostas Papadimitriou
        # step two, verify email (automatically
1219 e7cb4085 Kostas Papadimitriou
        # moderates/accepts user, since moderation is disabled)
1220 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1221 e7cb4085 Kostas Papadimitriou
        valid_code = user.verification_code
1222 e7cb4085 Kostas Papadimitriou
1223 e7cb4085 Kostas Papadimitriou
        # test invalid code
1224 e7cb4085 Kostas Papadimitriou
        result = backend.handle_verification(user, valid_code)
1225 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
1226 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('manager@synnefo.org')), 1)
1227 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('helpdesk@synnefo.org')), 1)
1228 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('admin@synnefo.org')), 1)
1229 e7cb4085 Kostas Papadimitriou
        # verification + activated + greeting = 3
1230 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(mail.outbox), 3)
1231 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1232 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, True)
1233 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated, True)
1234 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.moderated_at)
1235 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, True)
1236 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
1237 e7cb4085 Kostas Papadimitriou
1238 e7cb4085 Kostas Papadimitriou
    @im_settings(MODERATION_ENABLED=True,
1239 e7cb4085 Kostas Papadimitriou
                 MANAGERS=(('Manager',
1240 e7cb4085 Kostas Papadimitriou
                            'manager@synnefo.org'),),
1241 e7cb4085 Kostas Papadimitriou
                 HELPDESK=(('Helpdesk',
1242 e7cb4085 Kostas Papadimitriou
                            'helpdesk@synnefo.org'),),
1243 e7cb4085 Kostas Papadimitriou
                 ADMINS=(('Admin', 'admin@synnefo.org'), ))
1244 e7cb4085 Kostas Papadimitriou
    def test_with_moderation(self):
1245 e7cb4085 Kostas Papadimitriou
1246 e7cb4085 Kostas Papadimitriou
        backend = activation_backends.get_backend()
1247 e7cb4085 Kostas Papadimitriou
        form = backend.get_signup_form('local')
1248 e7cb4085 Kostas Papadimitriou
        self.assertTrue(isinstance(form, forms.LocalUserCreationForm))
1249 e7cb4085 Kostas Papadimitriou
1250 e7cb4085 Kostas Papadimitriou
        user_data = {
1251 e7cb4085 Kostas Papadimitriou
            'email': 'kpap@synnefo.org',
1252 e7cb4085 Kostas Papadimitriou
            'first_name': 'Kostas Papas',
1253 e7cb4085 Kostas Papadimitriou
            'password1': '123',
1254 e7cb4085 Kostas Papadimitriou
            'password2': '123'
1255 e7cb4085 Kostas Papadimitriou
        }
1256 e7cb4085 Kostas Papadimitriou
        form = backend.get_signup_form(provider='local',
1257 e7cb4085 Kostas Papadimitriou
                                       initial_data=user_data)
1258 e7cb4085 Kostas Papadimitriou
        user = form.save(commit=False)
1259 e7cb4085 Kostas Papadimitriou
        form.store_user(user)
1260 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, False)
1261 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, False)
1262 e7cb4085 Kostas Papadimitriou
1263 e7cb4085 Kostas Papadimitriou
        # step one, registration
1264 e7cb4085 Kostas Papadimitriou
        result = backend.handle_registration(user)
1265 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1266 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, False)
1267 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, False)
1268 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.verification_code)
1269 e7cb4085 Kostas Papadimitriou
        self.assertEqual(result.status, backend.Result.PENDING_VERIFICATION)
1270 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
1271 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
1272 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(mail.outbox), 1)
1273 e7cb4085 Kostas Papadimitriou
1274 e7cb4085 Kostas Papadimitriou
        # step two, verifying email
1275 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1276 e7cb4085 Kostas Papadimitriou
        valid_code = user.verification_code
1277 e7cb4085 Kostas Papadimitriou
        invalid_code = user.verification_code + 'invalid'
1278 e7cb4085 Kostas Papadimitriou
1279 e7cb4085 Kostas Papadimitriou
        # test invalid code
1280 e7cb4085 Kostas Papadimitriou
        result = backend.handle_verification(user, invalid_code)
1281 e7cb4085 Kostas Papadimitriou
        self.assertEqual(result.status, backend.Result.ERROR)
1282 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
1283 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1284 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, False)
1285 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated, False)
1286 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated_at, None)
1287 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, False)
1288 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
1289 e7cb4085 Kostas Papadimitriou
1290 e7cb4085 Kostas Papadimitriou
        # test valid code
1291 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1292 e7cb4085 Kostas Papadimitriou
        result = backend.handle_verification(user, valid_code)
1293 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
1294 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('manager@synnefo.org')), 1)
1295 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('helpdesk@synnefo.org')), 1)
1296 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(get_mailbox('admin@synnefo.org')), 1)
1297 e7cb4085 Kostas Papadimitriou
        self.assertEqual(len(mail.outbox), 2)
1298 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1299 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated, False)
1300 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated_at, None)
1301 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, True)
1302 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
1303 e7cb4085 Kostas Papadimitriou
1304 e7cb4085 Kostas Papadimitriou
        # test code reuse
1305 e7cb4085 Kostas Papadimitriou
        result = backend.handle_verification(user, valid_code)
1306 e7cb4085 Kostas Papadimitriou
        self.assertEqual(result.status, backend.Result.ERROR)
1307 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1308 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, False)
1309 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated, False)
1310 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated_at, None)
1311 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, True)
1312 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
1313 e7cb4085 Kostas Papadimitriou
1314 e7cb4085 Kostas Papadimitriou
        # valid code on verified user
1315 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1316 e7cb4085 Kostas Papadimitriou
        valid_code = user.verification_code
1317 e7cb4085 Kostas Papadimitriou
        result = backend.handle_verification(user, valid_code)
1318 e7cb4085 Kostas Papadimitriou
        self.assertEqual(result.status, backend.Result.ERROR)
1319 e7cb4085 Kostas Papadimitriou
1320 e7cb4085 Kostas Papadimitriou
        # step three, moderation user
1321 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1322 e7cb4085 Kostas Papadimitriou
        result = backend.handle_moderation(user)
1323 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
1324 e7cb4085 Kostas Papadimitriou
1325 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get()
1326 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.is_active, True)
1327 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.moderated, True)
1328 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.moderated_at)
1329 e7cb4085 Kostas Papadimitriou
        self.assertEqual(user.email_verified, True)
1330 e7cb4085 Kostas Papadimitriou
        self.assertTrue(user.activation_sent)
1331 5b65fb47 Kostas Papadimitriou
1332 5b65fb47 Kostas Papadimitriou
1333 5b65fb47 Kostas Papadimitriou
class TestWebloginRedirect(TestCase):
1334 5b65fb47 Kostas Papadimitriou
1335 5b65fb47 Kostas Papadimitriou
    @with_settings(settings, COOKIE_DOMAIN='.astakos.synnefo.org')
1336 5b65fb47 Kostas Papadimitriou
    def test_restricts_domains(self):
1337 5b65fb47 Kostas Papadimitriou
        get_local_user('user1@synnefo.org')
1338 5b65fb47 Kostas Papadimitriou
1339 5b65fb47 Kostas Papadimitriou
        # next url construct helpers
1340 5b65fb47 Kostas Papadimitriou
        weblogin = lambda nxt: reverse('weblogin') + '?next=%s' % nxt
1341 5b65fb47 Kostas Papadimitriou
        weblogin_quoted = lambda nxt: reverse('weblogin') + '?next=%s' % \
1342 5b65fb47 Kostas Papadimitriou
            urllib.quote_plus(nxt)
1343 5b65fb47 Kostas Papadimitriou
1344 5b65fb47 Kostas Papadimitriou
        # common cases
1345 5b65fb47 Kostas Papadimitriou
        invalid_domain = weblogin("https://www.invaliddomain.synnefo.org")
1346 5b65fb47 Kostas Papadimitriou
        invalid_scheme = weblogin("customscheme://localhost")
1347 5b65fb47 Kostas Papadimitriou
        invalid_scheme_with_valid_domain = \
1348 8fb8d0cf Giorgos Korfiatis
            weblogin("http://www.invaliddomain.com")
1349 5b65fb47 Kostas Papadimitriou
        valid_scheme = weblogin("pithos://localhost/")
1350 5b65fb47 Kostas Papadimitriou
        # to be used in assertRedirects
1351 5b65fb47 Kostas Papadimitriou
        valid_scheme_quoted = weblogin_quoted("pithos://localhost/")
1352 5b65fb47 Kostas Papadimitriou
1353 5b65fb47 Kostas Papadimitriou
        # not authenticated, redirects to login which contains next param with
1354 5b65fb47 Kostas Papadimitriou
        # additional nested quoted next params
1355 5b65fb47 Kostas Papadimitriou
        r = self.client.get(valid_scheme, follow=True)
1356 1ecda536 Kostas Papadimitriou
        login_redirect = reverse('login') + '?next=' + \
1357 5b65fb47 Kostas Papadimitriou
            urllib.quote_plus("http://testserver" + valid_scheme_quoted)
1358 5b65fb47 Kostas Papadimitriou
        self.assertRedirects(r, login_redirect)
1359 5b65fb47 Kostas Papadimitriou
1360 5b65fb47 Kostas Papadimitriou
        # authenticate client
1361 5b65fb47 Kostas Papadimitriou
        self.client.login(username="user1@synnefo.org", password="password")
1362 5b65fb47 Kostas Papadimitriou
1363 5b65fb47 Kostas Papadimitriou
        # valid scheme
1364 5b65fb47 Kostas Papadimitriou
        r = self.client.get(valid_scheme, follow=True)
1365 5b65fb47 Kostas Papadimitriou
        url = r.redirect_chain[1][0]
1366 5b65fb47 Kostas Papadimitriou
        # scheme preserved
1367 5b65fb47 Kostas Papadimitriou
        self.assertTrue(url.startswith('pithos://localhost/'))
1368 5b65fb47 Kostas Papadimitriou
        # redirect contains token param
1369 28a890d3 Kostas Papadimitriou
        params = urlparse.urlparse(url.replace('pithos', 'https'),
1370 28a890d3 Kostas Papadimitriou
                                   scheme='https').query
1371 5b65fb47 Kostas Papadimitriou
        params = urlparse.parse_qs(params)
1372 5b65fb47 Kostas Papadimitriou
        self.assertEqual(params['token'][0],
1373 5b65fb47 Kostas Papadimitriou
                         AstakosUser.objects.get().auth_token)
1374 5b65fb47 Kostas Papadimitriou
        # does not contain uuid
1375 387eee94 Kostas Papadimitriou
        # reverted for 0.14.2 to support old pithos desktop clients
1376 387eee94 Kostas Papadimitriou
        #self.assertFalse('uuid' in params)
1377 5b65fb47 Kostas Papadimitriou
1378 5b65fb47 Kostas Papadimitriou
        # invalid cases
1379 5b65fb47 Kostas Papadimitriou
        r = self.client.get(invalid_scheme, follow=True)
1380 5b65fb47 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
1381 5b65fb47 Kostas Papadimitriou
1382 5b65fb47 Kostas Papadimitriou
        r = self.client.get(invalid_scheme_with_valid_domain, follow=True)
1383 5b65fb47 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)
1384 5b65fb47 Kostas Papadimitriou
1385 5b65fb47 Kostas Papadimitriou
        r = self.client.get(invalid_domain, follow=True)
1386 5b65fb47 Kostas Papadimitriou
        self.assertEqual(r.status_code, 403)