diff --git a/app/main/views/user_profile.py b/app/main/views/user_profile.py index 8aa8db858..a19ee96bb 100644 --- a/app/main/views/user_profile.py +++ b/app/main/views/user_profile.py @@ -240,7 +240,7 @@ def user_profile_security_keys(): ) -@main.route("/user-profile/security-keys//manage", methods=['GET']) +@main.route("/user-profile/security-keys//manage", methods=['GET', 'POST']) @user_is_platform_admin def user_profile_manage_security_key(key_id): security_keys = user_api_client.get_webauthn_credentials_for_user(current_user.id) @@ -251,6 +251,14 @@ def user_profile_manage_security_key(key_id): form = ChangeNameOfSecurityKey(name_of_key=security_key["name"]) + if form.validate_on_submit(): + user_api_client.update_webauthn_credential_for_user( + user_id=current_user.id, + credential_id=key_id, + new_name_for_credential=form.name_of_key.data + ) + return redirect(url_for('.user_profile_security_keys')) + return render_template( 'views/user-profile/manage-security-key.html', security_key=security_key, diff --git a/app/notify_client/user_api_client.py b/app/notify_client/user_api_client.py index df9a2ba47..5b54a785d 100644 --- a/app/notify_client/user_api_client.py +++ b/app/notify_client/user_api_client.py @@ -201,5 +201,10 @@ class UserApiClient(NotifyAdminAPIClient): return self.post(endpoint, data=credential.serialize()) + def update_webauthn_credential_for_user(self, *, user_id, credential_id, new_name_for_credential): + endpoint = f'/user/{user_id}/webauthn/{credential_id}' + + return self.post(endpoint, data={"name": new_name_for_credential}) + user_api_client = UserApiClient() diff --git a/tests/app/main/views/test_user_profile.py b/tests/app/main/views/test_user_profile.py index f33d27898..226cf46e6 100644 --- a/tests/app/main/views/test_user_profile.py +++ b/tests/app/main/views/test_user_profile.py @@ -425,3 +425,40 @@ def test_non_platform_admin_user_doesnt_see_manage_security_key_page(client_requ key_id=webauthn_credential['id'], _expected_status=403, ) + + +def test_should_redirect_after_change_of_security_key_name( + client_request, + platform_admin_user, + webauthn_credential, + webauthn_credential_2, + mocker +): + client_request.login(platform_admin_user) + + mocker.patch( + 'app.user_api_client.get_webauthn_credentials_for_user', + return_value=[webauthn_credential, webauthn_credential_2], + ) + + mock_update = mocker.patch( + 'app.user_api_client.update_webauthn_credential_for_user', + return_value=[webauthn_credential], + ) + + client_request.post( + 'main.user_profile_manage_security_key', + key_id=webauthn_credential['id'], + _data={'name_of_key': "new name"}, + _expected_status=302, + _expected_redirect=url_for( + 'main.user_profile_security_keys', + _external=True, + ) + ) + + mock_update.assert_called_once_with( + credential_id=webauthn_credential['id'], + new_name_for_credential="new name", + user_id=platform_admin_user["id"] + )