//go:build linux && rootrunner package release import ( "context" "os" "path/filepath" "testing" "github.com/carlosframework/platform/internal/rootstate" ) func TestPlan14GenerationCompletenessCheckedRootStore(t *testing.T) { if os.Geteuid() != 0 { t.Fatal("designated runner must execute as root") } dir, err := os.MkdirTemp("/var/lib", "plan14-generation-certificate-") if err != nil { t.Fatal(err) } t.Cleanup(func() { if err := os.RemoveAll(dir); err != nil { t.Error(err) } }) state := filepath.Join(dir, "state") disk, err := rootstate.Open(state, true, false) if err != nil { t.Fatal(err) } defer disk.Close() g := &RootGenerations{Store: disk} _, _, b := generationFixture(t) if _, err := g.Reserve(b); err != nil { t.Fatal(err) } records, err := g.Reservations(t.Context()) if err != nil { t.Fatal(err) } verify := func(context.Context, []GenerationReservation) (GenerationEvidence, error) { return generationEvidence(), nil } if _, err := g.Certify(t.Context(), records, verify); err != nil { t.Fatal(err) } file := filepath.Join(state, generationCompletenessKey) for _, mode := range []os.FileMode{0666, 0620} { if err := os.Chmod(file, mode); err != nil { t.Fatal(err) } if _, err := g.Completeness(); err == nil { t.Fatal("accepted writable certificate") } if err := os.Chmod(file, 0600); err != nil { t.Fatal(err) } } if err := os.Chown(file, 65534, 65534); err != nil { t.Fatal(err) } if _, err := g.Completeness(); err == nil { t.Fatal("accepted service-owned certificate") } if err := os.Chown(file, 0, 0); err != nil { t.Fatal(err) } saved := filepath.Join(state, "saved") if err := os.Rename(file, saved); err != nil { t.Fatal(err) } if err := os.Symlink(saved, file); err != nil { t.Fatal(err) } if _, err := g.Completeness(); err == nil { t.Fatal("accepted symlink certificate") } if err := os.Remove(file); err != nil { t.Fatal(err) } if err := os.Rename(saved, file); err != nil { t.Fatal(err) } if _, err := g.Certify(t.Context(), records, verify); err != nil { t.Fatal(err) } if err := os.Rename(state, state+".retained"); err != nil { t.Fatal(err) } if err := os.Mkdir(state, 0700); err != nil { t.Fatal(err) } if _, err := g.Completeness(); err != nil { t.Fatal("retained descriptor lost its checked store", err) } if _, err := os.Stat(filepath.Join(state, generationCompletenessKey)); !os.IsNotExist(err) { t.Fatal("retained descriptor wrote to replacement directory", err) } replacement, err := rootstate.Open(state, false, false) if err != nil { t.Fatal(err) } defer replacement.Close() if _, err := (&RootGenerations{Store: replacement}).Completeness(); !os.IsNotExist(err) { t.Fatal("replacement directory inherited completeness", err) } if err := os.Chmod(state+".retained", 0777); err != nil { t.Fatal(err) } if _, err := g.Completeness(); err == nil { t.Fatal("accepted writable store directory") } }