Statistics
| Branch: | Tag: | Revision:

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

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