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 }