diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 548d5bc6..00e64ebf 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -100,7 +100,13 @@ func (overlay Overlay) Exists() bool { // Returns: // - true if the overlay is a site overlay; false otherwise. func (overlay Overlay) IsSiteOverlay() bool { - return strings.Contains(overlay.Path(), config.Get().Paths.SiteOverlaydir()) + siteDir := filepath.Clean(config.Get().Paths.SiteOverlaydir()) + overlayPath := filepath.Clean(overlay.Path()) + if rel, err := filepath.Rel(siteDir, overlayPath); err != nil { + return false + } else { + return !strings.HasPrefix(rel, "..") + } } // IsDistributionOverlay determines whether the overlay is a distribution overlay. @@ -111,7 +117,13 @@ func (overlay Overlay) IsSiteOverlay() bool { // Returns: // - true if the overlay is a distribution overlay; false otherwise. func (overlay Overlay) IsDistributionOverlay() bool { - return strings.Contains(overlay.Path(), config.Get().Paths.DistributionOverlaydir()) + siteDir := filepath.Clean(config.Get().Paths.DistributionOverlaydir()) + overlayPath := filepath.Clean(overlay.Path()) + if rel, err := filepath.Rel(siteDir, overlayPath); err != nil { + return false + } else { + return !strings.HasPrefix(rel, "..") + } } func (overlay Overlay) AddFile(filePath string, content []byte, parents bool, force bool) error { diff --git a/internal/pkg/warewulfd/api/overlay.go b/internal/pkg/warewulfd/api/overlay.go index 9140c6ac..44d3cbd6 100644 --- a/internal/pkg/warewulfd/api/overlay.go +++ b/internal/pkg/warewulfd/api/overlay.go @@ -82,13 +82,19 @@ type OverlayFile struct { } func (of *OverlayFile) FullPath() string { - myOverlay, _ := overlay.GetOverlay(of.Overlay) - return myOverlay.File(of.Path) + if myOverlay, err := overlay.GetOverlay(of.Overlay); err != nil { + return "" + } else { + return myOverlay.File(of.Path) + } } func (of *OverlayFile) Exists() bool { - myOverlay, _ := overlay.GetOverlay(of.Overlay) - return myOverlay.Exists() && util.IsFile(of.FullPath()) + if myOverlay, err := overlay.GetOverlay(of.Overlay); err != nil { + return false + } else { + return myOverlay.Exists() && util.IsFile(of.FullPath()) + } } func (of *OverlayFile) readContents() (string, error) { @@ -231,7 +237,10 @@ func deleteOverlay() usecase.Interactor { u := usecase.NewInteractor(func(ctx context.Context, input deleteOverlayInput, output *OverlayResponse) error { wwlog.Debug("api.deleteOverlay(Name:%v, Force:%v)", input.Name, input.Force) - overlay_, _ := overlay.GetOverlay(input.Name) + overlay_, err := overlay.GetOverlay(input.Name) + if err != nil { + return err + } isSiteOverlay := overlay_.IsSiteOverlay() if !input.Force { if registry, err := node.New(); err != nil { @@ -276,10 +285,12 @@ func deleteOverlayFile() usecase.Interactor { if relPath, err := url.QueryUnescape(input.Path); err != nil { return fmt.Errorf("failed to decode path: %v: %w", input.Path, err) } else { - overlay_, _ := overlay.GetOverlay(input.Name) - err := overlay_.DeleteFile(relPath, input.Force, input.Cleanup) - if err != nil { - return fmt.Errorf("unable to delete overlay file %v: %v: %w", input.Name, relPath, err) + if overlay_, err := overlay.GetOverlay(input.Name); err != nil { + return err + } else { + if err := overlay_.DeleteFile(relPath, input.Force, input.Cleanup); err != nil { + return fmt.Errorf("unable to delete overlay file %v: %v: %w", input.Name, relPath, err) + } } } *output = *NewOverlayResponse(input.Name) diff --git a/internal/pkg/warewulfd/util.go b/internal/pkg/warewulfd/util.go index 0e8b944c..48f6b1c9 100644 --- a/internal/pkg/warewulfd/util.go +++ b/internal/pkg/warewulfd/util.go @@ -52,8 +52,9 @@ func getOverlayFile(n node.Node, context string, stage_overlays []string, autobu build = util.PathIsNewer(stage_file, config.Get().Paths.NodesConf()) for _, overlayname := range stage_overlays { - myOverlay, _ := overlay.GetOverlay(overlayname) - build = build || util.PathIsNewer(stage_file, myOverlay.Rootfs()) + if myOverlay, err := overlay.GetOverlay(overlayname); err == nil { + build = build || util.PathIsNewer(stage_file, myOverlay.Rootfs()) + } } }