diff --git a/mnemosyne/themis/templates/themis/profile/settings.html b/mnemosyne/themis/templates/themis/profile/settings.html index 9c177cb..727b70d 100644 --- a/mnemosyne/themis/templates/themis/profile/settings.html +++ b/mnemosyne/themis/templates/themis/profile/settings.html @@ -140,5 +140,32 @@ + + +
+
+

Daedalus API Token

+

+ Used by Daedalus to authenticate with Mnemosyne. Set + DAEDALUS_MNEMOSYNE_API_KEY + in your Daedalus environment to this value. +

+
+ {{ api_token.key }} + +
+
+
+ {% csrf_token %} + +
+
+
+
{% endblock %} diff --git a/mnemosyne/themis/urls.py b/mnemosyne/themis/urls.py index 87e986b..44d8881 100644 --- a/mnemosyne/themis/urls.py +++ b/mnemosyne/themis/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ path("live/", views.live, name="live"), # Profile settings path("profile/settings/", views.profile_settings, name="profile-settings"), + path("profile/api-token/regenerate/", views.api_token_regenerate, name="api-token-regenerate"), # API key management path("profile/keys/", views.key_list, name="key-list"), path("profile/keys/add/", views.key_create, name="key-create"), diff --git a/mnemosyne/themis/views.py b/mnemosyne/themis/views.py index 30fda4a..d9deb94 100644 --- a/mnemosyne/themis/views.py +++ b/mnemosyne/themis/views.py @@ -12,6 +12,8 @@ from django.shortcuts import get_object_or_404, redirect, render from django.utils import timezone from django.views.decorators.http import require_GET, require_http_methods, require_POST +from rest_framework.authtoken.models import Token + from themis.encryption import encrypt_value from themis.forms import APIKeyCreateForm, APIKeyEditForm, ProfileSettingsForm from themis.models import UserAPIKey, UserNotification @@ -63,6 +65,7 @@ def live(request): def profile_settings(request): """Display and update user profile preferences.""" profile = request.user.profile + api_token, _ = Token.objects.get_or_create(user=request.user) if request.method == "POST": form = ProfileSettingsForm(request.POST, instance=profile) @@ -73,7 +76,17 @@ def profile_settings(request): else: form = ProfileSettingsForm(instance=profile) - return render(request, "themis/profile/settings.html", {"form": form}) + return render(request, "themis/profile/settings.html", {"form": form, "api_token": api_token}) + + +@login_required +@require_POST +def api_token_regenerate(request): + """Delete and recreate the user's DRF API token.""" + Token.objects.filter(user=request.user).delete() + Token.objects.create(user=request.user) + messages.success(request, "API token regenerated.") + return redirect("themis:profile-settings") # ---------------------------------------------------------------------------