summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/remote/activitypub/kernel/delete/index.ts42
-rw-r--r--src/remote/activitypub/type.ts8
2 files changed, 40 insertions, 10 deletions
diff --git a/src/remote/activitypub/kernel/delete/index.ts b/src/remote/activitypub/kernel/delete/index.ts
index be7779e026..4fb3d40577 100644
--- a/src/remote/activitypub/kernel/delete/index.ts
+++ b/src/remote/activitypub/kernel/delete/index.ts
@@ -1,26 +1,48 @@
-import Resolver from '../../resolver';
import deleteNote from './note';
import { IRemoteUser } from '../../../../models/entities/user';
-import { IDelete, getApId, validPost } from '../../type';
-import { apLogger } from '../../logger';
+import { IDelete, getApId, isTombstone, IObject, validPost, validActor } from '../../type';
+import { toSingle } from '../../../../prelude/array';
/**
* 削除アクティビティを捌きます
*/
-export default async (actor: IRemoteUser, activity: IDelete): Promise<void> => {
+export default async (actor: IRemoteUser, activity: IDelete): Promise<string> => {
if ('actor' in activity && actor.uri !== activity.actor) {
throw new Error('invalid actor');
}
- const resolver = new Resolver();
+ // 削除対象objectのtype
+ let formarType: string | undefined;
- const object = await resolver.resolve(activity.object);
+ if (typeof activity.object === 'string') {
+ // typeが不明だけど、どうせ消えてるのでremote resolveしない
+ formarType = undefined;
+ } else {
+ const object = activity.object as IObject;
+ if (isTombstone(object)) {
+ formarType = toSingle(object.formerType);
+ } else {
+ formarType = toSingle(object.type);
+ }
+ }
+
+ const uri = getApId(activity.object);
- const uri = getApId(object);
+ // type不明でもactorとobjectが同じならばそれはPersonに違いない
+ if (!formarType && actor.uri === uri) {
+ formarType = 'Person';
+ }
+
+ // それでもなかったらおそらくNote
+ if (!formarType) {
+ formarType = 'Note';
+ }
- if (validPost.includes(object.type) || object.type === 'Tombstone') {
- deleteNote(actor, uri);
+ if (validPost.includes(formarType)) {
+ return await deleteNote(actor, uri);
+ } else if (validActor.includes(formarType)) {
+ return `Delete Actor is not implanted`;
} else {
- apLogger.warn(`Unknown type: ${object.type}`);
+ return `Unknown type ${formarType}`;
}
};
diff --git a/src/remote/activitypub/type.ts b/src/remote/activitypub/type.ts
index 0533506cdc..5c01c24b53 100644
--- a/src/remote/activitypub/type.ts
+++ b/src/remote/activitypub/type.ts
@@ -119,6 +119,14 @@ interface IQuestionChoice {
replies?: ICollection;
_misskey_votes?: number;
}
+export interface ITombstone extends IObject {
+ type: 'Tombstone';
+ formerType?: string;
+ deleted?: Date;
+}
+
+export const isTombstone = (object: IObject): object is ITombstone =>
+ object.type === 'Tombstone';
export const validActor = ['Person', 'Service', 'Group', 'Organization', 'Application'];