2026-10-01 17:58:22 +02:00
|
|
|
using PrivaPub.Federation.Actors;
|
|
|
|
|
using PrivaPub.Federation.Outbox;
|
|
|
|
|
using PrivaPub.Federation.Rendering;
|
|
|
|
|
using PrivaPub.Models.Federation;
|
|
|
|
|
using PrivaPub.Models.User;
|
|
|
|
|
using PrivaPub.StaticServices;
|
|
|
|
|
|
|
|
|
|
using System.Text.Json.Nodes;
|
|
|
|
|
|
|
|
|
|
using static PrivaPub.Federation.Objects.ActivityJson;
|
|
|
|
|
|
|
|
|
|
namespace PrivaPub.Federation.Inbox.Handlers
|
|
|
|
|
{
|
|
|
|
|
public class JoinHandler : IActivityHandler
|
|
|
|
|
{
|
|
|
|
|
readonly DbEntities _dbEntities;
|
|
|
|
|
readonly ILocalActorService _localActors;
|
|
|
|
|
readonly IDeliveryService _delivery;
|
|
|
|
|
|
|
|
|
|
public JoinHandler(DbEntities dbEntities, ILocalActorService localActors, IDeliveryService delivery)
|
|
|
|
|
{
|
|
|
|
|
_dbEntities = dbEntities;
|
|
|
|
|
_localActors = localActors;
|
|
|
|
|
_delivery = delivery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string Type => "Join";
|
|
|
|
|
|
|
|
|
|
public async Task Handle(JsonNode activity, ForeignAvatar actor, CancellationToken token)
|
|
|
|
|
{
|
|
|
|
|
var objectUri = Id(activity["object"]);
|
|
|
|
|
if (objectUri == default || !objectUri.StartsWith(_localActors.BaseAddress + "/", StringComparison.OrdinalIgnoreCase))
|
2026-10-03 11:04:42 +02:00
|
|
|
{
|
|
|
|
|
Arrival.Drop("unknown-object");
|
2026-10-01 17:58:22 +02:00
|
|
|
return;
|
2026-10-03 11:04:42 +02:00
|
|
|
}
|
2026-10-01 17:58:22 +02:00
|
|
|
var post = await _dbEntities.Posts.Match(p => p.ObjectURI == objectUri && !p.IsFederatedCopy && !p.DeletedAt.HasValue).ExecuteFirstAsync(token);
|
|
|
|
|
var owner = post == default ? default : await _localActors.FindById(LocalActorKind.Person, post.GroupUserId, token);
|
|
|
|
|
if (owner == default || string.IsNullOrEmpty(actor.InboxURL))
|
2026-10-03 11:04:42 +02:00
|
|
|
{
|
|
|
|
|
Arrival.Drop("unknown-object");
|
2026-10-01 17:58:22 +02:00
|
|
|
return;
|
2026-10-03 11:04:42 +02:00
|
|
|
}
|
|
|
|
|
Arrival.About(post.ObjectType ?? "Note", post.Visibility, post.CreationDate);
|
|
|
|
|
Arrival.Reject("ignored");
|
2026-10-01 17:58:22 +02:00
|
|
|
await _delivery.Enqueue(owner, new[] { actor.InboxURL }, new JsonObject
|
|
|
|
|
{
|
|
|
|
|
["@context"] = ActivityPubRenderer.ActivityStreams,
|
|
|
|
|
["id"] = owner.ActivityUri($"ignore-{Guid.NewGuid():N}"),
|
|
|
|
|
["type"] = "Ignore",
|
|
|
|
|
["actor"] = owner.Uri,
|
|
|
|
|
["object"] = activity.DeepClone()
|
|
|
|
|
}, token);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|