fix(backend): getApTypeでエラーを投げないように (#14361)

* fix(backend): getApTypeでエラーを投げないように

* Update Changelog

* Update Changelog

* Update type.ts

* add comment
This commit is contained in:
かっこかり 2024-08-11 16:25:57 +09:00 committed by GitHub
parent 0aaf74ee22
commit 93fc06d18b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 28 additions and 11 deletions

View file

@ -18,6 +18,8 @@
- Fix: Play各種エンドポイントの返り値に`visibility`が含まれていない問題を修正 - Fix: Play各種エンドポイントの返り値に`visibility`が含まれていない問題を修正
- Fix: サーバー情報取得の際にモデレーター限定の情報が取得できないことがあるのを修正 - Fix: サーバー情報取得の際にモデレーター限定の情報が取得できないことがあるのを修正
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/582) (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/582)
- Fix: ActivityPubのエンティティタイプ判定で不明なタイプを受け取った場合でも処理を継続するように
- キュー処理のつまりが改善される可能性があります
## 2024.7.0 ## 2024.7.0

View file

@ -78,9 +78,10 @@ export class ApNoteService {
@bindThis @bindThis
public validateNote(object: IObject, uri: string): Error | null { public validateNote(object: IObject, uri: string): Error | null {
const expectHost = this.utilityService.extractDbHost(uri); const expectHost = this.utilityService.extractDbHost(uri);
const apType = getApType(object);
if (!validPost.includes(getApType(object))) { if (apType == null || !validPost.includes(apType)) {
return new IdentifiableError('d450b8a9-48e4-4dab-ae36-f4db763fda7c', `invalid Note: invalid object type ${getApType(object)}`); return new IdentifiableError('d450b8a9-48e4-4dab-ae36-f4db763fda7c', `invalid Note: invalid object type ${apType ?? 'undefined'}`);
} }
if (object.id && this.utilityService.extractDbHost(object.id) !== expectHost) { if (object.id && this.utilityService.extractDbHost(object.id) !== expectHost) {

View file

@ -60,11 +60,14 @@ export function getApId(value: string | IObject): string {
/** /**
* Get ActivityStreams Object type * 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 (typeof value.type === 'string') return value.type;
if (Array.isArray(value.type) && typeof value.type[0] === 'string') return value.type[0]; 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 { export function getOneApHrefNullable(value: ApObject | undefined): string | undefined {
@ -110,8 +113,10 @@ export interface IOrderedCollection extends IObject {
export const validPost = ['Note', 'Question', 'Article', 'Audio', 'Document', 'Image', 'Page', 'Video', 'Event']; export const validPost = ['Note', 'Question', 'Article', 'Audio', 'Document', 'Image', 'Page', 'Video', 'Event'];
export const isPost = (object: IObject): object is IPost => export const isPost = (object: IObject): object is IPost => {
validPost.includes(getApType(object)); const type = getApType(object);
return type != null && validPost.includes(type);
};
export interface IPost extends IObject { export interface IPost extends IObject {
type: 'Note' | 'Question' | 'Article' | 'Audio' | 'Document' | 'Image' | 'Page' | 'Video' | 'Event'; type: 'Note' | 'Question' | 'Article' | 'Audio' | 'Document' | 'Image' | 'Page' | 'Video' | 'Event';
@ -158,8 +163,10 @@ export const isTombstone = (object: IObject): object is ITombstone =>
export const validActor = ['Person', 'Service', 'Group', 'Organization', 'Application']; export const validActor = ['Person', 'Service', 'Group', 'Organization', 'Application'];
export const isActor = (object: IObject): object is IActor => export const isActor = (object: IObject): object is IActor => {
validActor.includes(getApType(object)); const type = getApType(object);
return type != null && validActor.includes(type);
};
export interface IActor extends IObject { export interface IActor extends IObject {
type: 'Person' | 'Service' | 'Organization' | 'Group' | 'Application'; type: 'Person' | 'Service' | 'Organization' | 'Group' | 'Application';
@ -242,12 +249,16 @@ export interface IKey extends IObject {
publicKeyPem: string | Buffer; publicKeyPem: string | Buffer;
} }
export const validDocumentTypes = ['Audio', 'Document', 'Image', 'Page', 'Video'];
export interface IApDocument extends IObject { export interface IApDocument extends IObject {
type: 'Audio' | 'Document' | 'Image' | 'Page' | 'Video'; type: 'Audio' | 'Document' | 'Image' | 'Page' | 'Video';
} }
export const isDocument = (object: IObject): object is IApDocument => export const isDocument = (object: IObject): object is IApDocument => {
['Audio', 'Document', 'Image', 'Page', 'Video'].includes(getApType(object)); const type = getApType(object);
return type != null && validDocumentTypes.includes(type);
};
export interface IApImage extends IApDocument { export interface IApImage extends IApDocument {
type: 'Image'; type: 'Image';
@ -325,7 +336,10 @@ export const isAccept = (object: IObject): object is IAccept => getApType(object
export const isReject = (object: IObject): object is IReject => getApType(object) === 'Reject'; export const isReject = (object: IObject): object is IReject => getApType(object) === 'Reject';
export const isAdd = (object: IObject): object is IAdd => getApType(object) === 'Add'; export const isAdd = (object: IObject): object is IAdd => getApType(object) === 'Add';
export const isRemove = (object: IObject): object is IRemove => getApType(object) === 'Remove'; 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 isAnnounce = (object: IObject): object is IAnnounce => getApType(object) === 'Announce';
export const isBlock = (object: IObject): object is IBlock => getApType(object) === 'Block'; export const isBlock = (object: IObject): object is IBlock => getApType(object) === 'Block';
export const isFlag = (object: IObject): object is IFlag => getApType(object) === 'Flag'; export const isFlag = (object: IObject): object is IFlag => getApType(object) === 'Flag';