refactor: 絵文字URLを引き回すのをやめる (#9423)
This commit is contained in:
		| @@ -309,6 +309,7 @@ export const paramDef = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		detail: { type: 'boolean', default: true }, | ||||
| 		omitEmojiUrl: { type: 'boolean', default: false }, | ||||
| 	}, | ||||
| 	required: [], | ||||
| } as const; | ||||
| @@ -390,7 +391,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 				backgroundImageUrl: instance.backgroundImageUrl, | ||||
| 				logoImageUrl: instance.logoImageUrl, | ||||
| 				maxNoteTextLength: MAX_NOTE_TEXT_LENGTH, // 後方互換性のため | ||||
| 				emojis: await this.emojiEntityService.packMany(emojis), | ||||
| 				emojis: await this.emojiEntityService.packMany(emojis, { omitUrl: ps.omitEmojiUrl }), | ||||
| 				defaultLightTheme: instance.defaultLightTheme, | ||||
| 				defaultDarkTheme: instance.defaultDarkTheme, | ||||
| 				ads: ads.map(ad => ({ | ||||
|   | ||||
| @@ -26,7 +26,7 @@ import { PageEntityService } from '@/core/entities/PageEntityService.js'; | ||||
| import { GalleryPostEntityService } from '@/core/entities/GalleryPostEntityService.js'; | ||||
| import { ClipEntityService } from '@/core/entities/ClipEntityService.js'; | ||||
| import { ChannelEntityService } from '@/core/entities/ChannelEntityService.js'; | ||||
| import type { ChannelsRepository, ClipsRepository, GalleryPostsRepository, NotesRepository, PagesRepository, UserProfilesRepository, UsersRepository } from '@/models/index.js'; | ||||
| import type { ChannelsRepository, ClipsRepository, EmojisRepository, GalleryPostsRepository, NotesRepository, PagesRepository, UserProfilesRepository, UsersRepository } from '@/models/index.js'; | ||||
| import { deepClone } from '@/misc/clone.js'; | ||||
| import { bindThis } from '@/decorators.js'; | ||||
| import manifest from './manifest.json' assert { type: 'json' }; | ||||
| @@ -70,6 +70,9 @@ export class ClientServerService { | ||||
| 		@Inject(DI.pagesRepository) | ||||
| 		private pagesRepository: PagesRepository, | ||||
|  | ||||
| 		@Inject(DI.emojisRepository) | ||||
| 		private emojisRepository: EmojisRepository, | ||||
|  | ||||
| 		private userEntityService: UserEntityService, | ||||
| 		private noteEntityService: NoteEntityService, | ||||
| 		private pageEntityService: PageEntityService, | ||||
| @@ -217,6 +220,33 @@ export class ClientServerService { | ||||
| 			return reply.sendFile('/apple-touch-icon.png', staticAssets); | ||||
| 		}); | ||||
|  | ||||
| 		fastify.get<{ Params: { path: string } }>('/emoji/:path(.*)', async (request, reply) => { | ||||
| 			const path = request.params.path; | ||||
|  | ||||
| 			if (!path.match(/^[a-zA-Z0-9\-_@\.]+?\.webp$/)) { | ||||
| 				reply.code(404); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			const name = path.split('@')[0].replace('.webp', ''); | ||||
| 			const host = path.split('@')[1]?.replace('.webp', ''); | ||||
|  | ||||
| 			const emoji = await this.emojisRepository.findOneBy({ | ||||
| 				host: host == null ? IsNull() : host, | ||||
| 				name: name, | ||||
| 			}); | ||||
|  | ||||
| 			if (emoji == null) { | ||||
| 				reply.code(404); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			reply.header('Content-Security-Policy', 'default-src \'none\'; style-src \'unsafe-inline\''); | ||||
|  | ||||
| 			// ?? emoji.originalUrl してるのは後方互換性のため | ||||
| 			return await reply.redirect(301, emoji.publicUrl ?? emoji.originalUrl); | ||||
| 		}); | ||||
|  | ||||
| 		fastify.get<{ Params: { path: string } }>('/fluent-emoji/:path(.*)', async (request, reply) => { | ||||
| 			const path = request.params.path; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo