bastion 0.53.2
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
//go:build !windows
|
||||
|
||||
package main
|
||||
|
||||
// Tagged !windows for the reason singleton_test.go states: syscall.Umask does
|
||||
// not exist on that target. The rest of the machine store's tests are portable
|
||||
// and stay in machinestore_test.go.
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// A day-file that ALREADY EXISTS with a loose mode is tightened before the
|
||||
// machine's findings are appended to it.
|
||||
//
|
||||
// THIS IS THE TEST THE FIRST VERSION GOT WRONG, and the mutation sweep is what
|
||||
// said so. That version set the umask to 0 and asserted 0600 — but a umask only
|
||||
// ever clears bits, so an O_CREATE of 0600 comes out 0600 under every umask
|
||||
// there is, and deleting the chmod under test left it green. What the chmod
|
||||
// really guards is the file it did NOT create: O_APPEND|O_CREATE does not touch
|
||||
// the mode of an existing file, so a day-file restored from a backup or copied
|
||||
// in with `cp -p` keeps whatever mode it arrived with while this process writes
|
||||
// the machine's findings into it.
|
||||
//
|
||||
// The umask is still set to 0, for a different and now-honest reason: it proves
|
||||
// the 0644 below is the mode the file really has rather than one the umask
|
||||
// happened to allow.
|
||||
func TestAnExistingLooseDayFileIsTightenedBeforeItIsAppendedTo(t *testing.T) {
|
||||
isolateConfigDir(t)
|
||||
old := syscall.Umask(0)
|
||||
defer syscall.Umask(old)
|
||||
|
||||
at := time.Date(2026, 9, 19, 10, 0, 0, 0, time.UTC)
|
||||
p, err := storeDayPath(storeFindings, at)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Arrives world-readable, the way a restored or copied file does.
|
||||
if err := os.WriteFile(p, []byte("{}\n"), 0o644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if fi, err := os.Stat(p); err != nil || fi.Mode().Perm() != 0o644 {
|
||||
t.Fatalf("the fixture is not loose to begin with, so this test cannot fail: %v %v", fi, err)
|
||||
}
|
||||
|
||||
if _, err := storeRecordPass(storeReport("base-a", storeFinding("aaa", deltaHigh)), at); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fi, err := os.Stat(p)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if fi.Mode().Perm() != 0o600 {
|
||||
t.Fatalf("journal file is %v, want 0600 — the machine's own record stayed world-readable", fi.Mode().Perm())
|
||||
}
|
||||
}
|
||||
|
||||
// The writer's own state file is bookkeeping the host must not be able to
|
||||
// reach: a file the host could write is a file that could suppress a finding by
|
||||
// pre-declaring it open.
|
||||
func TestTheWritersStateFileIsOwnerOnly(t *testing.T) {
|
||||
isolateConfigDir(t)
|
||||
old := syscall.Umask(0)
|
||||
defer syscall.Umask(old)
|
||||
|
||||
at := time.Date(2026, 9, 19, 10, 0, 0, 0, time.UTC)
|
||||
sp, err := storeStatePath()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := os.MkdirAll(filepath.Dir(sp), 0o700); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := os.WriteFile(sp, []byte("{}"), 0o644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := storeRecordPass(storeReport("base-a", storeFinding("aaa", deltaHigh)), at); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fi, err := os.Stat(sp)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if fi.Mode().Perm() != 0o600 {
|
||||
t.Fatalf("store state is %v, want 0600", fi.Mode().Perm())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user