Skip to content

Commit 7837b12

Browse files
committed
Merge tag '2024.5.0-io.8' into bun
2 parents 22a0dbe + 155ce40 commit 7837b12

File tree

7 files changed

+30
-18
lines changed

7 files changed

+30
-18
lines changed

packages/backend/src/core/entities/DriveFileEntityService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type { Packed } from '@/misc/json-schema.js';
1212
import { awaitAll } from '@/misc/prelude/await-all.js';
1313
import type { MiUser } from '@/models/User.js';
1414
import type { MiDriveFile } from '@/models/DriveFile.js';
15-
import { appendQuery, query } from '@/misc/prelude/url.js';
15+
import { appendQuery, omitHttps, query } from '@/misc/prelude/url.js';
1616
import { deepClone } from '@/misc/clone.js';
1717
import { bindThis } from '@/decorators.js';
1818
import { isMimeImage } from '@/misc/is-mime-image.js';
@@ -77,7 +77,7 @@ export class DriveFileEntityService {
7777
@bindThis
7878
private getProxiedUrl(url: string, mode?: 'static' | 'avatar'): string {
7979
return appendQuery(
80-
`${this.config.mediaProxy}/${mode ?? 'image'}/${encodeURIComponent(url)}`,
80+
`${this.config.mediaProxy}/${mode ?? 'image'}/${encodeURIComponent(omitHttps(url))}`,
8181
query({
8282
...(mode ? { [mode]: '1' } : {}),
8383
}),

packages/backend/src/misc/prelude/url.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,16 @@ export function query(obj: Record<string, unknown>): string {
1414
.reduce((a, [k, v]) => (a[k] = v, a), {} as Record<string, any>);
1515

1616
return Object.entries(params)
17-
.map((e) => `${e[0]}=${encodeURIComponent(e[1])}`)
17+
.map((p) => `${p[0]}=${encodeURIComponent(p[1])}`)
1818
.join('&');
1919
}
2020

2121
export function appendQuery(url: string, query: string): string {
2222
return `${url}${/\?/.test(url) ? url.endsWith('?') ? '' : '&' : '?'}${query}`;
2323
}
24+
25+
export function omitHttps(url: string): string {
26+
if (url.startsWith('https://')) return url.slice(8);
27+
if (url.startsWith('https%3A%2F%2F')) return url.slice(14);
28+
return url;
29+
}

packages/backend/src/server/FileServerService.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { FileInfoService } from '@/core/FileInfoService.js';
2626
import { LoggerService } from '@/core/LoggerService.js';
2727
import { bindThis } from '@/decorators.js';
2828
import { isMimeImage } from '@/misc/is-mime-image.js';
29-
import { appendQuery, query } from '@/misc/prelude/url.js';
29+
import { appendQuery, omitHttps, query } from '@/misc/prelude/url.js';
3030
import { correctFilename } from '@/misc/correct-filename.js';
3131
import { handleRequestRedirectToOmitSearch } from '@/misc/fastify-hook-handlers.js';
3232
import type { FastifyInstance, FastifyRequest, FastifyReply, FastifyPluginOptions } from 'fastify';
@@ -162,7 +162,7 @@ export class FileServerService {
162162
reply.header('Cache-Control', 'max-age=31536000, immutable');
163163

164164
const url = appendQuery(
165-
`${this.config.mediaProxy}/static/${encodeURIComponent(file.url)}`,
165+
`${this.config.mediaProxy}/static/${encodeURIComponent(omitHttps(file.url))}`,
166166
query({
167167
static: '1',
168168
}),
@@ -185,7 +185,7 @@ export class FileServerService {
185185
if (['image/svg+xml'].includes(file.mime)) {
186186
reply.header('Cache-Control', 'max-age=31536000, immutable');
187187

188-
const url = `${this.config.mediaProxy}/svg/${encodeURIComponent(file.url)}`;
188+
const url = `${this.config.mediaProxy}/svg/${encodeURIComponent(omitHttps(file.url))}`;
189189

190190
file.cleanup();
191191
return await reply.redirect(url, 301);
@@ -342,13 +342,13 @@ export class FileServerService {
342342

343343
reply.header('Cache-Control', 'public, max-age=259200'); // 3 days
344344

345-
const url = appendQuery(
346-
`${this.config.mediaProxy}/redirect/${encodeURIComponent(request.params.url)}`,
345+
const redirectUrl = appendQuery(
346+
`${this.config.mediaProxy}/redirect/${encodeURIComponent(omitHttps(url))}`,
347347
query(transformQuery as Record<string, string>),
348348
);
349349

350350
return reply.redirect(
351-
url,
351+
redirectUrl,
352352
301,
353353
);
354354
}

packages/backend/src/server/ServerService.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { DI } from '@/di-symbols.js';
1919
import type Logger from '@/logger.js';
2020
import * as Acct from '@/misc/acct.js';
2121
import { genIdenticon } from '@/misc/gen-identicon.js';
22-
import { appendQuery, query } from '@/misc/prelude/url.js';
22+
import { appendQuery, omitHttps, query } from '@/misc/prelude/url.js';
2323
import { UserEntityService } from '@/core/entities/UserEntityService.js';
2424
import { LoggerService } from '@/core/LoggerService.js';
2525
import { bindThis } from '@/decorators.js';
@@ -167,15 +167,15 @@ export class ServerService implements OnApplicationShutdown {
167167
if ('badge' in request.query) {
168168
url = appendQuery(
169169
// || emoji.originalUrl してるのは後方互換性のため(publicUrlはstringなので??はだめ)
170-
`${this.config.mediaProxy}/emoji/${encodeURIComponent(emoji.publicUrl || emoji.originalUrl)}`,
170+
`${this.config.mediaProxy}/emoji/${encodeURIComponent(omitHttps(emoji.publicUrl || emoji.originalUrl))}`,
171171
query({
172172
badge: '1',
173173
}),
174174
);
175175
} else {
176176
url = appendQuery(
177177
// || emoji.originalUrl してるのは後方互換性のため(publicUrlはstringなので??はだめ)
178-
`${this.config.mediaProxy}/emoji/${encodeURIComponent(emoji.publicUrl || emoji.originalUrl)}`,
178+
`${this.config.mediaProxy}/emoji/${encodeURIComponent(omitHttps(emoji.publicUrl || emoji.originalUrl))}`,
179179
query({
180180
emoji: '1',
181181
...('static' in request.query ? { static: '1' } : {}),

packages/backend/src/server/web/UrlPreviewService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type { Config } from '@/config.js';
1212
import { MetaService } from '@/core/MetaService.js';
1313
import { HttpRequestService } from '@/core/HttpRequestService.js';
1414
import type Logger from '@/logger.js';
15-
import { appendQuery, query } from '@/misc/prelude/url.js';
15+
import { appendQuery, omitHttps, query } from '@/misc/prelude/url.js';
1616
import { LoggerService } from '@/core/LoggerService.js';
1717
import { bindThis } from '@/decorators.js';
1818
import { ApiError } from '@/server/api/error.js';
@@ -40,7 +40,7 @@ export class UrlPreviewService {
4040
if (!RegExp(/^https?:\/\//).exec(url)) return url;
4141

4242
return appendQuery(
43-
`${this.config.mediaProxy}/preview/${encodeURIComponent(url)}`,
43+
`${this.config.mediaProxy}/preview/${encodeURIComponent(omitHttps(url))}`,
4444
query({
4545
preview: '1',
4646
}),

packages/frontend/src/scripts/media-proxy.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: AGPL-3.0-only
44
*/
55

6-
import { appendQuery, query } from '@/scripts/url.js';
6+
import { appendQuery, omitHttps, query } from '@/scripts/url.js';
77
import { url } from '@/config.js';
88
import { instance } from '@/instance.js';
99

@@ -25,7 +25,7 @@ export function getProxiedImageUrl(imageUrl: string, type?: 'preview' | 'emoji'
2525
}
2626

2727
return appendQuery(
28-
`${mustOrigin ? localProxy : instance.mediaProxy}/${type === 'preview' ? 'preview' : 'image'}/${encodeURIComponent(imageUrl)}`,
28+
`${mustOrigin ? localProxy : instance.mediaProxy}/${type === 'preview' ? 'preview' : 'image'}/${encodeURIComponent(omitHttps(imageUrl))}`,
2929
query({
3030
...(!noFallback ? { 'fallback': '1' } : {}),
3131
...(type ? { [type]: '1' } : {}),
@@ -55,7 +55,7 @@ export function getStaticImageUrl(baseUrl: string): string {
5555
}
5656

5757
return appendQuery(
58-
`${instance.mediaProxy}/static/${encodeURIComponent(u.href)}`,
58+
`${instance.mediaProxy}/static/${encodeURIComponent(omitHttps(u.href))}`,
5959
query({ static: '1' }),
6060
);
6161
}

packages/frontend/src/scripts/url.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* 2. プロパティがundefinedの時はクエリを付けない
99
* (new URLSearchParams(obj)ではそこまで丁寧なことをしてくれない)
1010
*/
11-
export function query(obj: Record<string, any>): string {
11+
export function query(obj: Record<string, unknown>): string {
1212
const params = Object.entries(obj)
1313
.filter(([, v]) => Array.isArray(v) ? v.length : v !== undefined)
1414
.reduce((a, [k, v]) => (a[k] = v, a), {} as Record<string, any>);
@@ -21,3 +21,9 @@ export function query(obj: Record<string, any>): string {
2121
export function appendQuery(url: string, query: string): string {
2222
return `${url}${/\?/.test(url) ? url.endsWith('?') ? '' : '&' : '?'}${query}`;
2323
}
24+
25+
export function omitHttps(url: string): string {
26+
if (url.startsWith('https://')) return url.slice(8);
27+
if (url.startsWith('https%3A%2F%2F')) return url.slice(14);
28+
return url;
29+
}

0 commit comments

Comments
 (0)