Revision e7cb4085 snf-astakos-app/astakos/im/tests.py

b/snf-astakos-app/astakos/im/tests.py
38 38

  
39 39
from snf_django.utils.testing import with_settings, override_settings
40 40

  
41
from django.test import TestCase, Client
41
from django.test import Client
42
from django.test import TransactionTestCase as TestCase
42 43
from django.core import mail
43 44
from django.http import SimpleCookie, HttpRequest, QueryDict
44 45
from django.utils.importlib import import_module
......
50 51
from astakos.im import functions
51 52
from astakos.im import settings as astakos_settings
52 53
from astakos.im import forms
54
from astakos.im import activation_backends
53 55

  
54 56
from urllib import quote
55 57
from datetime import timedelta
......
154 156
            user_params.update(kwargs)
155 157
            user = AstakosUser(**user_params)
156 158
            user.set_password(kwargs.get('password', 'password'))
159
            user.renew_verification_code()
157 160
            user.save()
158 161
            user.add_auth_provider('local', auth_backend='astakos')
159 162
            if kwargs.get('is_active', True):
......
206 209
        astakos_settings.SHIBBOLETH_REQUIRE_NAME_INFO = False
207 210

  
208 211
        # shibboleth logged us in
209
        client.set_tokens(mail="kpap@grnet.gr", eppn="kpapeppn",
212
        client.set_tokens(mail="kpap@synnefo.org", eppn="kpapeppn",
210 213
                          cn="Kostas Papadimitriou",
211 214
                          ep_affiliation="Test Affiliation")
212 215
        r = client.get('/im/login/shibboleth?', follow=True)
......
252 255
        existing_user.delete()
253 256

  
254 257
        # and finally a valid signup
255
        post_data['email'] = 'kpap@grnet.gr'
258
        post_data['email'] = 'kpap@synnefo.org'
256 259
        r = client.post(signup_url, post_data, follow=True)
257
        self.assertContains(r, messages.NOTIFICATION_SENT)
260
        self.assertContains(r, messages.VERIFICATION_SENT)
258 261

  
259
        # everything is ok in our db
262
        # entires commited as expected
260 263
        self.assertEqual(AstakosUser.objects.count(), 1)
261 264
        self.assertEqual(AstakosUserAuthProvider.objects.count(), 1)
262 265
        self.assertEqual(PendingThirdPartyUser.objects.count(), 0)
......
264 267
        # provider info stored
265 268
        provider = AstakosUserAuthProvider.objects.get(module="shibboleth")
266 269
        self.assertEqual(provider.affiliation, 'Test Affiliation')
267
        self.assertEqual(provider.info, {u'email': u'kpap@grnet.gr',
270
        self.assertEqual(provider.info, {u'email': u'kpap@synnefo.org',
268 271
                                         u'eppn': u'kpapeppn',
269 272
                                         u'name': u'Kostas Papadimitriou'})
270 273

  
271
        # lets login (not activated yet)
272
        client.set_tokens(mail="kpap@grnet.gr", eppn="kpapeppn",
274
        # login (not activated yet)
275
        client.set_tokens(mail="kpap@synnefo.org", eppn="kpapeppn",
273 276
                          cn="Kostas Papadimitriou", )
274 277
        r = client.get("/im/login/shibboleth?", follow=True)
275 278
        self.assertContains(r, 'is pending moderation')
276 279

  
277
        # admin activates our user
278
        u = AstakosUser.objects.get(username="kpap@grnet.gr")
279
        functions.activate(u)
280
        # admin activates the user
281
        u = AstakosUser.objects.get(username="kpap@synnefo.org")
282
        backend = activation_backends.get_backend()
283
        activation_result = backend.verify_user(u, u.verification_code)
284
        activation_result = backend.accept_user(u)
285
        self.assertFalse(activation_result.is_error())
286
        backend.send_result_notifications(activation_result, u)
280 287
        self.assertEqual(u.is_active, True)
281 288

  
282 289
        # we see our profile
......
290 297
        """
291 298

  
292 299
        # this is our existing user
293
        existing_user = get_local_user('kpap@grnet.gr')
294
        existing_inactive = get_local_user('kpap-inactive@grnet.gr')
300
        existing_user = get_local_user('kpap@synnefo.org')
301
        existing_inactive = get_local_user('kpap-inactive@synnefo.org')
295 302
        existing_inactive.is_active = False
296 303
        existing_inactive.save()
297 304

  
298
        existing_unverified = get_local_user('kpap-unverified@grnet.gr')
305
        existing_unverified = get_local_user('kpap-unverified@synnefo.org')
299 306
        existing_unverified.is_active = False
300 307
        existing_unverified.activation_sent = None
301 308
        existing_unverified.email_verified = False
......
316 323
        client.reset_tokens()
317 324
        self.assertRedirects(r, "/im/signup?third_party_token=%s" % token)
318 325

  
319
        form = r.context['login_form']
326
        form = r.context['form']
320 327
        signupdata = copy.copy(form.initial)
321
        signupdata['email'] = 'kpap@grnet.gr'
328
        signupdata['email'] = 'kpap@synnefo.org'
322 329
        signupdata['third_party_token'] = token
323 330
        signupdata['provider'] = 'shibboleth'
324 331
        signupdata.pop('id', None)
......
328 335
        self.assertContains(r, "There is already an account with this email "
329 336
                               "address")
330 337
        # change the case, still cannot create
331
        signupdata['email'] = 'KPAP@grnet.GR'
338
        signupdata['email'] = 'KPAP@synnefo.org'
332 339
        r = client.post("/im/signup", signupdata)
333 340
        self.assertContains(r, "There is already an account with this email "
334 341
                               "address")
335 342
        # inactive user
336
        signupdata['email'] = 'KPAP-inactive@grnet.GR'
343
        signupdata['email'] = 'KPAP-inactive@synnefo.org'
337 344
        r = client.post("/im/signup", signupdata)
338 345
        self.assertContains(r, "There is already an account with this email "
339 346
                               "address")
340 347

  
341 348
        # unverified user, this should pass, old entry will be deleted
342
        signupdata['email'] = 'KAPAP-unverified@grnet.GR'
349
        signupdata['email'] = 'KAPAP-unverified@synnefo.org'
343 350
        r = client.post("/im/signup", signupdata)
344 351

  
345 352
        post_data = {'password': 'password',
346
                     'username': 'kpap@grnet.gr'}
353
                     'username': 'kpap@synnefo.org'}
347 354
        r = client.post('/im/local', post_data, follow=True)
348 355
        self.assertTrue(r.context['request'].user.is_authenticated())
349 356
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
......
363 370
                          cn="Kostas Papadimitriou")
364 371
        r = client.get("/im/login/shibboleth?", follow=True)
365 372
        self.assertTrue(r.context['request'].user.is_authenticated())
366
        self.assertTrue(r.context['request'].user.email == "kpap@grnet.gr")
373
        self.assertTrue(r.context['request'].user.email == "kpap@synnefo.org")
367 374
        self.assertRedirects(r, '/im/landing')
368 375
        self.assertEqual(r.status_code, 200)
369 376
        client.logout()
......
375 382

  
376 383
        # login with local account also works
377 384
        post_data = {'password': 'password',
378
                     'username': 'kpap@grnet.gr'}
385
                     'username': 'kpap@synnefo.org'}
379 386
        r = self.client.post('/im/local', post_data, follow=True)
380 387
        self.assertTrue(r.context['request'].user.is_authenticated())
381
        self.assertTrue(r.context['request'].user.email == "kpap@grnet.gr")
388
        self.assertTrue(r.context['request'].user.email == "kpap@synnefo.org")
382 389
        self.assertRedirects(r, '/im/landing')
383 390
        self.assertEqual(r.status_code, 200)
384 391

  
......
403 410
        client.reset_tokens()
404 411

  
405 412
        # cannot login with another eppn
406
        client.set_tokens(mail="kpap@grnet.gr", eppn="kpapeppninvalid",
413
        client.set_tokens(mail="kpap@synnefo.org", eppn="kpapeppninvalid",
407 414
                          cn="Kostas Papadimitriou")
408 415
        r = client.get("/im/login/shibboleth?", follow=True)
409 416
        self.assertFalse(r.context['request'].user.is_authenticated())
......
411 418
        # cannot
412 419

  
413 420
        # lets remove local password
414
        user = AstakosUser.objects.get(username="kpap@grnet.gr",
415
                                       email="kpap@grnet.gr")
421
        user = AstakosUser.objects.get(username="kpap@synnefo.org",
422
                                       email="kpap@synnefo.org")
416 423
        remove_local_url = user.get_auth_provider('local').get_remove_url
417 424
        remove_shibbo_url = user.get_auth_provider('shibboleth',
418 425
                                                   'kpapeppn').get_remove_url
......
432 439

  
433 440
        # cannot login using local credentials (notice we use another client)
434 441
        post_data = {'password': 'password',
435
                     'username': 'kpap@grnet.gr'}
442
                     'username': 'kpap@synnefo.org'}
436 443
        r = self.client.post('/im/local', post_data, follow=True)
437 444
        self.assertFalse(r.context['request'].user.is_authenticated())
438 445

  
......
450 457

  
451 458
        # now we can login
452 459
        post_data = {'password': '111',
453
                     'username': 'kpap@grnet.gr'}
460
                     'username': 'kpap@synnefo.org'}
454 461
        r = self.client.post('/im/local', post_data, follow=True)
455 462
        self.assertTrue(r.context['request'].user.is_authenticated())
456 463

  
457 464
        client.reset_tokens()
458 465

  
459 466
        # we cannot take over another shibboleth identifier
460
        user2 = get_local_user('another@grnet.gr')
467
        user2 = get_local_user('another@synnefo.org')
461 468
        user2.add_auth_provider('shibboleth', identifier='existingeppn')
462 469
        # login
463 470
        client.set_tokens(mail="kpap@shibboleth.gr", eppn="kpapeppn",
......
475 482
    fixtures = ['groups']
476 483

  
477 484
    def setUp(self):
478
        settings.ADMINS = (('admin', 'support@cloud.grnet.gr'),)
479
        settings.SERVER_EMAIL = 'no-reply@grnet.gr'
485
        settings.ADMINS = (('admin', 'support@cloud.synnefo.org'),)
486
        settings.SERVER_EMAIL = 'no-reply@synnefo.org'
480 487
        self._orig_moderation = astakos_settings.MODERATION_ENABLED
481 488
        settings.ASTAKOS_MODERATION_ENABLED = True
482 489

  
......
490 497
        # create a new user
491 498
        r = self.client.get("/im/signup")
492 499
        self.assertEqual(r.status_code, 200)
493
        data = {'email': 'kpap@grnet.gr', 'password1': 'password',
500
        data = {'email': 'kpap@synnefo.org', 'password1': 'password',
494 501
                'password2': 'password', 'first_name': 'Kostas',
495 502
                'last_name': 'Mitroglou', 'provider': 'local'}
496 503
        r = self.client.post("/im/signup", data)
497 504

  
498 505
        # user created
499 506
        self.assertEqual(AstakosUser.objects.count(), 1)
500
        user = AstakosUser.objects.get(username="kpap@grnet.gr",
501
                                       email="kpap@grnet.gr")
502
        self.assertEqual(user.username, 'kpap@grnet.gr')
507
        user = AstakosUser.objects.get(username="kpap@synnefo.org",
508
                                       email="kpap@synnefo.org")
509
        self.assertEqual(user.username, 'kpap@synnefo.org')
503 510
        self.assertEqual(user.has_auth_provider('local'), True)
504 511
        self.assertFalse(user.is_active)
505 512

  
506 513
        # user (but not admin) gets notified
507
        self.assertEqual(len(get_mailbox('support@cloud.grnet.gr')), 0)
508
        self.assertEqual(len(get_mailbox('kpap@grnet.gr')), 1)
514
        self.assertEqual(len(get_mailbox('support@cloud.synnefo.org')), 0)
515
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
509 516
        astakos_settings.MODERATION_ENABLED = True
510 517

  
511 518
    def test_email_case(self):
512 519
        data = {
513
            'email': 'kPap@grnet.gr',
520
            'email': 'kPap@synnefo.org',
514 521
            'password1': '1234',
515 522
            'password2': '1234'
516 523
        }
......
521 528
        form.store_user(user, {})
522 529

  
523 530
        u = AstakosUser.objects.get()
524
        self.assertEqual(u.email, 'kPap@grnet.gr')
525
        self.assertEqual(u.username, 'kpap@grnet.gr')
531
        self.assertEqual(u.email, 'kPap@synnefo.org')
532
        self.assertEqual(u.username, 'kpap@synnefo.org')
526 533
        u.is_active = True
527 534
        u.email_verified = True
528 535
        u.save()
529 536

  
530
        data = {'username': 'kpap@grnet.gr', 'password': '1234'}
537
        data = {'username': 'kpap@synnefo.org', 'password': '1234'}
531 538
        login = forms.LoginForm(data=data)
532 539
        self.assertTrue(login.is_valid())
533 540

  
534
        data = {'username': 'KpaP@grnet.gr', 'password': '1234'}
541
        data = {'username': 'KpaP@synnefo.org', 'password': '1234'}
535 542
        login = forms.LoginForm(data=data)
536 543
        self.assertTrue(login.is_valid())
537 544

  
538 545
        data = {
539
            'email': 'kpap@grnet.gr',
546
            'email': 'kpap@synnefo.org',
540 547
            'password1': '1234',
541 548
            'password2': '1234'
542 549
        }
......
544 551
        self.assertFalse(form.is_valid())
545 552

  
546 553
    @im_settings(HELPDESK=(('support', 'support@synnefo.org'),),
547
                 FORCE_PROFILE_UPDATE=False)
554
                 FORCE_PROFILE_UPDATE=False, MODERATION_ENABLED=True)
548 555
    def test_local_provider(self):
549 556
        self.helpdesk_email = astakos_settings.HELPDESK[0][1]
550
        # enable moderation
551
        astakos_settings.MODERATION_ENABLED = True
552 557

  
553 558
        # create a user
554 559
        r = self.client.get("/im/signup")
555 560
        self.assertEqual(r.status_code, 200)
556
        data = {'email': 'kpap@grnet.gr', 'password1': 'password',
561
        data = {'email': 'kpap@synnefo.org', 'password1': 'password',
557 562
                'password2': 'password', 'first_name': 'Kostas',
558 563
                'last_name': 'Mitroglou', 'provider': 'local'}
559 564
        r = self.client.post("/im/signup", data)
560 565

  
561 566
        # user created
562 567
        self.assertEqual(AstakosUser.objects.count(), 1)
563
        user = AstakosUser.objects.get(username="kpap@grnet.gr",
564
                                       email="kpap@grnet.gr")
565
        self.assertEqual(user.username, 'kpap@grnet.gr')
568
        user = AstakosUser.objects.get(username="kpap@synnefo.org",
569
                                       email="kpap@synnefo.org")
570
        self.assertEqual(user.username, 'kpap@synnefo.org')
566 571
        self.assertEqual(user.has_auth_provider('local'), True)
567 572
        self.assertFalse(user.is_active)  # not activated
568 573
        self.assertFalse(user.email_verified)  # not verified
569
        self.assertFalse(user.activation_sent)  # activation automatically sent
574
        self.assertTrue(user.activation_sent)  # activation automatically sent
575
        self.assertFalse(user.moderated)
576
        self.assertFalse(user.email_verified)
570 577

  
571 578
        # admin gets notified and activates the user from the command line
572
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 1)
573
        r = self.client.post('/im/local', {'username': 'kpap@grnet.gr',
574
                                           'password': 'password'})
575
        self.assertContains(r, messages.NOTIFICATION_SENT)
576
        functions.send_activation(user)
579
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
580
        r = self.client.post('/im/local', {'username': 'kpap@synnefo.org',
581
                                           'password': 'password'},
582
                             follow=True)
583
        self.assertContains(r, messages.VERIFICATION_SENT)
584
        backend = activation_backends.get_backend()
585

  
586
        user = AstakosUser.objects.get(username="kpap@synnefo.org")
587
        backend.send_user_verification_email(user)
577 588

  
578 589
        # user activation fields updated and user gets notified via email
579 590
        user = AstakosUser.objects.get(pk=user.pk)
580 591
        self.assertTrue(user.activation_sent)
581 592
        self.assertFalse(user.email_verified)
582 593
        self.assertFalse(user.is_active)
583
        self.assertEqual(len(get_mailbox('kpap@grnet.gr')), 1)
594
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 2)
584 595

  
585 596
        # user forgot she got registered and tries to submit registration
586 597
        # form. Notice the upper case in email
587
        data = {'email': 'KPAP@grnet.gr', 'password1': 'password',
598
        data = {'email': 'KPAP@synnefo.org', 'password1': 'password',
588 599
                'password2': 'password', 'first_name': 'Kostas',
589 600
                'last_name': 'Mitroglou', 'provider': 'local'}
590 601
        r = self.client.post("/im/signup", data, follow=True)
591 602
        self.assertRedirects(r, reverse('index'))
592
        self.assertContains(r, messages.NOTIFICATION_SENT)
603
        self.assertContains(r, messages.VERIFICATION_SENT)
593 604

  
594 605
        user = AstakosUser.objects.get()
595
        functions.send_activation(user)
596

  
597 606
        # previous user replaced
598 607
        self.assertTrue(user.activation_sent)
599 608
        self.assertFalse(user.email_verified)
600 609
        self.assertFalse(user.is_active)
601
        self.assertEqual(len(get_mailbox('KPAP@grnet.gr')), 1)
610
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 1)
602 611

  
603 612
        # hmmm, email exists; lets request a password change
604 613
        r = self.client.get('/im/local/password_reset')
605 614
        self.assertEqual(r.status_code, 200)
606
        data = {'email': 'kpap@grnet.gr'}
615
        data = {'email': 'kpap@synnefo.org'}
607 616
        r = self.client.post('/im/local/password_reset', data, follow=True)
608 617
        # she can't because account is not active yet
609 618
        self.assertContains(r, 'pending activation')
......
612 621
        # so user can trigger resend of the activation email
613 622
        r = self.client.get('/im/send/activation/%d' % user.pk, follow=True)
614 623
        self.assertContains(r, 'has been sent to your email address.')
615
        self.assertEqual(len(get_mailbox('KPAP@grnet.gr')), 2)
624
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 2)
616 625

  
617 626
        # also she cannot login
618
        data = {'username': 'kpap@grnet.gr', 'password': 'password'}
627
        data = {'username': 'kpap@synnefo.org', 'password': 'password'}
619 628
        r = self.client.post('/im/local', data, follow=True)
620 629
        self.assertContains(r, 'Resend activation')
621 630
        self.assertFalse(r.context['request'].user.is_authenticated())
......
623 632

  
624 633
        # user sees the message and resends activation
625 634
        r = self.client.get('/im/send/activation/%d' % user.pk, follow=True)
626
        self.assertEqual(len(get_mailbox('KPAP@grnet.gr')), 3)
635
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 3)
627 636

  
628
        # switch back moderation setting
629
        astakos_settings.MODERATION_ENABLED = True
637
        # logged in user cannot activate another account
638
        tmp_user = get_local_user("test_existing_user@synnefo.org")
639
        tmp_client = Client()
640
        tmp_client.login(username="test_existing_user@synnefo.org",
641
                         password="password")
642
        r = tmp_client.get(user.get_activation_url(), follow=True)
643
        self.assertContains(r, messages.LOGGED_IN_WARNING)
644

  
645
        r = self.client.get(user.get_activation_url(), follow=True)
646
        # previous code got invalidated
647
        self.assertEqual(r.status_code, 404)
648

  
649
        user = AstakosUser.objects.get(pk=user.pk)
650
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 0)
630 651
        r = self.client.get(user.get_activation_url(), follow=True)
631
        self.assertRedirects(r, "/im/landing")
652
        self.assertRedirects(r, reverse('index'))
653
        # user sees that account is pending approval from admins
654
        self.assertContains(r, messages.NOTIFICATION_SENT)
655
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 1)
656

  
657
        user = AstakosUser.objects.get(email="KPAP@synnefo.org")
658
        result = backend.handle_moderation(user)
659
        backend.send_result_notifications(result, user)
660
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 4)
661
        self.assertEqual(len(get_mailbox(self.helpdesk_email)), 2)
662

  
663
        user = AstakosUser.objects.get(email="KPAP@synnefo.org")
632 664
        r = self.client.get('/im/profile', follow=True)
633
        self.assertTrue(r.context['request'].user.is_authenticated())
634
        self.assertTrue('_pithos2_a' in self.client.cookies)
635
        self.assertContains(r, "KPAP@grnet.gr")
636
        self.assertEqual(len(get_mailbox('KPAP@grnet.gr')), 4)
665
        self.assertFalse(r.context['request'].user.is_authenticated())
666
        self.assertFalse('_pithos2_a' in self.client.cookies)
667
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 4)
637 668

  
638 669
        user = AstakosUser.objects.get(pk=user.pk)
670
        r = self.client.post('/im/local', {'username': 'kpap@synnefo.org',
671
                                           'password': 'password'},
672
                             follow=True)
639 673
        # user activated and logged in, token cookie set
640 674
        self.assertTrue(r.context['request'].user.is_authenticated())
641 675
        self.assertTrue('_pithos2_a' in self.client.cookies)
......
652 686
        del self.client.cookies['_pithos2_a']
653 687

  
654 688
        # user can login
655
        r = self.client.post('/im/local', {'username': 'kpap@grnet.gr',
689
        r = self.client.post('/im/local', {'username': 'kpap@synnefo.org',
656 690
                                           'password': 'password'},
657 691
                             follow=True)
658 692
        self.assertTrue(r.context['request'].user.is_authenticated())
......
667 701
        r = self.client.get('/im/local/password_reset')
668 702
        self.assertEqual(r.status_code, 200)
669 703
        r = self.client.post('/im/local/password_reset', {'email':
670
                                                          'kpap@grnet.gr'})
704
                                                          'kpap@synnefo.org'})
671 705
        self.assertEqual(r.status_code, 302)
672 706
        # email sent
673
        self.assertEqual(len(get_mailbox('KPAP@grnet.gr')), 5)
707
        self.assertEqual(len(get_mailbox('KPAP@synnefo.org')), 5)
674 708

  
675 709
        # user visits change password link
676
        # "Refresh" user because created url is based on last_login timestamp
677 710
        user = AstakosUser.objects.get(pk=user.pk)
678 711
        r = self.client.get(user.get_password_reset_url())
679 712
        r = self.client.post(user.get_password_reset_url(),
......
684 717
        self.assertNotEqual(old_pass, user.password)
685 718

  
686 719
        # old pass is not usable
687
        r = self.client.post('/im/local', {'username': 'kpap@grnet.gr',
720
        r = self.client.post('/im/local', {'username': 'kpap@synnefo.org',
688 721
                                           'password': 'password'})
689 722
        self.assertContains(r, 'Please enter a correct username and password')
690
        r = self.client.post('/im/local', {'username': 'kpap@grnet.gr',
723
        r = self.client.post('/im/local', {'username': 'kpap@synnefo.org',
691 724
                                           'password': 'newpass'},
692 725
                             follow=True)
693 726
        self.assertTrue(r.context['request'].user.is_authenticated())
......
702 735
        r = self.client.get('/im/local/password_reset')
703 736
        self.assertEqual(r.status_code, 200)
704 737
        r = self.client.post('/im/local/password_reset', {'email':
705
                                                          'kpap@grnet.gr'})
738
                                                          'kpap@synnefo.org'})
706 739
        # she can't because account is not active yet
707 740
        self.assertContains(r, "Changing password is not")
708 741

  
......
711 744

  
712 745
    def test_email_change(self):
713 746
        # to test existing email validation
714
        get_local_user('existing@grnet.gr')
747
        get_local_user('existing@synnefo.org')
715 748

  
716 749
        # local user
717
        user = get_local_user('kpap@grnet.gr')
750
        user = get_local_user('kpap@synnefo.org')
718 751

  
719 752
        # login as kpap
720
        self.client.login(username='kpap@grnet.gr', password='password')
753
        self.client.login(username='kpap@synnefo.org', password='password')
721 754
        r = self.client.get('/im/profile', follow=True)
722 755
        user = r.context['request'].user
723 756
        self.assertTrue(user.is_authenticated())
......
728 761
        self.assertFalse(user.email_change_is_pending())
729 762

  
730 763
        # request email change to an existing email fails
731
        data = {'new_email_address': 'existing@grnet.gr'}
764
        data = {'new_email_address': 'existing@synnefo.org'}
732 765
        r = self.client.post('/im/email_change', data)
733 766
        self.assertContains(r, messages.EMAIL_USED)
734 767

  
......
746 779
        self.assertTrue(user.email_change_is_pending())
747 780

  
748 781
        # link was sent
749
        self.assertEqual(len(get_mailbox('kpap@grnet.gr')), 0)
782
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 0)
750 783
        self.assertEqual(len(get_mailbox('kpap@gmail.com')), 1)
751 784

  
752 785
        # proper email change
......
754 787
        r = self.client.post('/im/email_change', data, follow=True)
755 788
        self.assertRedirects(r, '/im/profile')
756 789
        self.assertContains(r, messages.EMAIL_CHANGE_REGISTERED)
757
        self.assertEqual(len(get_mailbox('kpap@grnet.gr')), 0)
790
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 0)
758 791
        self.assertEqual(len(get_mailbox('kpap@yahoo.com')), 1)
759 792
        change2 = EmailChange.objects.get()
760 793

  
......
763 796
        self.client.logout()
764 797

  
765 798
        r = self.client.post('/im/local?next=' + change2.get_url(),
766
                             {'username': 'kpap@grnet.gr',
799
                             {'username': 'kpap@synnefo.org',
767 800
                              'password': 'password',
768 801
                              'next': change2.get_url()},
769 802
                             follow=True)
......
774 807

  
775 808
        self.client.logout()
776 809
        r = self.client.post('/im/local?next=' + change2.get_url(),
777
                             {'username': 'kpap@grnet.gr',
810
                             {'username': 'kpap@synnefo.org',
778 811
                              'password': 'password',
779 812
                              'next': change2.get_url()},
780 813
                             follow=True)
......
793 826
        Pending = PendingThirdPartyUser
794 827
        User = AstakosUser
795 828

  
796
        User.objects.create(email="newuser@grnet.gr")
797
        get_local_user("olduser@grnet.gr")
829
        User.objects.create(email="newuser@synnefo.org")
830
        get_local_user("olduser@synnefo.org")
798 831
        cl_olduser = ShibbolethClient()
799
        get_local_user("olduser2@grnet.gr")
832
        get_local_user("olduser2@synnefo.org")
800 833
        ShibbolethClient()
801 834
        cl_newuser = ShibbolethClient()
802 835
        cl_newuser2 = Client()
......
812 845
                                                          login=False,
813 846
                                                          add=False)
814 847

  
815

  
816 848
        # new academic user
817
        self.assertFalse(academic_users.filter(email='newuser@grnet.gr'))
849
        self.assertFalse(academic_users.filter(email='newuser@synnefo.org'))
818 850
        cl_newuser.set_tokens(eppn="newusereppn")
819 851
        r = cl_newuser.get('/im/login/shibboleth?', follow=True)
820 852
        pending = Pending.objects.get()
......
826 858
                       'provider': 'shibboleth'}
827 859
        r = cl_newuser.post('/im/signup', signup_data)
828 860
        self.assertContains(r, "This field is required", )
829
        signup_data['email'] = 'olduser@grnet.gr'
861
        signup_data['email'] = 'olduser@synnefo.org'
830 862
        r = cl_newuser.post('/im/signup', signup_data)
831 863
        self.assertContains(r, "already an account with this email", )
832
        signup_data['email'] = 'newuser@grnet.gr'
864
        signup_data['email'] = 'newuser@synnefo.org'
833 865
        r = cl_newuser.post('/im/signup', signup_data, follow=True)
834 866
        r = cl_newuser.post('/im/signup', signup_data, follow=True)
835 867
        self.assertEqual(r.status_code, 404)
836
        newuser = User.objects.get(email="newuser@grnet.gr")
868
        newuser = User.objects.get(email="newuser@synnefo.org")
837 869
        activation_link = newuser.get_activation_url()
838
        self.assertTrue(academic_users.get(email='newuser@grnet.gr'))
870
        self.assertTrue(academic_users.get(email='newuser@synnefo.org'))
839 871

  
840 872
        # new non-academic user
841 873
        signup_data = {'first_name': 'Non Academic',
......
843 875
                       'provider': 'local',
844 876
                       'password1': 'password',
845 877
                       'password2': 'password'}
846
        signup_data['email'] = 'olduser@grnet.gr'
878
        signup_data['email'] = 'olduser@synnefo.org'
847 879
        r = cl_newuser2.post('/im/signup', signup_data)
848 880
        self.assertContains(r, 'There is already an account with this '
849 881
                               'email address')
850
        signup_data['email'] = 'newuser@grnet.gr'
882
        signup_data['email'] = 'newuser@synnefo.org'
851 883
        r = cl_newuser2.post('/im/signup/', signup_data)
852
        self.assertFalse(academic_users.filter(email='newuser@grnet.gr'))
884
        self.assertFalse(academic_users.filter(email='newuser@synnefo.org'))
853 885
        r = self.client.get(activation_link, follow=True)
854
        self.assertEqual(r.status_code, 400)
855
        newuser = User.objects.get(email="newuser@grnet.gr")
856
        self.assertFalse(newuser.activation_sent)
857
        r = self.client.get(newuser.get_activation_url(), follow=True)
858
        self.assertContains(r, "pending moderation")
886
        self.assertEqual(r.status_code, 404)
887
        newuser = User.objects.get(email="newuser@synnefo.org")
888
        self.assertTrue(newuser.activation_sent)
859 889

  
860
        self.assertFalse(academic_users.filter(email='newuser@grnet.gr'))
890
        # activation sent, user didn't open verification url so additional
891
        # registrations invalidate the previous signups.
892
        self.assertFalse(academic_users.filter(email='newuser@synnefo.org'))
861 893
        r = cl_newuser.get('/im/login/shibboleth?', follow=True)
862 894
        pending = Pending.objects.get()
863 895
        identifier = pending.third_party_identifier
......
866 898
                       'third_party_token': pending.token,
867 899
                       'last_name': 'New User',
868 900
                       'provider': 'shibboleth'}
869
        signup_data['email'] = 'newuser@grnet.gr'
901
        signup_data['email'] = 'newuser@synnefo.org'
870 902
        r = cl_newuser.post('/im/signup', signup_data)
871
        newuser = User.objects.get(email="newuser@grnet.gr")
903
        self.assertEqual(r.status_code, 302)
904
        newuser = User.objects.get(email="newuser@synnefo.org")
872 905
        self.assertTrue(newuser.activation_sent)
873 906
        activation_link = newuser.get_activation_url()
874
        self.assertTrue(academic_users.get(email='newuser@grnet.gr'))
907
        self.assertTrue(academic_users.get(email='newuser@synnefo.org'))
875 908
        r = cl_newuser.get(newuser.get_activation_url(), follow=True)
876 909
        self.assertRedirects(r, '/im/landing')
877
        newuser = User.objects.get(email="newuser@grnet.gr")
910
        newuser = User.objects.get(email="newuser@synnefo.org")
878 911
        self.assertEqual(newuser.is_active, True)
879 912
        self.assertEqual(newuser.email_verified, True)
880 913
        cl_newuser.logout()
......
883 916
        newuser.is_active = False
884 917
        newuser.save()
885 918
        r = cl_newuser.get(newuser.get_activation_url())
886
        newuser = User.objects.get(email="newuser@grnet.gr")
919
        newuser = User.objects.get(email="newuser@synnefo.org")
887 920
        self.assertFalse(newuser.is_active)
888 921

  
889 922
        # release suspension
......
898 931
        self.assertRedirects(r, '/im/profile')
899 932
        self.assertContains(r, 'disabled for your')
900 933

  
901
        cl_olduser.login(username='olduser@grnet.gr', password="password")
934
        cl_olduser.login(username='olduser@synnefo.org', password="password")
902 935
        r = cl_olduser.get('/im/profile', follow=True)
903 936
        self.assertEqual(r.status_code, 200)
904 937
        r = cl_olduser.get('/im/login/shibboleth?', follow=True)
......
910 943
        r = cl_olduser.get('/im/login/shibboleth?', follow=True)
911 944
        self.assertContains(r, 'Academic login enabled for this account')
912 945

  
913
        user = User.objects.get(email="olduser@grnet.gr")
946
        user = User.objects.get(email="olduser@synnefo.org")
914 947
        shib_provider = user.get_auth_provider('shibboleth', 'oldusereppn')
915 948
        local_provider = user.get_auth_provider('local')
916 949
        self.assertEqual(shib_provider.get_remove_policy, True)
917 950
        self.assertEqual(local_provider.get_remove_policy, True)
918 951

  
919

  
920 952
        policy_only_academic = Profile.objects.add_policy('academic_strict2',
921 953
                                                          'shibboleth',
922 954
                                                          academic_group,
......
929 961
        self.assertEqual(local_provider.get_login_policy, False)
930 962

  
931 963
        cl_olduser.logout()
932
        login_data = {'username': 'olduser@grnet.gr', 'password': 'password'}
964
        login_data = {'username': 'olduser@synnefo.org', 'password': 'password'}
933 965
        r = cl_olduser.post('/im/local', login_data, follow=True)
934 966
        self.assertContains(r, "href='/im/login/shibboleth'>Academic login")
935 967

  
......
941 973

  
942 974
    @im_settings(IM_MODULES=['local', 'shibboleth'])
943 975
    def test_create(self):
944
        user = AstakosUser.objects.create(email="kpap@grnet.gr")
945
        user2 = AstakosUser.objects.create(email="kpap2@grnet.gr")
976
        user = AstakosUser.objects.create(email="kpap@synnefo.org")
977
        user2 = AstakosUser.objects.create(email="kpap2@synnefo.org")
946 978

  
947 979
        module = 'shibboleth'
948 980
        identifier = 'SHIB_UUID'
......
995 1027
                        CREATION_GROUPS_POLICY=['localgroup-create',
996 1028
                                                'group-create'])
997 1029
    def test_add_groups(self):
998
        user = AstakosUser.objects.create(email="kpap@grnet.gr")
1030
        user = AstakosUser.objects.create(email="kpap@synnefo.org")
999 1031
        provider = auth.get_provider('shibboleth', user, 'test123')
1000 1032
        provider.add_to_user()
1001 1033
        user = AstakosUser.objects.get()
1002 1034
        self.assertEqual(sorted(user.groups.values_list('name', flat=True)),
1003
                         sorted([u'group1', u'group2', u'group-create']))
1035
                              sorted([u'group1', u'group2', u'group-create']))
1004 1036

  
1005 1037
        local = auth.get_provider('local', user)
1006 1038
        local.add_to_user()
......
1010 1042
        user = AstakosUser.objects.get()
1011 1043
        self.assertEqual(len(user.get_auth_providers()), 1)
1012 1044
        self.assertEqual(sorted(user.groups.values_list('name', flat=True)),
1013
                         sorted([u'group-create', u'localgroup']))
1045
                              sorted([u'group-create', u'localgroup']))
1014 1046

  
1015 1047
        local = user.get_auth_provider('local')
1016 1048
        self.assertRaises(Exception, local.remove_from_user)
......
1018 1050
        provider.add_to_user()
1019 1051
        user = AstakosUser.objects.get()
1020 1052
        self.assertEqual(sorted(user.groups.values_list('name', flat=True)),
1021
                         sorted([u'group-create', u'group1', u'group2',
1022
                                 u'localgroup']))
1053
                              sorted([u'group-create', u'group1', u'group2',
1054
                               u'localgroup']))
1055

  
1056

  
1023 1057

  
1024 1058
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1025 1059
    def test_policies(self):
......
1031 1065
        settings.ASTAKOS_AUTH_PROVIDER_GOOGLE_ADD_GROUPS_POLICY = \
1032 1066
            ['google-user']
1033 1067

  
1034
        user = AstakosUser.objects.create(email="kpap@grnet.gr")
1068
        user = AstakosUser.objects.create(email="kpap@synnefo.org")
1035 1069
        user.groups.add(group_old)
1036 1070
        user.add_auth_provider('local')
1037 1071

  
1038
        user2 = AstakosUser.objects.create(email="kpap2@grnet.gr")
1072
        user2 = AstakosUser.objects.create(email="kpap2@synnefo.org")
1039 1073
        user2.add_auth_provider('shibboleth', identifier='shibid')
1040 1074

  
1041
        user3 = AstakosUser.objects.create(email="kpap3@grnet.gr")
1075
        user3 = AstakosUser.objects.create(email="kpap3@synnefo.org")
1042 1076
        user3.groups.add(group_old)
1043 1077
        user3.add_auth_provider('local')
1044 1078
        user3.add_auth_provider('shibboleth', identifier='1234')
......
1129 1163
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1130 1164
    @shibboleth_settings(LIMIT_POLICY=2)
1131 1165
    def test_policies(self):
1132
        user = get_local_user('kpap@grnet.gr')
1166
        user = get_local_user('kpap@synnefo.org')
1133 1167
        user.add_auth_provider('shibboleth', identifier='1234')
1134 1168
        user.add_auth_provider('shibboleth', identifier='12345')
1135 1169

  
......
1151 1185
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1152 1186
    @shibboleth_settings(LIMIT_POLICY=2)
1153 1187
    def test_messages(self):
1154
        user = get_local_user('kpap@grnet.gr')
1188
        user = get_local_user('kpap@synnefo.org')
1155 1189
        user.add_auth_provider('shibboleth', identifier='1234')
1156 1190
        user.add_auth_provider('shibboleth', identifier='12345')
1157 1191
        provider = auth_providers.get_provider('shibboleth')
......
1184 1218
    @im_settings(IM_MODULES=['local', 'shibboleth'])
1185 1219
    @shibboleth_settings(LIMIT_POLICY=2)
1186 1220
    def test_templates(self):
1187
        user = get_local_user('kpap@grnet.gr')
1221
        user = get_local_user('kpap@synnefo.org')
1188 1222
        user.add_auth_provider('shibboleth', identifier='1234')
1189 1223
        user.add_auth_provider('shibboleth', identifier='12345')
1190 1224

  
......
1196 1230
                         'im/auth/generic_login.html')
1197 1231

  
1198 1232

  
1233
class TestActivationBackend(TestCase):
1234

  
1235
    def setUp(self):
1236
        # dummy call to pass through logging middleware
1237
        self.client.get('/im/')
1238

  
1239
    @im_settings(RE_USER_EMAIL_PATTERNS=['.*@synnefo.org'])
1240
    @shibboleth_settings(AUTOMODERATE_POLICY=True)
1241
    def test_policies(self):
1242
        backend = activation_backends.get_backend()
1243

  
1244
        # email matches RE_USER_EMAIL_PATTERNS
1245
        user1 = get_local_user('kpap@synnefo.org', moderated=False,
1246
                               is_active=False, email_verified=False)
1247
        backend.handle_verification(user1, user1.verification_code)
1248
        self.assertEqual(user1.accepted_policy, 'email')
1249

  
1250
        # manually moderated
1251
        user2 = get_local_user('kpap@synnefo-bad.org', moderated=False,
1252
                               is_active=False, email_verified=False)
1253

  
1254
        backend.handle_verification(user2, user2.verification_code)
1255
        self.assertEqual(user2.moderated, False)
1256
        backend.handle_moderation(user2)
1257
        self.assertEqual(user2.moderated, True)
1258
        self.assertEqual(user2.accepted_policy, 'manual')
1259

  
1260
        # autoaccept due to provider automoderate policy
1261
        user3 = get_local_user('kpap2@synnefo-bad.org', moderated=False,
1262
                               is_active=False, email_verified=False)
1263
        user3.auth_providers.all().delete()
1264
        user3.add_auth_provider('shibboleth', identifier='shib123')
1265
        backend.handle_verification(user3, user3.verification_code)
1266
        self.assertEqual(user3.moderated, True)
1267
        self.assertEqual(user3.accepted_policy, 'auth_provider_shibboleth')
1268

  
1269
    @im_settings(MODERATION_ENABLED=False,
1270
                 MANAGERS=(('Manager',
1271
                            'manager@synnefo.org'),),
1272
                 HELPDESK=(('Helpdesk',
1273
                            'helpdesk@synnefo.org'),),
1274
                 ADMINS=(('Admin', 'admin@synnefo.org'), ))
1275
    def test_without_moderation(self):
1276
        backend = activation_backends.get_backend()
1277
        form = backend.get_signup_form('local')
1278
        self.assertTrue(isinstance(form, forms.LocalUserCreationForm))
1279

  
1280
        user_data = {
1281
            'email': 'kpap@synnefo.org',
1282
            'first_name': 'Kostas Papas',
1283
            'password1': '123',
1284
            'password2': '123'
1285
        }
1286
        form = backend.get_signup_form('local', user_data)
1287
        user = form.save(commit=False)
1288
        form.store_user(user)
1289
        self.assertEqual(user.is_active, False)
1290
        self.assertEqual(user.email_verified, False)
1291

  
1292
        # step one, registration
1293
        result = backend.handle_registration(user)
1294
        user = AstakosUser.objects.get()
1295
        self.assertEqual(user.is_active, False)
1296
        self.assertEqual(user.email_verified, False)
1297
        self.assertTrue(user.verification_code)
1298
        self.assertEqual(result.status, backend.Result.PENDING_VERIFICATION)
1299
        backend.send_result_notifications(result, user)
1300
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
1301
        self.assertEqual(len(mail.outbox), 1)
1302

  
1303
        # step two, verify email (automatically
1304
        # moderates/accepts user, since moderation is disabled)
1305
        user = AstakosUser.objects.get()
1306
        valid_code = user.verification_code
1307

  
1308
        # test invalid code
1309
        result = backend.handle_verification(user, valid_code)
1310
        backend.send_result_notifications(result, user)
1311
        self.assertEqual(len(get_mailbox('manager@synnefo.org')), 1)
1312
        self.assertEqual(len(get_mailbox('helpdesk@synnefo.org')), 1)
1313
        self.assertEqual(len(get_mailbox('admin@synnefo.org')), 1)
1314
        # verification + activated + greeting = 3
1315
        self.assertEqual(len(mail.outbox), 3)
1316
        user = AstakosUser.objects.get()
1317
        self.assertEqual(user.is_active, True)
1318
        self.assertEqual(user.moderated, True)
1319
        self.assertTrue(user.moderated_at)
1320
        self.assertEqual(user.email_verified, True)
1321
        self.assertTrue(user.activation_sent)
1322

  
1323
    @im_settings(MODERATION_ENABLED=True,
1324
                 MANAGERS=(('Manager',
1325
                            'manager@synnefo.org'),),
1326
                 HELPDESK=(('Helpdesk',
1327
                            'helpdesk@synnefo.org'),),
1328
                 ADMINS=(('Admin', 'admin@synnefo.org'), ))
1329
    def test_with_moderation(self):
1330

  
1331
        backend = activation_backends.get_backend()
1332
        form = backend.get_signup_form('local')
1333
        self.assertTrue(isinstance(form, forms.LocalUserCreationForm))
1334

  
1335
        user_data = {
1336
            'email': 'kpap@synnefo.org',
1337
            'first_name': 'Kostas Papas',
1338
            'password1': '123',
1339
            'password2': '123'
1340
        }
1341
        form = backend.get_signup_form(provider='local',
1342
                                       initial_data=user_data)
1343
        user = form.save(commit=False)
1344
        form.store_user(user)
1345
        self.assertEqual(user.is_active, False)
1346
        self.assertEqual(user.email_verified, False)
1347

  
1348
        # step one, registration
1349
        result = backend.handle_registration(user)
1350
        user = AstakosUser.objects.get()
1351
        self.assertEqual(user.is_active, False)
1352
        self.assertEqual(user.email_verified, False)
1353
        self.assertTrue(user.verification_code)
1354
        self.assertEqual(result.status, backend.Result.PENDING_VERIFICATION)
1355
        backend.send_result_notifications(result, user)
1356
        self.assertEqual(len(get_mailbox('kpap@synnefo.org')), 1)
1357
        self.assertEqual(len(mail.outbox), 1)
1358

  
1359
        # step two, verifying email
1360
        user = AstakosUser.objects.get()
1361
        valid_code = user.verification_code
1362
        invalid_code = user.verification_code + 'invalid'
1363

  
1364
        # test invalid code
1365
        result = backend.handle_verification(user, invalid_code)
1366
        self.assertEqual(result.status, backend.Result.ERROR)
1367
        backend.send_result_notifications(result, user)
1368
        user = AstakosUser.objects.get()
1369
        self.assertEqual(user.is_active, False)
1370
        self.assertEqual(user.moderated, False)
1371
        self.assertEqual(user.moderated_at, None)
1372
        self.assertEqual(user.email_verified, False)
1373
        self.assertTrue(user.activation_sent)
1374

  
1375
        # test valid code
1376
        user = AstakosUser.objects.get()
1377
        result = backend.handle_verification(user, valid_code)
1378
        backend.send_result_notifications(result, user)
1379
        self.assertEqual(len(get_mailbox('manager@synnefo.org')), 1)
1380
        self.assertEqual(len(get_mailbox('helpdesk@synnefo.org')), 1)
1381
        self.assertEqual(len(get_mailbox('admin@synnefo.org')), 1)
1382
        self.assertEqual(len(mail.outbox), 2)
1383
        user = AstakosUser.objects.get()
1384
        self.assertEqual(user.moderated, False)
1385
        self.assertEqual(user.moderated_at, None)
1386
        self.assertEqual(user.email_verified, True)
1387
        self.assertTrue(user.activation_sent)
1388

  
1389
        # test code reuse
1390
        result = backend.handle_verification(user, valid_code)
1391
        self.assertEqual(result.status, backend.Result.ERROR)
1392
        user = AstakosUser.objects.get()
1393
        self.assertEqual(user.is_active, False)
1394
        self.assertEqual(user.moderated, False)
1395
        self.assertEqual(user.moderated_at, None)
1396
        self.assertEqual(user.email_verified, True)
1397
        self.assertTrue(user.activation_sent)
1398

  
1399
        # valid code on verified user
1400
        user = AstakosUser.objects.get()
1401
        valid_code = user.verification_code
1402
        result = backend.handle_verification(user, valid_code)
1403
        self.assertEqual(result.status, backend.Result.ERROR)
1404

  
1405
        # step three, moderation user
1406
        user = AstakosUser.objects.get()
1407
        result = backend.handle_moderation(user)
1408
        backend.send_result_notifications(result, user)
1409

  
1410
        user = AstakosUser.objects.get()
1411
        self.assertEqual(user.is_active, True)
1412
        self.assertEqual(user.moderated, True)
1413
        self.assertTrue(user.moderated_at)
1414
        self.assertEqual(user.email_verified, True)
1415
        self.assertTrue(user.activation_sent)
1416

  
1417

  
1199 1418
class TestProjects(TestCase):
1200 1419
    """
1201 1420
    Test projects.

Also available in: Unified diff