mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-02-13 23:45:08 -05:00
Fix #1169: Add robust handling for paths and symlinks in GetAbsolutePath
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/danielmiessler/fabric/common"
|
||||
"github.com/danielmiessler/fabric/plugins/template"
|
||||
)
|
||||
|
||||
@@ -33,8 +34,16 @@ func (o *PatternsEntity) GetApplyVariables(
|
||||
strings.HasPrefix(source, ".")
|
||||
|
||||
if isFilePath {
|
||||
pattern, err = o.getFromFile(source)
|
||||
// Resolve the file path using GetAbsolutePath
|
||||
absPath, err := common.GetAbsolutePath(source)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not resolve file path: %v", err)
|
||||
}
|
||||
|
||||
// Use the resolved absolute path to get the pattern
|
||||
pattern, err = o.getFromFile(absPath)
|
||||
} else {
|
||||
// Otherwise, get the pattern from the database
|
||||
pattern, err = o.getFromDB(source)
|
||||
}
|
||||
|
||||
@@ -42,10 +51,12 @@ func (o *PatternsEntity) GetApplyVariables(
|
||||
return
|
||||
}
|
||||
|
||||
// Apply variables to the pattern
|
||||
err = o.applyVariables(pattern, variables, input)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
func (o *PatternsEntity) applyVariables(
|
||||
pattern *Pattern, variables map[string]string, input string) (err error) {
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/samber/lo"
|
||||
"github.com/danielmiessler/fabric/common"
|
||||
)
|
||||
|
||||
type StorageEntity struct {
|
||||
@@ -26,39 +26,48 @@ func (o *StorageEntity) Configure() (err error) {
|
||||
|
||||
// GetNames finds all patterns in the patterns directory and enters the id, name, and pattern into a slice of Entry structs. it returns these entries or an error
|
||||
func (o *StorageEntity) GetNames() (ret []string, err error) {
|
||||
var entries []os.DirEntry
|
||||
if entries, err = os.ReadDir(o.Dir); err != nil {
|
||||
err = fmt.Errorf("could not read items from directory: %v", err)
|
||||
return
|
||||
// Resolve the directory path to an absolute path
|
||||
absDir, err := common.GetAbsolutePath(o.Dir)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not resolve directory path: %v", err)
|
||||
}
|
||||
|
||||
if o.ItemIsDir {
|
||||
ret = lo.FilterMap(entries, func(item os.DirEntry, index int) (ret string, ok bool) {
|
||||
if ok = item.IsDir(); ok {
|
||||
ret = item.Name()
|
||||
}
|
||||
return
|
||||
})
|
||||
} else {
|
||||
if o.FileExtension == "" {
|
||||
ret = lo.FilterMap(entries, func(item os.DirEntry, index int) (ret string, ok bool) {
|
||||
if ok = !item.IsDir(); ok {
|
||||
ret = item.Name()
|
||||
}
|
||||
return
|
||||
})
|
||||
} else {
|
||||
ret = lo.FilterMap(entries, func(item os.DirEntry, index int) (ret string, ok bool) {
|
||||
if ok = !item.IsDir() && filepath.Ext(item.Name()) == o.FileExtension; ok {
|
||||
ret = strings.TrimSuffix(item.Name(), o.FileExtension)
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
// Read the directory entries
|
||||
var entries []os.DirEntry
|
||||
if entries, err = os.ReadDir(absDir); err != nil {
|
||||
return nil, fmt.Errorf("could not read items from directory: %v", err)
|
||||
}
|
||||
return
|
||||
|
||||
for _, entry := range entries {
|
||||
entryPath := filepath.Join(absDir, entry.Name())
|
||||
|
||||
// Get metadata for the entry, including symlink info
|
||||
fileInfo, err := os.Lstat(entryPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not stat entry %s: %v", entryPath, err)
|
||||
}
|
||||
|
||||
// Determine if the entry should be included
|
||||
if o.ItemIsDir {
|
||||
// Include directories or symlinks to directories
|
||||
if fileInfo.IsDir() || (fileInfo.Mode()&os.ModeSymlink != 0 && common.IsSymlinkToDir(entryPath)) {
|
||||
ret = append(ret, entry.Name())
|
||||
}
|
||||
} else {
|
||||
// Include files, optionally filtering by extension
|
||||
if !fileInfo.IsDir() {
|
||||
if o.FileExtension == "" || filepath.Ext(entry.Name()) == o.FileExtension {
|
||||
ret = append(ret, strings.TrimSuffix(entry.Name(), o.FileExtension))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (o *StorageEntity) Delete(name string) (err error) {
|
||||
if err = os.Remove(o.BuildFilePathByName(name)); err != nil {
|
||||
err = fmt.Errorf("could not delete %s: %v", name, err)
|
||||
|
||||
Reference in New Issue
Block a user