package hostactors import ( "context" "github.com/carlosframework/platform/internal/hostfloor" "reflect" "time" ) func (d Directory) checkMembership(ctx context.Context, old, next Roster) error { if old.Publication == "" { return nil } if next.FloorSHA256 != old.FloorSHA256 || next.Publication == "" { return ErrRoster } changed := !reflect.DeepEqual(old.Boxes, next.Boxes) || !reflect.DeepEqual(old.Consoles, next.Consoles) || !reflect.DeepEqual(old.Regions, next.Regions) if old.Publication == "preparing" { if changed { return ErrRoster } return nil } if old.Publication != "published" || next.Publication != "published" { return ErrRoster } if !changed { return nil } f, err := hostfloor.Read(ctx, d.Store, d.PublicKey, d.Bucket) if err != nil || f.Digest != old.FloorSHA256 { return ErrRoster } e := ExactEvidence{PublicKey: d.PublicKey, Store: d.Store, Boxes: d.PrivateBoxReport} for ref, b := range next.Boxes { previous, exists := old.Boxes[ref] if exists && !(previous.State != "active" && b.State == "active") { continue } report, err := d.PrivateBoxReport(ctx, ref, b) if err != nil { return err } if err = VerifyReport(ctx, e, d.PublicKey, f, report, b.Enrollment, b.Cloud.InstanceID, time.Now()); err != nil { return err } } for id, c := range next.Consoles { if previous, exists := old.Consoles[id]; exists && reflect.DeepEqual(previous, c) { continue } report, err := e.ConsoleReport(ctx, id, c) if err != nil { return err } if _, err := verifyCompute(ctx, Observed{Roster: next}, e, id, c, report); err != nil { return err } if err = VerifyReport(ctx, e, d.PublicKey, f, report, c.Enrollment, id, time.Now()); err != nil { return err } } return nil }