[backend] Fix resolver cannot parse some follows and notes request

This commit is contained in:
老周部落 2024-02-25 09:54:16 +08:00 committed by 老周部落
parent e9ef70e272
commit 3824767cc9

View file

@ -24,6 +24,7 @@ import { renderActivity } from "@/remote/activitypub/renderer/index.js";
import renderFollow from "@/remote/activitypub/renderer/follow.js"; import renderFollow from "@/remote/activitypub/renderer/follow.js";
import { shouldBlockInstance } from "@/misc/should-block-instance.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js";
import { apLogger } from "@/remote/activitypub/logger.js"; import { apLogger } from "@/remote/activitypub/logger.js";
import { In, IsNull, Not } from "typeorm";
export default class Resolver { export default class Resolver {
private history: Set<string>; private history: Set<string>;
@ -154,7 +155,7 @@ export default class Resolver {
return Notes.findOneByOrFail({ id: parsed.id }).then((note) => { return Notes.findOneByOrFail({ id: parsed.id }).then((note) => {
if (parsed.rest === "activity") { if (parsed.rest === "activity") {
// this refers to the create activity and not the note itself // this refers to the create activity and not the note itself
return renderActivity(renderCreate(renderNote(note))); return renderActivity(renderCreate(renderNote(note), note));
} else { } else {
return renderNote(note); return renderNote(note);
} }
@ -176,15 +177,34 @@ export default class Resolver {
(reaction) => renderActivity(renderLike(reaction, { uri: null })), (reaction) => renderActivity(renderLike(reaction, { uri: null })),
); );
case "follows": case "follows":
// rest should be <followee id> // if rest is a <followee id>
if (parsed.rest == null || !/^\w+$/.test(parsed.rest)) if (parsed.rest != null && /^\w+$/.test(parsed.rest)) {
throw new Error("resolveLocal: invalid follow URI"); return Promise.all(
[parsed.id, parsed.rest].map((id) => Users.findOneByOrFail({ id })),
).then(([follower, followee]) =>
renderActivity(renderFollow(follower, followee, url)),
);
}
return Promise.all( // Another situation is there is only requestId, then obtained object from database.
[parsed.id, parsed.rest].map((id) => Users.findOneByOrFail({ id })), const followRequest = FollowRequests.findOneBy({
).then(([follower, followee]) => id: parsed.id,
renderActivity(renderFollow(follower, followee, url)), });
); if (followRequest == null) {
throw new Error("resolveLocal: invalid follow URI");
}
const follower = Users.findOneBy({
id: followRequest.followerId,
host: IsNull(),
});
const followee = Users.findOneBy({
id: followRequest.followeeId,
host: Not(IsNull()),
});
if (follower == null || followee == null) {
throw new Error("resolveLocal: invalid follow URI");
}
return renderActivity(renderFollow(follower, followee, url));
default: default:
throw new Error(`resolveLocal: type ${type} unhandled`); throw new Error(`resolveLocal: type ${type} unhandled`);
} }