def two_factor():
    user_id = session['user_details']['id']

    def _check_code(code):
        return user_api_client.check_verify_code(user_id, code, "sms")

    form = TwoFactorForm(_check_code)

    if form.validate_on_submit():
        try:
            user = user_api_client.get_user(user_id)
            services = service_api_client.get_services({'user_id': str(user_id)}).get('data', [])
            # Check if coming from new password page
            if 'password' in session['user_details']:
                user.set_password(session['user_details']['password'])
                user.reset_failed_login_count()
                user_api_client.update_user(user)
            login_user(user, remember=True)
        finally:
            del session['user_details']

        next_url = request.args.get('next')
        if next_url and _is_safe_redirect_url(next_url):
            return redirect(next_url)

        if current_user.platform_admin:
            return redirect(url_for('main.show_all_services'))
        if len(services) == 1:
            return redirect(url_for('main.service_dashboard', service_id=services[0]['id']))
        else:
            return redirect(url_for('main.choose_service'))

    return render_template('views/two-factor.html', form=form)
def test_form_is_valid_returns_no_errors(app_, mock_check_verify_code):
    with app_.test_request_context(method='POST',
                                   data={'sms_code': '12345'}) as req:
        def _check_code(code):
            return user_api_client.check_verify_code('1', code, "sms")
        form = TwoFactorForm(_check_code)
        assert form.validate() is True
        assert len(form.errors) == 0
def test_returns_errors_when_code_contains_letters(app_, mock_check_verify_code):
    with app_.test_request_context(method='POST',
                                   data={'sms_code': 'asdfg'}) as req:
        def _check_code(code):
            return user_api_client.check_verify_code('1', code, "sms")
        form = TwoFactorForm(_check_code)
        assert form.validate() is False
        assert len(form.errors) == 1
        assert set(form.errors) == set({'sms_code': ['Code must be 5 digits', 'Code does not match']})
def test_returns_errors_when_code_is_missing(app_, mock_check_verify_code):
    with app_.test_request_context(method='POST',
                                   data={}) as req:
        def _check_code(code):
            return user_api_client.check_verify_code('1', code, "sms")
        form = TwoFactorForm(_check_code)
        assert form.validate() is False
        assert len(form.errors) == 1
        assert set(form.errors) == set({'sms_code': ['Code must not be empty']})
def test_should_return_errors_when_code_is_expired(app_,
                                                   mock_check_verify_code_code_expired):
    with app_.test_request_context(method='POST',
                                   data={'sms_code': '23456'}) as req:
        def _check_code(code):
            return user_api_client.check_verify_code('1', code, "sms")
        form = TwoFactorForm(_check_code)
        assert form.validate() is False
        errors = form.errors
        assert len(errors) == 1
        assert errors == {'sms_code': ['Code has expired']}
def verify():
    user_id = session['user_details']['id']

    def _check_code(code):
        return user_api_client.check_verify_code(user_id, code, 'sms')

    form = TwoFactorForm(_check_code)

    if form.validate_on_submit():
        try:
            user = user_api_client.get_user(user_id)
            activated_user = user_api_client.activate_user(user)
            login_user(activated_user)
            return redirect(url_for('main.add_service', first='first'))
        finally:
            session.pop('user_details', None)

    return render_template('views/two-factor.html', form=form)
Exemple #7
0
def two_factor():
    if current_user.is_authenticated:
        return redirect_when_logged_in(
            user=current_user, platform_admin=current_user.platform_admin)

    user_id = session['user_details']['id']

    # Check if a FIDO2 key exists, if yes, return template
    user = User.from_id(user_id)

    if len(user.security_keys):
        return render_template('views/two-factor-fido.html')

    def _check_code(code):
        return user_api_client.check_verify_code(user_id, code, "sms")

    form = TwoFactorForm(_check_code)

    if form.validate_on_submit():
        return log_in_user(user_id)

    return render_template('views/two-factor.html', form=form)
Exemple #8
0
def user_profile_mobile_number_confirm():

    # Validate verify code for form
    def _check_code(cde):
        return user_api_client.check_verify_code(current_user.id, cde, 'sms')

    if NEW_MOBILE_PASSWORD_CONFIRMED not in session:
        return redirect(url_for('.user_profile_mobile_number'))

    form = TwoFactorForm(_check_code)

    if form.validate_on_submit():
        current_user.refresh_session_id()
        mobile_number = session[NEW_MOBILE]
        del session[NEW_MOBILE]
        del session[NEW_MOBILE_PASSWORD_CONFIRMED]
        current_user.update(mobile_number=mobile_number)
        return redirect(url_for('.user_profile'))

    return render_template('views/user-profile/confirm.html',
                           form_field=form.two_factor_code,
                           thing='mobile number')
def two_factor():
    user_id = session['user_details']['id']

    def _check_code(code):
        return user_api_client.check_verify_code(user_id, code, "sms")

    form = TwoFactorForm(_check_code)

    if form.validate_on_submit():
        try:
            user = user_api_client.get_user(user_id)
            services = service_api_client.get_services({
                'user_id': str(user_id)
            }).get('data', [])
            # Check if coming from new password page
            if 'password' in session['user_details']:
                user.set_password(session['user_details']['password'])
                user.reset_failed_login_count()
                user_api_client.update_user(user)
            activated_user = user_api_client.activate_user(user)
            login_user(activated_user, remember=True)
        finally:
            del session['user_details']

        next_url = request.args.get('next')
        if next_url and _is_safe_redirect_url(next_url):
            return redirect(next_url)

        if current_user.platform_admin:
            return redirect(url_for('main.show_all_services'))
        if len(services) == 1:
            return redirect(
                url_for('main.service_dashboard',
                        service_id=services[0]['id']))
        else:
            return redirect(url_for('main.choose_service'))

    return render_template('views/two-factor.html', form=form)