From 72d13c19d8d76293e7dd31cc57655de5725ae712 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 19 Feb 2024 00:14:30 +0100 Subject: [PATCH] [backend/federation] Process incoming user deletes --- .../ActivityPub/ActivityHandlerService.cs | 7 +++--- .../Core/Services/UserService.cs | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs index 1ee82ae3..e8c6b5cc 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs @@ -78,8 +78,8 @@ public class ActivityHandlerService( if (activity.Actor.Id != actor.Id) throw GracefulException.UnprocessableEntity("Refusing to delete user: actor doesn't match"); - //TODO: handle user deletes - throw new NotImplementedException("User deletes aren't supported yet"); + await userSvc.DeleteUserAsync(actor); + return; } if (activity.Object is not ASTombstone tombstone) @@ -95,8 +95,7 @@ public class ActivityHandlerService( if (tombstone.Id != activity.Actor.Id) throw GracefulException.UnprocessableEntity("Refusing to delete user: actor doesn't match"); - //TODO: handle user deletes - throw new NotImplementedException("User deletes aren't supported yet"); + await userSvc.DeleteUserAsync(activity.Actor); } logger.LogDebug("Delete activity object {id} is unknown, skipping", tombstone.Id); diff --git a/Iceshrimp.Backend/Core/Services/UserService.cs b/Iceshrimp.Backend/Core/Services/UserService.cs index 86e8325e..a748445c 100644 --- a/Iceshrimp.Backend/Core/Services/UserService.cs +++ b/Iceshrimp.Backend/Core/Services/UserService.cs @@ -317,4 +317,26 @@ public class UserService( await db.SaveChangesAsync(); return key; } + + public async Task DeleteUserAsync(ASActor actor) + { + var user = await db.Users + .Include(user => user.Avatar) + .Include(user => user.Banner) + .FirstOrDefaultAsync(p => p.Uri == actor.Id && p.Host != null); + + if (user == null) + { + logger.LogDebug("User {uri} is unknown, skipping delete task", actor.Id); + return; + } + + db.Remove(user); + await db.SaveChangesAsync(); + + if (user.Avatar != null) + await driveSvc.RemoveFile(user.Avatar); + if (user.Banner != null) + await driveSvc.RemoveFile(user.Banner); + } } \ No newline at end of file