From bd8d5b20f84a8f2e1edc1b057248081fd78bfa73 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Wed, 24 Apr 2024 04:05:40 +0200 Subject: [PATCH] [backend/federation] Use separate renoteUri schema This allows renoteUris to be fetchable at their canonical uri. --- .../Federation/ActivityPubController.cs | 29 +++++++++++++++++-- .../ActivityPub/ActivityRenderer.cs | 2 +- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Iceshrimp.Backend/Controllers/Federation/ActivityPubController.cs b/Iceshrimp.Backend/Controllers/Federation/ActivityPubController.cs index 0ae339e4..e1d9465c 100644 --- a/Iceshrimp.Backend/Controllers/Federation/ActivityPubController.cs +++ b/Iceshrimp.Backend/Controllers/Federation/ActivityPubController.cs @@ -42,7 +42,32 @@ public class ActivityPubController( .FirstOrDefaultAsync(p => p.Id == id && p.UserHost == null); if (note == null) return NotFound(); var rendered = await noteRenderer.RenderAsync(note); - var compacted = LdHelpers.Compact(rendered); + var compacted = rendered.Compact(); + return Ok(compacted); + } + + [HttpGet("/notes/{id}/activity")] + [AuthorizedFetch] + [MediaTypeRouteFilter("application/activity+json", "application/ld+json")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ASNote))] + [ProducesResponseType(StatusCodes.Status401Unauthorized, Type = typeof(ErrorResponse))] + [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(ErrorResponse))] + public async Task GetRenote(string id) + { + var actor = HttpContext.GetActor(); + var note = await db.Notes + .IncludeCommonProperties() + .EnsureVisibleFor(actor) + .FirstOrDefaultAsync(p => p.Id == id && p.UserHost == null); + + if (note is not { IsPureRenote: true, Renote: not null }) return NotFound(); + + var rendered = ActivityPub.ActivityRenderer.RenderAnnounce(noteRenderer.RenderLite(note.Renote), + note.GetPublicUri(config.Value), + userRenderer.RenderLite(note.User), + note.Visibility, + note.User.GetPublicUri(config.Value) + "/followers"); + var compacted = rendered.Compact(); return Ok(compacted); } @@ -88,7 +113,7 @@ public class ActivityPubController( Items = rendered.Cast().ToList() }; - var compacted = LdHelpers.Compact(res); + var compacted = res.Compact(); return Ok(compacted); } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs index baaeef7b..62567112 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityRenderer.cs @@ -209,7 +209,7 @@ public class ActivityRenderer( _ => [] }; - return RenderAnnounce(note, actor, to, cc, renoteUri); + return RenderAnnounce(note, actor, to, cc, $"{renoteUri}/activity"); } public ASNote RenderVote(PollVote vote, Poll poll, Note note) => new()