carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1//go:build linux && rootrunner
2
3package release
4
5import (
6 "context"
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/carlosframework/platform/internal/rootstate"
12)
13
14func TestPlan14GenerationCompletenessCheckedRootStore(t *testing.T) {
15 if os.Geteuid() != 0 {
16 t.Fatal("designated runner must execute as root")
17 }
18 dir, err := os.MkdirTemp("/var/lib", "plan14-generation-certificate-")
19 if err != nil {
20 t.Fatal(err)
21 }
22 t.Cleanup(func() {
23 if err := os.RemoveAll(dir); err != nil {
24 t.Error(err)
25 }
26 })
27 state := filepath.Join(dir, "state")
28 disk, err := rootstate.Open(state, true, false)
29 if err != nil {
30 t.Fatal(err)
31 }
32 defer disk.Close()
33 g := &RootGenerations{Store: disk}
34 _, _, b := generationFixture(t)
35 if _, err := g.Reserve(b); err != nil {
36 t.Fatal(err)
37 }
38 records, err := g.Reservations(t.Context())
39 if err != nil {
40 t.Fatal(err)
41 }
42 verify := func(context.Context, []GenerationReservation) (GenerationEvidence, error) {
43 return generationEvidence(), nil
44 }
45 if _, err := g.Certify(t.Context(), records, verify); err != nil {
46 t.Fatal(err)
47 }
48 file := filepath.Join(state, generationCompletenessKey)
49 for _, mode := range []os.FileMode{0666, 0620} {
50 if err := os.Chmod(file, mode); err != nil {
51 t.Fatal(err)
52 }
53 if _, err := g.Completeness(); err == nil {
54 t.Fatal("accepted writable certificate")
55 }
56 if err := os.Chmod(file, 0600); err != nil {
57 t.Fatal(err)
58 }
59 }
60 if err := os.Chown(file, 65534, 65534); err != nil {
61 t.Fatal(err)
62 }
63 if _, err := g.Completeness(); err == nil {
64 t.Fatal("accepted service-owned certificate")
65 }
66 if err := os.Chown(file, 0, 0); err != nil {
67 t.Fatal(err)
68 }
69 saved := filepath.Join(state, "saved")
70 if err := os.Rename(file, saved); err != nil {
71 t.Fatal(err)
72 }
73 if err := os.Symlink(saved, file); err != nil {
74 t.Fatal(err)
75 }
76 if _, err := g.Completeness(); err == nil {
77 t.Fatal("accepted symlink certificate")
78 }
79 if err := os.Remove(file); err != nil {
80 t.Fatal(err)
81 }
82 if err := os.Rename(saved, file); err != nil {
83 t.Fatal(err)
84 }
85 if _, err := g.Certify(t.Context(), records, verify); err != nil {
86 t.Fatal(err)
87 }
88 if err := os.Rename(state, state+".retained"); err != nil {
89 t.Fatal(err)
90 }
91 if err := os.Mkdir(state, 0700); err != nil {
92 t.Fatal(err)
93 }
94 if _, err := g.Completeness(); err != nil {
95 t.Fatal("retained descriptor lost its checked store", err)
96 }
97 if _, err := os.Stat(filepath.Join(state, generationCompletenessKey)); !os.IsNotExist(err) {
98 t.Fatal("retained descriptor wrote to replacement directory", err)
99 }
100 replacement, err := rootstate.Open(state, false, false)
101 if err != nil {
102 t.Fatal(err)
103 }
104 defer replacement.Close()
105 if _, err := (&RootGenerations{Store: replacement}).Completeness(); !os.IsNotExist(err) {
106 t.Fatal("replacement directory inherited completeness", err)
107 }
108 if err := os.Chmod(state+".retained", 0777); err != nil {
109 t.Fatal(err)
110 }
111 if _, err := g.Completeness(); err == nil {
112 t.Fatal("accepted writable store directory")
113 }
114}
115