package host import ( "errors" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/registry" "os" "strings" ) func (h ClaimRootHTTP) verifyInventoryTimer(host string, owner registry.ClaimOwnership, e hostbox.StopInventoryEntry) error { if h.Reconcile.Registry == nil || e.Kind != "timer" || e.ManagedRoot != "registry" || !strings.HasPrefix(e.RelativePath, host+"/") || e.RowIdentity == "" || e.Ownership != owner.ClaimOwner || e.Device != 0 || e.Inode != 0 || e.Type != 0 { return hostbox.ErrTypedInventory } name := strings.TrimPrefix(e.RelativePath, host+"/") if name == "" || strings.ContainsAny(name, "/\\") || name == "." || name == ".." { return hostbox.ErrTypedInventory } timer, err := h.Reconcile.Registry.GetTimer(host, name) if err != nil && !errors.Is(err, os.ErrNotExist) { return err } if timer == nil { if e.Materialization != "intended" && !e.TimerRetired { return hostbox.ErrTypedInventory } return nil } if e.TimerRetired || (e.Materialization != "intended" && e.Materialization != "materialized") || timer.Host != host || timer.Name != name || timer.ClaimIncarnation != owner.ClaimIncarnation || timer.ClaimStamp != owner.ClaimStamp || timer.ClaimOwner != e.Ownership || timer.ClaimRowID != e.RowIdentity || timer.Registration != e.RowIdentity { return hostbox.ErrTypedInventory } return nil } func (h ClaimRootHTTP) verifyNewTimerIntentions(prior, next hostbox.StopInventory) error { for _, e := range next.Entries { if e.TimerRetired && e.Kind != "timer" { return hostbox.ErrTypedInventory } if e.Kind != "timer" { continue } known := false for _, old := range prior.Entries { if old.Kind == "timer" && old.ArtifactID == e.ArtifactID { known = true break } } if known { continue } if e.Materialization != "intended" || e.TimerRetired { return hostbox.ErrTypedInventory } row, err := h.Reconcile.Registry.GetTimer(next.Host, strings.TrimPrefix(e.RelativePath, next.Host+"/")) if err != nil && !errors.Is(err, os.ErrNotExist) { return err } if row != nil { return hostbox.ErrTypedInventory } } return nil }