mirror of
https://github.com/coder/code-server.git
synced 2026-05-05 03:55:18 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24ea70ac88 | ||
|
|
a6d80dc434 | ||
|
|
b43e772707 |
Submodule lib/vscode updated: 0870c2a0c7...ce099c1ed2
@@ -14,7 +14,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/ch
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- code-server.orig/lib/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.ts
|
--- code-server.orig/lib/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.ts
|
||||||
+++ code-server/lib/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.ts
|
+++ code-server/lib/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.ts
|
||||||
@@ -301,7 +301,7 @@ export class ChatDebugEditor extends Edi
|
@@ -303,7 +303,7 @@ export class ChatDebugEditor extends Edi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ Index: code-server/lib/vscode/src/vs/workbench/services/configuration/browser/co
|
|||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -555,6 +557,12 @@ export class WorkspaceService extends Di
|
@@ -559,6 +561,12 @@ export class WorkspaceService extends Di
|
||||||
previousFolders = this.workspace.folders;
|
previousFolders = this.workspace.folders;
|
||||||
this.workspace.update(workspace);
|
this.workspace.update(workspace);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
|
content="style-src 'self'; manifest-src 'self'; img-src 'self' data:; font-src 'self' data:;"
|
||||||
/>
|
/>
|
||||||
<meta name="color-scheme" content="light dark" />
|
<meta name="color-scheme" content="light dark" />
|
||||||
<title>{{ERROR_TITLE}} - code-server</title>
|
<title>{{ERROR_TITLE}} - {{APP_NAME}}</title>
|
||||||
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
|
<link rel="icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon-dark-support.svg" />
|
||||||
<link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
|
<link rel="alternate icon" href="{{CS_STATIC_BASE}}/src/browser/media/favicon.ico" />
|
||||||
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />
|
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials" />
|
||||||
|
|||||||
@@ -519,6 +519,7 @@ export interface DefaultedArgs extends ConfigArgs {
|
|||||||
"extensions-dir": string
|
"extensions-dir": string
|
||||||
"user-data-dir": string
|
"user-data-dir": string
|
||||||
"session-socket": string
|
"session-socket": string
|
||||||
|
"app-name": string
|
||||||
/* Positional arguments. */
|
/* Positional arguments. */
|
||||||
_: string[]
|
_: string[]
|
||||||
}
|
}
|
||||||
@@ -665,6 +666,10 @@ export async function setDefaults(cliArgs: UserProvidedArgs, configArgs?: Config
|
|||||||
}
|
}
|
||||||
args["proxy-domain"] = finalProxies
|
args["proxy-domain"] = finalProxies
|
||||||
|
|
||||||
|
if (!args["app-name"]) {
|
||||||
|
args["app-name"] = "code-server"
|
||||||
|
}
|
||||||
|
|
||||||
args._ = getResolvedPathsFromArgs(args)
|
args._ = getResolvedPathsFromArgs(args)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ export const errorHandler: express.ErrorRequestHandler = async (err, req, res, n
|
|||||||
replaceTemplates(req, content)
|
replaceTemplates(req, content)
|
||||||
.replace(/{{ERROR_TITLE}}/g, statusCode.toString())
|
.replace(/{{ERROR_TITLE}}/g, statusCode.toString())
|
||||||
.replace(/{{ERROR_HEADER}}/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 {
|
} else {
|
||||||
res.json({
|
res.json({
|
||||||
|
|||||||
@@ -29,8 +29,7 @@ const getRoot = async (req: Request, error?: Error): Promise<string> => {
|
|||||||
const content = await fs.readFile(path.join(rootPath, "src/browser/pages/login.html"), "utf8")
|
const content = await fs.readFile(path.join(rootPath, "src/browser/pages/login.html"), "utf8")
|
||||||
const locale = req.args["locale"] || "en"
|
const locale = req.args["locale"] || "en"
|
||||||
i18n.changeLanguage(locale)
|
i18n.changeLanguage(locale)
|
||||||
const appName = req.args["app-name"] || "code-server"
|
const welcomeText = req.args["welcome-text"] || (i18n.t("WELCOME", { app: req.args["app-name"] }) as string)
|
||||||
const welcomeText = req.args["welcome-text"] || (i18n.t("WELCOME", { app: appName }) as string)
|
|
||||||
|
|
||||||
// Determine password message using i18n
|
// Determine password message using i18n
|
||||||
let passwordMsg = i18n.t("LOGIN_PASSWORD", { configFile: req.args.config })
|
let passwordMsg = i18n.t("LOGIN_PASSWORD", { configFile: req.args.config })
|
||||||
@@ -43,7 +42,7 @@ const getRoot = async (req: Request, error?: Error): Promise<string> => {
|
|||||||
return replaceTemplates(
|
return replaceTemplates(
|
||||||
req,
|
req,
|
||||||
content
|
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(/{{WELCOME_TEXT}}/g, welcomeText)
|
||||||
.replace(/{{PASSWORD_MSG}}/g, passwordMsg)
|
.replace(/{{PASSWORD_MSG}}/g, passwordMsg)
|
||||||
.replace(/{{I18N_LOGIN_BELOW}}/g, i18n.t("LOGIN_BELOW"))
|
.replace(/{{I18N_LOGIN_BELOW}}/g, i18n.t("LOGIN_BELOW"))
|
||||||
|
|||||||
@@ -172,7 +172,6 @@ router.get("/", ensureVSCodeLoaded, async (req, res, next) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
router.get("/manifest.json", async (req, res) => {
|
router.get("/manifest.json", async (req, res) => {
|
||||||
const appName = req.args["app-name"] || "code-server"
|
|
||||||
res.writeHead(200, { "Content-Type": "application/manifest+json" })
|
res.writeHead(200, { "Content-Type": "application/manifest+json" })
|
||||||
|
|
||||||
res.end(
|
res.end(
|
||||||
@@ -180,8 +179,8 @@ router.get("/manifest.json", async (req, res) => {
|
|||||||
req,
|
req,
|
||||||
JSON.stringify(
|
JSON.stringify(
|
||||||
{
|
{
|
||||||
name: appName,
|
name: req.args["app-name"],
|
||||||
short_name: appName,
|
short_name: req.args["app-name"],
|
||||||
start_url: ".",
|
start_url: ".",
|
||||||
display: "fullscreen",
|
display: "fullscreen",
|
||||||
display_override: ["window-controls-overlay"],
|
display_override: ["window-controls-overlay"],
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ const defaults = {
|
|||||||
"extensions-dir": path.join(paths.data, "extensions"),
|
"extensions-dir": path.join(paths.data, "extensions"),
|
||||||
"user-data-dir": paths.data,
|
"user-data-dir": paths.data,
|
||||||
"session-socket": path.join(paths.data, "code-server-ipc.sock"),
|
"session-socket": path.join(paths.data, "code-server-ipc.sock"),
|
||||||
|
"app-name": "code-server",
|
||||||
_: [],
|
_: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import express from "express"
|
import express from "express"
|
||||||
|
import { UserProvidedArgs, setDefaults } from "../../../../src/node/cli"
|
||||||
import { errorHandler } from "../../../../src/node/routes/errors"
|
import { errorHandler } from "../../../../src/node/routes/errors"
|
||||||
|
|
||||||
describe("error page is rendered for text/html requests", () => {
|
describe("error page is rendered for text/html requests", () => {
|
||||||
@@ -9,7 +10,7 @@ describe("error page is rendered for text/html requests", () => {
|
|||||||
statusCode: 404,
|
statusCode: 404,
|
||||||
message: ";>hello<script>alert(1)</script>",
|
message: ";>hello<script>alert(1)</script>",
|
||||||
}
|
}
|
||||||
const req = createRequest()
|
const req = await createRequest()
|
||||||
const res = {
|
const res = {
|
||||||
status: jest.fn().mockReturnValue(this),
|
status: jest.fn().mockReturnValue(this),
|
||||||
send: 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.status).toHaveBeenCalledWith(404)
|
||||||
expect(res.send).toHaveBeenCalledWith(expect.not.stringContaining("<script>"))
|
expect(res.send).toHaveBeenCalledWith(expect.not.stringContaining("<script>"))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("should use custom app-name in error page title", async () => {
|
||||||
|
const err = {
|
||||||
|
statusCode: 404,
|
||||||
|
message: "Not found",
|
||||||
|
}
|
||||||
|
const req = await createRequest({ "app-name": "MyCodeServer" })
|
||||||
|
const res = {
|
||||||
|
status: jest.fn().mockReturnValue(this),
|
||||||
|
send: jest.fn().mockReturnValue(this),
|
||||||
|
set: jest.fn().mockReturnValue(this),
|
||||||
|
} as unknown as express.Response
|
||||||
|
|
||||||
|
await errorHandler(err, req, res, jest.fn())
|
||||||
|
expect(res.send).toHaveBeenCalledWith(expect.stringContaining("<title>404 - MyCodeServer</title>"))
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should use default 'code-server' when app-name is not set", async () => {
|
||||||
|
const err = {
|
||||||
|
statusCode: 500,
|
||||||
|
message: "Internal error",
|
||||||
|
}
|
||||||
|
const req = await createRequest()
|
||||||
|
const res = {
|
||||||
|
status: jest.fn().mockReturnValue(this),
|
||||||
|
send: jest.fn().mockReturnValue(this),
|
||||||
|
set: jest.fn().mockReturnValue(this),
|
||||||
|
} as unknown as express.Response
|
||||||
|
|
||||||
|
await errorHandler(err, req, res, jest.fn())
|
||||||
|
expect(res.send).toHaveBeenCalledWith(expect.stringContaining("<title>500 - code-server</title>"))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
function createRequest(): express.Request {
|
async function createRequest(args: UserProvidedArgs = {}): Promise<express.Request> {
|
||||||
return {
|
return {
|
||||||
headers: {
|
headers: {
|
||||||
accept: ["text/html"],
|
accept: ["text/html"],
|
||||||
@@ -31,5 +64,6 @@ function createRequest(): express.Request {
|
|||||||
query: {
|
query: {
|
||||||
to: "test",
|
to: "test",
|
||||||
},
|
},
|
||||||
|
args: await setDefaults(args),
|
||||||
} as unknown as express.Request
|
} as unknown as express.Request
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user