fix(backend): getApTypeでエラーを投げないように (misskey #14361)
This commit is contained in:
		
							parent
							
								
									4b77419c7a
								
							
						
					
					
						commit
						b9097d968c
					
				
					 3 changed files with 28 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -118,6 +118,8 @@
 | 
			
		|||
		サーバー管理者は各サーバーの必要に応じ`drive_file` `("uri")`に対するインデックスを張りなおすことでより安定しDBの探索が行われる可能性があります。詳細 は [GitHub](https://github.com/misskey-dev/misskey/pull/14323#issuecomment-2257562228)で確認可能です
 | 
			
		||||
- Fix: 自分のフォロワー限定投稿に対するリプライがホームタイムラインで見えないことが有る問題を修正
 | 
			
		||||
- Fix: フォローしていないユーザによるフォロワー限定投稿に対するリプライがソーシャルタイムラインで表示されることがある問題を修正
 | 
			
		||||
- Fix: ActivityPubのエンティティタイプ判定で不明なタイプを受け取った場合でも処理を継続するように
 | 
			
		||||
  - キュー処理のつまりが改善される可能性があります
 | 
			
		||||
 | 
			
		||||
### Misskey.js
 | 
			
		||||
- Feat: `/drive/files/create` のリクエストに対応(`multipart/form-data`に対応)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue