diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index 0cd05a5c5f..5639ace523 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -774,7 +774,7 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType): 'pretix.user.settings.2fa.disabled': _('Two-factor authentication has been disabled.'), 'pretix.user.settings.2fa.regenemergency': _('Your two-factor emergency codes have been regenerated.'), 'pretix.user.settings.2fa.emergency': _('A two-factor emergency code has been generated.'), - 'pretix.user.settings.2fa.resetdrift': _('TOTP drift has been reset.'), + 'pretix.user.settings.2fa.resetdrift': _('Drift and throttle values for two-factor devices have been reset.'), 'pretix.user.settings.2fa.device.added': _('A new two-factor authentication device "{name}" has been added to ' 'your account.'), 'pretix.user.settings.2fa.device.deleted': _('The two-factor authentication device "{name}" has been removed ' diff --git a/src/pretix/control/templates/pretixcontrol/users/form.html b/src/pretix/control/templates/pretixcontrol/users/form.html index 0038215a80..a6283872f9 100644 --- a/src/pretix/control/templates/pretixcontrol/users/form.html +++ b/src/pretix/control/templates/pretixcontrol/users/form.html @@ -17,10 +17,6 @@ {% csrf_token %} -
- {% csrf_token %} - -
{% endif %}
{% csrf_token %} @@ -70,6 +66,9 @@
+

{% trans "Available two-factor authentication methods" %}

@@ -105,6 +104,14 @@ {% endblocktrans %}
{% endif %} + {% if d.throttling_enabled and not d.verify_is_allowed.0 %} + + {% blocktrans trimmed with date=d.verify_is_allowed.1.locked_until|date:"SHORT_DATETIME_FORMAT" %} + Currently locked until {{ date }} + {% endblocktrans %} + +
+ {% endif %} {% if d.devicetype == 'totp' %} step = {{ d.step }}, @@ -171,4 +178,8 @@
+ + + {% csrf_token %} + {% endblock %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 3b7b3d1f7f..5e9cba6ccb 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -78,7 +78,7 @@ urlpatterns = [ re_path(r'^users/(?P\d+)/impersonate$', users.UserImpersonateView.as_view(), name='users.impersonate'), re_path(r'^users/(?P\d+)/anonymize$', users.UserAnonymizeView.as_view(), name='users.anonymize'), re_path(r'^users/(?P\d+)/emergencytoken$', users.UserEmergencyTokenView.as_view(), name='users.emergencytoken'), - re_path(r'^users/(?P\d+)/resetdrift$', users.Reset2FADriftView.as_view(), name='users.resetdrift'), + re_path(r'^users/(?P\d+)/resetdriftthrottle$', users.Reset2FADriftThrottleView.as_view(), name='users.resetdriftthrottle'), re_path(r'^pdf/editor/webfonts.css', pdf.FontsCSSView.as_view(), name='pdf.css'), re_path(r'^settings/?$', user.UserSettings.as_view(), name='user.settings'), re_path(r'^settings/history/$', user.UserHistoryView.as_view(), name='user.settings.history'), diff --git a/src/pretix/control/views/users.py b/src/pretix/control/views/users.py index 864844d2bb..34b1659511 100644 --- a/src/pretix/control/views/users.py +++ b/src/pretix/control/views/users.py @@ -201,14 +201,15 @@ class UserEmergencyTokenView(AdministratorPermissionRequiredMixin, RecentAuthent return reverse('control:users.edit', kwargs=self.kwargs) -class Reset2FADriftView(AdministratorPermissionRequiredMixin, RecentAuthenticationRequiredMixin, View): +class Reset2FADriftThrottleView(AdministratorPermissionRequiredMixin, RecentAuthenticationRequiredMixin, View): def get(self, request, *args, **kwargs): return redirect(reverse('control:users.edit', kwargs=self.kwargs)) def post(self, request, *args, **kwargs): self.object = get_object_or_404(User, pk=self.kwargs.get("id")) - self.object.totpdevice_set.update(drift=0) + self.object.totpdevice_set.update(drift=0, throttling_failure_timestamp=None, throttling_failure_count=0) + self.object.staticdevice_set.update(throttling_failure_timestamp=None, throttling_failure_count=0) self.object.log_action('pretix.user.settings.2fa.resetdrift', user=self.request.user) messages.success(request, _( 'The drift values for TOTP devices have been reset.'