Spaces:
Configuration error
Configuration error
package utils | |
import ( | |
"fmt" | |
"os" | |
"path/filepath" | |
"strings" | |
) | |
func ExistsInPath(path string, s string) bool { | |
_, err := os.Stat(filepath.Join(path, s)) | |
return err == nil | |
} | |
func InTrustedRoot(path string, trustedRoot string) error { | |
for path != "/" { | |
path = filepath.Dir(path) | |
if path == trustedRoot { | |
return nil | |
} | |
} | |
return fmt.Errorf("path is outside of trusted root") | |
} | |
// VerifyPath verifies that path is based in basePath. | |
func VerifyPath(path, basePath string) error { | |
c := filepath.Clean(filepath.Join(basePath, path)) | |
return InTrustedRoot(c, filepath.Clean(basePath)) | |
} | |
// SanitizeFileName sanitizes the given filename | |
func SanitizeFileName(fileName string) string { | |
// filepath.Clean to clean the path | |
cleanName := filepath.Clean(fileName) | |
// filepath.Base to ensure we only get the final element, not any directory path | |
baseName := filepath.Base(cleanName) | |
// Replace any remaining tricky characters that might have survived cleaning | |
safeName := strings.ReplaceAll(baseName, "..", "") | |
return safeName | |
} | |
func GenerateUniqueFileName(dir, baseName, ext string) string { | |
counter := 1 | |
fileName := baseName + ext | |
for { | |
filePath := filepath.Join(dir, fileName) | |
_, err := os.Stat(filePath) | |
if os.IsNotExist(err) { | |
return fileName | |
} | |
counter++ | |
fileName = fmt.Sprintf("%s_%d%s", baseName, counter, ext) | |
} | |
} | |