Пример #1
0
    def test_login_with_api_key_inactive_user(self):
        """Inactive user logging in with API key."""

        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        ip_address = '1.2.3.4'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=False,
                password=password,
                password_repeat=password,
                activation_url='https://activate.com/activate',
            ),
        )

        user = user_info(db=self.db(), email=email)
        assert user
        global_api_key = user.global_api_key()

        with pytest.raises(McAuthLoginException) as ex:
            login_with_api_key(db=self.db(),
                               api_key=global_api_key,
                               ip_address=ip_address)

        # Make sure the error message explicitly states that login failed due to user not being active
        assert 'not active' in str(ex)
Пример #2
0
    def test_login_with_api_key_inactive_user(self):
        """Inactive user logging in with API key."""

        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        ip_address = '1.2.3.4'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=False,
                password=password,
                password_repeat=password,
                activation_url='https://activate.com/activate',
            ),
        )

        user = user_info(db=self.db(), email=email)
        assert user
        global_api_key = user.global_api_key()

        with pytest.raises(McAuthLoginException) as ex:
            login_with_api_key(db=self.db(), api_key=global_api_key, ip_address=ip_address)

        # Make sure the error message explicitly states that login failed due to user not being active
        assert 'not active' in str(ex)
Пример #3
0
    def test_login_with_email_password_inactive_user(self):
        """Inactive user logging in with username and password."""

        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        # Inactive user
        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=False,
                password=password,
                password_repeat=password,
                activation_url='https://activate.com/activate',
            ),
        )

        with pytest.raises(McAuthLoginException) as ex:
            login_with_email_password(db=self.db(),
                                      email=email,
                                      password=password)

        # Make sure the error message explicitly states that login failed due to user not being active
        assert 'not active' in str(ex)
    def test_send_password_reset_token(self):
        email = '*****@*****.**'
        password = '******'
        password_reset_link = 'http://password-reset.com/'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name='Test user login',
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Existing user
        send_password_reset_token(db=self.db(), email=email, password_reset_link=password_reset_link)

        # Nonexisting user (call shouldn't fail because we don't want to reveal which users are in the system so we
        # pretend that we've sent the email)
        send_password_reset_token(db=self.db(), email='*****@*****.**', password_reset_link=password_reset_link)
Пример #5
0
    def test_login_with_email_password_inactive_user(self):
        """Inactive user logging in with username and password."""

        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        # Inactive user
        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=False,
                password=password,
                password_repeat=password,
                activation_url='https://activate.com/activate',
            ),
        )

        with pytest.raises(McAuthLoginException) as ex:
            login_with_email_password(db=self.db(), email=email, password=password)

        # Make sure the error message explicitly states that login failed due to user not being active
        assert 'not active' in str(ex)
Пример #6
0
    def test_send_password_reset_token(self):
        email = '*****@*****.**'
        password = '******'
        password_reset_link = 'http://password-reset.com/'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name='Test user login',
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Existing user
        send_password_reset_token(db=self.db(),
                                  email=email,
                                  password_reset_link=password_reset_link)

        # Nonexisting user (call shouldn't fail because we don't want to reveal which users are in the system so we
        # pretend that we've sent the email)
        send_password_reset_token(db=self.db(),
                                  email='*****@*****.**',
                                  password_reset_link=password_reset_link)
Пример #7
0
    def test_regenerate_api_key(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        ip_address = '1.2.3.4'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Get sample API keys
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password,
                                         ip_address=ip_address)
        assert user

        before_global_api_key = user.global_api_key()
        assert before_global_api_key

        before_per_ip_api_key = user.api_key_for_ip_address(
            ip_address=ip_address)
        assert before_per_ip_api_key

        assert before_global_api_key != before_per_ip_api_key

        # Regenerate API key, purge per-IP API keys
        regenerate_api_key(db=self.db(), email=email)

        # Get sample API keys again
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password,
                                         ip_address=ip_address)
        assert user

        after_global_api_key = user.global_api_key()
        assert after_global_api_key

        after_per_ip_api_key = user.api_key_for_ip_address(
            ip_address=ip_address)
        assert after_per_ip_api_key

        # Make sure API keys are different
        assert before_global_api_key != after_global_api_key
        assert before_per_ip_api_key != after_per_ip_api_key
