From 587ab8500abb2d8b0a494dc05952c9919cc7f66f Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Mon, 2 Mar 2026 16:05:12 -0500 Subject: split url into webUrl and localUrl (like mastodon) --- packages/backend/src/GlobalModule.ts | 2 +- packages/backend/src/boot/master.ts | 2 +- packages/backend/src/config.ts | 53 +++++++++++++--------- packages/backend/src/core/ChatService.ts | 2 +- packages/backend/src/core/EmailService.ts | 6 +-- packages/backend/src/core/GlobalEventService.ts | 2 +- .../backend/src/core/InternalStorageService.ts | 4 +- packages/backend/src/core/MfmService.ts | 4 +- packages/backend/src/core/NoteCreateService.ts | 2 +- packages/backend/src/core/NoteDeleteService.ts | 4 +- packages/backend/src/core/NotePiningService.ts | 4 +- .../backend/src/core/PushNotificationService.ts | 2 +- .../backend/src/core/RemoteUserResolveService.ts | 2 +- packages/backend/src/core/UserFollowingService.ts | 2 +- packages/backend/src/core/UserSearchService.ts | 2 +- packages/backend/src/core/UtilityService.ts | 8 ++-- packages/backend/src/core/WebAuthnService.ts | 6 +-- .../src/core/activitypub/ApDbResolverService.ts | 4 +- .../backend/src/core/activitypub/ApInboxService.ts | 2 +- .../src/core/activitypub/ApRendererService.ts | 48 ++++++++++---------- .../src/core/activitypub/ApRequestService.ts | 4 +- .../src/core/activitypub/models/ApPersonService.ts | 5 +- .../src/core/entities/DriveFileEntityService.ts | 2 +- .../backend/src/core/entities/MetaEntityService.ts | 2 +- .../backend/src/core/entities/UserEntityService.ts | 6 +-- .../ExportCustomEmojisProcessorService.ts | 2 +- .../SystemWebhookDeliverProcessorService.ts | 4 +- .../UserWebhookDeliverProcessorService.ts | 4 +- .../backend/src/server/ActivityPubServerService.ts | 12 ++--- packages/backend/src/server/FileServerService.ts | 2 +- .../backend/src/server/NodeinfoServerService.ts | 4 +- packages/backend/src/server/ServerService.ts | 6 +-- .../backend/src/server/WellKnownServerService.ts | 16 +++---- .../backend/src/server/api/SigninApiService.ts | 2 +- .../src/server/api/SigninWithPasskeyApiService.ts | 2 +- .../backend/src/server/api/SignupApiService.ts | 2 +- .../backend/src/server/api/endpoints/admin/meta.ts | 2 +- .../src/server/api/endpoints/i/2fa/register.ts | 4 +- .../src/server/api/endpoints/i/update-email.ts | 2 +- .../backend/src/server/api/endpoints/i/update.ts | 2 +- .../server/api/endpoints/request-reset-password.ts | 2 +- .../src/server/file/FileServerProxyHandler.ts | 4 +- .../src/server/oauth/OAuth2ProviderService.ts | 10 ++-- .../backend/src/server/web/ClientServerService.ts | 10 ++-- packages/backend/src/server/web/FeedService.ts | 6 +-- .../backend/src/server/web/HtmlTemplateService.ts | 3 +- packages/backend/src/server/web/views/_.ts | 1 + .../backend/src/server/web/views/announcement.tsx | 2 +- .../backend/src/server/web/views/base-embed.tsx | 1 + packages/backend/src/server/web/views/base.tsx | 3 +- packages/backend/src/server/web/views/channel.tsx | 2 +- packages/backend/src/server/web/views/clip.tsx | 2 +- packages/backend/src/server/web/views/flash.tsx | 2 +- .../backend/src/server/web/views/gallery-post.tsx | 2 +- .../backend/src/server/web/views/info-card.tsx | 6 +-- packages/backend/src/server/web/views/note.tsx | 4 +- packages/backend/src/server/web/views/page.tsx | 2 +- .../backend/src/server/web/views/reversi-game.tsx | 2 +- packages/backend/src/server/web/views/user.tsx | 4 +- packages/backend/test/e2e/2fa.ts | 8 ++-- packages/backend/test/e2e/move.ts | 2 +- .../backend/test/unit/server/FileServerService.ts | 6 +-- packages/backend/test/utils.ts | 4 +- packages/frontend-embed/src/boot.ts | 4 +- packages/frontend-embed/src/components/EmAcct.vue | 4 +- packages/frontend-embed/src/components/EmLink.vue | 2 +- .../frontend-embed/src/components/EmMention.vue | 2 +- packages/frontend-embed/src/components/EmMfm.ts | 4 +- packages/frontend-embed/src/components/EmNote.vue | 4 +- .../src/components/EmNoteDetailed.vue | 6 +-- .../src/components/EmSubNoteContent.vue | 4 +- packages/frontend-embed/src/components/EmUrl.vue | 2 +- packages/frontend-embed/src/pages/clip.vue | 4 +- packages/frontend-embed/src/pages/tag.vue | 4 +- .../frontend-embed/src/pages/user-timeline.vue | 4 +- packages/frontend-embed/src/utils.ts | 4 +- packages/frontend-shared/js/config.ts | 12 +++-- packages/frontend/src/accounts.ts | 20 ++++---- packages/frontend/src/aiscript/api.ts | 4 +- .../frontend/src/components/MkAccountMoved.vue | 2 +- packages/frontend/src/components/MkDonation.vue | 14 +++++- .../src/components/MkEmbedCodeGenDialog.vue | 4 +- .../frontend/src/components/MkFollowButton.vue | 4 +- packages/frontend/src/components/MkLink.vue | 4 +- packages/frontend/src/components/MkMention.vue | 2 +- packages/frontend/src/components/MkNote.vue | 4 +- .../frontend/src/components/MkNoteDetailed.vue | 4 +- packages/frontend/src/components/MkPageWindow.vue | 6 +-- packages/frontend/src/components/MkPoll.vue | 4 +- packages/frontend/src/components/MkPostForm.vue | 10 ++-- packages/frontend/src/components/MkPreview.vue | 2 +- .../frontend/src/components/MkSignin.input.vue | 2 +- .../src/components/MkSignupDialog.form.vue | 2 +- .../src/components/MkSourceCodeAvailablePopup.vue | 6 +-- .../frontend/src/components/MkTutorialDialog.vue | 4 +- packages/frontend/src/components/MkUrlPreview.vue | 4 +- .../frontend/src/components/MkUserSelectDialog.vue | 4 +- .../frontend/src/components/MkUserSetupDialog.vue | 6 +-- packages/frontend/src/components/global/MkA.vue | 4 +- packages/frontend/src/components/global/MkAcct.vue | 4 +- packages/frontend/src/components/global/MkAd.vue | 4 +- packages/frontend/src/components/global/MkMfm.ts | 4 +- packages/frontend/src/components/global/MkUrl.vue | 4 +- packages/frontend/src/filters/user.ts | 4 +- packages/frontend/src/pages/about-misskey.vue | 4 +- packages/frontend/src/pages/about.overview.vue | 6 +-- packages/frontend/src/pages/admin-user.vue | 4 +- packages/frontend/src/pages/admin/branding.vue | 6 +-- packages/frontend/src/pages/channel.vue | 6 +-- packages/frontend/src/pages/chat/XMessage.vue | 4 +- packages/frontend/src/pages/clip.vue | 6 +-- packages/frontend/src/pages/flash/flash.vue | 12 ++--- packages/frontend/src/pages/gallery/post.vue | 10 ++-- packages/frontend/src/pages/note.vue | 4 +- .../frontend/src/pages/page-editor/page-editor.vue | 4 +- packages/frontend/src/pages/page.vue | 10 ++-- packages/frontend/src/pages/qr.show.vue | 6 +-- packages/frontend/src/pages/reversi/game.board.vue | 4 +- packages/frontend/src/pages/reversi/game.vue | 4 +- packages/frontend/src/pages/search.note.vue | 4 +- .../frontend/src/pages/settings/2fa.qrdialog.vue | 4 +- packages/frontend/src/pages/theme-editor.vue | 2 +- packages/frontend/src/pages/welcome.setup.vue | 4 +- packages/frontend/src/preferences/manager.ts | 28 ++++++------ packages/frontend/src/ui/_common_/common.ts | 4 +- packages/frontend/src/ui/_common_/titlebar.vue | 4 +- packages/frontend/src/utility/get-embed-code.ts | 6 +-- packages/frontend/src/utility/get-note-menu.ts | 8 ++-- packages/frontend/src/utility/get-user-menu.ts | 8 ++-- .../image-frame-renderer/ImageFrameRenderer.ts | 4 +- packages/frontend/src/utility/media-proxy.ts | 8 ++-- packages/frontend/src/utility/popout.ts | 2 +- packages/frontend/src/utility/url-preview.ts | 4 +- .../src/utility/watermark/WatermarkRenderer.ts | 4 +- .../frontend/src/widgets/WidgetInstanceInfo.vue | 4 +- packages/frontend/src/widgets/WidgetRss.vue | 2 +- packages/frontend/src/widgets/WidgetRssTicker.vue | 2 +- 137 files changed, 377 insertions(+), 345 deletions(-) diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts index 435bd8dd45..eaaaf1e284 100644 --- a/packages/backend/src/GlobalModule.ts +++ b/packages/backend/src/GlobalModule.ts @@ -75,7 +75,7 @@ const $redisForSub: Provider = { provide: DI.redisForSub, useFactory: (config: Config) => { const redis = new Redis.Redis(config.redisForPubsub); - redis.subscribe(config.host); + redis.subscribe(config.webHost); return redis; }, inject: [DI.config], diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index 041f58e509..94a3fe2aff 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -120,7 +120,7 @@ export async function masterMain() { if (envOption.onlyQueue) { bootLogger.succ('Queue started', null, true); } else { - bootLogger.succ(config.socket ? `Now listening on socket ${config.socket} on ${config.url}` : `Now listening on port ${config.port} on ${config.url}`, null, true); + bootLogger.succ(config.socket ? `Now listening on socket ${config.socket} on ${config.webUrl}` : `Now listening on port ${config.port} on ${config.webUrl}`, null, true); } } diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 4cd82bed87..8dafe91d26 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -26,6 +26,8 @@ type RedisOptionsSource = Partial & { */ type Source = { url?: string; + localUrl?: string; + webUrl?: string; port?: number; socket?: string; trustProxy?: FastifyServerOptions['trustProxy']; @@ -118,7 +120,8 @@ type Source = { }; export type Config = { - url: string; + localUrl: string; + webUrl: string; port: number; socket: string | undefined; trustProxy: NonNullable; @@ -180,8 +183,10 @@ export type Config = { version: string; publishTarballInsteadOfProvideRepositoryUrl: boolean; setupPassword: string | undefined; - host: string; - hostname: string; + localHost: string; + localHostname: string; + webHost: string; + webHostname: string; scheme: string; wsScheme: string; apiUrl: string; @@ -259,11 +264,14 @@ export function loadConfig(): Config { const config = JSON.parse(fs.readFileSync(compiledConfigFilePath, 'utf-8')) as Source; - const url = tryCreateUrl(config.url ?? process.env.MISSKEY_URL ?? ''); + const localUrl = tryCreateUrl(config.url ?? config.localUrl ?? process.env.MISSKEY_URL ?? ''); + const webUrl = tryCreateUrl(config.webUrl ?? process.env.MISSKEY_WEB_URL ?? localUrl ?? ''); const version = meta.version; - const host = url.host; - const hostname = url.hostname; - const scheme = url.protocol.replace(/:$/, ''); + const localHost = localUrl.host; + const localHostname = localUrl.hostname; + const webHost = webUrl.host; + const webHostname = webUrl.hostname; + const scheme = webUrl.protocol.replace(/:$/, ''); const wsScheme = scheme.replace('http', 'ws'); const dbDb = config.db.db ?? process.env.DATABASE_DB ?? ''; @@ -273,14 +281,15 @@ export function loadConfig(): Config { const externalMediaProxy = config.mediaProxy ? config.mediaProxy.endsWith('/') ? config.mediaProxy.substring(0, config.mediaProxy.length - 1) : config.mediaProxy : null; - const internalMediaProxy = `${scheme}://${host}/proxy`; - const redis = convertRedisOptions(config.redis, host); + const internalMediaProxy = `${scheme}://${webHost}/proxy`; + const redis = convertRedisOptions(config.redis, localHost); return { version, publishTarballInsteadOfProvideRepositoryUrl: !!config.publishTarballInsteadOfProvideRepositoryUrl, setupPassword: config.setupPassword, - url: url.origin, + localUrl: localUrl.origin, + webUrl: webUrl.origin, port: config.port ?? parseInt(process.env.PORT ?? '', 10), socket: config.socket, trustProxy: config.trustProxy ?? [ @@ -294,24 +303,26 @@ export function loadConfig(): Config { chmodSocket: config.chmodSocket, disableHsts: config.disableHsts, enableIpRateLimit: config.enableIpRateLimit ?? true, - host, - hostname, + localHost, + localHostname, + webHost, + webHostname, scheme, wsScheme, - wsUrl: `${wsScheme}://${host}`, - apiUrl: `${scheme}://${host}/api`, - authUrl: `${scheme}://${host}/auth`, - driveUrl: `${scheme}://${host}/files`, + wsUrl: `${wsScheme}://${webHost}`, + apiUrl: `${scheme}://${webHost}/api`, + authUrl: `${scheme}://${webHost}/auth`, + driveUrl: `${scheme}://${webHost}/files`, db: { ...config.db, db: dbDb, user: dbUser, pass: dbPass }, dbReplications: config.dbReplications, dbSlaves: config.dbSlaves, fulltextSearch: config.fulltextSearch, meilisearch: config.meilisearch, redis, - redisForPubsub: config.redisForPubsub ? convertRedisOptions(config.redisForPubsub, host) : redis, - redisForJobQueue: config.redisForJobQueue ? convertRedisOptions(config.redisForJobQueue, host) : redis, - redisForTimelines: config.redisForTimelines ? convertRedisOptions(config.redisForTimelines, host) : redis, - redisForReactions: config.redisForReactions ? convertRedisOptions(config.redisForReactions, host) : redis, + redisForPubsub: config.redisForPubsub ? convertRedisOptions(config.redisForPubsub, webHost) : redis, + redisForJobQueue: config.redisForJobQueue ? convertRedisOptions(config.redisForJobQueue, webHost) : redis, + redisForTimelines: config.redisForTimelines ? convertRedisOptions(config.redisForTimelines, webHost) : redis, + redisForReactions: config.redisForReactions ? convertRedisOptions(config.redisForReactions, webHost) : redis, sentryForBackend: config.sentryForBackend, sentryForFrontend: config.sentryForFrontend, id: config.id, @@ -336,7 +347,7 @@ export function loadConfig(): Config { videoThumbnailGenerator: config.videoThumbnailGenerator ? config.videoThumbnailGenerator.endsWith('/') ? config.videoThumbnailGenerator.substring(0, config.videoThumbnailGenerator.length - 1) : config.videoThumbnailGenerator : null, - userAgent: `Misskey/${version} (${config.url})`, + userAgent: `Misskey/${version} (${config.localUrl})`, frontendEntry: frontendManifest['src/_boot_.ts'], frontendManifestExists: frontendManifestExists, frontendEmbedEntry: frontendEmbedManifest['src/boot.ts'], diff --git a/packages/backend/src/core/ChatService.ts b/packages/backend/src/core/ChatService.ts index 5cd336a097..b1a79090aa 100644 --- a/packages/backend/src/core/ChatService.ts +++ b/packages/backend/src/core/ChatService.ts @@ -379,7 +379,7 @@ export class ChatService { if (this.userEntityService.isLocalUser(toUser)) this.globalEventService.publishChatUserStream(message.toUserId, message.fromUserId, 'deleted', message.id); if (this.userEntityService.isLocalUser(fromUser) && this.userEntityService.isRemoteUser(toUser)) { - //const activity = this.apRendererService.addContext(this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.url}/notes/${message.id}`), fromUser)); + //const activity = this.apRendererService.addContext(this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.webUrl}/notes/${message.id}`), fromUser)); //this.queueService.deliver(fromUser, activity, toUser.inbox); } } else if (message.toRoomId) { diff --git a/packages/backend/src/core/EmailService.ts b/packages/backend/src/core/EmailService.ts index 384704b252..eb5490101b 100644 --- a/packages/backend/src/core/EmailService.ts +++ b/packages/backend/src/core/EmailService.ts @@ -42,8 +42,8 @@ export class EmailService { public async sendEmail(to: string, subject: string, html: string, text: string) { if (!this.meta.enableEmail) return; - const iconUrl = `${this.config.url}/static-assets/mi-white.png`; - const emailSettingUrl = `${this.config.url}/settings/email`; + const iconUrl = `${this.config.webUrl}/static-assets/mi-white.png`; + const emailSettingUrl = `${this.config.webUrl}/settings/email`; const enableAuth = this.meta.smtpUser != null && this.meta.smtpUser !== ''; @@ -135,7 +135,7 @@ export class EmailService { `; diff --git a/packages/backend/src/core/GlobalEventService.ts b/packages/backend/src/core/GlobalEventService.ts index da5982abf6..a6d6baf2cb 100644 --- a/packages/backend/src/core/GlobalEventService.ts +++ b/packages/backend/src/core/GlobalEventService.ts @@ -351,7 +351,7 @@ export class GlobalEventService { { type: type, body: null } : { type: type, body: value }; - this.redisForPub.publish(this.config.host, JSON.stringify({ + this.redisForPub.publish(this.config.webHost, JSON.stringify({ channel: channel, message: message, })); diff --git a/packages/backend/src/core/InternalStorageService.ts b/packages/backend/src/core/InternalStorageService.ts index 4fb8a93e49..f189d55d11 100644 --- a/packages/backend/src/core/InternalStorageService.ts +++ b/packages/backend/src/core/InternalStorageService.ts @@ -39,14 +39,14 @@ export class InternalStorageService { public saveFromPath(key: string, srcPath: string) { fs.mkdirSync(path, { recursive: true }); fs.copyFileSync(srcPath, this.resolvePath(key)); - return `${this.config.url}/files/${key}`; + return `${this.config.webUrl}/files/${key}`; } @bindThis public saveFromBuffer(key: string, data: Buffer) { fs.mkdirSync(path, { recursive: true }); fs.writeFileSync(this.resolvePath(key), data); - return `${this.config.url}/files/${key}`; + return `${this.config.webUrl}/files/${key}`; } @bindThis diff --git a/packages/backend/src/core/MfmService.ts b/packages/backend/src/core/MfmService.ts index 274966d921..b633839de8 100644 --- a/packages/backend/src/core/MfmService.ts +++ b/packages/backend/src/core/MfmService.ts @@ -357,7 +357,7 @@ export class MfmService { }, hashtag: (node) => { - return ``; + return ``; }, inlineCode: (node) => { @@ -386,7 +386,7 @@ export class MfmService { const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username.toLowerCase() === username.toLowerCase() && remoteUser.host?.toLowerCase() === host?.toLowerCase()); const href = remoteUserInfo ? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri) - : `${this.config.url}/${acct.endsWith(`@${this.config.url}`) ? acct.substring(0, acct.length - this.config.url.length - 1) : acct}`; + : `${this.config.webUrl}/${acct.endsWith(`@${this.config.localUrl}`) ? acct.substring(0, acct.length - this.config.localUrl.length - 1) : acct}`; try { const url = new URL(href); return `${escapeHtml(acct)}`; diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 748f2cbad9..7fb5515959 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -950,7 +950,7 @@ export class NoteCreateService implements OnApplicationShutdown { if (data.localOnly) return null; const content = this.isRenote(data) && !this.isQuote(data) - ? this.apRendererService.renderAnnounce(data.renote.uri ? data.renote.uri : `${this.config.url}/notes/${data.renote.id}`, note) + ? this.apRendererService.renderAnnounce(data.renote.uri ? data.renote.uri : `${this.config.webUrl}/notes/${data.renote.id}`, note) : this.apRendererService.renderCreate(await this.apRendererService.renderNote(note, false), note); return this.apRendererService.addContext(content); diff --git a/packages/backend/src/core/NoteDeleteService.ts b/packages/backend/src/core/NoteDeleteService.ts index af1f0eda9a..dee115b548 100644 --- a/packages/backend/src/core/NoteDeleteService.ts +++ b/packages/backend/src/core/NoteDeleteService.ts @@ -84,8 +84,8 @@ export class NoteDeleteService { } const content = this.apRendererService.addContext(renote - ? this.apRendererService.renderUndo(this.apRendererService.renderAnnounce(renote.uri ?? `${this.config.url}/notes/${renote.id}`, note), user) - : this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.url}/notes/${note.id}`), user)); + ? this.apRendererService.renderUndo(this.apRendererService.renderAnnounce(renote.uri ?? `${this.config.webUrl}/notes/${renote.id}`, note), user) + : this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.webUrl}/notes/${note.id}`), user)); this.deliverToConcerned(user, note, content); } diff --git a/packages/backend/src/core/NotePiningService.ts b/packages/backend/src/core/NotePiningService.ts index d38b48b65d..3665dd5f03 100644 --- a/packages/backend/src/core/NotePiningService.ts +++ b/packages/backend/src/core/NotePiningService.ts @@ -117,8 +117,8 @@ export class NotePiningService { if (!this.userEntityService.isLocalUser(user)) return; - const target = `${this.config.url}/users/${user.id}/collections/featured`; - const item = `${this.config.url}/notes/${noteId}`; + const target = `${this.config.webUrl}/users/${user.id}/collections/featured`; + const item = `${this.config.webUrl}/notes/${noteId}`; const content = this.apRendererService.addContext(isAddition ? this.apRendererService.renderAdd(user, target, item) : this.apRendererService.renderRemove(user, target, item)); this.apDeliverManagerService.deliverToFollowers(user, content); diff --git a/packages/backend/src/core/PushNotificationService.ts b/packages/backend/src/core/PushNotificationService.ts index 9333c1ebc5..e9ded5f282 100644 --- a/packages/backend/src/core/PushNotificationService.ts +++ b/packages/backend/src/core/PushNotificationService.ts @@ -77,7 +77,7 @@ export class PushNotificationService implements OnApplicationShutdown { if (!this.meta.enableServiceWorker || this.meta.swPublicKey == null || this.meta.swPrivateKey == null) return; // アプリケーションの連絡先と、サーバーサイドの鍵ペアの情報を登録 - push.setVapidDetails(this.config.url, + push.setVapidDetails(this.config.webUrl, this.meta.swPublicKey, this.meta.swPrivateKey); diff --git a/packages/backend/src/core/RemoteUserResolveService.ts b/packages/backend/src/core/RemoteUserResolveService.ts index a2f1b73cdb..55c03e9777 100644 --- a/packages/backend/src/core/RemoteUserResolveService.ts +++ b/packages/backend/src/core/RemoteUserResolveService.ts @@ -56,7 +56,7 @@ export class RemoteUserResolveService { host = this.utilityService.toPuny(host); - if (host === this.utilityService.toPuny(this.config.host)) { + if (host === this.utilityService.toPuny(this.config.localHost)) { this.logger.info(`return local user: ${usernameLower}`); return await this.usersRepository.findOneBy({ usernameLower, host: IsNull() }).then(u => { if (u == null) { diff --git a/packages/backend/src/core/UserFollowingService.ts b/packages/backend/src/core/UserFollowingService.ts index e7a6be99fb..9d2ab73fe8 100644 --- a/packages/backend/src/core/UserFollowingService.ts +++ b/packages/backend/src/core/UserFollowingService.ts @@ -536,7 +536,7 @@ export class UserFollowingService implements OnModuleInit { } if (this.userEntityService.isLocalUser(follower) && this.userEntityService.isRemoteUser(followee)) { - const content = this.apRendererService.addContext(this.apRendererService.renderFollow(follower as MiPartialLocalUser, followee as MiPartialRemoteUser, requestId ?? `${this.config.url}/follows/${followRequest.id}`)); + const content = this.apRendererService.addContext(this.apRendererService.renderFollow(follower as MiPartialLocalUser, followee as MiPartialRemoteUser, requestId ?? `${this.config.webUrl}/follows/${followRequest.id}`)); this.queueService.deliver(follower, content, followee.inbox, false); } } diff --git a/packages/backend/src/core/UserSearchService.ts b/packages/backend/src/core/UserSearchService.ts index 4be7bd9bdb..15245c39b7 100644 --- a/packages/backend/src/core/UserSearchService.ts +++ b/packages/backend/src/core/UserSearchService.ts @@ -198,7 +198,7 @@ export class UserSearchService { } if (params.host) { - if (params.host === this.config.hostname || params.host === '.') { + if (params.host === this.config.localHostname || params.host === '.') { userQuery.andWhere('user.host IS NULL'); } else { userQuery.andWhere('user.host LIKE :host', { diff --git a/packages/backend/src/core/UtilityService.ts b/packages/backend/src/core/UtilityService.ts index e3ceebccae..38390d0a2c 100644 --- a/packages/backend/src/core/UtilityService.ts +++ b/packages/backend/src/core/UtilityService.ts @@ -26,18 +26,20 @@ export class UtilityService { @bindThis public getFullApAccount(username: string, host: string | null): string { - return host ? `${username}@${this.toPuny(host)}` : `${username}@${this.toPuny(this.config.host)}`; + return host ? `${username}@${this.toPuny(host)}` : `${username}@${this.toPuny(this.config.localHost)}`; } @bindThis public isSelfHost(host: string | null): boolean { if (host == null) return true; - return this.toPuny(this.config.host) === this.toPuny(host); + return (this.toPuny(this.config.localHost) === this.toPuny(host)) || + (this.toPuny(this.config.webHost) === this.toPuny(host)) } @bindThis public isUriLocal(uri: string): boolean { - return this.punyHost(uri) === this.toPuny(this.config.host); + return (this.punyHost(uri) === this.toPuny(this.config.localHost)) || + (this.punyHost(uri) === this.toPuny(this.config.webHost)) } // メールアドレスのバリデーションを行う diff --git a/packages/backend/src/core/WebAuthnService.ts b/packages/backend/src/core/WebAuthnService.ts index 31c8d67c60..f0dc9dc104 100644 --- a/packages/backend/src/core/WebAuthnService.ts +++ b/packages/backend/src/core/WebAuthnService.ts @@ -46,9 +46,9 @@ export class WebAuthnService { @bindThis public getRelyingParty(): { origin: string; rpId: string; rpName: string; rpIcon?: string; } { return { - origin: this.config.url, - rpId: this.config.hostname, - rpName: this.meta.name ?? this.config.host, + origin: this.config.webUrl, + rpId: this.config.webHostname, + rpName: this.meta.name ?? this.config.webHost, rpIcon: this.meta.iconUrl ?? undefined, }; } diff --git a/packages/backend/src/core/activitypub/ApDbResolverService.ts b/packages/backend/src/core/activitypub/ApDbResolverService.ts index 5c16744a77..69933aaef6 100644 --- a/packages/backend/src/core/activitypub/ApDbResolverService.ts +++ b/packages/backend/src/core/activitypub/ApDbResolverService.ts @@ -65,9 +65,9 @@ export class ApDbResolverService implements OnApplicationShutdown { const separator = '/'; const uri = new URL(getApId(value)); - if (this.utilityService.toPuny(uri.host) !== this.utilityService.toPuny(this.config.host)) { + if ((this.utilityService.toPuny(uri.host) !== this.utilityService.toPuny(this.config.localHost)) && + (this.utilityService.toPuny(uri.host) !== this.utilityService.toPuny(this.config.webHost))) return { local: false, uri: uri.href }; - } const [, type, id, ...rest] = uri.pathname.split(separator); return { diff --git a/packages/backend/src/core/activitypub/ApInboxService.ts b/packages/backend/src/core/activitypub/ApInboxService.ts index ff47ca930d..1173c4bcce 100644 --- a/packages/backend/src/core/activitypub/ApInboxService.ts +++ b/packages/backend/src/core/activitypub/ApInboxService.ts @@ -549,7 +549,7 @@ export class ApInboxService { const uris = getApIds(activity.object); const userIds = uris - .filter(uri => uri.startsWith(this.config.url + '/users/')) + .filter(uri => uri.startsWith(this.config.webUrl + '/users/')) .map(uri => uri.split('/').at(-1)) .filter(x => x != null); const users = await this.usersRepository.findBy({ diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts index 8c461b6031..d50d72d188 100644 --- a/packages/backend/src/core/activitypub/ApRendererService.ts +++ b/packages/backend/src/core/activitypub/ApRendererService.ts @@ -110,7 +110,7 @@ export class ApRendererService { } return { - id: `${this.config.url}/notes/${note.id}/activity`, + id: `${this.config.webUrl}/notes/${note.id}/activity`, actor: this.userEntityService.genLocalUserUri(note.userId), type: 'Announce', published: this.idService.parse(note.id).date.toISOString(), @@ -133,7 +133,7 @@ export class ApRendererService { return { type: 'Block', - id: `${this.config.url}/blocks/${block.id}`, + id: `${this.config.webUrl}/blocks/${block.id}`, actor: this.userEntityService.genLocalUserUri(block.blockerId), object: block.blockee.uri, }; @@ -142,7 +142,7 @@ export class ApRendererService { @bindThis public renderCreate(object: IObject, note: MiNote): ICreate { const activity: ICreate = { - id: `${this.config.url}/notes/${note.id}/activity`, + id: `${this.config.webUrl}/notes/${note.id}/activity`, actor: this.userEntityService.genLocalUserUri(note.userId), type: 'Create', published: this.idService.parse(note.id).date.toISOString(), @@ -179,7 +179,7 @@ export class ApRendererService { @bindThis public renderEmoji(emoji: MiEmoji): IApEmoji { return { - id: `${this.config.url}/emojis/${emoji.name}`, + id: `${this.config.webUrl}/emojis/${emoji.name}`, type: 'Emoji', name: `:${emoji.name}:`, updated: emoji.updatedAt != null ? emoji.updatedAt.toISOString() : new Date().toISOString(), @@ -209,7 +209,7 @@ export class ApRendererService { @bindThis public renderFollowRelay(relay: MiRelay, relayActor: MiLocalUser): IFollow { return { - id: `${this.config.url}/activities/follow-relay/${relay.id}`, + id: `${this.config.webUrl}/activities/follow-relay/${relay.id}`, type: 'Follow', actor: this.userEntityService.genLocalUserUri(relayActor.id), object: 'https://www.w3.org/ns/activitystreams#Public', @@ -233,7 +233,7 @@ export class ApRendererService { requestId?: string, ): IFollow { return { - id: requestId ?? `${this.config.url}/follows/${follower.id}/${followee.id}`, + id: requestId ?? `${this.config.webUrl}/follows/${follower.id}/${followee.id}`, type: 'Follow', actor: this.userEntityService.getUserUri(follower), object: this.userEntityService.getUserUri(followee), @@ -244,7 +244,7 @@ export class ApRendererService { public renderHashtag(tag: string): IApHashtag { return { type: 'Hashtag', - href: `${this.config.url}/tags/${encodeURIComponent(tag)}`, + href: `${this.config.webUrl}/tags/${encodeURIComponent(tag)}`, name: `#${tag}`, }; } @@ -294,7 +294,7 @@ export class ApRendererService { @bindThis public renderKey(user: MiLocalUser, key: MiUserKeypair, postfix?: string): IKey { return { - id: `${this.config.url}/users/${user.id}${postfix ?? '/publickey'}`, + id: `${this.config.webUrl}/users/${user.id}${postfix ?? '/publickey'}`, type: 'Key', owner: this.userEntityService.genLocalUserUri(user.id), publicKeyPem: createPublicKey(key.publicKey).export({ @@ -310,9 +310,9 @@ export class ApRendererService { const object: ILike = { type: 'Like', - id: `${this.config.url}/likes/${noteReaction.id}`, - actor: `${this.config.url}/users/${noteReaction.userId}`, - object: note.uri ? note.uri : `${this.config.url}/notes/${noteReaction.noteId}`, + id: `${this.config.webUrl}/likes/${noteReaction.id}`, + actor: `${this.config.webUrl}/users/${noteReaction.userId}`, + object: note.uri ? note.uri : `${this.config.webUrl}/notes/${noteReaction.noteId}`, content: reaction, _misskey_reaction: reaction, }; @@ -344,7 +344,7 @@ export class ApRendererService { const actor = this.userEntityService.getUserUri(src); const target = this.userEntityService.getUserUri(dst); return { - id: `${this.config.url}/moves/${src.id}/${dst.id}`, + id: `${this.config.webUrl}/moves/${src.id}/${dst.id}`, actor, type: 'Move', object: actor, @@ -376,7 +376,7 @@ export class ApRendererService { if (dive) { inReplyTo = await this.renderNote(inReplyToNote, false); } else { - inReplyTo = `${this.config.url}/notes/${inReplyToNote.id}`; + inReplyTo = `${this.config.webUrl}/notes/${inReplyToNote.id}`; } } } @@ -391,7 +391,7 @@ export class ApRendererService { const renote = await this.notesRepository.findOneBy({ id: note.renoteId }); if (renote) { - quote = renote.uri ? renote.uri : `${this.config.url}/notes/${renote.id}`; + quote = renote.uri ? renote.uri : `${this.config.webUrl}/notes/${renote.id}`; } } @@ -467,7 +467,7 @@ export class ApRendererService { } as const : {}; return { - id: `${this.config.url}/notes/${note.id}`, + id: `${this.config.webUrl}/notes/${note.id}`, type: 'Note', attributedTo, summary: summary ?? undefined, @@ -548,9 +548,9 @@ export class ApRendererService { followers: `${id}/followers`, following: `${id}/following`, featured: `${id}/collections/featured`, - sharedInbox: `${this.config.url}/inbox`, - endpoints: { sharedInbox: `${this.config.url}/inbox` }, - url: `${this.config.url}/@${user.username}`, + sharedInbox: `${this.config.webUrl}/inbox`, + endpoints: { sharedInbox: `${this.config.webUrl}/inbox` }, + url: `${this.config.webUrl}/@${user.username}`, preferredUsername: user.username, name: user.name, summary: profile.description ? this.mfmService.toHtml(mfm.parse(profile.description)) : null, @@ -592,7 +592,7 @@ export class ApRendererService { public renderQuestion(user: { id: MiUser['id'] }, note: MiNote, poll: MiPoll): IQuestion { return { type: 'Question', - id: `${this.config.url}/questions/${note.id}`, + id: `${this.config.webUrl}/questions/${note.id}`, actor: this.userEntityService.genLocalUserUri(user.id), content: note.text ?? '', [poll.multiple ? 'anyOf' : 'oneOf']: poll.choices.map((text, i) => ({ @@ -649,7 +649,7 @@ export class ApRendererService { @bindThis public renderUpdate(object: string | IObject, user: { id: MiUser['id'] }): IUpdate { return { - id: `${this.config.url}/users/${user.id}#updates/${new Date().getTime()}`, + id: `${this.config.webUrl}/users/${user.id}#updates/${new Date().getTime()}`, actor: this.userEntityService.genLocalUserUri(user.id), type: 'Update', to: ['https://www.w3.org/ns/activitystreams#Public'], @@ -661,13 +661,13 @@ export class ApRendererService { @bindThis public renderVote(user: { id: MiUser['id'] }, vote: MiPollVote, note: MiNote, poll: MiPoll, pollOwner: MiRemoteUser): ICreate { return { - id: `${this.config.url}/users/${user.id}#votes/${vote.id}/activity`, + id: `${this.config.webUrl}/users/${user.id}#votes/${vote.id}/activity`, actor: this.userEntityService.genLocalUserUri(user.id), type: 'Create', to: [pollOwner.uri], published: new Date().toISOString(), object: { - id: `${this.config.url}/users/${user.id}#votes/${vote.id}`, + id: `${this.config.webUrl}/users/${user.id}#votes/${vote.id}`, type: 'Note', attributedTo: this.userEntityService.genLocalUserUri(user.id), to: [pollOwner.uri], @@ -680,7 +680,7 @@ export class ApRendererService { @bindThis public addContext(x: T): T & { '@context': any; id: string; } { if (typeof x === 'object' && x.id == null) { - x.id = `${this.config.url}/${randomUUID()}`; + x.id = `${this.config.webUrl}/${randomUUID()}`; } return Object.assign({ '@context': CONTEXT }, x as T & { id: string }); @@ -692,7 +692,7 @@ export class ApRendererService { const jsonLd = this.jsonLdService.use(); jsonLd.debug = false; - activity = await jsonLd.signRsaSignature2017(activity, keypair.privateKey, `${this.config.url}/users/${user.id}#main-key`); + activity = await jsonLd.signRsaSignature2017(activity, keypair.privateKey, `${this.config.webUrl}/users/${user.id}#main-key`); return activity; } diff --git a/packages/backend/src/core/activitypub/ApRequestService.ts b/packages/backend/src/core/activitypub/ApRequestService.ts index d14b82dc92..df10d076cd 100644 --- a/packages/backend/src/core/activitypub/ApRequestService.ts +++ b/packages/backend/src/core/activitypub/ApRequestService.ts @@ -163,7 +163,7 @@ export class ApRequestService { const req = ApRequestCreator.createSignedPost({ key: { privateKeyPem: keypair.privateKey, - keyId: `${this.config.url}/users/${user.id}#main-key`, + keyId: `${this.config.webUrl}/users/${user.id}#main-key`, }, url, body, @@ -192,7 +192,7 @@ export class ApRequestService { const req = ApRequestCreator.createSignedGet({ key: { privateKeyPem: keypair.privateKey, - keyId: `${this.config.url}/users/${user.id}#main-key`, + keyId: `${this.config.webUrl}/users/${user.id}#main-key`, }, url, additionalHeaders: { diff --git a/packages/backend/src/core/activitypub/models/ApPersonService.ts b/packages/backend/src/core/activitypub/models/ApPersonService.ts index ebe8e9c964..5336177965 100644 --- a/packages/backend/src/core/activitypub/models/ApPersonService.ts +++ b/packages/backend/src/core/activitypub/models/ApPersonService.ts @@ -233,7 +233,7 @@ export class ApPersonService implements OnModuleInit { if (cached) return cached; // URIがこのサーバーを指しているならデータベースからフェッチ - if (uri.startsWith(`${this.config.url}/`)) { + if (uri.startsWith(`${this.config.webUrl}/`) || uri.startsWith(`${this.config.localUrl}/`)) { const id = uri.split('/').pop(); const u = await this.usersRepository.findOneBy({ id }) as MiLocalUser | null; if (u) this.cacheService.uriPersonCache.set(uri, u); @@ -305,7 +305,8 @@ export class ApPersonService implements OnModuleInit { if (typeof uri !== 'string') throw new Error('uri is not string'); const host = this.utilityService.punyHost(uri); - if (host === this.utilityService.toPuny(this.config.host)) { + if ((host === this.utilityService.toPuny(this.config.localHost)) || + (host === this.utilityService.toPuny(this.config.webHost))) { throw new StatusError('cannot resolve local user', 400, 'cannot resolve local user'); } diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts index 1865d494c4..10e333c04b 100644 --- a/packages/backend/src/core/entities/DriveFileEntityService.ts +++ b/packages/backend/src/core/entities/DriveFileEntityService.ts @@ -123,7 +123,7 @@ export class DriveFileEntityService { const key = file.webpublicAccessKey; if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外 - const url = `${this.config.url}/files/${key}`; + const url = `${this.config.webUrl}/files/${key}`; if (mode === 'avatar') return this.getProxiedUrl(file.uri, 'avatar'); return url; } diff --git a/packages/backend/src/core/entities/MetaEntityService.ts b/packages/backend/src/core/entities/MetaEntityService.ts index 8e56ddbc02..29790c79a0 100644 --- a/packages/backend/src/core/entities/MetaEntityService.ts +++ b/packages/backend/src/core/entities/MetaEntityService.ts @@ -74,7 +74,7 @@ export class MetaEntityService { name: instance.name, shortName: instance.shortName, - uri: this.config.url, + uri: this.config.webUrl, description: instance.description, langs: instance.langs, tosUrl: instance.termsOfServiceUrl, diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 0f4051e7b8..eae9ade0d2 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -383,10 +383,10 @@ export class UserEntityService implements OnModuleInit { @bindThis public getIdenticonUrl(user: MiUser): string { - if ((user.host == null || user.host === this.config.host) && user.username.includes('.') && this.meta.iconUrl) { // ローカルのシステムアカウントの場合 + if ((user.host == null || user.host === this.config.localHost) && user.username.includes('.') && this.meta.iconUrl) { // ローカルのシステムアカウントの場合 return this.meta.iconUrl; } else { - return `${this.config.url}/identicon/${user.username.toLowerCase()}@${user.host ?? this.config.host}`; + return `${this.config.webUrl}/identicon/${user.username.toLowerCase()}@${user.host ?? this.config.localHost}`; } } @@ -398,7 +398,7 @@ export class UserEntityService implements OnModuleInit { @bindThis public genLocalUserUri(userId: string): string { - return `${this.config.url}/users/${userId}`; + return `${this.config.webUrl}/users/${userId}`; } public async pack( diff --git a/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts b/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts index 53ecd2d180..5a7bef824f 100644 --- a/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts @@ -75,7 +75,7 @@ export class ExportCustomEmojisProcessorService { }); }; - await writeMeta(`{"metaVersion":2,"host":"${this.config.host}","exportedAt":"${new Date().toString()}","emojis":[`); + await writeMeta(`{"metaVersion":2,"host":"${this.config.webHost}","exportedAt":"${new Date().toString()}","emojis":[`); const customEmojis = await this.emojisRepository.find({ where: { diff --git a/packages/backend/src/queue/processors/SystemWebhookDeliverProcessorService.ts b/packages/backend/src/queue/processors/SystemWebhookDeliverProcessorService.ts index f6bef52684..0d85812587 100644 --- a/packages/backend/src/queue/processors/SystemWebhookDeliverProcessorService.ts +++ b/packages/backend/src/queue/processors/SystemWebhookDeliverProcessorService.ts @@ -41,13 +41,13 @@ export class SystemWebhookDeliverProcessorService { method: 'POST', headers: { 'User-Agent': 'Misskey-Hooks', - 'X-Misskey-Host': this.config.host, + 'X-Misskey-Host': this.config.webHost, 'X-Misskey-Hook-Id': job.data.webhookId, 'X-Misskey-Hook-Secret': job.data.secret, 'Content-Type': 'application/json', }, body: JSON.stringify({ - server: this.config.url, + server: this.config.webUrl, hookId: job.data.webhookId, eventId: job.data.eventId, createdAt: job.data.createdAt, diff --git a/packages/backend/src/queue/processors/UserWebhookDeliverProcessorService.ts b/packages/backend/src/queue/processors/UserWebhookDeliverProcessorService.ts index 9ec630ef70..3d764125af 100644 --- a/packages/backend/src/queue/processors/UserWebhookDeliverProcessorService.ts +++ b/packages/backend/src/queue/processors/UserWebhookDeliverProcessorService.ts @@ -41,13 +41,13 @@ export class UserWebhookDeliverProcessorService { method: 'POST', headers: { 'User-Agent': 'Misskey-Hooks', - 'X-Misskey-Host': this.config.host, + 'X-Misskey-Host': this.config.webHost, 'X-Misskey-Hook-Id': job.data.webhookId, 'X-Misskey-Hook-Secret': job.data.secret, 'Content-Type': 'application/json', }, body: JSON.stringify({ - server: this.config.url, + server: this.config.webUrl, hookId: job.data.webhookId, userId: job.data.userId, eventId: job.data.eventId, diff --git a/packages/backend/src/server/ActivityPubServerService.ts b/packages/backend/src/server/ActivityPubServerService.ts index 54ffeecc6b..8e582eafa4 100644 --- a/packages/backend/src/server/ActivityPubServerService.ts +++ b/packages/backend/src/server/ActivityPubServerService.ts @@ -99,7 +99,7 @@ export class ActivityPubServerService { private async packActivity(note: MiNote): Promise { if (isRenote(note) && !isQuote(note)) { const renote = await this.notesRepository.findOneByOrFail({ id: note.renoteId }); - return this.apRendererService.renderAnnounce(renote.uri ? renote.uri : `${this.config.url}/notes/${renote.id}`, note); + return this.apRendererService.renderAnnounce(renote.uri ? renote.uri : `${this.config.webUrl}/notes/${renote.id}`, note); } return this.apRendererService.renderCreate(await this.apRendererService.renderNote(note, false), note); @@ -122,7 +122,7 @@ export class ActivityPubServerService { } if (signature.params.headers.indexOf('host') === -1 - || request.headers.host !== this.config.host) { + || (request.headers.host !== this.config.localHost && request.headers.host !== this.config.webHost)) { // Host not specified or not match. reply.code(401); return; @@ -223,7 +223,7 @@ export class ActivityPubServerService { //#endregion const limit = 10; - const partOf = `${this.config.url}/users/${userId}/followers`; + const partOf = `${this.config.webUrl}/users/${userId}/followers`; if (page) { const query = { @@ -320,7 +320,7 @@ export class ActivityPubServerService { //#endregion const limit = 10; - const partOf = `${this.config.url}/users/${userId}/following`; + const partOf = `${this.config.webUrl}/users/${userId}/following`; if (page) { const query = { @@ -403,7 +403,7 @@ export class ActivityPubServerService { const renderedNotes = await Promise.all(pinnedNotes.map(note => this.apRendererService.renderNote(note))); const rendered = this.apRendererService.renderOrderedCollection( - `${this.config.url}/users/${userId}/collections/featured`, + `${this.config.webUrl}/users/${userId}/collections/featured`, renderedNotes.length, undefined, undefined, @@ -460,7 +460,7 @@ export class ActivityPubServerService { } const limit = 20; - const partOf = `${this.config.url}/users/${userId}/outbox`; + const partOf = `${this.config.webUrl}/users/${userId}/outbox`; if (page) { const notes = this.meta.enableFanoutTimeline ? await this.fanoutTimelineEndpointService.getMiNotes({ diff --git a/packages/backend/src/server/FileServerService.ts b/packages/backend/src/server/FileServerService.ts index f5034d0733..249c4f33cc 100644 --- a/packages/backend/src/server/FileServerService.ts +++ b/packages/backend/src/server/FileServerService.ts @@ -98,7 +98,7 @@ export class FileServerService { .catch(err => this.errorHandler(request, reply, err)); }); fastify.get<{ Params: { key: string; } }>('/files/:key/*', async (request, reply) => { - return await reply.redirect(`${this.config.url}/files/${request.params.key}`, 301); + return await reply.redirect(`${this.config.webUrl}/files/${request.params.key}`, 301); }); done(); }); diff --git a/packages/backend/src/server/NodeinfoServerService.ts b/packages/backend/src/server/NodeinfoServerService.ts index 93c36f5365..69afa9bb77 100644 --- a/packages/backend/src/server/NodeinfoServerService.ts +++ b/packages/backend/src/server/NodeinfoServerService.ts @@ -38,10 +38,10 @@ export class NodeinfoServerService { public getLinks() { return [{ rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', - href: this.config.url + nodeinfo2_1path, + href: this.config.webUrl + nodeinfo2_1path, }, { rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', - href: this.config.url + nodeinfo2_0path, + href: this.config.webUrl + nodeinfo2_0path, }]; } diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts index ef9ac81f95..5c11e1012a 100644 --- a/packages/backend/src/server/ServerService.ts +++ b/packages/backend/src/server/ServerService.ts @@ -82,7 +82,7 @@ export class ServerService implements OnApplicationShutdown { // HSTS // 6months (15552000sec) - if (this.config.url.startsWith('https') && !this.config.disableHsts) { + if (this.config.webUrl.startsWith('https') && !this.config.disableHsts) { fastify.addHook('onRequest', (request, reply, done) => { reply.header('strict-transport-security', 'max-age=15552000; preload'); done(); @@ -123,7 +123,7 @@ export class ServerService implements OnApplicationShutdown { } const effectiveLocation = process.env.NODE_ENV === 'production' ? location : location.replace(/^http:\/\//, 'https://'); - if (effectiveLocation.startsWith(`https://${this.config.host}/`)) { + if (effectiveLocation.startsWith(`https://${this.config.webHost}/`)) { done(); return; } @@ -213,7 +213,7 @@ export class ServerService implements OnApplicationShutdown { const user = await this.usersRepository.findOne({ where: { usernameLower: username.toLowerCase(), - host: (host == null) || (host === this.config.host) ? IsNull() : host, + host: (host == null) || (host === this.config.localHost) ? IsNull() : host, isSuspended: false, }, }); diff --git a/packages/backend/src/server/WellKnownServerService.ts b/packages/backend/src/server/WellKnownServerService.ts index ebfd1a421d..2f99ed0ee0 100644 --- a/packages/backend/src/server/WellKnownServerService.ts +++ b/packages/backend/src/server/WellKnownServerService.ts @@ -78,7 +78,7 @@ export class WellKnownServerService { return XRD({ element: 'Link', attributes: { rel: 'lrdd', type: xrd, - template: `${this.config.url}${webFingerPath}?resource={uri}`, + template: `${this.config.webUrl}${webFingerPath}?resource={uri}`, } }); }); @@ -93,7 +93,7 @@ export class WellKnownServerService { links: [{ rel: 'lrdd', type: jrd, - template: `${this.config.url}${webFingerPath}?resource={uri}`, + template: `${this.config.webUrl}${webFingerPath}?resource={uri}`, }], }; }); @@ -129,15 +129,15 @@ fastify.get('/.well-known/change-password', async (request, reply) => { }); const generateQuery = (resource: string): FindOptionsWhere | number => - resource.startsWith(`${this.config.url.toLowerCase()}/users/`) ? + resource.startsWith(`${this.config.webUrl.toLowerCase()}/users/`) ? fromId(resource.split('/').pop()!) : fromAcct(Acct.parse( - resource.startsWith(`${this.config.url.toLowerCase()}/@`) ? resource.split('/').pop()! : + resource.startsWith(`${this.config.webUrl.toLowerCase()}/@`) ? resource.split('/').pop()! : resource.startsWith('acct:') ? resource.slice('acct:'.length) : resource)); const fromAcct = (acct: Acct.Acct): FindOptionsWhere | number => - !acct.host || acct.host === this.config.host.toLowerCase() ? { + !acct.host || acct.host === this.config.localHost.toLowerCase() ? { usernameLower: acct.username.toLowerCase(), host: IsNull(), isSuspended: false, @@ -162,7 +162,7 @@ fastify.get('/.well-known/change-password', async (request, reply) => { return; } - const subject = `acct:${user.username}@${this.config.host}`; + const subject = `acct:${user.username}@${this.config.localHost}`; const self = { rel: 'self', type: 'application/activity+json', @@ -171,11 +171,11 @@ fastify.get('/.well-known/change-password', async (request, reply) => { const profilePage = { rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', - href: `${this.config.url}/@${user.username}`, + href: `${this.config.webUrl}/@${user.username}`, }; const subscribe = { rel: 'http://ostatus.org/schema/1.0/subscribe', - template: `${this.config.url}/authorize-follow?acct={uri}`, + template: `${this.config.webUrl}/authorize-follow?acct={uri}`, }; vary(reply.raw, 'Accept'); diff --git a/packages/backend/src/server/api/SigninApiService.ts b/packages/backend/src/server/api/SigninApiService.ts index 5c9d16a95a..2e40743b62 100644 --- a/packages/backend/src/server/api/SigninApiService.ts +++ b/packages/backend/src/server/api/SigninApiService.ts @@ -82,7 +82,7 @@ export class SigninApiService { }>, reply: FastifyReply, ) { - reply.header('Access-Control-Allow-Origin', this.config.url); + reply.header('Access-Control-Allow-Origin', this.config.webUrl); reply.header('Access-Control-Allow-Credentials', 'true'); const body = request.body; diff --git a/packages/backend/src/server/api/SigninWithPasskeyApiService.ts b/packages/backend/src/server/api/SigninWithPasskeyApiService.ts index 6feb4c3afa..b4386fba7e 100644 --- a/packages/backend/src/server/api/SigninWithPasskeyApiService.ts +++ b/packages/backend/src/server/api/SigninWithPasskeyApiService.ts @@ -61,7 +61,7 @@ export class SigninWithPasskeyApiService { }>, reply: FastifyReply, ) { - reply.header('Access-Control-Allow-Origin', this.config.url); + reply.header('Access-Control-Allow-Origin', this.config.webUrl); reply.header('Access-Control-Allow-Credentials', 'true'); const body = request.body; diff --git a/packages/backend/src/server/api/SignupApiService.ts b/packages/backend/src/server/api/SignupApiService.ts index b419c51ef1..bfdf8859a7 100644 --- a/packages/backend/src/server/api/SignupApiService.ts +++ b/packages/backend/src/server/api/SignupApiService.ts @@ -198,7 +198,7 @@ export class SignupApiService { password: hash, }); - const link = `${this.config.url}/signup-complete/${code}`; + const link = `${this.config.webUrl}/signup-complete/${code}`; this.emailService.sendEmail(emailAddress!, 'Signup', `To complete signup, please click this link:
${link}`, diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 5beed3a7e8..20897c1af1 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -627,7 +627,7 @@ export default class extends Endpoint { // eslint- version: this.config.version, name: instance.name, shortName: instance.shortName, - uri: this.config.url, + uri: this.config.webUrl, description: instance.description, langs: instance.langs, tosUrl: instance.termsOfServiceUrl, diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register.ts b/packages/backend/src/server/api/endpoints/i/2fa/register.ts index b6c837eda7..7699063288 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/register.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/register.ts @@ -94,7 +94,7 @@ export default class extends Endpoint { // eslint- secret, digits: 6, label: me.username, - issuer: this.config.host, + issuer: this.config.webHost, }); const url = totp.toString(); const qr = await QRCode.toDataURL(url); @@ -104,7 +104,7 @@ export default class extends Endpoint { // eslint- url, secret: secret.base32, label: me.username, - issuer: this.config.host, + issuer: this.config.webHost, }; }); } diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts index c2f4281f36..620f854373 100644 --- a/packages/backend/src/server/api/endpoints/i/update-email.ts +++ b/packages/backend/src/server/api/endpoints/i/update-email.ts @@ -131,7 +131,7 @@ export default class extends Endpoint { // eslint- emailVerifyCode: code, }); - const link = `${this.config.url}/verify-email/${code}`; + const link = `${this.config.webUrl}/verify-email/${code}`; this.emailService.sendEmail(ps.email, 'Email verification', `To verify email, please click this link:
${link}`, diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 5207d9f2b0..2b84d67e7c 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -571,7 +571,7 @@ export default class extends Endpoint { // eslint- const doc = htmlParser.parse(html); - const myLink = `${this.config.url}/@${user.username}`; + const myLink = `${this.config.webUrl}/@${user.username}`; const aEls = Array.from(doc.getElementsByTagName('a')); const linkEls = Array.from(doc.getElementsByTagName('link')); diff --git a/packages/backend/src/server/api/endpoints/request-reset-password.ts b/packages/backend/src/server/api/endpoints/request-reset-password.ts index 86fe6a2e6e..9f4acec44e 100644 --- a/packages/backend/src/server/api/endpoints/request-reset-password.ts +++ b/packages/backend/src/server/api/endpoints/request-reset-password.ts @@ -89,7 +89,7 @@ export default class extends Endpoint { // eslint- token, }); - const link = `${this.config.url}/reset-password/${token}`; + const link = `${this.config.webUrl}/reset-password/${token}`; this.emailService.sendEmail(ps.email, 'Password reset requested', `To reset password, please click this link:
${link}`, diff --git a/packages/backend/src/server/file/FileServerProxyHandler.ts b/packages/backend/src/server/file/FileServerProxyHandler.ts index 41e8e47ba5..c606d54891 100644 --- a/packages/backend/src/server/file/FileServerProxyHandler.ts +++ b/packages/backend/src/server/file/FileServerProxyHandler.ts @@ -260,8 +260,8 @@ export class FileServerProxyHandler { } private async getStreamAndTypeFromUrl(url: string): Promise { - if (url.startsWith(`${this.config.url}/files/`)) { - const key = url.replace(`${this.config.url}/files/`, '').split('/').shift(); + if (url.startsWith(`${this.config.webUrl}/files/`)) { + const key = url.replace(`${this.config.webUrl}/files/`, '').split('/').shift(); if (!key) throw new StatusError('Invalid File Key', 400, 'Invalid File Key'); return await this.fileResolver.resolveFileByAccessKey(key); diff --git a/packages/backend/src/server/oauth/OAuth2ProviderService.ts b/packages/backend/src/server/oauth/OAuth2ProviderService.ts index 840c34b806..2682aeace8 100644 --- a/packages/backend/src/server/oauth/OAuth2ProviderService.ts +++ b/packages/backend/src/server/oauth/OAuth2ProviderService.ts @@ -341,7 +341,7 @@ export class OAuth2ProviderService { // "Authorization servers MUST support PKCE [RFC7636]." this.#server.grant(oauth2Pkce.extensions()); this.#server.grant(oauth2orize.grant.code({ - modes: getQueryMode(config.url), + modes: getQueryMode(config.webUrl), }, (client, redirectUri, token, ares, areq, locals, done) => { (async (): Promise>> => { this.#logger.info(`Checking the user before sending authorization code to ${client.id}`); @@ -431,9 +431,9 @@ export class OAuth2ProviderService { // https://indieauth.spec.indieweb.org/#indieauth-server-metadata public generateRFC8414() { return { - issuer: this.config.url, - authorization_endpoint: new URL('/oauth/authorize', this.config.url), - token_endpoint: new URL('/oauth/token', this.config.url), + issuer: this.config.webUrl, + authorization_endpoint: new URL('/oauth/authorize', this.config.webUrl), + token_endpoint: new URL('/oauth/token', this.config.webUrl), scopes_supported: kinds, response_types_supported: ['code'], grant_types_supported: ['authorization_code'], @@ -521,7 +521,7 @@ export class OAuth2ProviderService { }) as ValidateFunctionArity2)); fastify.use('/authorize', this.#server.errorHandler({ mode: 'indirect', - modes: getQueryMode(this.config.url), + modes: getQueryMode(this.config.webUrl), })); fastify.use('/authorize', this.#server.errorHandler()); diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 24bc619e79..ea567a53f2 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -156,10 +156,10 @@ export class ClientServerService { let manifest = { // 空文字列の場合右辺を使いたいため // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - 'short_name': this.meta.shortName || this.meta.name || this.config.host, + 'short_name': this.meta.shortName || this.meta.name || this.config.webHost, // 空文字列の場合右辺を使いたいため // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - 'name': this.meta.name || this.config.host, + 'name': this.meta.name || this.config.webHost, 'start_url': '/', 'display': 'standalone', 'background_color': '#313a42', @@ -213,7 +213,7 @@ export class ClientServerService { @bindThis public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) { - const configUrl = new URL(this.config.url); + const configUrl = new URL(this.config.webUrl); fastify.addHook('onRequest', (request, reply, done) => { // クリックジャッキング防止のためiFrameの中に入れられないようにする @@ -407,8 +407,8 @@ export class ClientServerService { content += `${name}`; content += `${name} Search`; content += 'UTF-8'; - content += `${this.config.url}/favicon.ico`; - content += ``; + content += `${this.config.webUrl}/favicon.ico`; + content += ``; content += ''; reply.header('Content-Type', 'application/opensearchdescription+xml'); diff --git a/packages/backend/src/server/web/FeedService.ts b/packages/backend/src/server/web/FeedService.ts index eae7645321..9c386d3a4f 100644 --- a/packages/backend/src/server/web/FeedService.ts +++ b/packages/backend/src/server/web/FeedService.ts @@ -42,7 +42,7 @@ export class FeedService { @bindThis public async packFeed(user: MiUser) { const author = { - link: `${this.config.url}/@${user.username}`, + link: `${this.config.webUrl}/@${user.username}`, name: user.name ?? user.username, }; @@ -60,7 +60,7 @@ export class FeedService { const feed = new Feed({ id: author.link, - title: `${author.name} (@${user.username}@${this.config.host})`, + title: `${author.name} (@${user.username}@${this.config.localHost})`, updated: notes.length !== 0 ? this.idService.parse(notes[0].id).date : undefined, generator: 'Misskey', description: `${user.notesCount} Notes, ${profile.followingVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.followersVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`, @@ -83,7 +83,7 @@ export class FeedService { feed.addItem({ title: `New note by ${author.name}`, - link: `${this.config.url}/notes/${note.id}`, + link: `${this.config.webUrl}/notes/${note.id}`, date: this.idService.parse(note.id).date, description: note.cw ?? undefined, content: text ? this.mfmService.toHtml(mfmParse(text), JSON.parse(note.mentionedRemoteUsers)) ?? undefined : undefined, diff --git a/packages/backend/src/server/web/HtmlTemplateService.ts b/packages/backend/src/server/web/HtmlTemplateService.ts index 8ff985530d..ffb8f7df9f 100644 --- a/packages/backend/src/server/web/HtmlTemplateService.ts +++ b/packages/backend/src/server/web/HtmlTemplateService.ts @@ -86,7 +86,8 @@ export class HtmlTemplateService { serverErrorImageUrl: this.meta.serverErrorImageUrl ?? 'https://xn--931a.moe/assets/error.jpg', infoImageUrl: this.meta.infoImageUrl ?? 'https://xn--931a.moe/assets/info.jpg', notFoundImageUrl: this.meta.notFoundImageUrl ?? 'https://xn--931a.moe/assets/not-found.jpg', - instanceUrl: this.config.url, + instanceUrl: this.config.webUrl, + localUrl: this.config.localUrl, metaJson: htmlSafeJsonStringify(await this.metaEntityService.packDetailed(this.meta)), now: Date.now(), federationEnabled: this.meta.federation !== 'none', diff --git a/packages/backend/src/server/web/views/_.ts b/packages/backend/src/server/web/views/_.ts index ac7418f362..7476c218a9 100644 --- a/packages/backend/src/server/web/views/_.ts +++ b/packages/backend/src/server/web/views/_.ts @@ -34,6 +34,7 @@ export type CommonData = MinimumCommonData & { infoImageUrl: string; notFoundImageUrl: string; instanceUrl: string; + localUrl: string; now: number; federationEnabled: boolean; frontendBootloaderJs: string | null; diff --git a/packages/backend/src/server/web/views/announcement.tsx b/packages/backend/src/server/web/views/announcement.tsx index bc1c808177..70105732a5 100644 --- a/packages/backend/src/server/web/views/announcement.tsx +++ b/packages/backend/src/server/web/views/announcement.tsx @@ -18,7 +18,7 @@ export function AnnouncementPage(props: CommonProps<{ - + {props.announcement.imageUrl ? ( <> diff --git a/packages/backend/src/server/web/views/base-embed.tsx b/packages/backend/src/server/web/views/base-embed.tsx index 011b66592e..6de70152b6 100644 --- a/packages/backend/src/server/web/views/base-embed.tsx +++ b/packages/backend/src/server/web/views/base-embed.tsx @@ -41,6 +41,7 @@ export function BaseEmbed(props: PropsWithChildren + diff --git a/packages/backend/src/server/web/views/base.tsx b/packages/backend/src/server/web/views/base.tsx index 6fa3395fb8..59dcc27f1e 100644 --- a/packages/backend/src/server/web/views/base.tsx +++ b/packages/backend/src/server/web/views/base.tsx @@ -43,12 +43,13 @@ export function Layout(props: PropsWithChildren + - + {props.serverErrorImageUrl != null ? : null} {props.infoImageUrl != null ? : null} {props.notFoundImageUrl != null ? : null} diff --git a/packages/backend/src/server/web/views/channel.tsx b/packages/backend/src/server/web/views/channel.tsx index 7d8123ea85..9bbf2c6a15 100644 --- a/packages/backend/src/server/web/views/channel.tsx +++ b/packages/backend/src/server/web/views/channel.tsx @@ -17,7 +17,7 @@ export function ChannelPage(props: CommonProps<{ {props.channel.description != null ? : null} - + {props.channel.bannerUrl ? ( <> diff --git a/packages/backend/src/server/web/views/clip.tsx b/packages/backend/src/server/web/views/clip.tsx index c3cc505e35..208ed176d8 100644 --- a/packages/backend/src/server/web/views/clip.tsx +++ b/packages/backend/src/server/web/views/clip.tsx @@ -18,7 +18,7 @@ export function ClipPage(props: CommonProps<{ {props.clip.description != null ? : null} - + {props.clip.user.avatarUrl ? ( <> diff --git a/packages/backend/src/server/web/views/flash.tsx b/packages/backend/src/server/web/views/flash.tsx index 25a6b2c0ae..6942bcd5e0 100644 --- a/packages/backend/src/server/web/views/flash.tsx +++ b/packages/backend/src/server/web/views/flash.tsx @@ -18,7 +18,7 @@ export function FlashPage(props: CommonProps<{ - + {props.flash.user.avatarUrl ? ( <> diff --git a/packages/backend/src/server/web/views/gallery-post.tsx b/packages/backend/src/server/web/views/gallery-post.tsx index 2bec2de930..3528dc9a20 100644 --- a/packages/backend/src/server/web/views/gallery-post.tsx +++ b/packages/backend/src/server/web/views/gallery-post.tsx @@ -18,7 +18,7 @@ export function GalleryPostPage(props: CommonProps<{ {props.galleryPost.description != null ? : null} - + {props.galleryPost.isSensitive && props.galleryPost.user.avatarUrl ? ( <> diff --git a/packages/backend/src/server/web/views/info-card.tsx b/packages/backend/src/server/web/views/info-card.tsx index 27be4c69e8..bcc28a5110 100644 --- a/packages/backend/src/server/web/views/info-card.tsx +++ b/packages/backend/src/server/web/views/info-card.tsx @@ -21,13 +21,13 @@ export function InfoCardPage(props: CommonPropsMinimum<{ - {props.meta.name ?? props.config.url} + {props.meta.name ?? props.config.webUrl} - +
diff --git a/packages/backend/src/server/web/views/note.tsx b/packages/backend/src/server/web/views/note.tsx index 803c3d2537..85657eb1ed 100644 --- a/packages/backend/src/server/web/views/note.tsx +++ b/packages/backend/src/server/web/views/note.tsx @@ -26,7 +26,7 @@ export function NotePage(props: CommonProps<{ - + {videos.map(video => ( <> @@ -74,7 +74,7 @@ export function NotePage(props: CommonProps<{ {props.federationEnabled ? ( <> - {props.note.user.host == null ? : null} + {props.note.user.host == null ? : null} {props.note.uri != null ? : null} ) : null} diff --git a/packages/backend/src/server/web/views/page.tsx b/packages/backend/src/server/web/views/page.tsx index d0484612df..f523173a49 100644 --- a/packages/backend/src/server/web/views/page.tsx +++ b/packages/backend/src/server/web/views/page.tsx @@ -18,7 +18,7 @@ export function PagePage(props: CommonProps<{ {props.page.summary != null ? : null} - + {props.page.eyeCatchingImage != null ? ( <> diff --git a/packages/backend/src/server/web/views/reversi-game.tsx b/packages/backend/src/server/web/views/reversi-game.tsx index 22609311fd..d969b47575 100644 --- a/packages/backend/src/server/web/views/reversi-game.tsx +++ b/packages/backend/src/server/web/views/reversi-game.tsx @@ -19,7 +19,7 @@ export function ReversiGamePage(props: CommonProps<{ - + ); diff --git a/packages/backend/src/server/web/views/user.tsx b/packages/backend/src/server/web/views/user.tsx index 76c2633ab9..023af2fdd0 100644 --- a/packages/backend/src/server/web/views/user.tsx +++ b/packages/backend/src/server/web/views/user.tsx @@ -26,7 +26,7 @@ export function UserPage(props: CommonProps<{ {props.user.description != null ? : null} - + @@ -48,7 +48,7 @@ export function UserPage(props: CommonProps<{ {props.sub == null && props.federationEnabled ? ( <> - {props.user.host == null ? : null} + {props.user.host == null ? : null} {props.user.uri != null ? : null} {props.profile.url != null ? : null} diff --git a/packages/backend/test/e2e/2fa.ts b/packages/backend/test/e2e/2fa.ts index 48e1bababb..f1f6cd1eb7 100644 --- a/packages/backend/test/e2e/2fa.ts +++ b/packages/backend/test/e2e/2fa.ts @@ -53,7 +53,7 @@ describe('2要素認証', () => { const rpIdHash = (): Buffer => { return crypto.createHash('sha256') - .update(Buffer.from(config.host, 'utf-8')) + .update(Buffer.from(config.webHost, 'utf-8')) .digest(); }; @@ -103,7 +103,7 @@ describe('2要素認証', () => { clientDataJSON: Buffer.from(JSON.stringify({ type: 'webauthn.create', challenge: param.creationOptions.challenge, - origin: config.scheme + '://' + config.host, + origin: config.scheme + '://' + config.webHost, androidPackageName: 'org.mozilla.firefox', }), 'utf-8').toString('base64url'), attestationObject: cbor.encode({ @@ -147,7 +147,7 @@ describe('2要素認証', () => { const clientDataJSONBuffer = Buffer.from(JSON.stringify({ type: 'webauthn.get', challenge: param.requestOptions.challenge, - origin: config.scheme + '://' + config.host, + origin: config.scheme + '://' + config.webHost, androidPackageName: 'org.mozilla.firefox', }), 'utf-8'); const hashedclientDataJSON = crypto.createHash('sha256') @@ -189,7 +189,7 @@ describe('2要素認証', () => { assert.notEqual(registerResponse.body.url, undefined); assert.notEqual(registerResponse.body.secret, undefined); assert.strictEqual(registerResponse.body.label, username); - assert.strictEqual(registerResponse.body.issuer, config.host); + assert.strictEqual(registerResponse.body.issuer, config.webHost); const doneResponse = await api('i/2fa/done', { token: otpToken(registerResponse.body.secret), diff --git a/packages/backend/test/e2e/move.ts b/packages/backend/test/e2e/move.ts index fd798bdb25..b873570a9b 100644 --- a/packages/backend/test/e2e/move.ts +++ b/packages/backend/test/e2e/move.ts @@ -34,7 +34,7 @@ describe('Account Move', () => { jq = await jobQueue(); const config = loadConfig(); - url = new URL(config.url); + url = new URL(config.webUrl); const connection = await initTestDb(false); root = await signup({ username: 'root' }); alice = await signup({ username: 'alice' }); diff --git a/packages/backend/test/unit/server/FileServerService.ts b/packages/backend/test/unit/server/FileServerService.ts index c88175c5c7..e4bde36d17 100644 --- a/packages/backend/test/unit/server/FileServerService.ts +++ b/packages/backend/test/unit/server/FileServerService.ts @@ -109,7 +109,7 @@ describe('FileServerService', () => { size?: number; }) { const accessKey = params.accessKey; - const url = params.uri ?? `${config.url}/files/${accessKey}`; + const url = params.uri ?? `${config.webUrl}/files/${accessKey}`; await driveFilesRepository.insert({ id: idService.gen(), userId: null, @@ -582,7 +582,7 @@ describe('FileServerService', () => { }); expect(res.statusCode).toBe(301); - expect(res.headers.location).toBe(`${config.url}/files/testkey`); + expect(res.headers.location).toBe(`${config.webUrl}/files/testkey`); expect(res.headers['content-security-policy']).toBe('default-src \'none\'; img-src \'self\'; media-src \'self\'; style-src \'unsafe-inline\''); }); }); @@ -755,7 +755,7 @@ describe('FileServerService', () => { const res = await fastify.inject({ method: 'GET', - url: `/proxy/any?url=${encodeURIComponent(`${config.url}/files/${accessKey}`)}&origin=1`, + url: `/proxy/any?url=${encodeURIComponent(`${config.webUrl}/files/${accessKey}`)}&origin=1`, headers: { 'user-agent': 'Mozilla/5.0', }, diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts index f91fb7f9b1..2ac69256e0 100644 --- a/packages/backend/test/utils.ts +++ b/packages/backend/test/utils.ts @@ -39,8 +39,8 @@ export type SystemWebhookPayload = { const config = loadConfig(); export const port = config.port; -export const origin = config.url; -export const host = new URL(config.url).host; +export const origin = config.webUrl; +export const host = new URL(config.webUrl).host; export const WEBHOOK_HOST = 'http://localhost:15080'; export const WEBHOOK_PORT = 15080; diff --git a/packages/frontend-embed/src/boot.ts b/packages/frontend-embed/src/boot.ts index 961cbcef66..65c4106888 100644 --- a/packages/frontend-embed/src/boot.ts +++ b/packages/frontend-embed/src/boot.ts @@ -22,7 +22,7 @@ import { applyTheme, assertIsTheme } from '@/theme.js'; import { fetchCustomEmojis } from '@/custom-emojis.js'; import { DI } from '@/di.js'; import { serverMetadata } from '@/server-metadata.js'; -import { url, version, lang } from '@@/js/config.js'; +import { webUrl, version, lang } from '@@/js/config.js'; import { parseEmbedParams } from '@@/js/embed-page.js'; import { postMessageToParentWindow, setIframeId } from '@/post-message.js'; import { serverContext } from '@/server-context.js'; @@ -101,7 +101,7 @@ const app = createApp( defineAsyncComponent(() => import('@/ui.vue')), ); -app.provide(DI.mediaProxy, new MediaProxy(serverMetadata, url)); +app.provide(DI.mediaProxy, new MediaProxy(serverMetadata, webUrl)); app.provide(DI.serverMetadata, serverMetadata); diff --git a/packages/frontend-embed/src/components/EmAcct.vue b/packages/frontend-embed/src/components/EmAcct.vue index ff794d9b6e..2a8bd0ccc8 100644 --- a/packages/frontend-embed/src/components/EmAcct.vue +++ b/packages/frontend-embed/src/components/EmAcct.vue @@ -13,12 +13,12 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend-embed/src/components/EmLink.vue b/packages/frontend-embed/src/components/EmLink.vue index aec9b33072..945e73e5cd 100644 --- a/packages/frontend-embed/src/components/EmLink.vue +++ b/packages/frontend-embed/src/components/EmLink.vue @@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/global/MkAd.vue b/packages/frontend/src/components/global/MkAd.vue index c592079f03..14a1c71e10 100644 --- a/packages/frontend/src/components/global/MkAd.vue +++ b/packages/frontend/src/components/global/MkAd.vue @@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
Ads by {{ host }}
+
Ads by {{ webHost }}
{{ i18n.ts._ad.reduceFrequencyOfThisAd }} @@ -40,7 +40,7 @@ SPDX-License-Identifier: AGPL-3.0-only `, + ``, + ``, ]; return iframeCode.join('\n'); } diff --git a/packages/frontend/src/utility/get-note-menu.ts b/packages/frontend/src/utility/get-note-menu.ts index 78176970f1..a630d3405a 100644 --- a/packages/frontend/src/utility/get-note-menu.ts +++ b/packages/frontend/src/utility/get-note-menu.ts @@ -4,7 +4,7 @@ */ import * as Misskey from 'misskey-js'; -import { url } from '@@/js/config.js'; +import { webUrl } from '@@/js/config.js'; import { claimAchievement } from './achievements.js'; import type { Ref, ShallowRef } from 'vue'; import type { MenuItem } from '@/types/menu.js'; @@ -140,7 +140,7 @@ export function getAbuseNoteMenu(note: Misskey.entities.Note, text: string): Men icon: 'ti ti-exclamation-circle', text, action: async (): Promise => { - const localUrl = `${url}/notes/${note.id}`; + const localUrl = `${webUrl}/notes/${note.id}`; let noteInfo = ''; if (note.url ?? note.uri != null) noteInfo = `Note: ${note.url ?? note.uri}\n`; noteInfo += `Local Note: ${localUrl}\n`; @@ -159,7 +159,7 @@ export function getCopyNoteLinkMenu(note: Misskey.entities.Note, text: string): icon: 'ti ti-link', text, action: (): void => { - copyToClipboard(`${url}/notes/${note.id}`); + copyToClipboard(`${webUrl}/notes/${note.id}`); }, }; } @@ -279,7 +279,7 @@ export function getNoteMenu(props: { navigator.share({ title: i18n.tsx.noteOf({ user: appearNote.user.name ?? appearNote.user.username }), text: appearNote.text ?? '', - url: `${url}/notes/${appearNote.id}`, + url: `${webUrl}/notes/${appearNote.id}`, }); } diff --git a/packages/frontend/src/utility/get-user-menu.ts b/packages/frontend/src/utility/get-user-menu.ts index 9b2c53360c..fc77ec8e54 100644 --- a/packages/frontend/src/utility/get-user-menu.ts +++ b/packages/frontend/src/utility/get-user-menu.ts @@ -6,7 +6,7 @@ import { toUnicode } from 'punycode.js'; import { defineAsyncComponent, ref, watch } from 'vue'; import * as Misskey from 'misskey-js'; -import { host, url } from '@@/js/config.js'; +import { localHost, webUrl } from '@@/js/config.js'; import type { Router } from '@/router.js'; import type { MenuItem } from '@/types/menu.js'; import { i18n } from '@/i18n.js'; @@ -171,7 +171,7 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: Router icon: 'ti ti-at', text: i18n.ts.copyUsername, action: () => { - copyToClipboard(`@${user.username}@${user.host ?? host}`); + copyToClipboard(`@${user.username}@${user.host ?? localHost}`); }, }); @@ -180,7 +180,7 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: Router text: i18n.ts.copyProfileUrl, action: () => { const canonical = user.host === null ? `@${user.username}` : `@${user.username}@${toUnicode(user.host)}`; - copyToClipboard(`${url}/${canonical}`); + copyToClipboard(`${webUrl}/${canonical}`); }, }); @@ -188,7 +188,7 @@ export function getUserMenu(user: Misskey.entities.UserDetailed, router: Router icon: 'ti ti-rss', text: i18n.ts.copyRSS, action: () => { - copyToClipboard(`${user.host ?? host}/@${user.username}.atom`); + copyToClipboard(`${user.host ?? localHost}/@${user.username}.atom`); }, }); diff --git a/packages/frontend/src/utility/image-frame-renderer/ImageFrameRenderer.ts b/packages/frontend/src/utility/image-frame-renderer/ImageFrameRenderer.ts index 591a94b855..0a33caf238 100644 --- a/packages/frontend/src/utility/image-frame-renderer/ImageFrameRenderer.ts +++ b/packages/frontend/src/utility/image-frame-renderer/ImageFrameRenderer.ts @@ -4,7 +4,7 @@ */ import QRCodeStyling from 'qr-code-styling'; -import { url } from '@@/js/config.js'; +import { webUrl } from '@@/js/config.js'; import ExifReader from 'exifreader'; import { FN_frame } from './frame.js'; import { ImageCompositor } from '@/lib/ImageCompositor.js'; @@ -159,7 +159,7 @@ export class ImageFrameRenderer { height: labelCanvasCtx.canvas.height, margin: 0, type: 'canvas', - data: `${url}/users/${$i.id}`, + data: `${webUrl}/users/${$i.id}`, //image: $i.avatarUrl, qrOptions: { typeNumber: 0, diff --git a/packages/frontend/src/utility/media-proxy.ts b/packages/frontend/src/utility/media-proxy.ts index 78eba35ead..d93c0448d1 100644 --- a/packages/frontend/src/utility/media-proxy.ts +++ b/packages/frontend/src/utility/media-proxy.ts @@ -4,14 +4,14 @@ */ import { MediaProxy } from '@@/js/media-proxy.js'; -import { url } from '@@/js/config.js'; +import { webUrl } from '@@/js/config.js'; import { instance } from '@/instance.js'; let _mediaProxy: MediaProxy | null = null; export function getProxiedImageUrl(...args: Parameters): string { if (_mediaProxy == null) { - _mediaProxy = new MediaProxy(instance, url); + _mediaProxy = new MediaProxy(instance, webUrl); } return _mediaProxy.getProxiedImageUrl(...args); @@ -19,7 +19,7 @@ export function getProxiedImageUrl(...args: Parameters): string | null { if (_mediaProxy == null) { - _mediaProxy = new MediaProxy(instance, url); + _mediaProxy = new MediaProxy(instance, webUrl); } return _mediaProxy.getProxiedImageUrlNullable(...args); @@ -27,7 +27,7 @@ export function getProxiedImageUrlNullable(...args: Parameters): string { if (_mediaProxy == null) { - _mediaProxy = new MediaProxy(instance, url); + _mediaProxy = new MediaProxy(instance, webUrl); } return _mediaProxy.getStaticImageUrl(...args); diff --git a/packages/frontend/src/utility/popout.ts b/packages/frontend/src/utility/popout.ts index 7e0222c459..cf5de9e22f 100644 --- a/packages/frontend/src/utility/popout.ts +++ b/packages/frontend/src/utility/popout.ts @@ -7,7 +7,7 @@ import { appendQuery } from '@@/js/url.js'; import * as config from '@@/js/config.js'; export function popout(path: string, w?: HTMLElement) { - let url = path.startsWith('http://') || path.startsWith('https://') ? path : config.url + path; + let url = path.startsWith('http://') || path.startsWith('https://') ? path : config.webUrl + path; url = appendQuery(url, 'zen'); if (w) { const position = w.getBoundingClientRect(); diff --git a/packages/frontend/src/utility/url-preview.ts b/packages/frontend/src/utility/url-preview.ts index 5ed809a5af..11936f7ae6 100644 --- a/packages/frontend/src/utility/url-preview.ts +++ b/packages/frontend/src/utility/url-preview.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ import { computed } from 'vue'; -import { hostname } from '@@/js/config.js'; +import { webHost } from '@@/js/config.js'; import { instance } from '@/instance.js'; import { prefer } from '@/preferences.js'; @@ -18,7 +18,7 @@ export function transformPlayerUrl(url: string): string { if (urlObj.hostname === 'player.twitch.tv' || urlObj.hostname === 'clips.twitch.tv') { // TwitchはCSPの制約あり // https://dev.twitch.tv/docs/embed/video-and-clips/ - urlParams.set('parent', hostname); + urlParams.set('parent', webHost); urlParams.set('allowfullscreen', ''); urlParams.set('autoplay', 'true'); } else { diff --git a/packages/frontend/src/utility/watermark/WatermarkRenderer.ts b/packages/frontend/src/utility/watermark/WatermarkRenderer.ts index 32341a9e10..52460f0d58 100644 --- a/packages/frontend/src/utility/watermark/WatermarkRenderer.ts +++ b/packages/frontend/src/utility/watermark/WatermarkRenderer.ts @@ -4,7 +4,7 @@ */ import QRCodeStyling from 'qr-code-styling'; -import { url, host } from '@@/js/config.js'; +import { webUrl } from '@@/js/config.js'; import { getProxiedImageUrl } from '../media-proxy.js'; import { fn as fn_watermark } from './watermark.js'; import { fn as fn_stripe } from '@/utility/image-compositor-functions/stripe.js'; @@ -300,7 +300,7 @@ async function createTextureFromQr(options: { data: string | null }, resolution height: resolution, margin: 42, type: 'canvas', - data: options.data == null || options.data === '' ? `${url}/users/${$i.id}` : options.data, + data: options.data == null || options.data === '' ? `${webUrl}/users/${$i.id}` : options.data, image: $i.avatarUrl, qrOptions: { typeNumber: 0, diff --git a/packages/frontend/src/widgets/WidgetInstanceInfo.vue b/packages/frontend/src/widgets/WidgetInstanceInfo.vue index 7e6a779cf0..18a50ff97a 100644 --- a/packages/frontend/src/widgets/WidgetInstanceInfo.vue +++ b/packages/frontend/src/widgets/WidgetInstanceInfo.vue @@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ instance.name }} -
{{ host }}
+
{{ webHost }}
@@ -20,7 +20,7 @@ SPDX-License-Identifier: AGPL-3.0-only