diff --git a/src/browser/pages/error.html b/src/browser/pages/error.html index b3ad56757ae2..f44df0539ccb 100644 --- a/src/browser/pages/error.html +++ b/src/browser/pages/error.html @@ -11,7 +11,7 @@ content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;" /> - {{ERROR_TITLE}} - code-server + {{ERROR_TITLE}} - {{APP_NAME}} diff --git a/src/node/cli.ts b/src/node/cli.ts index 7e4674eaa052..8b1c9bfd7b5c 100644 --- a/src/node/cli.ts +++ b/src/node/cli.ts @@ -519,6 +519,7 @@ export interface DefaultedArgs extends ConfigArgs { "extensions-dir": string "user-data-dir": string "session-socket": string + "app-name": string /* Positional arguments. */ _: string[] } @@ -665,6 +666,10 @@ export async function setDefaults(cliArgs: UserProvidedArgs, configArgs?: Config } args["proxy-domain"] = finalProxies + if (!args["app-name"]) { + args["app-name"] = "code-server" + } + args._ = getResolvedPathsFromArgs(args) return { diff --git a/src/node/routes/errors.ts b/src/node/routes/errors.ts index c1439d6adedc..47286210afe8 100644 --- a/src/node/routes/errors.ts +++ b/src/node/routes/errors.ts @@ -57,7 +57,8 @@ export const errorHandler: express.ErrorRequestHandler = async (err, req, res, n replaceTemplates(req, content) .replace(/{{ERROR_TITLE}}/g, statusCode.toString()) .replace(/{{ERROR_HEADER}}/g, statusCode.toString()) - .replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)), + .replace(/{{ERROR_BODY}}/g, escapeHtml(err.message)) + .replace(/{{APP_NAME}}/g, req.args["app-name"]), ) } else { res.json({ diff --git a/src/node/routes/login.ts b/src/node/routes/login.ts index db4d1c45dbb3..6d9f33161c61 100644 --- a/src/node/routes/login.ts +++ b/src/node/routes/login.ts @@ -29,8 +29,7 @@ const getRoot = async (req: Request, error?: Error): Promise => { const content = await fs.readFile(path.join(rootPath, "src/browser/pages/login.html"), "utf8") const locale = req.args["locale"] || "en" i18n.changeLanguage(locale) - const appName = req.args["app-name"] || "code-server" - const welcomeText = req.args["welcome-text"] || (i18n.t("WELCOME", { app: appName }) as string) + const welcomeText = req.args["welcome-text"] || (i18n.t("WELCOME", { app: req.args["app-name"] }) as string) // Determine password message using i18n let passwordMsg = i18n.t("LOGIN_PASSWORD", { configFile: req.args.config }) @@ -43,7 +42,7 @@ const getRoot = async (req: Request, error?: Error): Promise => { return replaceTemplates( req, content - .replace(/{{I18N_LOGIN_TITLE}}/g, i18n.t("LOGIN_TITLE", { app: appName })) + .replace(/{{I18N_LOGIN_TITLE}}/g, i18n.t("LOGIN_TITLE", { app: req.args["app-name"] })) .replace(/{{WELCOME_TEXT}}/g, welcomeText) .replace(/{{PASSWORD_MSG}}/g, passwordMsg) .replace(/{{I18N_LOGIN_BELOW}}/g, i18n.t("LOGIN_BELOW")) diff --git a/src/node/routes/vscode.ts b/src/node/routes/vscode.ts index 33d1287a7892..3ff64a179604 100644 --- a/src/node/routes/vscode.ts +++ b/src/node/routes/vscode.ts @@ -172,7 +172,6 @@ router.get("/", ensureVSCodeLoaded, async (req, res, next) => { }) router.get("/manifest.json", async (req, res) => { - const appName = req.args["app-name"] || "code-server" res.writeHead(200, { "Content-Type": "application/manifest+json" }) res.end( @@ -180,8 +179,8 @@ router.get("/manifest.json", async (req, res) => { req, JSON.stringify( { - name: appName, - short_name: appName, + name: req.args["app-name"], + short_name: req.args["app-name"], start_url: ".", display: "fullscreen", display_override: ["window-controls-overlay"], diff --git a/test/unit/node/cli.test.ts b/test/unit/node/cli.test.ts index 668a3c55776c..44a0bd1c71a0 100644 --- a/test/unit/node/cli.test.ts +++ b/test/unit/node/cli.test.ts @@ -38,6 +38,7 @@ const defaults = { "extensions-dir": path.join(paths.data, "extensions"), "user-data-dir": paths.data, "session-socket": path.join(paths.data, "code-server-ipc.sock"), + "app-name": "code-server", _: [], } diff --git a/test/unit/node/routes/errors.test.ts b/test/unit/node/routes/errors.test.ts index ffa8f479111c..94657abf9f92 100644 --- a/test/unit/node/routes/errors.test.ts +++ b/test/unit/node/routes/errors.test.ts @@ -1,4 +1,5 @@ import express from "express" +import { UserProvidedArgs, setDefaults } from "../../../../src/node/cli" import { errorHandler } from "../../../../src/node/routes/errors" describe("error page is rendered for text/html requests", () => { @@ -9,7 +10,7 @@ describe("error page is rendered for text/html requests", () => { statusCode: 404, message: ";>hello", } - const req = createRequest() + const req = await createRequest() const res = { status: jest.fn().mockReturnValue(this), send: jest.fn().mockReturnValue(this), @@ -20,9 +21,41 @@ describe("error page is rendered for text/html requests", () => { expect(res.status).toHaveBeenCalledWith(404) expect(res.send).toHaveBeenCalledWith(expect.not.stringContaining("