Пример #8
0
    def test_login_with_api_key(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        ip_address = '1.2.3.4'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Get sample API keys
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password,
                                         ip_address=ip_address)
        assert user

        global_api_key = user.global_api_key()
        assert global_api_key

        per_ip_api_key = user.api_key_for_ip_address(ip_address=ip_address)
        assert per_ip_api_key

        assert global_api_key != per_ip_api_key

        # Non-existent API key
        with pytest.raises(McAuthLoginException):
            login_with_api_key(db=self.db(),
                               api_key='Non-existent API key',
                               ip_address=ip_address)

        # Global API key
        user = login_with_api_key(db=self.db(),
                                  api_key=global_api_key,
                                  ip_address=ip_address)
        assert user
        assert user.email() == email
        assert user.global_api_key() == global_api_key

        # Per-IP API key
        user = login_with_api_key(db=self.db(),
                                  api_key=per_ip_api_key,
                                  ip_address=ip_address)
        assert user
        assert user.email() == email
Пример #9
0
    def test_login_with_email_password(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Successful login
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Unsuccessful login
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(),
                                      email=email,
                                      password='******')

        # Subsequent login attempt after a failed one should be delayed by 1 second
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(),
                                      email=email,
                                      password=password)

        # Successful login after waiting out the delay
        time.sleep(2)
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name
Пример #10
0
    def test_regenerate_api_key(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        ip_address = '1.2.3.4'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Get sample API keys
        user = login_with_email_password(db=self.db(), email=email, password=password, ip_address=ip_address)
        assert user

        before_global_api_key = user.global_api_key()
        assert before_global_api_key

        before_per_ip_api_key = user.api_key_for_ip_address(ip_address=ip_address)
        assert before_per_ip_api_key

        assert before_global_api_key != before_per_ip_api_key

        # Regenerate API key, purge per-IP API keys
        regenerate_api_key(db=self.db(), email=email)

        # Get sample API keys again
        user = login_with_email_password(db=self.db(), email=email, password=password, ip_address=ip_address)
        assert user

        after_global_api_key = user.global_api_key()
        assert after_global_api_key

        after_per_ip_api_key = user.api_key_for_ip_address(ip_address=ip_address)
        assert after_per_ip_api_key

        # Make sure API keys are different
        assert before_global_api_key != after_global_api_key
        assert before_per_ip_api_key != after_per_ip_api_key
Пример #11
0
    def test_login_with_api_key(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        ip_address = '1.2.3.4'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Get sample API keys
        user = login_with_email_password(db=self.db(), email=email, password=password, ip_address=ip_address)
        assert user

        global_api_key = user.global_api_key()
        assert global_api_key

        per_ip_api_key = user.api_key_for_ip_address(ip_address=ip_address)
        assert per_ip_api_key

        assert global_api_key != per_ip_api_key

        # Non-existent API key
        with pytest.raises(McAuthLoginException):
            login_with_api_key(db=self.db(), api_key='Non-existent API key', ip_address=ip_address)

        # Global API key
        user = login_with_api_key(db=self.db(), api_key=global_api_key, ip_address=ip_address)
        assert user
        assert user.email() == email
        assert user.global_api_key() == global_api_key

        # Per-IP API key
        user = login_with_api_key(db=self.db(), api_key=per_ip_api_key, ip_address=ip_address)
        assert user
        assert user.email() == email
Пример #12
0
    def test_login_with_email_password(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Successful login
        user = login_with_email_password(db=self.db(), email=email, password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Unsuccessful login
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(), email=email, password='******')

        # Subsequent login attempt after a failed one should be delayed by 1 second
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(), email=email, password=password)

        # Successful login after waiting out the delay
        time.sleep(2)
        user = login_with_email_password(db=self.db(), email=email, password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name
Пример #13
0
    def test_all_users(self):
        email = '*****@*****.**'
        full_name = 'Test user info'
        notes = 'Test test test'
        weekly_requests_limit = 123
        weekly_requested_items_limit = 456

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes=notes,
                role_ids=[1],
                active=True,
                password='******',
                password_repeat='user_info',
                activation_url='',  # user is active, no need for activation URL
                weekly_requests_limit=weekly_requests_limit,
                weekly_requested_items_limit=weekly_requested_items_limit,
            ),
        )

        users = all_users(db=self.db())
        assert len(users) == 1

        user = users[0]
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name
        assert user.notes() == notes
        assert user.weekly_requests_limit() == weekly_requests_limit
        assert user.weekly_requested_items_limit(
        ) == weekly_requested_items_limit
        assert user.active()
        assert user.global_api_key()
        assert user.password_hash()
        assert user.has_role('admin')
Пример #14
0
    def test_all_users(self):
        email = '*****@*****.**'
        full_name = 'Test user info'
        notes = 'Test test test'
        weekly_requests_limit = 123
        weekly_requested_items_limit = 456

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes=notes,
                role_ids=[1],
                active=True,
                password='******',
                password_repeat='user_info',
                activation_url='',  # user is active, no need for activation URL
                weekly_requests_limit=weekly_requests_limit,
                weekly_requested_items_limit=weekly_requested_items_limit,
            ),
        )

        users = all_users(db=self.db())
        assert len(users) == 1

        user = users[0]
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name
        assert user.notes() == notes
        assert user.weekly_requests_limit() == weekly_requests_limit
        assert user.weekly_requested_items_limit() == weekly_requested_items_limit
        assert user.active()
        assert user.global_api_key()
        assert user.password_hash()
        assert user.has_role('admin')
