mirror of https://github.com/coder/code-server.git
Merge pull request #3304 from cdr/jsjoeio/fix-tmp-path
fix(socket): use xdgBasedir.runtime instead of tmp
This commit is contained in:
commit
d2337bcd85
|
@ -2,7 +2,7 @@
|
||||||
Please link to the issue this PR solves.
|
Please link to the issue this PR solves.
|
||||||
If there is no existing issue, please first create one unless the fix is minor.
|
If there is no existing issue, please first create one unless the fix is minor.
|
||||||
|
|
||||||
Please make sure the base of your PR is the master branch!
|
Please make sure the base of your PR is the default branch!
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## Checklist
|
## Checklist
|
||||||
|
|
|
@ -72,6 +72,7 @@ VS Code v1.56
|
||||||
### Development
|
### Development
|
||||||
|
|
||||||
- chore: ignore updates to microsoft/playwright-github-action
|
- chore: ignore updates to microsoft/playwright-github-action
|
||||||
|
- fix(socket): use xdgBasedir.runtime instead of tmp #3304 @jsjoeio
|
||||||
|
|
||||||
## 3.10.0
|
## 3.10.0
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,7 @@ import * as path from "path"
|
||||||
import * as tls from "tls"
|
import * as tls from "tls"
|
||||||
import { Emitter } from "../common/emitter"
|
import { Emitter } from "../common/emitter"
|
||||||
import { generateUuid } from "../common/util"
|
import { generateUuid } from "../common/util"
|
||||||
import { tmpdir } from "./constants"
|
import { canConnect, paths } from "./util"
|
||||||
import { canConnect } from "./util"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a way to proxy a TLS socket. Can be used when you need to pass a
|
* Provides a way to proxy a TLS socket. Can be used when you need to pass a
|
||||||
|
@ -13,7 +12,7 @@ import { canConnect } from "./util"
|
||||||
*/
|
*/
|
||||||
export class SocketProxyProvider {
|
export class SocketProxyProvider {
|
||||||
private readonly onProxyConnect = new Emitter<net.Socket>()
|
private readonly onProxyConnect = new Emitter<net.Socket>()
|
||||||
private proxyPipe = path.join(tmpdir, "tls-proxy")
|
private proxyPipe = path.join(paths.runtime, "tls-proxy")
|
||||||
private _proxyServer?: Promise<net.Server>
|
private _proxyServer?: Promise<net.Server>
|
||||||
private readonly proxyTimeout = 5000
|
private readonly proxyTimeout = 5000
|
||||||
|
|
||||||
|
@ -76,7 +75,10 @@ export class SocketProxyProvider {
|
||||||
this._proxyServer = this.findFreeSocketPath(this.proxyPipe)
|
this._proxyServer = this.findFreeSocketPath(this.proxyPipe)
|
||||||
.then((pipe) => {
|
.then((pipe) => {
|
||||||
this.proxyPipe = pipe
|
this.proxyPipe = pipe
|
||||||
return Promise.all([fs.mkdir(tmpdir, { recursive: true }), fs.rmdir(this.proxyPipe, { recursive: true })])
|
return Promise.all([
|
||||||
|
fs.mkdir(path.dirname(this.proxyPipe), { recursive: true }),
|
||||||
|
fs.rmdir(this.proxyPipe, { recursive: true }),
|
||||||
|
])
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
|
|
|
@ -8,9 +8,10 @@ import * as path from "path"
|
||||||
import * as util from "util"
|
import * as util from "util"
|
||||||
import xdgBasedir from "xdg-basedir"
|
import xdgBasedir from "xdg-basedir"
|
||||||
|
|
||||||
interface Paths {
|
export interface Paths {
|
||||||
data: string
|
data: string
|
||||||
config: string
|
config: string
|
||||||
|
runtime: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const paths = getEnvPaths()
|
export const paths = getEnvPaths()
|
||||||
|
@ -20,23 +21,34 @@ export const paths = getEnvPaths()
|
||||||
* On MacOS this function gets the standard XDG directories instead of using the native macOS
|
* On MacOS this function gets the standard XDG directories instead of using the native macOS
|
||||||
* ones. Most CLIs do this as in practice only GUI apps use the standard macOS directories.
|
* ones. Most CLIs do this as in practice only GUI apps use the standard macOS directories.
|
||||||
*/
|
*/
|
||||||
function getEnvPaths(): Paths {
|
export function getEnvPaths(): Paths {
|
||||||
let paths: Paths
|
const paths = envPaths("code-server", { suffix: "" })
|
||||||
if (process.platform === "win32") {
|
const append = (p: string): string => path.join(p, "code-server")
|
||||||
paths = envPaths("code-server", {
|
switch (process.platform) {
|
||||||
suffix: "",
|
case "darwin":
|
||||||
})
|
return {
|
||||||
} else {
|
// envPaths uses native directories so force Darwin to use the XDG spec
|
||||||
if (xdgBasedir.data === undefined || xdgBasedir.config === undefined) {
|
// to align with other CLI tools.
|
||||||
throw new Error("No home folder?")
|
data: xdgBasedir.data ? append(xdgBasedir.data) : paths.data,
|
||||||
|
config: xdgBasedir.config ? append(xdgBasedir.config) : paths.config,
|
||||||
|
// Fall back to temp if there is no runtime dir.
|
||||||
|
runtime: xdgBasedir.runtime ? append(xdgBasedir.runtime) : paths.temp,
|
||||||
}
|
}
|
||||||
paths = {
|
case "win32":
|
||||||
data: path.join(xdgBasedir.data, "code-server"),
|
return {
|
||||||
config: path.join(xdgBasedir.config, "code-server"),
|
data: paths.data,
|
||||||
|
config: paths.config,
|
||||||
|
// Windows doesn't have a runtime dir.
|
||||||
|
runtime: paths.temp,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return {
|
||||||
|
data: paths.data,
|
||||||
|
config: paths.config,
|
||||||
|
// Fall back to temp if there is no runtime dir.
|
||||||
|
runtime: xdgBasedir.runtime ? append(xdgBasedir.runtime) : paths.temp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return paths
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,147 @@
|
||||||
|
describe("getEnvPaths", () => {
|
||||||
|
describe("on darwin", () => {
|
||||||
|
let ORIGINAL_PLATFORM = ""
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
ORIGINAL_PLATFORM = process.platform
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: "darwin",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.resetModules()
|
||||||
|
jest.mock("env-paths", () => {
|
||||||
|
return () => ({
|
||||||
|
data: "/home/envPath/.local/share",
|
||||||
|
config: "/home/envPath/.config",
|
||||||
|
temp: "/tmp/envPath/runtime",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
// Restore old platform
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: ORIGINAL_PLATFORM,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return the env paths using xdgBasedir", () => {
|
||||||
|
jest.mock("xdg-basedir", () => ({
|
||||||
|
data: "/home/usr/.local/share",
|
||||||
|
config: "/home/usr/.config",
|
||||||
|
runtime: "/tmp/runtime",
|
||||||
|
}))
|
||||||
|
const getEnvPaths = require("../../../src/node/util").getEnvPaths
|
||||||
|
const envPaths = getEnvPaths()
|
||||||
|
|
||||||
|
expect(envPaths.data).toEqual("/home/usr/.local/share/code-server")
|
||||||
|
expect(envPaths.config).toEqual("/home/usr/.config/code-server")
|
||||||
|
expect(envPaths.runtime).toEqual("/tmp/runtime/code-server")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return the env paths using envPaths when xdgBasedir is undefined", () => {
|
||||||
|
jest.mock("xdg-basedir", () => ({}))
|
||||||
|
const getEnvPaths = require("../../../src/node/util").getEnvPaths
|
||||||
|
const envPaths = getEnvPaths()
|
||||||
|
|
||||||
|
expect(envPaths.data).toEqual("/home/envPath/.local/share")
|
||||||
|
expect(envPaths.config).toEqual("/home/envPath/.config")
|
||||||
|
expect(envPaths.runtime).toEqual("/tmp/envPath/runtime")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe("on win32", () => {
|
||||||
|
let ORIGINAL_PLATFORM = ""
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
ORIGINAL_PLATFORM = process.platform
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: "win32",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.resetModules()
|
||||||
|
jest.mock("env-paths", () => {
|
||||||
|
return () => ({
|
||||||
|
data: "/windows/envPath/.local/share",
|
||||||
|
config: "/windows/envPath/.config",
|
||||||
|
temp: "/tmp/envPath/runtime",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
// Restore old platform
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: ORIGINAL_PLATFORM,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return the env paths using envPaths", () => {
|
||||||
|
const getEnvPaths = require("../../../src/node/util").getEnvPaths
|
||||||
|
const envPaths = getEnvPaths()
|
||||||
|
|
||||||
|
expect(envPaths.data).toEqual("/windows/envPath/.local/share")
|
||||||
|
expect(envPaths.config).toEqual("/windows/envPath/.config")
|
||||||
|
expect(envPaths.runtime).toEqual("/tmp/envPath/runtime")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe("on other platforms", () => {
|
||||||
|
let ORIGINAL_PLATFORM = ""
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
ORIGINAL_PLATFORM = process.platform
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: "linux",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.resetModules()
|
||||||
|
jest.mock("env-paths", () => {
|
||||||
|
return () => ({
|
||||||
|
data: "/linux/envPath/.local/share",
|
||||||
|
config: "/linux/envPath/.config",
|
||||||
|
temp: "/tmp/envPath/runtime",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
// Restore old platform
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: ORIGINAL_PLATFORM,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return the runtime using xdgBasedir if it exists", () => {
|
||||||
|
jest.mock("xdg-basedir", () => ({
|
||||||
|
runtime: "/tmp/runtime",
|
||||||
|
}))
|
||||||
|
const getEnvPaths = require("../../../src/node/util").getEnvPaths
|
||||||
|
const envPaths = getEnvPaths()
|
||||||
|
|
||||||
|
expect(envPaths.data).toEqual("/linux/envPath/.local/share")
|
||||||
|
expect(envPaths.config).toEqual("/linux/envPath/.config")
|
||||||
|
expect(envPaths.runtime).toEqual("/tmp/runtime/code-server")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return the env paths using envPaths when xdgBasedir is undefined", () => {
|
||||||
|
jest.mock("xdg-basedir", () => ({}))
|
||||||
|
const getEnvPaths = require("../../../src/node/util").getEnvPaths
|
||||||
|
const envPaths = getEnvPaths()
|
||||||
|
|
||||||
|
expect(envPaths.data).toEqual("/linux/envPath/.local/share")
|
||||||
|
expect(envPaths.config).toEqual("/linux/envPath/.config")
|
||||||
|
expect(envPaths.runtime).toEqual("/tmp/envPath/runtime")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue