summaryrefslogtreecommitdiff
path: root/src/remote/activitypub
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2020-07-11 06:19:49 +0900
committerGitHub <noreply@github.com>2020-07-11 06:19:49 +0900
commit5f8fb43cc9a2a3dc40b42fa63eee7cc0f9b17338 (patch)
tree6e35b1de5b45fe711c50d6cd3aa7d72b6ee288ad /src/remote/activitypub
parentUpdate resolutions (#6516) (diff)
downloadsharkey-5f8fb43cc9a2a3dc40b42fa63eee7cc0f9b17338.tar.gz
sharkey-5f8fb43cc9a2a3dc40b42fa63eee7cc0f9b17338.tar.bz2
sharkey-5f8fb43cc9a2a3dc40b42fa63eee7cc0f9b17338.zip
AP Delate Activityの修正 (#6512)
Diffstat (limited to 'src/remote/activitypub')
-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'];