2022-06-10 06:38:29 +00:00
|
|
|
package archetype
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
2022-06-12 06:00:38 +00:00
|
|
|
"os"
|
2022-06-10 06:38:29 +00:00
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SimpleFileManager struct {
|
|
|
|
Root string
|
|
|
|
ShowHtml bool
|
|
|
|
ShowHidden bool
|
|
|
|
}
|
|
|
|
|
2022-06-12 06:00:38 +00:00
|
|
|
type FileData struct {
|
|
|
|
Error string
|
|
|
|
Path string
|
|
|
|
Name string
|
|
|
|
IsDir bool
|
|
|
|
}
|
|
|
|
|
2022-06-10 06:38:29 +00:00
|
|
|
type FileListing struct {
|
|
|
|
Error string
|
|
|
|
Root string
|
|
|
|
Up string
|
|
|
|
SubDirs []string
|
|
|
|
Files []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type FileManager interface {
|
|
|
|
Init(cfg *Config) error
|
|
|
|
// ListTree() FileListing
|
|
|
|
ListSubTree(root string) FileListing
|
2022-06-12 06:00:38 +00:00
|
|
|
GetFileData(slug string) FileData
|
2022-06-10 06:38:29 +00:00
|
|
|
// AddFile(path string, file multipart.FileHeader) error
|
|
|
|
// MkDir(path string) error
|
|
|
|
// Remove(path string) error
|
|
|
|
// Rename(old, new string) error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *SimpleFileManager) Init(cfg *Config) error {
|
2022-06-12 06:00:38 +00:00
|
|
|
self.Root = filepath.Clean(cfg.StaticRoot)
|
2022-06-10 06:38:29 +00:00
|
|
|
self.ShowHtml = cfg.StaticShowHtml
|
|
|
|
self.ShowHidden = cfg.StaticShowHidden
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *SimpleFileManager) ListSubTree(root string) FileListing {
|
|
|
|
list := FileListing{}
|
|
|
|
|
|
|
|
if strings.Contains(root, "../") || strings.Contains(root, "..\\") {
|
|
|
|
list.Error = "You cannot escape!"
|
|
|
|
return list
|
|
|
|
}
|
|
|
|
|
|
|
|
fullPath := filepath.Join(self.Root, root)
|
|
|
|
|
|
|
|
files, err := ioutil.ReadDir(fullPath)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
list.Error = err.Error()
|
|
|
|
return list
|
|
|
|
}
|
|
|
|
|
|
|
|
list.Root = root
|
|
|
|
if !strings.HasSuffix(list.Root, "/") {
|
|
|
|
list.Root += "/"
|
|
|
|
}
|
|
|
|
if !strings.HasPrefix(list.Root, "/") {
|
|
|
|
list.Root = "/" + list.Root
|
|
|
|
}
|
|
|
|
|
|
|
|
levels := strings.Split(root, "/")
|
|
|
|
if list.Root != "/" {
|
|
|
|
list.Up = "/"
|
|
|
|
}
|
|
|
|
if len(levels) >= 2 {
|
|
|
|
list.Up = "/" + strings.Join(levels[:len(levels)-1], "/")
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, file := range files {
|
|
|
|
if !self.ShowHidden && strings.HasPrefix(file.Name(), ".") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if file.IsDir() {
|
|
|
|
list.SubDirs = append(list.SubDirs, file.Name())
|
|
|
|
} else {
|
|
|
|
if !self.ShowHtml && strings.HasSuffix(file.Name(), ".html") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
list.Files = append(list.Files, file.Name())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return list
|
|
|
|
}
|
2022-06-12 06:00:38 +00:00
|
|
|
|
|
|
|
func (self *SimpleFileManager) GetFileData(slug string) FileData {
|
|
|
|
fullPath := filepath.Join(self.Root, slug)
|
|
|
|
fileInfo, err := os.Stat(fullPath)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return FileData{
|
|
|
|
Error: err.Error(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !strings.HasPrefix(fullPath, self.Root) {
|
|
|
|
return FileData{
|
|
|
|
Error: "You cannot escape!",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanedSlug := filepath.Clean(slug)
|
|
|
|
fileBase := filepath.Base(cleanedSlug)
|
|
|
|
|
|
|
|
return FileData{
|
|
|
|
Path: filepath.Clean(slug),
|
|
|
|
Name: fileBase,
|
|
|
|
IsDir: fileInfo.IsDir(),
|
|
|
|
}
|
|
|
|
}
|