mirror of
https://github.com/caddyserver/caddy.git
synced 2025-10-19 07:43:17 +00:00
core: Add optional unix socket file permissions (#4741)
* core: Add optional unix socket file permissions
This commit also changes the default unix socket file permissions to `u=w,g=,o=` (octal: `0200`).
It used to default to the shell's umask (usually `u=rwx,g=rx,o=rx`, octal: `0755`).
`/run/caddy.sock` -> `/run/caddy.sock` with `0200` default perms
`/run/caddy.sock|0222` -> `/run/caddy.sock` with `0222` perms
`|` instead of `:` is used as a separator, to account for the `:` in Windows drive letters (e.g. `C:\absolute\path.sock`)
Fun fact:
The old unix(7) man page (pre Jun 2016) stated a socket needs both read and write perms.
Turns out, only write perms are needed.
Corrected in 7578ea2f85
Despite this, most implementations still default to read+write to this date.
* Add cases with Windows paths to test
* Require write perms for the owning user
This commit is contained in:
parent
7a69ae7571
commit
22927e278d
2 changed files with 156 additions and 3 deletions
|
@ -555,3 +555,98 @@ func TestExpand(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitUnixSocketPermissionsBits(t *testing.T) {
|
||||
for i, tc := range []struct {
|
||||
input string
|
||||
expectNetwork string
|
||||
expectPath string
|
||||
expectFileMode string
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
input: "./foo.socket",
|
||||
expectPath: "./foo.socket",
|
||||
expectFileMode: "--w-------",
|
||||
},
|
||||
{
|
||||
input: `.\relative\path.socket`,
|
||||
expectPath: `.\relative\path.socket`,
|
||||
expectFileMode: "--w-------",
|
||||
},
|
||||
{
|
||||
// literal colon in resulting address
|
||||
// and defaulting to 0200 bits
|
||||
input: "./foo.socket:0666",
|
||||
expectPath: "./foo.socket:0666",
|
||||
expectFileMode: "--w-------",
|
||||
},
|
||||
{
|
||||
input: "./foo.socket|0220",
|
||||
expectPath: "./foo.socket",
|
||||
expectFileMode: "--w--w----",
|
||||
},
|
||||
{
|
||||
input: "/var/run/foo|222",
|
||||
expectPath: "/var/run/foo",
|
||||
expectFileMode: "--w--w--w-",
|
||||
},
|
||||
{
|
||||
input: "./foo.socket|0660",
|
||||
expectPath: "./foo.socket",
|
||||
expectFileMode: "-rw-rw----",
|
||||
},
|
||||
{
|
||||
input: "./foo.socket|0666",
|
||||
expectPath: "./foo.socket",
|
||||
expectFileMode: "-rw-rw-rw-",
|
||||
},
|
||||
{
|
||||
input: "/var/run/foo|666",
|
||||
expectPath: "/var/run/foo",
|
||||
expectFileMode: "-rw-rw-rw-",
|
||||
},
|
||||
{
|
||||
input: `c:\absolute\path.socket|220`,
|
||||
expectPath: `c:\absolute\path.socket`,
|
||||
expectFileMode: "--w--w----",
|
||||
},
|
||||
{
|
||||
// symbolic permission representation is not supported for now
|
||||
input: "./foo.socket|u=rw,g=rw,o=rw",
|
||||
expectErr: true,
|
||||
},
|
||||
{
|
||||
// octal (base-8) permission representation has to be between
|
||||
// `0` for no read, no write, no exec (`---`) and
|
||||
// `7` for read (4), write (2), exec (1) (`rwx` => `4+2+1 = 7`)
|
||||
input: "./foo.socket|888",
|
||||
expectErr: true,
|
||||
},
|
||||
{
|
||||
// too many colons in address
|
||||
input: "./foo.socket|123456|0660",
|
||||
expectErr: true,
|
||||
},
|
||||
{
|
||||
// owner is missing write perms
|
||||
input: "./foo.socket|0522",
|
||||
expectErr: true,
|
||||
},
|
||||
} {
|
||||
actualPath, actualFileMode, err := splitUnixSocketPermissionsBits(tc.input)
|
||||
if tc.expectErr && err == nil {
|
||||
t.Errorf("Test %d: Expected error but got: %v", i, err)
|
||||
}
|
||||
if !tc.expectErr && err != nil {
|
||||
t.Errorf("Test %d: Expected no error but got: %v", i, err)
|
||||
}
|
||||
if actualPath != tc.expectPath {
|
||||
t.Errorf("Test %d: Expected path '%s' but got '%s'", i, tc.expectPath, actualPath)
|
||||
}
|
||||
// fileMode.Perm().String() parses 0 to "----------"
|
||||
if !tc.expectErr && actualFileMode.Perm().String() != tc.expectFileMode {
|
||||
t.Errorf("Test %d: Expected perms '%s' but got '%s'", i, tc.expectFileMode, actualFileMode.Perm().String())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue