show emergency codes only once after generating (4.10)

This commit is contained in:
Mira Weller
2025-11-25 13:05:05 +01:00
parent 9fd9defbd7
commit 5ba66a370e
2 changed files with 22 additions and 15 deletions

View File

@@ -144,14 +144,23 @@
</div> </div>
<div class="panel-body"> <div class="panel-body">
<p> <p>
{% trans "If you lose access to your devices, you can use one of the following keys to log in. We recommend to store them in a safe place, e.g. printed out or in a password manager. Every token can be used at most once." %} {% blocktrans trimmed with generation_date_time=static_tokens_device.created_at %}
If you lose access to your devices, you can use one of your emergency tokens to log in.
We recommend to store them in a safe place, e.g. printed out or in a password manager.
Every token can be used at most once.
{% endblocktrans %}
</p> </p>
<p>{% trans "Unused tokens:" %}</p> {% if static_tokens_device %}
<ul> <p>
{% for t in static_tokens %} {% blocktrans trimmed with generation_date_time=static_tokens_device.created_at %}
<li><code>{{ t.token }}</code></li> You generated your emergency tokens on {{ generation_date_time }}.
{% endfor %} {% endblocktrans %}
</ul> </p>
{% else %}
<p>
{% trans "You don't have any emergency tokens yet." %}
</p>
{% endif %}
<a href="{% url "control:user.settings.2fa.regenemergency" %}" class="btn btn-default"> <a href="{% url "control:user.settings.2fa.regenemergency" %}" class="btn btn-default">
<span class="fa fa-refresh"></span> <span class="fa fa-refresh"></span>
{% trans "Generate new emergency tokens" %} {% trans "Generate new emergency tokens" %}

View File

@@ -292,16 +292,13 @@ class User2FAMainView(RecentAuthenticationRequiredMixin, TemplateView):
ctx = super().get_context_data() ctx = super().get_context_data()
try: try:
ctx['static_tokens'] = StaticDevice.objects.get(user=self.request.user, name='emergency').token_set.all() ctx['static_tokens_device'] = StaticDevice.objects.get(user=self.request.user, name='emergency')
except StaticDevice.MultipleObjectsReturned: except StaticDevice.MultipleObjectsReturned:
ctx['static_tokens'] = StaticDevice.objects.filter( ctx['static_tokens_device'] = StaticDevice.objects.filter(
user=self.request.user, name='emergency' user=self.request.user, name='emergency'
).first().token_set.all() ).first()
except StaticDevice.DoesNotExist: except StaticDevice.DoesNotExist:
d = StaticDevice.objects.create(user=self.request.user, name='emergency') ctx['static_tokens_device'] = None
for i in range(10):
d.token_set.create(token=get_random_string(length=12, allowed_chars='1234567890'))
ctx['static_tokens'] = d.token_set.all()
ctx['devices'] = [] ctx['devices'] = []
for dt in REAL_DEVICE_TYPES: for dt in REAL_DEVICE_TYPES:
@@ -634,7 +631,8 @@ class User2FARegenerateEmergencyView(RecentAuthenticationRequiredMixin, Template
self.request.user.update_session_token() self.request.user.update_session_token()
update_session_auth_hash(self.request, self.request.user) update_session_auth_hash(self.request, self.request.user)
messages.success(request, _('Your emergency codes have been newly generated. Remember to store them in a safe ' messages.success(request, _('Your emergency codes have been newly generated. Remember to store them in a safe '
'place in case you lose access to your devices.')) 'place in case you lose access to your devices. You will not be able to view them '
'again here.\n\nYour emergency codes:\n- ' + '\n- '.join(t.token for t in d.token_set.all())))
return redirect(reverse('control:user.settings.2fa')) return redirect(reverse('control:user.settings.2fa'))