Beispiel #1
0
 def test_to_dict(self):
     """
     Test that User objects can be recreated.
     """
     d1 = self.user1.to_dict()
     u2 = User(d1)
     d2 = u2.to_dict()
     self.assertEqual(d1, d2)
Beispiel #2
0
 def test_to_dict_old_format(self):
     """
     Test that User objects can be recreated.
     """
     d1 = self.user1.to_dict(old_userdb_format=True)
     u2 = User(d1)
     d2 = u2.to_dict(old_userdb_format=True)
     self.assertEqual(d1, d2)
Beispiel #3
0
class TestUser(TestCase):

    def setUp(self):
        self.data1 = {u'_id': ObjectId('547357c3d00690878ae9b620'),
                      u'eduPersonPrincipalName': u'guvat-nalif',
                      u'mail': u'*****@*****.**',
                      u'mailAliases': [{u'added_timestamp': datetime.datetime(2014, 12, 18, 11, 25, 19, 804000),
                                        u'email': u'*****@*****.**',
                                        u'verified': True}],
                      u'passwords': [{u'created_ts': datetime.datetime(2014, 11, 24, 16, 22, 49, 188000),
                                      u'id': ObjectId('54735b588a7d2a2c4ec3e7d0'),
                                      u'salt': u'$NDNv1H1$315d7$32$32$',
                                      u'source': u'dashboard'}],
                      u'norEduPersonNIN': [u'197801012345'],
                      u'subject': u'physical person',
                      u'eduPersonEntitlement': [u'http://foo.example.org'],
                      u'preferredLanguage': u'en',
                      }
        self.user1 = User(self.data1)

        self.data2 = {u'_id': ObjectId('549190b5d00690878ae9b622'),
                      u'displayName': u'Some \xf6ne',
                      u'eduPersonPrincipalName': u'birub-gagoz',
                      u'givenName': u'Some',
                      u'mail': u'*****@*****.**',
                      u'mailAliases': [{u'email': u'*****@*****.**',
                                        u'verified': True},
                                       {u'added_timestamp': datetime.datetime(2014, 12, 17, 14, 35, 14, 728000),
                                        u'email': u'*****@*****.**',
                                        u'verified': True}],
                      u'mobile': [{u'added_timestamp': datetime.datetime(2014, 12, 18, 9, 11, 35, 78000),
                                   u'mobile': u'+46702222222',
                                   u'primary': True,
                                   u'verified': True}],
                      u'passwords': [{u'created_ts': datetime.datetime(2015, 2, 11, 13, 58, 42, 327000),
                                      u'id': ObjectId('54db60128a7d2a26e8690cda'),
                                      u'salt': u'$NDNv1H1$db011fc$32$32$',
                                      u'source': u'dashboard'}],
                      u'preferredLanguage': u'sv',
                      u'surname': u'\xf6ne',
                      u'subject': u'physical person'}
        self.user2 = User(self.data2)

    def test_user_id(self):
        self.assertEqual(self.user1.user_id, self.data1['_id'])

    def test_eppn(self):
        self.assertEqual(self.user1.eppn, self.data1['eduPersonPrincipalName'])

    def test_given_name(self):
        self.assertEqual(self.user2.given_name, self.data2['givenName'])

    def test_display_name(self):
        self.assertEqual(self.user2.display_name, self.data2['displayName'])

    def test_surname(self):
        self.assertEqual(self.user2.surname, self.data2['surname'])

    def test_mail_addresses(self):
        self.assertEqual(self.user1.mail_addresses.primary.email, self.data1['mailAliases'][0]['email'])

    def test_mail_addresses_to_old_userdb_format(self):
        """
        Test that we get back a dict identical to the one we put in for old-style userdb data.
        """
        to_dict_result = self.user1.mail_addresses.to_list_of_dicts(old_userdb_format=True)
        self.assertEqual(to_dict_result, self.data1['mailAliases'])

    def test_phone_numbers(self):
        """
        Test that we get back a dict identical to the one we put in for old-style userdb data.
        """
        to_dict_result = self.user2.phone_numbers.to_list_of_dicts(old_userdb_format=True)
        self.assertEqual(to_dict_result, self.data2['mobile'])

    def test_passwords(self):
        """
        Test that we get back a dict identical to the one we put in for old-style userdb data.
        """
        self.assertEqual(self.user1.passwords.to_list_of_dicts(old_userdb_format=True), self.data1['passwords'])

    def test_obsolete_attributes(self):
        """
        Test that some obsolete attributes don't cause parse failures.
        """
        data = self.data1
        data['postalAddress'] = {'foo': 'bar'}
        data['date'] = 'anything'
        data['csrf'] = 'long and secret string'
        user = User(data)
        self.assertEqual(self.user1._data, user._data)

    def test_unknown_attributes(self):
        """
        Test parsing a document with unknown data in it.
        """
        data = self.data1
        data['unknown_attribute'] = 'something'
        user = User(data, raise_on_unknown=False)
        self.assertEqual(data['_id'], user.user_id)

        with self.assertRaises(UserHasUnknownData):
            User(data, raise_on_unknown=True)

    def test_incomplete_signup_user(self):
        """
        Test parsing the incomplete documents left in the central userdb by older Signup application.
        """
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'vohon-mufus',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': False}],
                }
        with self.assertRaises(UserHasNotCompletedSignup):
            User(data)
        data['subject'] = 'physical person'  # later signup added this attribute
        with self.assertRaises(UserHasNotCompletedSignup):
            User(data)
        data[u'mailAliases'][0]['verified'] = True
        data['surname'] = 'not signup-incomplete anymore'
        data['passwords'] = [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                              u'id': ObjectId(),
                              u'salt': u'salt',
                              u'created_by': u'dashboard'}]
        user = User(data)
        self.assertEqual(user.surname, data['surname'])
        self.assertEqual(user.passwords.to_list_of_dicts(), data['passwords'])

    def test_revoked_user(self):
        """
        Test ability to identify revoked users.
        """
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'binib-mufus',
                u'revoked_ts': datetime.datetime(2015, 5, 26, 8, 33, 56, 826000),
                }
        with self.assertRaises(UserIsRevoked):
            User(data)

    def test_user_with_no_primary_mail(self):
        mail = u'*****@*****.**'
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'lutol-bafim',
                u'mailAliases': [{u'email': mail, u'verified': True}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                                u'id': ObjectId(),
                                u'salt': u'salt',
                                u'source': u'dashboard'}],
                }
        user = User(data)
        self.assertEqual(mail, user.mail_addresses.primary.email)

    def test_user_with_indirectly_verified_primary_mail(self):
        """
        If a user has passwords set, the 'mail' attribute will be considered indirectly verified.
        """
        mail = u'*****@*****.**'
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'lutol-bafim',
                u'mail': mail,
                u'mailAliases': [{u'email': mail, u'verified': False}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                                u'id': ObjectId(),
                                u'salt': u'salt',
                                u'source': u'dashboard'}],
                }
        user = User(data)
        self.assertEqual(mail, user.mail_addresses.primary.email)

    def test_user_with_csrf_junk_in_mail_address(self):
        """
        For a long time, Dashboard leaked CSRF tokens into the mail address dicts.
        """
        mail = u'*****@*****.**'
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'test-test',
                u'mailAliases': [{u'email': mail,
                u'verified': True,
                u'csrf': u'6ae1d4e95305b72318a683883e70e3b8e302cd75'}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                                u'id': ObjectId(),
                                u'salt': u'salt',
                                u'source': u'dashboard'}],
               }
        user = User(data)
        self.assertEqual(mail, user.mail_addresses.primary.email)

    def test_to_dict(self):
        """
        Test that User objects can be recreated.
        """
        d1 = self.user1.to_dict()
        u2 = User(d1)
        d2 = u2.to_dict()
        self.assertEqual(d1, d2)

    def test_to_dict_old_format(self):
        """
        Test that User objects can be recreated.
        """
        d1 = self.user1.to_dict(old_userdb_format=True)
        u2 = User(d1)
        d2 = u2.to_dict(old_userdb_format=True)
        self.assertEqual(d1, d2)

    def test_modified_ts(self):
        """
        Test the modified_ts property.
        """
        # ensure known starting point
        self.assertIsNone(self.user1.modified_ts)
        # set to current time
        self.user1.modified_ts = True
        _time1 = self.user1.modified_ts
        self.assertIsInstance(_time1, datetime.datetime)
        # Setting existing value to None should be ignored
        self.user1.modified_ts = None
        self.assertEqual(_time1, self.user1.modified_ts)
        # update to current time
        self.user1.modified_ts = True
        _time2 = self.user1.modified_ts
        self.assertNotEqual(_time1, _time2)
        # set to a datetime instance
        self.user1.modified_ts = _time1
        self.assertEqual(_time1, self.user1.modified_ts)

    def test_two_unverified_non_primary_phones(self):
        """
        Test that the first entry in the `phone' list is chosen as primary when none are verified.
        """
        number1 = u'+9112345678'
        number2 = u'+9123456789'
        data = {u'_id': ObjectId(),
                u'displayName': u'xxx yyy',
                u'eduPersonPrincipalName': u'pohig-test',
                u'givenName': u'xxx',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number1,
                             u'primary': False,
                             u'verified': False},
                            {u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number2,
                             u'primary': False,
                             u'verified': False}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                u'id': ObjectId(),
                                u'salt': u'$NDNv1H1$foo$32$32$',
                                u'source': u'dashboard'}],
                u'preferredLanguage': u'en',
                u'surname': u'yyy',
                }
        user = User(data)
        self.assertEqual(user.phone_numbers.primary, None)

    def test_two_non_primary_phones(self):
        """
        Test that the first verified number is chosen as primary, if there is a verified number.
        """
        number1 = u'+9112345678'
        number2 = u'+9123456789'
        data = {u'_id': ObjectId(),
                u'displayName': u'xxx yyy',
                u'eduPersonPrincipalName': u'pohig-test',
                u'givenName': u'xxx',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number1,
                             u'primary': False,
                             u'verified': False},
                            {u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number2,
                             u'primary': False,
                             u'verified': True}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                u'id': ObjectId(),
                                u'salt': u'$NDNv1H1$foo$32$32$',
                                u'source': u'dashboard'}],
                u'preferredLanguage': u'en',
                u'surname': u'yyy',
                }
        user = User(data)
        self.assertEqual(user.phone_numbers.primary.number, number2)

    def test_primary_non_verified_phone(self):
            """
            Test that if a non verified phone number is primary, due to earlier error, then that primary flag is removed.
            """
            data = {u'_id': ObjectId(),
                    u'displayName': u'xxx yyy',
                    u'eduPersonPrincipalName': u'pohig-test',
                    u'givenName': u'xxx',
                    u'mail': u'*****@*****.**',
                    u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                    u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                                u'number': u'+9112345678',
                                u'primary': True,
                                u'verified': False}],
                    u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                    u'id': ObjectId(),
                                    u'salt': u'$NDNv1H1$foo$32$32$',
                                    u'source': u'dashboard'}],
                    u'preferredLanguage': u'en',
                    u'surname': u'yyy',
                    }
            user = User(data)
            for number in user.phone_numbers.to_list():
                self.assertEqual(number.is_primary, False)

    def test_primary_non_verified_phone2(self):
        """
        Test that if a non verified phone number is primary, due to earlier error, then that primary flag is removed.
        """
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'pohig-test',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                u'phone': [{u'number': u'+11111111111',
                            u'primary': True,
                            u'verified': False},
                           {u'number': u'+22222222222',
                            u'primary': False,
                            u'verified': True,
                            }
                           ],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                u'id': ObjectId(),
                                u'salt': u'$NDNv1H1$foo$32$32$',
                                u'source': u'dashboard'}],
                }
        user = User(data)
        self.assertEqual(user.phone_numbers.primary.number, u'+22222222222')

    def test_user_tou(self):
        """
        Basic test for user ToU.
        """
        tou_dict = \
            {'id': ObjectId(),
             'event_type': 'tou_event',
             'version': '1',
             'created_by': 'unit test',
             'created_ts': True,
             }
        tou_events = ToUList([tou_dict])
        data = self.data1
        data.update({'tou': tou_events.to_list_of_dicts()})
        user = User(data)
        self.assertTrue(user.tou.has_accepted('1'))
        self.assertFalse(user.tou.has_accepted('2'))