Skip to content

Commit c4d8758

Browse files
authored
feat: cli arg for file permission of socket (#4923)
1 parent 78658f1 commit c4d8758

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

src/node/app.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { disposer } from "./http"
1111
import { isNodeJSErrnoException } from "./util"
1212
import { handleUpgrade } from "./wsRouter"
1313

14-
type ListenOptions = Pick<DefaultedArgs, "socket" | "port" | "host">
14+
type ListenOptions = Pick<DefaultedArgs, "socket-mode" | "socket" | "port" | "host">
1515

1616
export interface App extends Disposable {
1717
/** Handles regular HTTP requests. */
@@ -22,7 +22,7 @@ export interface App extends Disposable {
2222
server: http.Server
2323
}
2424

25-
const listen = (server: http.Server, { host, port, socket }: ListenOptions) => {
25+
const listen = (server: http.Server, { host, port, socket, "socket-mode": mode }: ListenOptions) => {
2626
return new Promise<void>(async (resolve, reject) => {
2727
server.on("error", reject)
2828

@@ -31,7 +31,16 @@ const listen = (server: http.Server, { host, port, socket }: ListenOptions) => {
3131
server.off("error", reject)
3232
server.on("error", (err) => util.logError(logger, "http server error", err))
3333

34-
resolve()
34+
if (socket && mode) {
35+
fs.chmod(socket, mode)
36+
.then(resolve)
37+
.catch((err) => {
38+
util.logError(logger, "socket chmod", err)
39+
reject(err)
40+
})
41+
} else {
42+
resolve()
43+
}
3544
}
3645

3746
if (socket) {

src/node/cli.ts

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export interface UserProvidedArgs {
5656
open?: boolean
5757
"bind-addr"?: string
5858
socket?: string
59+
"socket-mode"?: string
5960
version?: boolean
6061
"proxy-domain"?: string[]
6162
"reuse-window"?: boolean
@@ -175,6 +176,7 @@ const options: Options<Required<UserProvidedArgs>> = {
175176
port: { type: "number", description: "" },
176177

177178
socket: { type: "string", path: true, description: "Path to a socket (bind-addr will be ignored)." },
179+
"socket-mode": { type: "string", description: "File mode of the socket." },
178180
version: { type: "boolean", short: "v", description: "Display version information." },
179181
_: { type: "string[]" },
180182

@@ -513,6 +515,7 @@ export async function setDefaults(cliArgs: UserProvidedArgs, configArgs?: Config
513515
args.host = "localhost"
514516
args.port = 0
515517
args.socket = undefined
518+
args["socket-mode"] = undefined
516519
args.cert = undefined
517520
args.auth = AuthType.None
518521
}

test/unit/node/app.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,18 @@ describe("createApp", () => {
107107
app.dispose()
108108
})
109109

110+
it("should change the file mode of a socket", async () => {
111+
const defaultArgs = await setDefaults({
112+
socket: tmpFilePath,
113+
"socket-mode": "777",
114+
})
115+
116+
const app = await createApp(defaultArgs)
117+
118+
expect((await promises.stat(tmpFilePath)).mode & 0o777).toBe(0o777)
119+
app.dispose()
120+
})
121+
110122
it("should create an https server if args.cert exists", async () => {
111123
const testCertificate = await generateCertificate("localhost")
112124
const cert = new OptionalString(testCertificate.cert)

test/unit/node/cli.test.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ describe("parser", () => {
7373

7474
"--socket=mumble",
7575

76+
"--socket-mode=777",
77+
7678
"3",
7779

7880
["--user-data-dir", "path/to/user/dir"],
@@ -110,6 +112,7 @@ describe("parser", () => {
110112
open: true,
111113
port: 8081,
112114
socket: path.resolve("mumble"),
115+
"socket-mode": "777",
113116
verbose: true,
114117
version: true,
115118
"bind-addr": "192.169.0.1:8080",
@@ -269,7 +272,9 @@ describe("parser", () => {
269272
})
270273

271274
it("should override with --link", async () => {
272-
const args = parse("--cert test --cert-key test --socket test --host 0.0.0.0 --port 8888 --link test".split(" "))
275+
const args = parse(
276+
"--cert test --cert-key test --socket test --socket-mode 777 --host 0.0.0.0 --port 8888 --link test".split(" "),
277+
)
273278
const defaultArgs = await setDefaults(args)
274279
expect(defaultArgs).toEqual({
275280
...defaults,
@@ -282,6 +287,7 @@ describe("parser", () => {
282287
cert: undefined,
283288
"cert-key": path.resolve("test"),
284289
socket: undefined,
290+
"socket-mode": undefined,
285291
})
286292
})
287293

0 commit comments

Comments
 (0)