carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package host
2
3import (
4 "context"
5 "encoding/json"
6 "strings"
7
8 "github.com/carlosframework/platform/internal/hostactors"
9 "github.com/carlosframework/platform/internal/hostbox"
10 "github.com/carlosframework/platform/internal/hostevidence"
11 "github.com/carlosframework/platform/internal/release"
12)
13
14func readMigrationStop(ctx context.Context, store release.Store, directory hostactors.Directory, launches *hostbox.LaunchJournal, inventory *hostbox.StopInventoryDB, launch hostbox.LaunchInventory) (StopResult, error) {
15 target := launch.Target
16 in, err := inventory.ReadExactStopInventory(ctx, target)
17 if err != nil {
18 return StopResult{}, err
19 }
20 journal, err := launches.ReadStopKernelJournal(ctx, target)
21 if err != nil {
22 return StopResult{}, err
23 }
24 if err := legacyJournalProof(store, directory)(ctx, launch, in, journal); err != nil {
25 return StopResult{}, err
26 }
27 roster, err := directory.Read(ctx)
28 if err != nil {
29 return StopResult{}, err
30 }
31 actor, ok := roster.Roster.Boxes[target.Box]
32 if !ok || actor.Enrollment != target.Enrollment {
33 return StopResult{}, hostbox.ErrLegacyJournalProof
34 }
35 prefix := strings.TrimSuffix(stopEvidenceKey(target.Host, target.Op, target.Box, ""), ".json")
36 keys, err := store.List(ctx, prefix)
37 if err != nil {
38 return StopResult{}, err
39 }
40 wanted := StopReceipt{Host: target.Host, Incarnation: target.Incarnation, InstallationStamp: target.Stamp, WriterSession: target.Session, Box: target.Box, Enrollment: target.Enrollment, BootID: target.BootID, ControllerID: target.ControllerID, OperationID: target.Op, Region: target.Region, Binding: in.DirectoryRevision, InventorySHA256: digestStop(in), LocalJournalSHA256: digestStop(journal)}
41 for _, key := range keys {
42 if !strings.HasPrefix(key, prefix) || !strings.HasSuffix(key, ".json") {
43 continue
44 }
45 raw, _, err := store.Get(ctx, key)
46 if err != nil {
47 return StopResult{}, err
48 }
49 signature, _, err := store.Get(ctx, key+".sig")
50 if err != nil {
51 continue
52 }
53 if hostevidence.Verify(actor.CensusPublicKey, key, raw, signature) != nil {
54 continue
55 }
56 var p StopReceipt
57 if json.Unmarshal(raw, &p) != nil || p.V != 1 || p.Kind != "stopped" || p.ID == "" || p.FenceID == "" || p.ClaimGen == 0 || p.ObservedBootID == "" || p.EvidenceAt.IsZero() || len(p.CgroupIdentities) == 0 || p.RequestLimitNS != int64(hostbox.RequestLimit) || key != prefix+p.ID+".json" || legacyJournalProofMatch(p) != legacyJournalProofMatch(wanted) || p.Phase != target.Phase || p.ObligationID != target.ObligationID {
58 continue
59 }
60 numeral, ok := receiptRosterRevision(p.DirectoryRevision)
61 if !ok {
62 continue
63 }
64 target.FenceID, target.ClaimGen, target.ClaimETag, target.RosterRevision = p.FenceID, p.ClaimGen, p.ClaimETag, numeral
65 return StopResult{Target: target, Key: key, Digest: digestRawStop(raw), Bytes: raw, EvidenceAt: p.EvidenceAt}, nil
66 }
67 return StopResult{}, hostbox.ErrLegacyJournalProof
68}
69