From 4d21aa1670208a63de8cd29fb96d40d347e15f51 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 11 Mar 2024 03:04:32 +0100 Subject: [PATCH] [backend/federation] Fix remote custom emoji reactions (ISH-154) --- .../Federation/ActivityPub/ActivityDeliverService.cs | 11 ++++++----- .../Core/Federation/ActivityPub/ActivityRenderer.cs | 6 +++--- Iceshrimp.Backend/Core/Services/NoteService.cs | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs index 15adf934..fbb56ed9 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityDeliverService.cs @@ -51,13 +51,14 @@ public class ActivityDeliverService( { if (note.Visibility != Note.NoteVisibility.Specified) { - await DeliverToFollowersAsync(activity, actor, [note.User]); + await DeliverToFollowersAsync(activity, actor, note.User.Host == null ? [] : [note.User]); return; } - await DeliverToAsync(activity, actor, await db.Users.Where(p => note.VisibleUserIds - .Prepend(note.User.Id) - .Contains(p.Id)) - .ToArrayAsync()); + var recipients = await db.Users + .Where(p => note.VisibleUserIds.Prepend(note.User.Id).Contains(p.Id) && p.Host != null) + .ToArrayAsync(); + + await DeliverToAsync(activity, actor, recipients); } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs index 52aa3455..eaef8346 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs @@ -76,8 +76,6 @@ public class ActivityRenderer( public ASEmojiReact RenderReact(NoteReaction reaction, Emoji? emoji) { - if (reaction.Note.UserHost == null) - throw GracefulException.BadRequest("Refusing to render like activity: note user must be remote"); if (reaction.User.Host != null) throw GracefulException.BadRequest("Refusing to render like activity: actor must be local"); @@ -91,9 +89,11 @@ public class ActivityRenderer( if (emoji != null) { + var name = emoji.Host == null ? emoji.Name : $"{emoji.Name}@{emoji.Host}"; + var e = new ASEmoji { - Id = emoji.PublicUrl, Name = emoji.Name, Image = new ASImage { Url = new ASLink(emoji.PublicUrl) } + Id = emoji.PublicUrl, Name = name, Image = new ASImage { Url = new ASLink(emoji.PublicUrl) } }; res.Tags = [e]; diff --git a/Iceshrimp.Backend/Core/Services/NoteService.cs b/Iceshrimp.Backend/Core/Services/NoteService.cs index 5b116ac3..4e3ed084 100644 --- a/Iceshrimp.Backend/Core/Services/NoteService.cs +++ b/Iceshrimp.Backend/Core/Services/NoteService.cs @@ -1184,7 +1184,7 @@ public class NoteService( await db.Database .ExecuteSqlAsync($"""UPDATE "note" SET "reactions" = jsonb_set("reactions", ARRAY[{name}], (COALESCE("reactions"->>{name}, '0')::int + 1)::text::jsonb) WHERE "id" = {note.Id}"""); - if (user.Host == null && note.User.Host != null) + if (user.Host == null) { var emoji = await emojiSvc.ResolveEmoji(reaction.Reaction); var activity = activityRenderer.RenderReact(reaction, emoji); @@ -1218,7 +1218,7 @@ public class NoteService( await db.Database .ExecuteSqlAsync($"""UPDATE "note" SET "reactions" = jsonb_set("reactions", ARRAY[{name}], (COALESCE("reactions"->>{name}, '1')::int - 1)::text::jsonb) WHERE "id" = {note.Id}"""); - if (user.Host == null && note.User.Host != null) + if (user.Host == null) { var actor = userRenderer.RenderLite(user); var emoji = await emojiSvc.ResolveEmoji(reaction.Reaction);