improve identity deletion

This commit is contained in:
mein Name 2025-02-08 21:05:23 -05:00 committed by Henri Dickson
parent ab807ea1c9
commit 092d890ddc
4 changed files with 19 additions and 15 deletions

@ -1 +1 @@
Subproject commit 40dc947009e60e429bfe78a92917209f92106112 Subproject commit 21fd348a2c54f8769adb7f4d6d8782ebdd3a25bc

View file

@ -126,19 +126,16 @@ class Takahe:
@staticmethod @staticmethod
def request_delete_identity(identity_pk: int): 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() i = Identity.objects.filter(pk=identity_pk).first()
if i: if i:
InboxMessage.create_internal( InboxMessage.create_internal(
{"type": "DeleteIdentity", "actor": i.actor_uri} {"type": "DeleteIdentity", "actor": i.actor_uri}
) )
logger.warning(f"Requested identity {i} deletion") logger.warning(f"Identity {i} deletion requested")
return True
else: else:
logger.error(f"Identity {i} not found, force delete APIdentity") logger.error(f"Identity {i} not found")
apid = APIdentity.objects.get(pk=identity_pk) return False
remove_data_by_identity(apid)
@staticmethod @staticmethod
def create_internal_message(message: dict): def create_internal_message(message: dict):

View file

@ -17,6 +17,7 @@ class Command(BaseCommand):
parser.add_argument("--list", action="store_true", help="list all users") parser.add_argument("--list", action="store_true", help="list all users")
parser.add_argument("--verbose", action="store_true") parser.add_argument("--verbose", action="store_true")
parser.add_argument("--fix", action="store_true") parser.add_argument("--fix", action="store_true")
parser.add_argument("--delete", action="store", nargs="*", help="delete user")
parser.add_argument( parser.add_argument(
"--integrity", "--integrity",
action="store_true", action="store_true",

View file

@ -1,5 +1,6 @@
from urllib.parse import quote from urllib.parse import quote
import django_rq
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib import auth, messages from django.contrib import auth, messages
@ -218,25 +219,30 @@ def auth_logout(request):
return logout_takahe(redirect("/")) return logout_takahe(redirect("/"))
@require_http_methods(["POST"]) def initiate_user_deletion(user):
@login_required # for deletion initiated by local user in neodb:
def clear_data(request):
# for deletion initiated by local identity in neodb:
# 1. clear user data # 1. clear user data
# 2. neodb send DeleteIdentity to Takahe # 2. neodb send DeleteIdentity to Takahe
# 3. takahe delete identity and send identity_deleted to neodb # 3. takahe delete identity and send identity_deleted to neodb
# 4. identity_deleted clear user (if not yet) and identity data # 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: # for deletion initiated by remote/local identity in takahe:
# just 3 & 4 # 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"): if request.META.get("HTTP_AUTHORIZATION"):
raise BadRequest("Only for web login") raise BadRequest("Only for web login")
v = request.POST.get("verification", "").strip() v = request.POST.get("verification", "").strip()
if v: if v:
for acct in request.user.social_accounts.all(): for acct in request.user.social_accounts.all():
if acct.handle == v: if acct.handle == v:
request.user.clear() initiate_user_deletion(request.user)
Takahe.request_delete_identity(request.user.identity.pk)
messages.add_message( messages.add_message(
request, messages.INFO, _("Account is being deleted.") request, messages.INFO, _("Account is being deleted.")
) )