users: use two distinct actions for user password reset.

- this makes a better UX instead of TOGGLE.
This commit is contained in:
Marcin Kuzminski 2019-01-14 18:46:18 +01:00
parent 89024101a8
commit c37bfb464a
6 changed files with 61 additions and 30 deletions

View file

@ -280,8 +280,12 @@ def admin_routes(config):
pattern='/users/{user_id:\d+}/delete',
user_route=True)
config.add_route(
name='user_force_password_reset',
pattern='/users/{user_id:\d+}/password_reset',
name='user_enable_force_password_reset',
pattern='/users/{user_id:\d+}/password_reset_enable',
user_route=True)
config.add_route(
name='user_disable_force_password_reset',
pattern='/users/{user_id:\d+}/password_reset_disable',
user_route=True)
config.add_route(
name='user_create_personal_repo_group',

View file

@ -59,8 +59,6 @@ def route_path(name, params=None, **kwargs):
ADMIN_PREFIX + '/users/{user_id}/update',
'user_delete':
ADMIN_PREFIX + '/users/{user_id}/delete',
'user_force_password_reset':
ADMIN_PREFIX + '/users/{user_id}/password_reset',
'user_create_personal_repo_group':
ADMIN_PREFIX + '/users/{user_id}/create_repo_group',

View file

@ -599,12 +599,9 @@ class UsersView(UserAppView):
@HasPermissionAllDecorator('hg.admin')
@CSRFRequired()
@view_config(
route_name='user_force_password_reset', request_method='POST',
route_name='user_enable_force_password_reset', request_method='POST',
renderer='rhodecode:templates/admin/users/user_edit.mako')
def user_force_password_reset(self):
"""
toggle reset password flag for this user
"""
def user_enable_force_password_reset(self):
_ = self.request.translate
c = self.load_default_context()
@ -612,19 +609,41 @@ class UsersView(UserAppView):
c.user = self.db_user
try:
old_value = c.user.user_data.get('force_password_change')
c.user.update_userdata(force_password_change=not old_value)
c.user.update_userdata(force_password_change=True)
if old_value:
msg = _('Force password change disabled for user')
audit_logger.store_web(
'user.edit.password_reset.disabled',
user=c.rhodecode_user)
else:
msg = _('Force password change enabled for user')
audit_logger.store_web(
'user.edit.password_reset.enabled',
user=c.rhodecode_user)
msg = _('Force password change enabled for user')
audit_logger.store_web('user.edit.password_reset.enabled',
user=c.rhodecode_user)
Session().commit()
h.flash(msg, category='success')
except Exception:
log.exception("Exception during password reset for user")
h.flash(_('An error occurred during password reset for user'),
category='error')
raise HTTPFound(h.route_path('user_edit_advanced', user_id=user_id))
@LoginRequired()
@HasPermissionAllDecorator('hg.admin')
@CSRFRequired()
@view_config(
route_name='user_disable_force_password_reset', request_method='POST',
renderer='rhodecode:templates/admin/users/user_edit.mako')
def user_disable_force_password_reset(self):
_ = self.request.translate
c = self.load_default_context()
user_id = self.db_user_id
c.user = self.db_user
try:
c.user.update_userdata(force_password_change=False)
msg = _('Force password change disabled for user')
audit_logger.store_web(
'user.edit.password_reset.disabled',
user=c.rhodecode_user)
Session().commit()
h.flash(msg, category='success')

View file

@ -102,7 +102,8 @@ function registerRCRoutes() {
pyroutes.register('user_edit_global_perms_update', '/_admin/users/%(user_id)s/edit/global_permissions/update', ['user_id']);
pyroutes.register('user_update', '/_admin/users/%(user_id)s/update', ['user_id']);
pyroutes.register('user_delete', '/_admin/users/%(user_id)s/delete', ['user_id']);
pyroutes.register('user_force_password_reset', '/_admin/users/%(user_id)s/password_reset', ['user_id']);
pyroutes.register('user_enable_force_password_reset', '/_admin/users/%(user_id)s/password_reset_enable', ['user_id']);
pyroutes.register('user_disable_force_password_reset', '/_admin/users/%(user_id)s/password_reset_disable', ['user_id']);
pyroutes.register('user_create_personal_repo_group', '/_admin/users/%(user_id)s/create_repo_group', ['user_id']);
pyroutes.register('edit_user_auth_tokens_delete', '/_admin/users/%(user_id)s/edit/auth_tokens/delete', ['user_id']);
pyroutes.register('edit_user_ssh_keys', '/_admin/users/%(user_id)s/edit/ssh_keys', ['user_id']);

View file

@ -143,7 +143,7 @@
<div class="select">
${c.form['repo_landing_commit_ref'].render(css_class='medium', oid='repo_landing_commit_ref')|n}
${c.form.render_error(request, c.form['repo_landing_commit_ref'])|n}
<p class="help-block">${_('Default commit for files page, downloads, full text search index and readme')}</p>
<p class="help-block">${_('The default commit for file pages, downloads, full text search index, and README generation.')}</p>
</div>
</div>

View file

@ -35,15 +35,23 @@
<h3 class="panel-title">${_('Force Password Reset')}</h3>
</div>
<div class="panel-body">
${h.secure_form(h.route_path('user_force_password_reset', user_id=c.user.user_id), request=request)}
${h.secure_form(h.route_path('user_disable_force_password_reset', user_id=c.user.user_id), request=request)}
<div class="field">
<button class="btn btn-default" type="submit">
<i class="icon-lock"></i>
%if c.user.user_data.get('force_password_change'):
${_('Disable forced password reset')}
%else:
${_('Enable forced password reset')}
%endif
<i class="icon-unlock"></i> ${_('Disable forced password reset')}
</button>
</div>
<div class="field">
<span class="help-block">
${_("Clear the forced password change flag.")}
</span>
</div>
${h.end_form()}
${h.secure_form(h.route_path('user_enable_force_password_reset', user_id=c.user.user_id), request=request)}
<div class="field">
<button class="btn btn-default" type="submit" onclick="return confirm('${_('Confirm to enable forced password change')}');">
<i class="icon-lock"></i> ${_('Enable forced password reset')}
</button>
</div>
<div class="field">
@ -52,6 +60,7 @@
</span>
</div>
${h.end_form()}
</div>
</div>