Skip to content

Add reset MFA button for admin s on user profile edit#6056

Open
clauvaldez wants to merge 1 commit intoBookStackApp:developmentfrom
clauvaldez:mfaReset
Open

Add reset MFA button for admin s on user profile edit#6056
clauvaldez wants to merge 1 commit intoBookStackApp:developmentfrom
clauvaldez:mfaReset

Conversation

@clauvaldez
Copy link
Copy Markdown

Summary

This pull request adds a Reset MFA button to the user profile edit page, allowing administrators to easily reset a user's multi-factor authentication configuration.

Motivation

If a user loses access to their MFA device or is unable to complete the authentication process, administrators currently have no quick way to reset MFA from the interface. This feature provides a simple and controlled way for admins to resolve such situations.

Changes

  • Added a Reset MFA button in the user profile edit view.
  • Implemented a controller method to handle MFA reset for the selected user.
  • Restricted the action to users with the appropriate UsersManage permission.
  • The reset operation removes the user's stored MFA values, forcing them to reconfigure MFA on next login.

Security

Only administrators with the UsersManage permission can perform this action.

Result

Administrators can quickly reset MFA for users who are locked out due to lost or misconfigured authentication devices, improving support and account recovery workflows.

@ssddanbrown ssddanbrown added this to the Next Feature Release milestone Mar 22, 2026
Copy link
Copy Markdown
Member

@ssddanbrown ssddanbrown left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for offering this!
I've added a range of comments regarding some changes to be made.
We will also need testing coverage of the core actions here. If unsure, I can add these later.

Note: If you're heavily using AI/LLM generation for this contribution please let me know, as I don't want to be spending time reviewing and providing feedback to a machine via a proxy.

If anything is unclear or you need further guidance just let me know!

$user = $this->userRepo->getById($id);
// Resetear el 2FA del usuario
$user->mfaValues()->delete();
session()->flash('success', trans('settings.users_mfa_reset_success', ['userName' => $user->name]));
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please can you use the $this->showSuccessNotification method instead to show a notification

{
$this->checkPermission(Permission::UsersManage);
$user = $this->userRepo->getById($id);
// Resetear el 2FA del usuario
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this comment, I think it's a bit redundant based on context and I'd prefer to keep comments in one language.

Comment thread lang/en/settings.php
Comment on lines +266 to +270
'users_mfa_reset' => 'Reset 2FA',
'users_mfa_reset_desc' => 'Reset and clear all configured MFA methods for :userName. They will be prompted to reconfigure on next login.',
'users_mfa_reset_confirm' => 'Are you sure you want to reset 2FA for :userName?',
'users_mfa_reset_success' => '2FA has been reset for :userName',
'users_mfa_reset_error' => 'Failed to reset 2FA for :userName',
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please can you use "multi-factor authentication" instead of "2FA" to keep the language used consistent in the app.

Also, avoid passing through the username here. We only do that where necessary, to keep translations simpler and avoid other issues, but it can be implied by context here so I don't think it's needed.

</div>
</div>

@if(user()->hasSystemRole('admin'))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does not align with the actual permission used in the controller, and we're already checking the relevant permissions before providing the view, so a permission check here is redundant.

Instead, We should probably only show this section if the user has at least one MFA option configured.

Comment thread lang/en/settings.php
'users_mfa_x_methods' => ':count method configured|:count methods configured',
'users_mfa_configure' => 'Configure Methods',
'users_mfa_reset' => 'Reset 2FA',
'users_mfa_reset_desc' => 'Reset and clear all configured MFA methods for :userName. They will be prompted to reconfigure on next login.',
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is kind of incorrect. They will only be prompted to reconfigure on login if MFA is required for their role.

// Resetear el 2FA del usuario
$user->mfaValues()->delete();
session()->flash('success', trans('settings.users_mfa_reset_success', ['userName' => $user->name]));
return redirect()->back();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we redirect directly to the user edit view?
Redirect backs like this can go wonky in a range of scenarios, so best to specify a location where known.

<form action="{{ url("/settings/users/{$user->id}/reset-mfa") }}" method="POST" style="display: inline;">
@csrf
<button type="submit" class="button neg"
onclick="return confirm('{{ trans('settings.users_mfa_reset_confirm', ['userName' => $user->name]) }}')">
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This won't work due to CSP (security) blocking. We avoid any inline JavaScript.

Making the initial a dropdown, with a second button for confirmation, may be better. We do this in a select few other areas I think.

@clauvaldez
Copy link
Copy Markdown
Author

Hello!
Thanks for the answers, I am working on the recommendations, it is the first time I make a contribution so there are many details to take into account.
Thank you very much for taking the time, I will work on the details you mentioned and

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants