🐛 Fix activitypub bugs
This commit is contained in:
@@ -60,8 +60,9 @@ public class ActivityPubDeliveryService(
|
|||||||
|
|
||||||
var actorUrl = $"https://{Domain}/activitypub/actors/{publisher.Name}";
|
var actorUrl = $"https://{Domain}/activitypub/actors/{publisher.Name}";
|
||||||
var targetActor = await GetOrFetchActorAsync(targetActorUri);
|
var targetActor = await GetOrFetchActorAsync(targetActorUri);
|
||||||
|
var localActor = await GetOrCreateLocalActorAsync(publisher);
|
||||||
|
|
||||||
if (targetActor?.InboxUri == null)
|
if (targetActor?.InboxUri == null || localActor == null)
|
||||||
{
|
{
|
||||||
logger.LogWarning("Target actor or inbox not found: {Uri}", targetActorUri);
|
logger.LogWarning("Target actor or inbox not found: {Uri}", targetActorUri);
|
||||||
return false;
|
return false;
|
||||||
@@ -80,7 +81,7 @@ public class ActivityPubDeliveryService(
|
|||||||
{
|
{
|
||||||
IsLocalActor = true,
|
IsLocalActor = true,
|
||||||
LocalPublisherId = publisher.Id,
|
LocalPublisherId = publisher.Id,
|
||||||
ActorId = Guid.NewGuid(),
|
ActorId = localActor.Id,
|
||||||
TargetActorId = targetActor.Id,
|
TargetActorId = targetActor.Id,
|
||||||
State = RelationshipState.Pending,
|
State = RelationshipState.Pending,
|
||||||
IsFollowing = true,
|
IsFollowing = true,
|
||||||
@@ -278,6 +279,50 @@ public class ActivityPubDeliveryService(
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<SnFediverseActor?> GetOrCreateLocalActorAsync(SnPublisher publisher)
|
||||||
|
{
|
||||||
|
var actorUrl = $"https://{Domain}/activitypub/actors/{publisher.Name}";
|
||||||
|
|
||||||
|
var localActor = await db.FediverseActors
|
||||||
|
.FirstOrDefaultAsync(a => a.Uri == actorUrl);
|
||||||
|
|
||||||
|
if (localActor != null)
|
||||||
|
return localActor;
|
||||||
|
|
||||||
|
var instance = await db.FediverseInstances
|
||||||
|
.FirstOrDefaultAsync(i => i.Domain == Domain);
|
||||||
|
|
||||||
|
if (instance == null)
|
||||||
|
{
|
||||||
|
instance = new SnFediverseInstance
|
||||||
|
{
|
||||||
|
Domain = Domain,
|
||||||
|
Name = Domain
|
||||||
|
};
|
||||||
|
db.FediverseInstances.Add(instance);
|
||||||
|
await db.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
localActor = new SnFediverseActor
|
||||||
|
{
|
||||||
|
Uri = actorUrl,
|
||||||
|
Username = publisher.Name,
|
||||||
|
DisplayName = publisher.Name,
|
||||||
|
Bio = null,
|
||||||
|
InboxUri = $"{actorUrl}/inbox",
|
||||||
|
OutboxUri = $"{actorUrl}/outbox",
|
||||||
|
FollowersUri = $"{actorUrl}/followers",
|
||||||
|
FollowingUri = $"{actorUrl}/following",
|
||||||
|
AvatarUrl = null,
|
||||||
|
InstanceId = instance.Id
|
||||||
|
};
|
||||||
|
|
||||||
|
db.FediverseActors.Add(localActor);
|
||||||
|
await db.SaveChangesAsync();
|
||||||
|
|
||||||
|
return localActor;
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<SnFediverseActor?> GetOrFetchActorAsync(string actorUri)
|
private async Task<SnFediverseActor?> GetOrFetchActorAsync(string actorUri)
|
||||||
{
|
{
|
||||||
var actor = await db.FediverseActors
|
var actor = await db.FediverseActors
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using DysonNetwork.Shared.Models;
|
using DysonNetwork.Shared.Models;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
|
|
||||||
@@ -8,67 +9,67 @@ namespace DysonNetwork.Sphere.ActivityPub;
|
|||||||
|
|
||||||
public class MastodonInstanceV2Response
|
public class MastodonInstanceV2Response
|
||||||
{
|
{
|
||||||
public string Domain { get; set; } = null!;
|
[JsonPropertyName("domain")] public string Domain { get; init; } = null!;
|
||||||
public string Title { get; set; } = null!;
|
[JsonPropertyName("title")] public string Title { get; init; } = null!;
|
||||||
public string Version { get; set; } = null!;
|
[JsonPropertyName("version")] public string Version { get; init; } = null!;
|
||||||
public string? SourceUrl { get; set; }
|
[JsonPropertyName("source_url")] public string? SourceUrl { get; init; }
|
||||||
public string? Description { get; set; }
|
[JsonPropertyName("description")] public string? Description { get; init; }
|
||||||
public MastodonUsage? Usage { get; set; }
|
[JsonPropertyName("usage")] public MastodonUsage? Usage { get; init; }
|
||||||
public MastodonThumbnail? Thumbnail { get; set; }
|
[JsonPropertyName("thumbnail")] public MastodonThumbnail? Thumbnail { get; init; }
|
||||||
public List<MastodonIcon>? Icon { get; set; }
|
[JsonPropertyName("icon")] public List<MastodonIcon>? Icon { get; init; }
|
||||||
public List<string>? Languages { get; set; }
|
[JsonPropertyName("languages")] public List<string>? Languages { get; init; }
|
||||||
public MastodonContact? Contact { get; set; }
|
[JsonPropertyName("contact")] public MastodonContact? Contact { get; init; }
|
||||||
public Dictionary<string, object>? Registrations { get; set; }
|
[JsonPropertyName("registrations")] public Dictionary<string, object>? Registrations { get; init; }
|
||||||
public Dictionary<string, object>? Configuration { get; set; }
|
[JsonPropertyName("configuration")] public Dictionary<string, object>? Configuration { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MastodonUsage
|
public class MastodonUsage
|
||||||
{
|
{
|
||||||
public MastodonUserUsage? Users { get; set; }
|
[JsonPropertyName("users")] public MastodonUserUsage? Users { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MastodonUserUsage
|
public class MastodonUserUsage
|
||||||
{
|
{
|
||||||
public int ActiveMonth { get; set; }
|
[JsonPropertyName("active_month")] public int ActiveMonth { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MastodonThumbnail
|
public class MastodonThumbnail
|
||||||
{
|
{
|
||||||
public string? Url { get; set; }
|
[JsonPropertyName("url")] public string? Url { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MastodonIcon
|
public class MastodonIcon
|
||||||
{
|
{
|
||||||
public string? Src { get; set; }
|
[JsonPropertyName("src")] public string? Src { get; init; }
|
||||||
public string? Size { get; set; }
|
[JsonPropertyName("size")] public string? Size { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MastodonContact
|
public class MastodonContact
|
||||||
{
|
{
|
||||||
public string? Email { get; set; }
|
[JsonPropertyName("email")] public string? Email { get; init; }
|
||||||
public MastodonContactAccount? Account { get; set; }
|
[JsonPropertyName("account")] public MastodonContactAccount? Account { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MastodonContactAccount
|
public class MastodonContactAccount
|
||||||
{
|
{
|
||||||
public string? Username { get; set; }
|
[JsonPropertyName("username")] public string? Username { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MisskeyMetaResponse
|
public class MisskeyMetaResponse
|
||||||
{
|
{
|
||||||
public string? Name { get; set; }
|
[JsonPropertyName("name")] public string? Name { get; init; }
|
||||||
public string? Description { get; set; }
|
[JsonPropertyName("description")] public string? Description { get; init; }
|
||||||
public string? Version { get; set; }
|
[JsonPropertyName("version")] public string? Version { get; init; }
|
||||||
public string? Uri { get; set; }
|
[JsonPropertyName("uri")] public string? Uri { get; init; }
|
||||||
public List<string>? Langs { get; set; }
|
[JsonPropertyName("langs")] public List<string>? Langs { get; init; }
|
||||||
public string? MaintainerName { get; set; }
|
[JsonPropertyName("maintainerName")] public string? MaintainerName { get; init; }
|
||||||
public string? MaintainerEmail { get; set; }
|
[JsonPropertyName("maintainerEmail")] public string? MaintainerEmail { get; init; }
|
||||||
public string? IconUrl { get; set; }
|
[JsonPropertyName("iconUrl")] public string? IconUrl { get; init; }
|
||||||
public string? BannerUrl { get; set; }
|
[JsonPropertyName("bannerUrl")] public string? BannerUrl { get; init; }
|
||||||
public string? RepositoryUrl { get; set; }
|
[JsonPropertyName("repositoryUrl")] public string? RepositoryUrl { get; init; }
|
||||||
public string? PrivacyPolicyUrl { get; set; }
|
[JsonPropertyName("privacyPolicyUrl")] public string? PrivacyPolicyUrl { get; init; }
|
||||||
public string? TosUrl { get; set; }
|
[JsonPropertyName("tosUrl")] public string? TosUrl { get; init; }
|
||||||
public int? MaxNoteTextLength { get; set; }
|
[JsonPropertyName("maxNoteTextLength")] public int? MaxNoteTextLength { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public partial class ActivityPubDiscoveryService(
|
public partial class ActivityPubDiscoveryService(
|
||||||
@@ -629,4 +630,4 @@ public partial class ActivityPubDiscoveryService(
|
|||||||
|
|
||||||
[GeneratedRegex(@"^@?(\w+)@([\w.-]+)$", RegexOptions.Compiled)]
|
[GeneratedRegex(@"^@?(\w+)@([\w.-]+)$", RegexOptions.Compiled)]
|
||||||
private static partial Regex HandleRegex();
|
private static partial Regex HandleRegex();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user