From aea0b0e7cde7495e60fe07b4444067f53d35ce3f Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 14 May 2021 12:04:44 +0200 Subject: Inject server config in HTML --- server/lib/client-html.ts | 18 ++++++++++++++++-- server/lib/config.ts | 31 ++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 13 deletions(-) (limited to 'server/lib') diff --git a/server/lib/client-html.ts b/server/lib/client-html.ts index 203bd3893..85fdc8754 100644 --- a/server/lib/client-html.ts +++ b/server/lib/client-html.ts @@ -2,12 +2,14 @@ import * as express from 'express' import { readFile } from 'fs-extra' import { join } from 'path' import validator from 'validator' +import { escapeHTML } from '@shared/core-utils/renderer' +import { HTMLServerConfig } from '@shared/models' import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/core-utils/i18n/i18n' import { HttpStatusCode } from '../../shared/core-utils/miscs/http-error-codes' import { VideoPlaylistPrivacy, VideoPrivacy } from '../../shared/models/videos' import { isTestInstance, sha256 } from '../helpers/core-utils' -import { escapeHTML } from '@shared/core-utils/renderer' import { logger } from '../helpers/logger' +import { mdToPlainText } from '../helpers/markdown' import { CONFIG } from '../initializers/config' import { ACCEPT_HEADERS, @@ -24,7 +26,7 @@ import { VideoChannelModel } from '../models/video/video-channel' import { getActivityStreamDuration } from '../models/video/video-format-utils' import { VideoPlaylistModel } from '../models/video/video-playlist' import { MAccountActor, MChannelActor } from '../types/models' -import { mdToPlainText } from '../helpers/markdown' +import { getHTMLServerConfig } from './config' type Tags = { ogType: string @@ -209,11 +211,14 @@ class ClientHtml { if (!isTestInstance() && ClientHtml.htmlCache[path]) return ClientHtml.htmlCache[path] const buffer = await readFile(path) + const serverConfig = await getHTMLServerConfig() let html = buffer.toString() html = await ClientHtml.addAsyncPluginCSS(html) html = ClientHtml.addCustomCSS(html) html = ClientHtml.addTitleTag(html) + html = ClientHtml.addDescriptionTag(html) + html = ClientHtml.addServerConfig(html, serverConfig) ClientHtml.htmlCache[path] = html @@ -275,6 +280,7 @@ class ClientHtml { if (!isTestInstance() && ClientHtml.htmlCache[path]) return ClientHtml.htmlCache[path] const buffer = await readFile(path) + const serverConfig = await getHTMLServerConfig() let html = buffer.toString() @@ -283,6 +289,7 @@ class ClientHtml { html = ClientHtml.addFaviconContentHash(html) html = ClientHtml.addLogoContentHash(html) html = ClientHtml.addCustomCSS(html) + html = ClientHtml.addServerConfig(html, serverConfig) html = await ClientHtml.addAsyncPluginCSS(html) ClientHtml.htmlCache[path] = html @@ -355,6 +362,13 @@ class ClientHtml { return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.CUSTOM_CSS, styleTag) } + private static addServerConfig (htmlStringPage: string, serverConfig: HTMLServerConfig) { + const serverConfigString = JSON.stringify(serverConfig) + const configScriptTag = `` + + return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.SERVER_CONFIG, configScriptTag) + } + private static async addAsyncPluginCSS (htmlStringPage: string) { const globalCSSContent = await readFile(PLUGIN_GLOBAL_CSS_PATH) if (globalCSSContent.byteLength === 0) return htmlStringPage diff --git a/server/lib/config.ts b/server/lib/config.ts index fed468fe1..18d49f05a 100644 --- a/server/lib/config.ts +++ b/server/lib/config.ts @@ -2,17 +2,13 @@ import { isSignupAllowed, isSignupAllowedForCurrentIP } from '@server/helpers/si import { getServerCommit } from '@server/helpers/utils' import { CONFIG, isEmailEnabled } from '@server/initializers/config' import { CONSTRAINTS_FIELDS, DEFAULT_THEME_NAME, PEERTUBE_VERSION } from '@server/initializers/constants' -import { RegisteredExternalAuthConfig, RegisteredIdAndPassAuthConfig, ServerConfig } from '@shared/models' +import { HTMLServerConfig, RegisteredExternalAuthConfig, RegisteredIdAndPassAuthConfig, ServerConfig } from '@shared/models' import { Hooks } from './plugins/hooks' import { PluginManager } from './plugins/plugin-manager' import { getThemeOrDefault } from './plugins/theme-utils' import { VideoTranscodingProfilesManager } from './transcoding/video-transcoding-profiles' -let serverCommit: string - async function getServerConfig (ip?: string): Promise { - if (serverCommit === undefined) serverCommit = await getServerCommit() - const { allowed } = await Hooks.wrapPromiseFun( isSignupAllowed, { @@ -22,6 +18,23 @@ async function getServerConfig (ip?: string): Promise { ) const allowedForCurrentIP = isSignupAllowedForCurrentIP(ip) + + const signup = { + allowed, + allowedForCurrentIP, + requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION + } + + const htmlConfig = await getHTMLServerConfig() + + return { ...htmlConfig, signup } +} + +// Config injected in HTML +let serverCommit: string +async function getHTMLServerConfig (): Promise { + if (serverCommit === undefined) serverCommit = await getServerCommit() + const defaultTheme = getThemeOrDefault(CONFIG.THEME.DEFAULT, DEFAULT_THEME_NAME) return { @@ -65,11 +78,6 @@ async function getServerConfig (ip?: string): Promise { }, serverVersion: PEERTUBE_VERSION, serverCommit, - signup: { - allowed, - allowedForCurrentIP, - requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION - }, transcoding: { hls: { enabled: CONFIG.TRANSCODING.HLS.ENABLED @@ -223,7 +231,8 @@ export { getServerConfig, getRegisteredThemes, getEnabledResolutions, - getRegisteredPlugins + getRegisteredPlugins, + getHTMLServerConfig } // --------------------------------------------------------------------------- -- cgit v1.2.3