diff options
| author | tamaina <tamaina@hotmail.co.jp> | 2023-02-28 17:14:23 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-28 17:14:23 +0900 |
| commit | 12932d2831213bb2a60949f8d388fc2f6bd64ba3 (patch) | |
| tree | 0120eea59a447dbe569d7254a1043d6f675ed9d4 | |
| parent | dev: introduce Reviewer lottery (diff) | |
| download | sharkey-12932d2831213bb2a60949f8d388fc2f6bd64ba3.tar.gz sharkey-12932d2831213bb2a60949f8d388fc2f6bd64ba3.tar.bz2 sharkey-12932d2831213bb2a60949f8d388fc2f6bd64ba3.zip | |
fix: 外部メディアプロキシ使用時にアバタークロップができない問題を修正 (#10142)
* wip
* fix
* Update packages/frontend/src/scripts/media-proxy.ts
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
---------
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
| -rw-r--r-- | packages/backend/src/server/FileServerService.ts | 5 | ||||
| -rw-r--r-- | packages/frontend/src/components/MkCropperDialog.vue | 4 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/media-proxy.ts | 18 |
3 files changed, 15 insertions, 12 deletions
diff --git a/packages/backend/src/server/FileServerService.ts b/packages/backend/src/server/FileServerService.ts index c12ae9b824..e5eefac1fa 100644 --- a/packages/backend/src/server/FileServerService.ts +++ b/packages/backend/src/server/FileServerService.ts @@ -226,7 +226,10 @@ export class FileServerService { return; } - if (this.config.externalMediaProxyEnabled) { + // アバタークロップなど、どうしてもオリジンである必要がある場合 + const mustOrigin = 'origin' in request.query; + + if (this.config.externalMediaProxyEnabled && !mustOrigin) { // 外部のメディアプロキシが有効なら、そちらにリダイレクト reply.header('Cache-Control', 'public, max-age=259200'); // 3 days diff --git a/packages/frontend/src/components/MkCropperDialog.vue b/packages/frontend/src/components/MkCropperDialog.vue index d1b5cc5118..043a614e46 100644 --- a/packages/frontend/src/components/MkCropperDialog.vue +++ b/packages/frontend/src/components/MkCropperDialog.vue @@ -18,7 +18,7 @@ </div> </Transition> <div class="container"> - <img ref="imgEl" :src="imgUrl" style="display: none;" crossorigin="anonymous" @load="onImageLoad"> + <img ref="imgEl" :src="imgUrl" style="display: none;" @load="onImageLoad"> </div> </div> </template> @@ -49,7 +49,7 @@ const props = defineProps<{ aspectRatio: number; }>(); -const imgUrl = getProxiedImageUrl(props.file.url); +const imgUrl = getProxiedImageUrl(props.file.url, undefined, true); let dialogEl = $shallowRef<InstanceType<typeof MkModalWindow>>(); let imgEl = $shallowRef<HTMLImageElement>(); let cropper: Cropper | null = null; diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts index 274e96e0a1..2fe5bdcf8f 100644 --- a/packages/frontend/src/scripts/media-proxy.ts +++ b/packages/frontend/src/scripts/media-proxy.ts @@ -1,20 +1,20 @@ -import { query, appendQuery } from '@/scripts/url'; +import { query } from '@/scripts/url'; import { url } from '@/config'; import { instance } from '@/instance'; -export function getProxiedImageUrl(imageUrl: string, type?: 'preview'): string { - if (imageUrl.startsWith(instance.mediaProxy + '/') || imageUrl.startsWith('/proxy/')) { - // もう既にproxyっぽそうだったらsearchParams付けるだけ - return appendQuery(imageUrl, query({ - fallback: '1', - ...(type ? { [type]: '1' } : {}), - })); +export function getProxiedImageUrl(imageUrl: string, type?: 'preview', mustOrigin: boolean = false): string { + const localProxy = `${url}/proxy`; + + if (imageUrl.startsWith(instance.mediaProxy + '/') || imageUrl.startsWith('/proxy/') || imageUrl.startsWith(localProxy + '/')) { + // もう既にproxyっぽそうだったらurlを取り出す + imageUrl = (new URL(imageUrl)).searchParams.get('url') ?? imageUrl; } - return `${instance.mediaProxy}/image.webp?${query({ + return `${mustOrigin ? localProxy : instance.mediaProxy}/image.webp?${query({ url: imageUrl, fallback: '1', ...(type ? { [type]: '1' } : {}), + ...(mustOrigin ? { origin: '1' } : {}), })}`; } |