[backend/federation] Canonicalize MkSummary in UpdateProfileMentions

This commit is contained in:
Laura Hausmann 2024-02-26 23:05:58 +01:00
parent c30dac0210
commit 89079f09c7
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 33 additions and 19 deletions

View file

@ -10,9 +10,12 @@ using Microsoft.Extensions.Options;
namespace Iceshrimp.Backend.Core.Services;
using MentionTuple = (List<Note.MentionedUser> mentions,
Dictionary<(string usernameLower, string webDomain), string> splitDomainMapping);
public class UserProfileMentionsResolver(ActivityPub.UserResolver userResolver, IOptions<Config.InstanceSection> config)
{
public async Task<List<Note.MentionedUser>> ResolveMentions(ASActor actor, string? host)
public async Task<MentionTuple> ResolveMentions(ASActor actor, string? host)
{
var fields = actor.Attachments?.OfType<ASField>()
.Where(p => p is { Name: not null, Value: not null })
@ -44,17 +47,25 @@ public class UserProfileMentionsResolver(ActivityPub.UserResolver userResolver,
.Select(async p => await userResolver.ResolveAsyncOrNull(p))
.AwaitAllNoConcurrencyAsync());
return users.Where(p => p != null)
.Cast<User>()
.DistinctBy(p => p.Id)
.Select(p => new Note.MentionedUser
{
Host = p.Host,
Uri = p.Uri ?? p.GetPublicUri(config.Value),
Url = p.UserProfile?.Url,
Username = p.Username
})
.ToList();
var mentions = users.Where(p => p != null)
.Cast<User>()
.DistinctBy(p => p.Id)
.Select(p => new Note.MentionedUser
{
Host = p.Host,
Uri = p.Uri ?? p.GetPublicUri(config.Value),
Url = p.UserProfile?.Url,
Username = p.Username
})
.ToList();
var splitDomainMapping = users.Where(p => p is { Host: not null, Uri: not null })
.Cast<User>()
.Where(p => new Uri(p.Uri!).Host != p.Host)
.DistinctBy(p => p.Host)
.ToDictionary(p => (p.UsernameLower, new Uri(p.Uri!).Host), p => p.Host!);
return (mentions, splitDomainMapping);
}
public async Task<List<Note.MentionedUser>> ResolveMentions(UserProfile.Field[]? fields, string? bio, string? host)

View file

@ -28,7 +28,8 @@ public class UserService(
DriveService driveSvc,
FollowupTaskService followupTaskSvc,
NotificationService notificationSvc,
EmojiService emojiSvc
EmojiService emojiSvc,
ActivityPub.MentionsResolver mentionsResolver
)
{
private static readonly AsyncKeyedLocker<string> KeyedLocker = new(o =>
@ -642,7 +643,7 @@ public class UserService(
if (actor != null)
{
var mentions = await bgMentionsResolver.ResolveMentions(actor, bgUser.Host);
var (mentions, splitDomainMapping) = await bgMentionsResolver.ResolveMentions(actor, bgUser.Host);
var fields = actor.Attachments != null
? await actor.Attachments
.OfType<ASField>()
@ -655,11 +656,13 @@ public class UserService(
.AwaitAllAsync()
: null;
bgUser.UserProfile.Mentions = mentions;
bgUser.UserProfile.Fields = fields?.ToArray() ?? [];
bgUser.UserProfile.Description = actor.MkSummary ??
await MfmConverter.FromHtmlAsync(actor.Summary,
bgUser.UserProfile.Mentions);
var description = actor.MkSummary != null
? mentionsResolver.ResolveMentions(actor.MkSummary, bgUser.Host, mentions, splitDomainMapping)
: await MfmConverter.FromHtmlAsync(actor.Summary, mentions);
bgUser.UserProfile.Mentions = mentions;
bgUser.UserProfile.Fields = fields?.ToArray() ?? [];
bgUser.UserProfile.Description = description;
}
else
{