fix(server): ノート翻訳時に公開範囲が考慮されていない問題を修正
This commit is contained in:
		
							parent
							
								
									65d9c304df
								
							
						
					
					
						commit
						1cd8bfaded
					
				
					 3 changed files with 61 additions and 0 deletions
				
			
		|  | @ -7,6 +7,12 @@ | |||
| 
 | ||||
| --> | ||||
| 
 | ||||
| ## 12.x.x (unreleased) | ||||
| 
 | ||||
| ### Bugfixes | ||||
| - Dockerfileを修正 | ||||
| - ノート翻訳時に公開範囲が考慮されていない問題を修正 | ||||
| 
 | ||||
| ## 12.90.0 (2021/09/04) | ||||
| 
 | ||||
| ### Improvements | ||||
|  |  | |||
|  | @ -18,7 +18,57 @@ export class NoteRepository extends Repository<Note> { | |||
| 		return x.trim().length <= 100; | ||||
| 	} | ||||
| 
 | ||||
| 	public async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> { | ||||
| 		// visibility が specified かつ自分が指定されていなかったら非表示
 | ||||
| 		if (note.visibility === 'specified') { | ||||
| 			if (meId == null) { | ||||
| 				return false; | ||||
| 			} else if (meId === note.userId) { | ||||
| 				return true; | ||||
| 			} else { | ||||
| 				// 指定されているかどうか
 | ||||
| 				const specified = note.visibleUserIds.some((id: any) => meId === id); | ||||
| 
 | ||||
| 				if (specified) { | ||||
| 					return true; | ||||
| 				} else { | ||||
| 					return false; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// visibility が followers かつ自分が投稿者のフォロワーでなかったら非表示
 | ||||
| 		if (note.visibility === 'followers') { | ||||
| 			if (meId == null) { | ||||
| 				return false; | ||||
| 			} else if (meId === note.userId) { | ||||
| 				return true; | ||||
| 			} else if (note.reply && (meId === note.reply.userId)) { | ||||
| 				// 自分の投稿に対するリプライ
 | ||||
| 				return true; | ||||
| 			} else if (note.mentions && note.mentions.some(id => meId === id)) { | ||||
| 				// 自分へのメンション
 | ||||
| 				return true; | ||||
| 			} else { | ||||
| 				// フォロワーかどうか
 | ||||
| 				const following = await Followings.findOne({ | ||||
| 					followeeId: note.userId, | ||||
| 					followerId: meId | ||||
| 				}); | ||||
| 
 | ||||
| 				if (following == null) { | ||||
| 					return false; | ||||
| 				} else { | ||||
| 					return true; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	private async hideNote(packedNote: PackedNote, meId: User['id'] | null) { | ||||
| 		// TODO: isVisibleForMe を使うようにしても良さそう(型違うけど)
 | ||||
| 		let hide = false; | ||||
| 
 | ||||
| 		// visibility が specified かつ自分が指定されていなかったら非表示
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ import config from '@/config/index'; | |||
| import { getAgentByUrl } from '@/misc/fetch'; | ||||
| import { URLSearchParams } from 'url'; | ||||
| import { fetchMeta } from '@/misc/fetch-meta'; | ||||
| import { Notes } from '@/models'; | ||||
| 
 | ||||
| export const meta = { | ||||
| 	tags: ['notes'], | ||||
|  | @ -43,6 +44,10 @@ export default define(meta, async (ps, user) => { | |||
| 		throw e; | ||||
| 	}); | ||||
| 
 | ||||
| 	if (!(await Notes.isVisibleForMe(note, user ? user.id : null))) { | ||||
| 		return 204; // TODO: 良い感じのエラー返す
 | ||||
| 	} | ||||
| 
 | ||||
| 	if (note.text == null) { | ||||
| 		return 204; | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue