[backend/core] Correctly handle remote AP redirects to local notes
This commit is contained in:
parent
bcdcce80c9
commit
1ef5be8917
3 changed files with 24 additions and 8 deletions
|
@ -87,7 +87,7 @@ public class ActivityFetcherService(
|
|||
{
|
||||
var requestHost = new Uri(url).Host;
|
||||
if (requestHost == config.Value.WebDomain || requestHost == config.Value.AccountDomain)
|
||||
throw GracefulException.UnprocessableEntity("Refusing to fetch activity from local domain");
|
||||
throw new LocalFetchException(url);
|
||||
|
||||
if (await fedCtrlSvc.ShouldBlockAsync(requestHost))
|
||||
{
|
||||
|
|
|
@ -201,6 +201,12 @@ public class AuthFetchException(HttpStatusCode statusCode, string message, strin
|
|||
new(HttpStatusCode.NotFound, HttpStatusCode.NotFound.ToString(), message);
|
||||
}
|
||||
|
||||
public class LocalFetchException(string uri)
|
||||
: GracefulException(HttpStatusCode.UnprocessableEntity, "Refusing to fetch activity from local domain")
|
||||
{
|
||||
public string Uri => uri;
|
||||
}
|
||||
|
||||
public enum ExceptionVerbosity
|
||||
{
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Global")]
|
||||
|
|
|
@ -1029,19 +1029,29 @@ public class NoteService(
|
|||
throw GracefulException.UnprocessableEntity("Refusing to resolve circular threads");
|
||||
_resolverHistory.Add(uri);
|
||||
|
||||
var note = uri.StartsWith($"https://{config.Value.WebDomain}/notes/")
|
||||
? await db.Notes.IncludeCommonProperties()
|
||||
.FirstOrDefaultAsync(p => p.Id ==
|
||||
uri.Substring($"https://{config.Value.WebDomain}/notes/".Length))
|
||||
: await db.Notes.IncludeCommonProperties()
|
||||
.FirstOrDefaultAsync(p => p.Uri == uri);
|
||||
if (uri.StartsWith($"https://{config.Value.WebDomain}/notes/"))
|
||||
{
|
||||
var id = uri[$"https://{config.Value.WebDomain}/notes/".Length..];
|
||||
return await db.Notes.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == id);
|
||||
}
|
||||
|
||||
var note = await db.Notes.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Uri == uri);
|
||||
|
||||
if (note != null) return note;
|
||||
|
||||
if (!fetchedNote?.VerifiedFetch ?? false)
|
||||
fetchedNote = null;
|
||||
|
||||
fetchedNote ??= user != null ? await fetchSvc.FetchNoteAsync(uri, user) : await fetchSvc.FetchNoteAsync(uri);
|
||||
try
|
||||
{
|
||||
fetchedNote ??=
|
||||
user != null ? await fetchSvc.FetchNoteAsync(uri, user) : await fetchSvc.FetchNoteAsync(uri);
|
||||
}
|
||||
catch (LocalFetchException e) when (e.Uri.StartsWith($"https://{config.Value.WebDomain}/notes/"))
|
||||
{
|
||||
var id = e.Uri[$"https://{config.Value.WebDomain}/notes/".Length..];
|
||||
return await db.Notes.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == id);
|
||||
}
|
||||
|
||||
if (fetchedNote == null)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue