Files
notarius/internal/framework/checkpoint/filesystem_permissions_unix_test.go

99 lines
2.5 KiB
Go

//go:build linux || darwin
package checkpoint
import (
"os"
"path/filepath"
"syscall"
"testing"
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
)
func TestFilesystemCheckpointPermissionsFollowUmask(t *testing.T) {
for _, test := range []struct {
name string
umask int
dirMode os.FileMode
fileMode os.FileMode
}{
{name: "private", umask: 0o077, dirMode: 0o700, fileMode: 0o600},
{name: "group", umask: 0o007, dirMode: 0o770, fileMode: 0o660},
} {
t.Run(test.name, func(t *testing.T) {
previousUmask := syscall.Umask(test.umask)
defer syscall.Umask(previousUmask)
root := filepath.Join(t.TempDir(), "checkpoints")
identity, err := NewIdentity(representativeIdentityInput())
if err != nil {
t.Fatal(err)
}
recorder, err := NewFilesystemRecorder(root, identity)
if err != nil {
t.Fatal(err)
}
if err := recorder.SourceSucceeded("source-module", sourceDocumentForPermissions()); err != nil {
t.Fatal(err)
}
relative, err := identity.RelativePath()
if err != nil {
t.Fatal(err)
}
identityRoot := filepath.Join(root, filepath.FromSlash(relative))
sourceRoot := filepath.Join(identityRoot, "source")
for path, want := range map[string]os.FileMode{
root: test.dirMode,
identityRoot: test.dirMode,
sourceRoot: test.dirMode,
filepath.Join(sourceRoot, "manifest.json"): test.fileMode,
filepath.Join(sourceRoot, "source-document.json"): test.fileMode,
} {
assertCheckpointPermissions(t, path, want)
}
})
}
}
func TestFilesystemCheckpointLeavesExistingRootUntouched(t *testing.T) {
previousUmask := syscall.Umask(0o077)
defer syscall.Umask(previousUmask)
root := filepath.Join(t.TempDir(), "checkpoints")
syscall.Umask(0)
if err := os.Mkdir(root, 0o751); err != nil {
t.Fatal(err)
}
syscall.Umask(0o077)
identity, err := NewIdentity(representativeIdentityInput())
if err != nil {
t.Fatal(err)
}
recorder, err := NewFilesystemRecorder(root, identity)
if err != nil {
t.Fatal(err)
}
if err := recorder.SourceSucceeded("source-module", sourceDocumentForPermissions()); err != nil {
t.Fatal(err)
}
assertCheckpointPermissions(t, root, 0o751)
}
func sourceDocumentForPermissions() *source.SourceDocument {
document := checkpointDocument()
return &document
}
func assertCheckpointPermissions(t *testing.T, path string, want os.FileMode) {
t.Helper()
info, err := os.Stat(path)
if err != nil {
t.Fatal(err)
}
if got := info.Mode().Perm(); got != want {
t.Fatalf("%s mode = %#o, want %#o", path, got, want)
}
}