nirvash/archetype/fileManager.go

89 lines
1.7 KiB
Go
Raw Normal View History

package archetype
import (
"io/ioutil"
"path/filepath"
"strings"
)
type SimpleFileManager struct {
Root string
ShowHtml bool
ShowHidden bool
}
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
// 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 {
self.Root = cfg.StaticRoot
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
}