package host import ( "context" "errors" "os" "github.com/carlosframework/platform/internal/moves" "github.com/carlosframework/platform/internal/release" "github.com/carlosframework/platform/internal/seeds" ) type rootSeedsPublication struct { Schema int Deployment, Purpose string Floor moves.Floor } func verifyRootSeedsPublication(raw []byte, id rootFloorIdentity) (*moves.Floor, error) { pub, err := release.ParsePublicKey(os.Getenv("CARLOS_RELEASE_PUBKEY"), "CARLOS_RELEASE_PUBKEY") if err != nil { return nil, err } var p rootSeedsPublication if release.VerifyRootEnvelope(pub, raw, &p) != nil || p.Schema != 1 || p.Deployment != id.Deployment || p.Purpose != seeds.FloorKey || !validRootFloor(&p.Floor) { return nil, errRootFloorHistory } return &p.Floor, nil } func readRootSeedsBound(opt string, id rootFloorIdentity) (*moves.Floor, error) { f, err := openRootProtocolFloors(rootSeedsFloorDir(opt), id, false) if errors.Is(err, os.ErrNotExist) { return nil, nil } if err != nil { return nil, err } defer f.close() raw, err := f.public.Read("publication.json") if errors.Is(err, os.ErrNotExist) { return nil, nil } if err != nil { return nil, err } published, err := verifyRootSeedsPublication(raw, id) if err != nil { return nil, err } bound, err := f.localBound() if err != nil { return nil, err } capped, err := f.capLegacy([]*moves.Floor{bound}) if len(capped) > 0 { published = floorMaximum(published, capped[0]) } return published, err } func acceptRootSeedsPublication(ctx context.Context, f rootMovesFloors, raw []byte) error { bound, err := verifyRootSeedsPublication(raw, f.identity) if err != nil { return err } unlock, err := f.private.Lock(ctx, "floor.lock") if err != nil { return err } defer unlock() previous, e := f.public.Read("publication.json") if e == nil { old, e := verifyRootSeedsPublication(previous, f.identity) if e != nil { return e } if floorRegression(old, bound) != nil { return errRootFloorHistory } } else if !errors.Is(e, os.ErrNotExist) { return e } return f.public.Write("publication.json", raw) }