Пример #15
0
    def test_change_password_with_old_password(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Successful login
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Change password
        new_password = '******'
        change_password_with_old_password(
            db=self.db(),
            email=email,
            old_password=password,
            new_password=new_password,
            new_password_repeat=new_password,
        )

        # Unsuccessful login with old password
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(),
                                      email=email,
                                      password=password)

        # Imposed delay after unsuccessful login
        time.sleep(2)

        # Successful login with new password
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=new_password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Incorrect password
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_old_password(
                db=self.db(),
                email=email,
                old_password='******',
                new_password=new_password,
                new_password_repeat=new_password,
            )

        # Changing for nonexistent user
        with pytest.raises(McAuthChangePasswordException):
            even_newer_password = '******'
            change_password_with_old_password(
                db=self.db(),
                email='*****@*****.**',
                old_password=new_password,
                new_password=even_newer_password,
                new_password_repeat=even_newer_password,
            )

        # Passwords don't match
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_old_password(
                db=self.db(),
                email=email,
                old_password=new_password,
                new_password='******',
                new_password_repeat='not match',
            )
    def test_change_password_with_reset_token(self):
        # FIXME test changing password for user A using reset token from user B

        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Successful login
        user = login_with_email_password(db=self.db(), email=email, password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Make sure password reset token is not set
        password_reset_token_hash = self.db().query("""
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {'email': email}).flat()
        assert password_reset_token_hash[0] is None

        # Send password reset link
        password_reset_url = 'https://reset-password.com/reset'
        final_password_reset_url = _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        assert final_password_reset_url
        assert password_reset_url in final_password_reset_url

        final_password_reset_uri = furl(final_password_reset_url)
        assert final_password_reset_uri.args['email']
        assert final_password_reset_uri.args['password_reset_token']

        # Make sure password reset token is set
        password_reset_token_hash = self.db().query("""
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {'email': email}).flat()
        assert password_reset_token_hash[0] is not None

        # Change password
        new_password = '******'
        change_password_with_reset_token(
            db=self.db(),
            email=email,
            password_reset_token=final_password_reset_uri.args['password_reset_token'],
            new_password=new_password,
            new_password_repeat=new_password,
        )

        # Make sure password reset token has been reset after changing password
        password_reset_token_hash = self.db().query("""
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {'email': email}).flat()
        assert password_reset_token_hash[0] is None

        # Unsuccessful login with old password
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(), email=email, password=password)

        # Imposed delay after unsuccessful login
        time.sleep(2)

        # Successful login with new password
        user = login_with_email_password(db=self.db(), email=email, password=new_password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Incorrect password reset token
        _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_reset_token(
                db=self.db(),
                email=email,
                password_reset_token='incorrect password reset token',
                new_password=new_password,
                new_password_repeat=new_password,
            )

        # Changing for nonexistent user
        final_password_reset_url = _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_reset_token(
                db=self.db(),
                email='*****@*****.**',
                password_reset_token=furl(final_password_reset_url).args['password_reset_token'],
                new_password=new_password,
                new_password_repeat=new_password,
            )

        # Passwords don't match
        final_password_reset_url = _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_reset_token(
                db=self.db(),
                email=email,
                password_reset_token=furl(final_password_reset_url).args['password_reset_token'],
                new_password='******',
                new_password_repeat='not match',
            )
    def test_change_password_with_old_password(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Successful login
        user = login_with_email_password(db=self.db(), email=email, password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Change password
        new_password = '******'
        change_password_with_old_password(
            db=self.db(),
            email=email,
            old_password=password,
            new_password=new_password,
            new_password_repeat=new_password,
        )

        # Unsuccessful login with old password
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(), email=email, password=password)

        # Imposed delay after unsuccessful login
        time.sleep(2)

        # Successful login with new password
        user = login_with_email_password(db=self.db(), email=email, password=new_password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Incorrect password
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_old_password(
                db=self.db(),
                email=email,
                old_password='******',
                new_password=new_password,
                new_password_repeat=new_password,
            )

        # Changing for nonexistent user
        with pytest.raises(McAuthChangePasswordException):
            even_newer_password = '******'
            change_password_with_old_password(
                db=self.db(),
                email='*****@*****.**',
                old_password=new_password,
                new_password=even_newer_password,
                new_password_repeat=even_newer_password,
            )

        # Passwords don't match
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_old_password(
                db=self.db(),
                email=email,
                old_password=new_password,
                new_password='******',
                new_password_repeat='not match',
            )
Пример #18
0
    def test_change_password_with_reset_token(self):
        # FIXME test changing password for user A using reset token from user B

        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=True,
                password=password,
                password_repeat=password,
                activation_url='',  # user is active, no need for activation URL
            ),
        )

        # Successful login
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Make sure password reset token is not set
        password_reset_token_hash = self.db().query(
            """
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {
                'email': email
            }).flat()
        assert password_reset_token_hash[0] is None

        # Send password reset link
        password_reset_url = 'https://reset-password.com/reset'
        final_password_reset_url = _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        assert final_password_reset_url
        assert password_reset_url in final_password_reset_url

        final_password_reset_uri = furl(final_password_reset_url)
        assert final_password_reset_uri.args['email']
        assert final_password_reset_uri.args['password_reset_token']

        # Make sure password reset token is set
        password_reset_token_hash = self.db().query(
            """
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {
                'email': email
            }).flat()
        assert password_reset_token_hash[0] is not None

        # Change password
        new_password = '******'
        change_password_with_reset_token(
            db=self.db(),
            email=email,
            password_reset_token=final_password_reset_uri.
            args['password_reset_token'],
            new_password=new_password,
            new_password_repeat=new_password,
        )

        # Make sure password reset token has been reset after changing password
        password_reset_token_hash = self.db().query(
            """
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {
                'email': email
            }).flat()
        assert password_reset_token_hash[0] is None

        # Unsuccessful login with old password
        with pytest.raises(McAuthLoginException):
            login_with_email_password(db=self.db(),
                                      email=email,
                                      password=password)

        # Imposed delay after unsuccessful login
        time.sleep(2)

        # Successful login with new password
        user = login_with_email_password(db=self.db(),
                                         email=email,
                                         password=new_password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Incorrect password reset token
        _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_reset_token(
                db=self.db(),
                email=email,
                password_reset_token='incorrect password reset token',
                new_password=new_password,
                new_password_repeat=new_password,
            )

        # Changing for nonexistent user
        final_password_reset_url = _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_reset_token(
                db=self.db(),
                email='*****@*****.**',
                password_reset_token=furl(
                    final_password_reset_url).args['password_reset_token'],
                new_password=new_password,
                new_password_repeat=new_password,
            )

        # Passwords don't match
        final_password_reset_url = _generate_password_reset_token(
            db=self.db(),
            email=email,
            password_reset_link=password_reset_url,
        )
        with pytest.raises(McAuthChangePasswordException):
            change_password_with_reset_token(
                db=self.db(),
                email=email,
                password_reset_token=furl(
                    final_password_reset_url).args['password_reset_token'],
                new_password='******',
                new_password_repeat='not match',
            )
Пример #19
0
    def test_add_user(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'

        new_user = NewUser(
            email=email,
            full_name=full_name,
            notes='Test test test',
            role_ids=[1],
            active=True,
            password=password,
            password_repeat=password,
            activation_url='',  # user is active, no need for activation URL
        )

        # Add user
        add_user(db=self.db(), new_user=new_user)

        # Test logging in
        user = login_with_email_password(db=self.db(), email=email, password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Faulty input
        with pytest.raises(McAuthRegisterException):
            # noinspection PyTypeChecker
            add_user(db=self.db(), new_user=None)

        # Existing user
        with pytest.raises(McAuthRegisterException):
            add_user(db=self.db(), new_user=new_user)

        # Existing user with uppercase email
        with pytest.raises(McAuthRegisterException):
            add_user(
                db=self.db(),
                new_user=NewUser(
                    email=email.upper(),
                    full_name=full_name,
                    notes='Test test test',
                    role_ids=[1],
                    active=True,
                    password=password,
                    password_repeat=password,
                    activation_url='',  # user is active, no need for activation URL
                ),
            )

        # Invalid password
        with pytest.raises(McAuthUserException):
            add_user(
                db=self.db(),
                new_user=NewUser(
                    email='*****@*****.**',
                    full_name=full_name,
                    notes='Test test test',
                    role_ids=[1],
                    active=True,
                    password='******',
                    password_repeat='def',
                    activation_url='',  # user is active, no need for activation URL
                ),
            )

        # Nonexistent roles
        with pytest.raises(McAuthRegisterException):
            add_user(
                db=self.db(),
                new_user=NewUser(
                    email='*****@*****.**',
                    full_name=full_name,
                    notes='Test test test',
                    role_ids=[42],
                    active=True,
                    password=password,
                    password_repeat=password,
                    activation_url='',  # user is active, no need for activation URL
                ),
            )

        # Both the user is set as active and the activation URL is set
        with pytest.raises(McAuthUserException):
            add_user(
                db=self.db(),
                new_user=NewUser(
                    email='*****@*****.**',
                    full_name=full_name,
                    notes='Test test test',
                    role_ids=[1],
                    active=True,
                    password=password,
                    password_repeat=password,
                    activation_url='https://activate-user.com/activate',
                ),
            )

        # User is neither active not the activation URL is set
        with pytest.raises(McAuthUserException):
            add_user(
                db=self.db(),
                new_user=NewUser(
                    email='*****@*****.**',
                    full_name=full_name,
                    notes='Test test test',
                    role_ids=[1],
                    active=False,
                    password=password,
                    password_repeat=password,
                    activation_url='',
                ),
            )
Пример #20
0
    def test_activate_user_via_token(self):
        email = '*****@*****.**'
        password = '******'
        full_name = 'Test user login'
        activation_url = 'https://activate.com/activate'

        # Add inactive user
        add_user(
            db=self.db(),
            new_user=NewUser(
                email=email,
                full_name=full_name,
                notes='Test test test',
                role_ids=[1],
                active=False,  # not active, needs to be activated
                password=password,
                password_repeat=password,
                activation_url=activation_url,
            ),
        )

        # Test logging in
        with pytest.raises(McAuthLoginException) as ex:
            login_with_email_password(db=self.db(), email=email, password=password)

        # Make sure the error message explicitly states that login failed due to user not being active
        assert 'not active' in str(ex)

        # Make sure activation token is set
        activation_token_hash = self.db().query("""
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {'email': email}).flat()
        assert activation_token_hash
        assert len(activation_token_hash) == 1
        assert len(activation_token_hash[0]) > 0

        # Send password reset link
        final_activation_url = _generate_user_activation_token(
            db=self.db(),
            email=email,
            activation_link=activation_url,
        )
        final_activation_uri = furl(final_activation_url)
        assert final_activation_uri.args['email']

        activation_token = final_activation_uri.args['activation_token']
        assert activation_token

        # Make sure activation token is (still) set
        activation_token_hash = self.db().query("""
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {'email': email}).flat()
        assert activation_token_hash
        assert len(activation_token_hash) == 1
        assert len(activation_token_hash[0]) > 0

        # Activate user
        activate_user_via_token(db=self.db(), email=email, activation_token=activation_token)

        # Imposed delay after unsuccessful login
        time.sleep(2)

        # Test logging in
        user = login_with_email_password(db=self.db(), email=email, password=password)
        assert user
        assert isinstance(user, CurrentUser)
        assert user.email() == email
        assert user.full_name() == full_name

        # Make sure activation token is not set anymore
        activation_token_hash = self.db().query("""
            SELECT password_reset_token_hash
            FROM auth_users
            WHERE email = %(email)s
        """, {'email': email}).flat()
        assert activation_token_hash
        assert len(activation_token_hash) == 1
        assert activation_token_hash[0] is None

        # Incorrect activation token
        _generate_user_activation_token(db=self.db(), email=email, activation_link=activation_url)
        with pytest.raises(McAuthRegisterException):
            activate_user_via_token(db=self.db(), email=email, activation_token='incorrect activation token')

        # Activating nonexistent user
        final_activation_url = _generate_user_activation_token(
            db=self.db(),
            email=email,
            activation_link=activation_url,
        )
        final_activation_uri = furl(final_activation_url)
        activation_token = final_activation_uri.args['activation_token']
        with pytest.raises(McAuthRegisterException):
            activate_user_via_token(db=self.db(), email='*****@*****.**', activation_token=activation_token)