summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-08-11 16:25:57 +0900
committerdakkar <dakkar@thenautilus.net>2024-08-16 12:38:18 +0100
commitb9097d968cf38cd80b63c5ee38ca2beef288b26a (patch)
treecba47ed29d99025bd721fffb47363ecf383cb659 /packages
parentMerge branch 'feature/add-translation-key' into feature/misskey-2024.07 (diff)
downloadsharkey-b9097d968cf38cd80b63c5ee38ca2beef288b26a.tar.gz
sharkey-b9097d968cf38cd80b63c5ee38ca2beef288b26a.tar.bz2
sharkey-b9097d968cf38cd80b63c5ee38ca2beef288b26a.zip
fix(backend): getApTypeでエラーを投げないように (misskey #14361)
Diffstat (limited to 'packages')
-rw-r--r--packages/backend/src/core/activitypub/models/ApNoteService.ts5
-rw-r--r--packages/backend/src/core/activitypub/type.ts32
2 files changed, 26 insertions, 11 deletions
diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts
index 0766a8cd85..cc5addcf20 100644
--- a/packages/backend/src/core/activitypub/models/ApNoteService.ts
+++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts
@@ -83,9 +83,10 @@ export class ApNoteService {
@bindThis
public validateNote(object: IObject, uri: string): Error | null {
const expectHost = this.utilityService.extractDbHost(uri);
+ const apType = getApType(object);
- if (!validPost.includes(getApType(object))) {
- return new IdentifiableError('d450b8a9-48e4-4dab-ae36-f4db763fda7c', `invalid Note: invalid object type ${getApType(object)}`);
+ if (apType == null || !validPost.includes(apType)) {
+ return new IdentifiableError('d450b8a9-48e4-4dab-ae36-f4db763fda7c', `invalid Note: invalid object type ${apType ?? 'undefined'}`);
}
if (object.id && this.utilityService.extractDbHost(object.id) !== expectHost) {
diff --git a/packages/backend/src/core/activitypub/type.ts b/packages/backend/src/core/activitypub/type.ts
index 8edd8a1aba..c92e2b805f 100644
--- a/packages/backend/src/core/activitypub/type.ts
+++ b/packages/backend/src/core/activitypub/type.ts
@@ -60,11 +60,14 @@ export function getApId(value: string | IObject): string {
/**
* Get ActivityStreams Object type
+ *
+ * タイプ判定ができなかった場合に、あえてエラーではなくnullを返すようにしている。
+ * 詳細: https://github.com/misskey-dev/misskey/issues/14239
*/
-export function getApType(value: IObject): string {
+export function getApType(value: IObject): string | null {
if (typeof value.type === 'string') return value.type;
if (Array.isArray(value.type) && typeof value.type[0] === 'string') return value.type[0];
- throw new Error('cannot detect type');
+ return null;
}
export function getOneApHrefNullable(value: ApObject | undefined): string | undefined {
@@ -108,8 +111,10 @@ export interface IOrderedCollection extends IObject {
export const validPost = ['Note', 'Question', 'Article', 'Audio', 'Document', 'Image', 'Page', 'Video', 'Event'];
-export const isPost = (object: IObject): object is IPost =>
- validPost.includes(getApType(object));
+export const isPost = (object: IObject): object is IPost => {
+ const type = getApType(object);
+ return type != null && validPost.includes(type);
+};
export interface IPost extends IObject {
type: 'Note' | 'Question' | 'Article' | 'Audio' | 'Document' | 'Image' | 'Page' | 'Video' | 'Event';
@@ -159,8 +164,10 @@ export const isTombstone = (object: IObject): object is ITombstone =>
export const validActor = ['Person', 'Service', 'Group', 'Organization', 'Application'];
-export const isActor = (object: IObject): object is IActor =>
- validActor.includes(getApType(object));
+export const isActor = (object: IObject): object is IActor => {
+ const type = getApType(object);
+ return type != null && validActor.includes(type);
+};
export interface IActor extends IObject {
type: 'Person' | 'Service' | 'Organization' | 'Group' | 'Application';
@@ -246,12 +253,16 @@ export interface IKey extends IObject {
publicKeyPem: string | Buffer;
}
+export const validDocumentTypes = ['Audio', 'Document', 'Image', 'Page', 'Video'];
+
export interface IApDocument extends IObject {
type: 'Audio' | 'Document' | 'Image' | 'Page' | 'Video';
}
-export const isDocument = (object: IObject): object is IApDocument =>
- ['Audio', 'Document', 'Image', 'Page', 'Video'].includes(getApType(object));
+export const isDocument = (object: IObject): object is IApDocument => {
+ const type = getApType(object);
+ return type != null && validDocumentTypes.includes(type);
+};
export interface IApImage extends IApDocument {
type: 'Image';
@@ -329,7 +340,10 @@ export const isAccept = (object: IObject): object is IAccept => getApType(object
export const isReject = (object: IObject): object is IReject => getApType(object) === 'Reject';
export const isAdd = (object: IObject): object is IAdd => getApType(object) === 'Add';
export const isRemove = (object: IObject): object is IRemove => getApType(object) === 'Remove';
-export const isLike = (object: IObject): object is ILike => getApType(object) === 'Like' || getApType(object) === 'EmojiReaction' || getApType(object) === 'EmojiReact';
+export const isLike = (object: IObject): object is ILike => {
+ const type = getApType(object);
+ return type != null && ['Like', 'EmojiReaction', 'EmojiReact'].includes(type);
+};
export const isAnnounce = (object: IObject): object is IAnnounce => getApType(object) === 'Announce';
export const isBlock = (object: IObject): object is IBlock => getApType(object) === 'Block';
export const isFlag = (object: IObject): object is IFlag => getApType(object) === 'Flag';