[backend/masto-client] Resolve notes with user keypair
This commit is contained in:
parent
8f03cb0768
commit
78705b8a5d
3 changed files with 16 additions and 4 deletions
|
@ -157,7 +157,7 @@ public class SearchController(
|
||||||
//TODO: figure out whether there is a more efficient way to get this information (in one query)
|
//TODO: figure out whether there is a more efficient way to get this information (in one query)
|
||||||
if (note == null && !await db.Notes.AnyAsync(p => p.Uri == search.Query || p.Url == search.Query))
|
if (note == null && !await db.Notes.AnyAsync(p => p.Uri == search.Query || p.Url == search.Query))
|
||||||
{
|
{
|
||||||
var tmpNote = await noteSvc.ResolveNoteAsync(search.Query);
|
var tmpNote = await noteSvc.ResolveNoteAsync(search.Query, user: user);
|
||||||
|
|
||||||
// We need to re-fetch the note to capture the includes
|
// We need to re-fetch the note to capture the includes
|
||||||
if (tmpNote != null)
|
if (tmpNote != null)
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http.Headers;
|
using System.Net.Http.Headers;
|
||||||
|
using Iceshrimp.Backend.Core.Database;
|
||||||
using Iceshrimp.Backend.Core.Database.Tables;
|
using Iceshrimp.Backend.Core.Database.Tables;
|
||||||
using Iceshrimp.Backend.Core.Federation.ActivityStreams;
|
using Iceshrimp.Backend.Core.Federation.ActivityStreams;
|
||||||
using Iceshrimp.Backend.Core.Federation.ActivityStreams.Types;
|
using Iceshrimp.Backend.Core.Federation.ActivityStreams.Types;
|
||||||
using Iceshrimp.Backend.Core.Middleware;
|
using Iceshrimp.Backend.Core.Middleware;
|
||||||
using Iceshrimp.Backend.Core.Services;
|
using Iceshrimp.Backend.Core.Services;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
@ -14,6 +16,7 @@ public class ActivityFetcherService(
|
||||||
HttpClient client,
|
HttpClient client,
|
||||||
HttpRequestService httpRqSvc,
|
HttpRequestService httpRqSvc,
|
||||||
SystemUserService systemUserSvc,
|
SystemUserService systemUserSvc,
|
||||||
|
DatabaseContext db,
|
||||||
ILogger<ActivityFetcherService> logger
|
ILogger<ActivityFetcherService> logger
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -99,6 +102,14 @@ public class ActivityFetcherService(
|
||||||
return activity.OfType<ASNote>().FirstOrDefault();
|
return activity.OfType<ASNote>().FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<ASNote?> FetchNoteAsync(string uri, User actor)
|
||||||
|
{
|
||||||
|
var keypair = await db.UserKeypairs.FirstOrDefaultAsync(p => p.User == actor) ??
|
||||||
|
throw new Exception("User has no keypair");
|
||||||
|
var activity = await FetchActivityAsync(uri, actor, keypair);
|
||||||
|
return activity.OfType<ASNote>().FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<ASNote?> FetchNoteAsync(string uri)
|
public async Task<ASNote?> FetchNoteAsync(string uri)
|
||||||
{
|
{
|
||||||
var (actor, keypair) = await systemUserSvc.GetInstanceActorWithKeypairAsync();
|
var (actor, keypair) = await systemUserSvc.GetInstanceActorWithKeypairAsync();
|
||||||
|
|
|
@ -581,7 +581,7 @@ public class NoteService(
|
||||||
return result.Where(p => p != null).Cast<DriveFile>().ToList();
|
return result.Where(p => p != null).Cast<DriveFile>().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Note?> ResolveNoteAsync(string uri, ASNote? fetchedNote = null)
|
public async Task<Note?> ResolveNoteAsync(string uri, ASNote? fetchedNote = null, User? user = null)
|
||||||
{
|
{
|
||||||
//TODO: is this enough to prevent DoS attacks?
|
//TODO: is this enough to prevent DoS attacks?
|
||||||
if (_recursionLimit-- <= 0)
|
if (_recursionLimit-- <= 0)
|
||||||
|
@ -600,7 +600,8 @@ public class NoteService(
|
||||||
if (note != null) return note;
|
if (note != null) return note;
|
||||||
|
|
||||||
//TODO: should we fall back to a regular user's keypair if fetching with instance actor fails & a local user is following the actor?
|
//TODO: should we fall back to a regular user's keypair if fetching with instance actor fails & a local user is following the actor?
|
||||||
fetchedNote ??= await fetchSvc.FetchNoteAsync(uri);
|
fetchedNote ??= user != null ? await fetchSvc.FetchNoteAsync(uri, user) : await fetchSvc.FetchNoteAsync(uri);
|
||||||
|
|
||||||
if (fetchedNote == null)
|
if (fetchedNote == null)
|
||||||
{
|
{
|
||||||
logger.LogDebug("Failed to fetch note, skipping");
|
logger.LogDebug("Failed to fetch note, skipping");
|
||||||
|
|
Loading…
Add table
Reference in a new issue