diff --git a/neodb-takahe b/neodb-takahe index 40dc9470..21fd348a 160000 --- a/neodb-takahe +++ b/neodb-takahe @@ -1 +1 @@ -Subproject commit 40dc947009e60e429bfe78a92917209f92106112 +Subproject commit 21fd348a2c54f8769adb7f4d6d8782ebdd3a25bc diff --git a/takahe/utils.py b/takahe/utils.py index 38bc1122..e87e3def 100644 --- a/takahe/utils.py +++ b/takahe/utils.py @@ -126,19 +126,16 @@ class Takahe: @staticmethod def request_delete_identity(identity_pk: int): - from journal.models import remove_data_by_identity - from users.models import APIdentity - i = Identity.objects.filter(pk=identity_pk).first() if i: InboxMessage.create_internal( {"type": "DeleteIdentity", "actor": i.actor_uri} ) - logger.warning(f"Requested identity {i} deletion") + logger.warning(f"Identity {i} deletion requested") + return True else: - logger.error(f"Identity {i} not found, force delete APIdentity") - apid = APIdentity.objects.get(pk=identity_pk) - remove_data_by_identity(apid) + logger.error(f"Identity {i} not found") + return False @staticmethod def create_internal_message(message: dict): diff --git a/users/management/commands/user.py b/users/management/commands/user.py index 4d3033b8..daaa6d4c 100644 --- a/users/management/commands/user.py +++ b/users/management/commands/user.py @@ -17,6 +17,7 @@ class Command(BaseCommand): parser.add_argument("--list", action="store_true", help="list all users") parser.add_argument("--verbose", action="store_true") parser.add_argument("--fix", action="store_true") + parser.add_argument("--delete", action="store", nargs="*", help="delete user") parser.add_argument( "--integrity", action="store_true", diff --git a/users/views/account.py b/users/views/account.py index ffc4cd4d..3528b526 100644 --- a/users/views/account.py +++ b/users/views/account.py @@ -1,5 +1,6 @@ from urllib.parse import quote +import django_rq from django import forms from django.conf import settings from django.contrib import auth, messages @@ -218,25 +219,30 @@ def auth_logout(request): return logout_takahe(redirect("/")) -@require_http_methods(["POST"]) -@login_required -def clear_data(request): - # for deletion initiated by local identity in neodb: +def initiate_user_deletion(user): + # for deletion initiated by local user in neodb: # 1. clear user data # 2. neodb send DeleteIdentity to Takahe # 3. takahe delete identity and send identity_deleted to neodb # 4. identity_deleted clear user (if not yet) and identity data - # 5. log web user out # for deletion initiated by remote/local identity in takahe: # just 3 & 4 + user.clear() + r = Takahe.request_delete_identity(user.identity.pk) + if not r: + django_rq.get_queue("mastodon").enqueue(user.identity.clear) + + +@require_http_methods(["POST"]) +@login_required +def clear_data(request): if request.META.get("HTTP_AUTHORIZATION"): raise BadRequest("Only for web login") v = request.POST.get("verification", "").strip() if v: for acct in request.user.social_accounts.all(): if acct.handle == v: - request.user.clear() - Takahe.request_delete_identity(request.user.identity.pk) + initiate_user_deletion(request.user) messages.add_message( request, messages.INFO, _("Account is being deleted.") )