carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package hostactors
2
3import (
4 "context"
5 "encoding/json"
6 "strings"
7 "testing"
8 "time"
9
10 "github.com/carlosframework/platform/internal/release"
11)
12
13func TestPlan11EnrollmentTimestampSignedImmutable(t *testing.T) {
14 t.Setenv("CARLOS_HOST_CLAIM", "1")
15 ctx := context.Background()
16 d, sg, before := fixture(t)
17 next := Clone(before.Roster)
18 b := next.Boxes["box"]
19 b.BoxID = "second"
20 b.Enrollment = strings.Repeat("c", 32)
21 b.Cloud.InstanceID = "i-second"
22 next.Boxes["second"] = b
23 next.Consoles["console"] = Console{Enrollment: strings.Repeat("d", 32), InstanceID: "console", Namespaces: []string{"platform"}, DeploymentBucket: d.Bucket}
24 started := time.Now().UTC()
25 got, err := d.Replace(ctx, sg, before, next)
26 if err != nil {
27 t.Fatal(err)
28 }
29 if got.Roster.Boxes["second"].EnrolledAt.Before(started) || got.Roster.Boxes["second"].EnrolledAt.After(time.Now()) {
30 t.Fatal("new box has no authoritative enrollment time")
31 }
32 if got.Roster.Consoles["console"].EnrolledAt.IsZero() {
33 t.Fatal("console missing enrollment time")
34 }
35 read, err := d.Read(ctx)
36 if err != nil {
37 t.Fatal(err)
38 }
39 if !read.Roster.Boxes["second"].EnrolledAt.Equal(got.Roster.Boxes["second"].EnrolledAt) {
40 t.Fatal("timestamp not signed and round-tripped")
41 }
42 for _, which := range []string{"box-change", "box-erase", "console-change", "legacy-backfill"} {
43 n := Clone(got.Roster)
44 switch which {
45 case "box-change":
46 b := n.Boxes["second"]
47 b.EnrolledAt = b.EnrolledAt.Add(time.Second)
48 n.Boxes["second"] = b
49 case "box-erase":
50 b := n.Boxes["second"]
51 b.EnrolledAt = time.Time{}
52 n.Boxes["second"] = b
53 case "console-change":
54 c := n.Consoles["console"]
55 c.EnrolledAt = c.EnrolledAt.Add(time.Second)
56 n.Consoles["console"] = c
57 case "legacy-backfill":
58 b := n.Boxes["box"]
59 b.EnrolledAt = time.Now()
60 n.Boxes["box"] = b
61 }
62 if _, err := d.Replace(ctx, sg, got, n); err == nil {
63 t.Fatal("changed immutable timestamp", which)
64 }
65 }
66 retry, err := d.Replace(ctx, sg, got, Clone(got.Roster))
67 if err != nil {
68 t.Fatal(err)
69 }
70 if !retry.Roster.Boxes["second"].EnrolledAt.Equal(got.Roster.Boxes["second"].EnrolledAt) {
71 t.Fatal("retry reset timestamp")
72 }
73}
74
75func TestPlan11LegacyRosterBytesAndForgedTimestamp(t *testing.T) {
76 ctx := context.Background()
77 d, sg, o := fixture(t)
78 old, _, err := d.Store.Get(ctx, Key)
79 if err != nil {
80 t.Fatal(err)
81 }
82 raw, err := release.SignRootEnvelope(sg, o.Roster)
83 if err != nil {
84 t.Fatal(err)
85 }
86 if string(raw) != string(old) {
87 t.Fatal("legacy signature bytes changed")
88 }
89 payload, _ := json.Marshal(o.Roster)
90 if strings.Contains(string(payload), "enrolled_at") {
91 t.Fatal("zero field changed legacy shape")
92 }
93 next := Clone(o.Roster)
94 b := next.Boxes["box"]
95 b.BoxID = "new"
96 b.Enrollment = strings.Repeat("e", 32)
97 b.Cloud.InstanceID = "i-new"
98 b.EnrolledAt = time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
99 next.Boxes["new"] = b
100 if _, err := d.Replace(ctx, sg, o, next); err == nil {
101 t.Fatal("caller supplied enrollment time")
102 }
103 // A signed unknown nested field still fails the exact roster decoder.
104 var generic map[string]any
105 _ = json.Unmarshal(payload, &generic)
106 generic["boxes"].(map[string]any)["box"].(map[string]any)["enrolled_at_extra"] = "2026-10-09T00:00:00Z"
107 forged, _ := release.SignRootEnvelope(sg, generic)
108 if _, err := d.Store.Put(ctx, Key, forged, o.ETag); err != nil {
109 t.Fatal(err)
110 }
111 if _, err := d.Read(ctx); err == nil {
112 t.Fatal("unknown roster field accepted")
113 }
114}
115