47 lines
1.6 KiB
Go
47 lines
1.6 KiB
Go
package engine
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func passwdRootfs(t *testing.T) string {
|
|
t.Helper()
|
|
rootfs := t.TempDir()
|
|
os.MkdirAll(filepath.Join(rootfs, "etc"), 0o755)
|
|
os.WriteFile(filepath.Join(rootfs, "etc", "passwd"), []byte("root:x:0:0:root:/root:/bin/sh\npostgres:x:999:999::/var/lib/postgresql:/bin/bash\n"), 0o644)
|
|
os.WriteFile(filepath.Join(rootfs, "etc", "group"), []byte("root:x:0:\npostgres:x:999:\nstaff:x:50:\n"), 0o644)
|
|
return rootfs
|
|
}
|
|
|
|
func TestLookupUser(t *testing.T) {
|
|
rootfs := passwdRootfs(t)
|
|
for spec, want := range map[string]User{
|
|
"postgres": {UID: 999, GID: 999, Home: "/var/lib/postgresql"},
|
|
"999": {UID: 999, GID: 999, Home: "/var/lib/postgresql"},
|
|
"postgres:staff": {UID: 999, GID: 50, Home: "/var/lib/postgresql"},
|
|
"postgres:50": {UID: 999, GID: 50, Home: "/var/lib/postgresql"},
|
|
"1000": {UID: 1000, GID: 1000},
|
|
"1000:1001": {UID: 1000, GID: 1001},
|
|
"root": {UID: 0, GID: 0, Home: "/root"},
|
|
} {
|
|
got, err := LookupUser(rootfs, spec)
|
|
if err != nil || got != want {
|
|
t.Errorf("%q: got %+v, %v; want %+v", spec, got, err, want)
|
|
}
|
|
}
|
|
for _, spec := range []string{"nobody", "postgres:nogroup", "", ":staff", "-1"} {
|
|
if _, err := LookupUser(rootfs, spec); err == nil {
|
|
t.Errorf("%q: accepted", spec)
|
|
}
|
|
}
|
|
if _, err := LookupUser(t.TempDir(), "postgres"); err == nil || !strings.Contains(err.Error(), "passwd") {
|
|
t.Errorf("no passwd file: got %v", err)
|
|
}
|
|
if got, err := LookupUser(t.TempDir(), "70"); err != nil || got != (User{UID: 70, GID: 70}) {
|
|
t.Errorf("numeric without passwd: got %+v, %v", got, err)
|
|
}
|
|
}
|