package layout import ( "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/provision" "os" "path/filepath" ) func InstanceCensusName(rel string) (string, bool) { parent := filepath.Dir(rel) if parent != "instances" && parent != ".instances" { return "", false } name := filepath.Base(rel) if rel != filepath.Join(parent, name) || name == "." || name == ".." { return "", false } return name, true } func VerifyInstanceCensusAlias(root, alias, host string) error { public := filepath.Join("instances", provision.InstanceID(host)) if alias != filepath.Join(".instances", provision.InstanceID(host)) { return os.ErrPermission } a, err := hostbox.CaptureInventoryIdentity(root, alias) if err != nil { return err } b, err := hostbox.CaptureInventoryIdentity(root, public) if err != nil { return err } ar, err := filepath.Rel(a.MountPoint, filepath.Join(root, alias)) if err != nil || !filepath.IsLocal(ar) { return os.ErrPermission } br, err := filepath.Rel(b.MountPoint, filepath.Join(root, public)) if err != nil || !filepath.IsLocal(br) { return os.ErrPermission } if !a.SameMountNamespace(b) || a.Device != b.Device || filepath.Join(a.MountRoot, ar) != filepath.Join(b.MountRoot, br) { return os.ErrPermission } b.MountRoot, b.MountPoint, b.Mount, b.MountLineage = a.MountRoot, a.MountPoint, a.Mount, a.MountLineage b.MountUnique = a.MountUnique if !a.Same(b) { return os.ErrPermission } return nil }