30 lines
584 B
Go
Raw Normal View History

2025-09-16 00:05:16 -05:00
// backend/internal/fs.go
2025-09-08 00:48:47 -05:00
package internal
import (
"errors"
"os"
"path/filepath"
"strings"
)
2026-04-11 00:02:59 -03:00
var absPath = filepath.Abs
// SafeJoin resolves rel under root and rejects any path that escapes the root.
2025-09-08 00:48:47 -05:00
func SafeJoin(root, rel string) (string, error) {
rel = strings.TrimPrefix(rel, "/")
p := filepath.Join(root, rel)
2026-04-11 00:02:59 -03:00
ap, err := absPath(p)
if err != nil {
return "", err
}
2026-04-11 00:02:59 -03:00
ar, err := absPath(root)
if err != nil {
return "", err
}
2025-09-08 00:48:47 -05:00
if !strings.HasPrefix(ap, ar+string(os.PathSeparator)) && ap != ar {
return "", errors.New("path escapes root")
}
return ap, nil
}