From e954060f3b463c6c2b618807a3d768d94a3ffee0 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Tue, 27 May 2025 15:18:37 +0900 Subject: [PATCH 01/10] chore(dev): update vite configuration (#16110) --- packages/frontend-embed/vite.config.ts | 8 +++++++- packages/frontend/vite.config.ts | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/frontend-embed/vite.config.ts b/packages/frontend-embed/vite.config.ts index 3d628c800e..a057581b3a 100644 --- a/packages/frontend-embed/vite.config.ts +++ b/packages/frontend-embed/vite.config.ts @@ -66,9 +66,15 @@ export function getConfig(): UserConfig { return { base: '/embed_vite/', + // The console is shared with backend, so clearing the console will also clear the backend log. + clearScreen: false, + server: { - host, + // The backend allows access from any addresses, so vite also allows access from any addresses. + host: '0.0.0.0', + allowedHosts: host ? [host] : undefined, port: 5174, + strictPort: true, hmr: { // バックエンド経由での起動時、Viteは5174経由でアセットを参照していると思い込んでいるが実際は3000から配信される // そのため、バックエンドのWSサーバーにHMRのWSリクエストが吸収されてしまい、正しくHMRが機能しない diff --git a/packages/frontend/vite.config.ts b/packages/frontend/vite.config.ts index 71c133acc8..b0ccbfb65c 100644 --- a/packages/frontend/vite.config.ts +++ b/packages/frontend/vite.config.ts @@ -81,9 +81,15 @@ export function getConfig(): UserConfig { return { base: '/vite/', + // The console is shared with backend, so clearing the console will also clear the backend log. + clearScreen: false, + server: { - host, + // The backend allows access from any addresses, so vite also allows access from any addresses. + host: '0.0.0.0', + allowedHosts: host ? [host] : undefined, port: 5173, + strictPort: true, hmr: { // バックエンド経由での起動時、Viteは5173経由でアセットを参照していると思い込んでいるが実際は3000から配信される // そのため、バックエンドのWSサーバーにHMRのWSリクエストが吸収されてしまい、正しくHMRが機能しない From 97e916c912df25247d3ee4b8942ad037729e44dd Mon Sep 17 00:00:00 2001 From: zyoshoka <107108195+zyoshoka@users.noreply.github.com> Date: Tue, 27 May 2025 20:45:05 +0900 Subject: [PATCH 02/10] refactor(frontend): revoke weakening endpoint param type of API caller for type safety (#16100) --- packages/frontend/src/utility/misskey-api.ts | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/frontend/src/utility/misskey-api.ts b/packages/frontend/src/utility/misskey-api.ts index 72ba54ade3..f10249878f 100644 --- a/packages/frontend/src/utility/misskey-api.ts +++ b/packages/frontend/src/utility/misskey-api.ts @@ -9,24 +9,12 @@ import { apiUrl } from '@@/js/config.js'; import { $i } from '@/i.js'; export const pendingApiRequestsCount = ref(0); -export type Endpoint = keyof Misskey.Endpoints; - -export type Request = Misskey.Endpoints[E]['req']; - -export type AnyRequest = - (E extends Endpoint ? Request : never) | object; - -export type Response> = - E extends Endpoint - ? P extends Request ? Misskey.api.SwitchCaseResponseType : never - : object; - // Implements Misskey.api.ApiClient.request export function misskeyApi< ResT = void, - E extends Endpoint | NonNullable = Endpoint, - P extends AnyRequest = E extends Endpoint ? Request : never, - _ResT = ResT extends void ? Response : ResT, + E extends keyof Misskey.Endpoints = keyof Misskey.Endpoints, + P extends Misskey.Endpoints[E]['req'] = Misskey.Endpoints[E]['req'], + _ResT = ResT extends void ? Misskey.api.SwitchCaseResponseType : ResT, >( endpoint: E, data: P & { i?: string | null; } = {} as any, From 9bbc2028ade21c0d9b0e0c887d6b8c29b244de73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Tue, 27 May 2025 20:46:22 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20URL=E3=83=97=E3=83=AC=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=81=AE=E3=83=AA=E3=83=80=E3=82=A4=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=83=88=E3=82=92=E5=8F=97=E3=81=91=E5=85=A5=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B=E3=82=92=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B=20(#16112)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: URLプレビューのリダイレクトを受け入れるかどうかを設定できるようにする * fix CHANGELOG.md * fix lang --- CHANGELOG.md | 1 + locales/index.d.ts | 8 ++++++++ locales/ja-JP.yml | 2 ++ .../1748310233000-addUrlPreviewAllowRedirect.js | 16 ++++++++++++++++ packages/backend/src/models/Meta.ts | 5 +++++ .../src/server/api/endpoints/admin/meta.ts | 5 +++++ .../server/api/endpoints/admin/update-meta.ts | 5 +++++ .../backend/src/server/web/UrlPreviewService.ts | 3 ++- packages/frontend/src/pages/admin/settings.vue | 10 ++++++++-- packages/misskey-js/src/autogen/types.ts | 2 ++ 10 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 packages/backend/migration/1748310233000-addUrlPreviewAllowRedirect.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 440e2e21e7..3f8d29d2d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - デフォルトは**テキスト、JSON、画像、動画、音声ファイル**になっています。zipなど、その他の種別のファイルは含まれていないため、必要に応じて設定を変更してください。 - 場合によってはファイル種別を正しく検出できないことがあります(特にテキストフォーマット)。その場合、ファイル種別は application/octet-stream と見做されます。 - したがって、それらの種別不明ファイルを許可したい場合は application/octet-stream を指定に追加してください。 +- Feat: プレビュー先がリダイレクトを伴う場合、リダイレクト先のコンテンツを取得しに行くか否かを設定できるように(#16043) - Enhance: UIのアイコンデータの読み込みを軽量化 ### Client diff --git a/locales/index.d.ts b/locales/index.d.ts index b6b69f3ebe..c75c155d74 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -11232,6 +11232,14 @@ export interface Locale extends ILocale { * URLプレビューを有効にする */ "enable": string; + /** + * プレビュー先のリダイレクトを許可 + */ + "allowRedirect": string; + /** + * 入力されたURLがリダイレクトされる場合に、そのリダイレクト先をたどってプレビューを表示するかどうかを設定します。無効にするとサーバーリソースの節約になりますが、リダイレクト先の内容は表示されなくなります。 + */ + "allowRedirectDescription": string; /** * プレビュー取得時のタイムアウト(ms) */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a4081b1bf9..865d5d4203 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2987,6 +2987,8 @@ _offlineScreen: _urlPreviewSetting: title: "URLプレビューの設定" enable: "URLプレビューを有効にする" + allowRedirect: "プレビュー先のリダイレクトを許可" + allowRedirectDescription: "入力されたURLがリダイレクトされる場合に、そのリダイレクト先をたどってプレビューを表示するかどうかを設定します。無効にするとサーバーリソースの節約になりますが、リダイレクト先の内容は表示されなくなります。" timeout: "プレビュー取得時のタイムアウト(ms)" timeoutDescription: "プレビュー取得の所要時間がこの値を超えた場合、プレビューは生成されません。" maximumContentLength: "Content-Lengthの最大値(byte)" diff --git a/packages/backend/migration/1748310233000-addUrlPreviewAllowRedirect.js b/packages/backend/migration/1748310233000-addUrlPreviewAllowRedirect.js new file mode 100644 index 0000000000..a895d0a941 --- /dev/null +++ b/packages/backend/migration/1748310233000-addUrlPreviewAllowRedirect.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class AddUrlPreviewAllowRedirect1748310233000 { + name = 'AddUrlPreviewAllowRedirect1748310233000' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" ADD "urlPreviewAllowRedirect" boolean NOT NULL DEFAULT true`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "urlPreviewAllowRedirect"`); + } +} diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts index 545173ff3c..3ee6190d45 100644 --- a/packages/backend/src/models/Meta.ts +++ b/packages/backend/src/models/Meta.ts @@ -619,6 +619,11 @@ export class MiMeta { }) public urlPreviewEnabled: boolean; + @Column('boolean', { + default: true, + }) + public urlPreviewAllowRedirect: boolean; + @Column('integer', { default: 10000, }) diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 0cd46b614f..924163afbb 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -495,6 +495,10 @@ export const meta = { type: 'boolean', optional: false, nullable: false, }, + urlPreviewAllowRedirect: { + type: 'boolean', + optional: false, nullable: false, + }, urlPreviewTimeout: { type: 'number', optional: false, nullable: false, @@ -704,6 +708,7 @@ export default class extends Endpoint { // eslint- notesPerOneAd: instance.notesPerOneAd, summalyProxy: instance.urlPreviewSummaryProxyUrl, urlPreviewEnabled: instance.urlPreviewEnabled, + urlPreviewAllowRedirect: instance.urlPreviewAllowRedirect, urlPreviewTimeout: instance.urlPreviewTimeout, urlPreviewMaximumContentLength: instance.urlPreviewMaximumContentLength, urlPreviewRequireContentLength: instance.urlPreviewRequireContentLength, diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 0e3569d667..578aa2b662 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -170,6 +170,7 @@ export const paramDef = { description: '[Deprecated] Use "urlPreviewSummaryProxyUrl" instead.', }, urlPreviewEnabled: { type: 'boolean' }, + urlPreviewAllowRedirect: { type: 'boolean' }, urlPreviewTimeout: { type: 'integer' }, urlPreviewMaximumContentLength: { type: 'integer' }, urlPreviewRequireContentLength: { type: 'boolean' }, @@ -664,6 +665,10 @@ export default class extends Endpoint { // eslint- set.urlPreviewEnabled = ps.urlPreviewEnabled; } + if (ps.urlPreviewAllowRedirect !== undefined) { + set.urlPreviewAllowRedirect = ps.urlPreviewAllowRedirect; + } + if (ps.urlPreviewTimeout !== undefined) { set.urlPreviewTimeout = ps.urlPreviewTimeout; } diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index 531d085315..16763b2c3e 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -122,7 +122,7 @@ export class UrlPreviewService { : undefined; return summaly(url, { - followRedirects: false, + followRedirects: this.meta.urlPreviewAllowRedirect, lang: lang ?? 'ja-JP', agent: agent, userAgent: meta.urlPreviewUserAgent ?? undefined, @@ -137,6 +137,7 @@ export class UrlPreviewService { const queryStr = query({ url: url, lang: lang ?? 'ja-JP', + followRedirects: this.meta.urlPreviewAllowRedirect, userAgent: meta.urlPreviewUserAgent ?? undefined, operationTimeout: meta.urlPreviewTimeout, contentLengthLimit: meta.urlPreviewMaximumContentLength, diff --git a/packages/frontend/src/pages/admin/settings.vue b/packages/frontend/src/pages/admin/settings.vue index 8e0c373a7b..f6a2eb1c27 100644 --- a/packages/frontend/src/pages/admin/settings.vue +++ b/packages/frontend/src/pages/admin/settings.vue @@ -146,6 +146,11 @@ SPDX-License-Identifier: AGPL-3.0-only