From 716d6d7e7a1e3c676dbc4a56d1576eee1aabb0a3 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 25 Jun 2017 10:52:34 +0100 Subject: [PATCH] update comments and unexport some fields --- _assets/templates/base.tmpl | 2 +- filemanager.go | 93 +++++++++++++++++++++++++------------ http.go | 4 +- http_command.go | 2 +- http_listing.go | 2 +- http_search.go | 2 +- info.go | 2 +- listing.go | 2 +- 8 files changed, 71 insertions(+), 38 deletions(-) diff --git a/_assets/templates/base.tmpl b/_assets/templates/base.tmpl index 85b9a3ef..579e01bd 100644 --- a/_assets/templates/base.tmpl +++ b/_assets/templates/base.tmpl @@ -14,7 +14,7 @@ diff --git a/filemanager.go b/filemanager.go index 022bc9ab..4cc00080 100644 --- a/filemanager.go +++ b/filemanager.go @@ -11,44 +11,59 @@ import ( // FileManager is a file manager instance. type FileManager struct { - *User `json:"-"` - Assets *Assets `json:"-"` + *User + Assets *assets // PrefixURL is a part of the URL that is trimmed from the http.Request.URL before // it arrives to our handlers. It may be useful when using FileManager as a middleware - // such as in caddy-filemanager plugin. + // such as in caddy-filemanager plugin. It musn't end with a trailing slash. PrefixURL string - // BaseURL is the path where the GUI will be accessible. + // BaseURL is the path where the GUI will be accessible. It musn't end with + // a trailing slash and mustn't contain PrefixURL, if set. BaseURL string - // WebDavURL is the path where the WebDAV will be accessible. It can be set to "/" - // in order to override the GUI and only use the WebDAV. + // WebDavURL is the path where the WebDAV will be accessible. It can be set to "" + // in order to override the GUI and only use the WebDAV. It musn't end with + // a trailing slash. WebDavURL string // Users is a map with the different configurations for each user. - Users map[string]*User `json:"-"` + Users map[string]*User // TODO: event-based? - BeforeSave CommandFunc `json:"-"` - AfterSave CommandFunc `json:"-"` + BeforeSave CommandFunc + AfterSave CommandFunc } // User contains the configuration for each user. type User struct { - Scope string `json:"-"` // Path the user have access - FileSystem webdav.FileSystem `json:"-"` // The virtual file system the user have access - Handler *webdav.Handler `json:"-"` // The WebDav HTTP Handler - Rules []*Rule `json:"-"` // Access rules - StyleSheet string `json:"-"` // Costum stylesheet - AllowNew bool // Can create files and folders - AllowEdit bool // Can edit/rename files - AllowCommands bool // Can execute commands - Commands []string // Available Commands + // scope is the physical path the user has access to. + scope string + + // fileSystem is the virtual file system the user has access. + fileSystem webdav.FileSystem + + // handler handles incoming requests to the WebDAV backend. + handler *webdav.Handler + + // Rules is an array of access and deny rules. + Rules []*Rule `json:"-"` + + // TODO: this MUST be done in another way + StyleSheet string `json:"-"` + + // These indicate if the user can perform certain actions. + AllowNew bool // Create files and folders + AllowEdit bool // Edit/rename files + AllowCommands bool // Execute commands + + // Commands is the list of commands the user can execute. + Commands []string } -// Assets are the static and front-end assets, such as JS, CSS and HTML templates. -type Assets struct { +// assets are the static and front-end assets, such as JS, CSS and HTML templates. +type assets struct { requiredJS *rice.Box // JS that is always required to have in order to be usable. Templates *rice.Box CSS *rice.Box @@ -57,9 +72,16 @@ type Assets struct { // Rule is a dissalow/allow rule. type Rule struct { - Regex bool - Allow bool - Path string + // Regex indicates if this rule uses Regular Expressions or not. + Regex bool + + // Allow indicates if this is an allow rule. Set 'false' to be a disallow rule. + Allow bool + + // Path is the corresponding URL path for this rule. + Path string + + // Regexp is the regular expression. Only use this when 'Regex' was set to true. Regexp *regexp.Regexp } @@ -82,7 +104,7 @@ func New() *FileManager { Users: map[string]*User{}, BeforeSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, AfterSave: func(r *http.Request, c *FileManager, u *User) error { return nil }, - Assets: &Assets{ + Assets: &assets{ Templates: rice.MustFindBox("./_assets/templates"), CSS: rice.MustFindBox("./_assets/css"), requiredJS: rice.MustFindBox("./_assets/js"), @@ -96,14 +118,20 @@ func New() *FileManager { return m } +// AbsoluteURL returns the actual URL where +// File Manager interface can be accessed. func (m FileManager) AbsoluteURL() string { return m.PrefixURL + m.BaseURL } -func (m FileManager) AbsoluteWebdavURL() string { +// AbsoluteWebDavURL returns the actual URL +// where WebDAV can be accessed. +func (m FileManager) AbsoluteWebDavURL() string { return m.PrefixURL + m.WebDavURL } +// SetBaseURL updates the BaseURL of a File Manager +// object. func (m *FileManager) SetBaseURL(url string) { url = strings.TrimPrefix(url, "/") url = strings.TrimSuffix(url, "/") @@ -111,18 +139,23 @@ func (m *FileManager) SetBaseURL(url string) { m.BaseURL = strings.TrimSuffix(url, "/") } +// SetWebDavURL updates the WebDavURL of a File Manager +// object and updates it's main handler. func (m *FileManager) SetWebDavURL(url string) { - m.WebDavURL = m.BaseURL + "/" + strings.TrimPrefix(url, "/") - m.User.Handler = &webdav.Handler{ + url = strings.TrimPrefix(url, "/") + url = strings.TrimSuffix(url, "/") + + m.WebDavURL = m.BaseURL + "/" + url + m.User.handler = &webdav.Handler{ Prefix: m.WebDavURL, - FileSystem: m.FileSystem, + FileSystem: m.fileSystem, LockSystem: webdav.NewMemLS(), } } func (u *User) SetScope(scope string) { - u.Scope = strings.TrimSuffix(scope, "/") - u.FileSystem = webdav.Dir(u.Scope) + u.scope = strings.TrimSuffix(scope, "/") + u.fileSystem = webdav.Dir(u.scope) } // Allowed checks if the user has permission to access a directory/file. diff --git a/http.go b/http.go index faa6c140..e1e870d5 100644 --- a/http.go +++ b/http.go @@ -59,7 +59,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er // It was decided on https://github.com/hacdias/caddy-filemanager/issues/85 // that GET, for collections, will return the same as PROPFIND method. path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1) - path = user.Scope + "/" + path + path = user.scope + "/" + path path = filepath.Clean(path) var i os.FileInfo @@ -97,7 +97,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er } } - c.Handler.ServeHTTP(w, r) + c.handler.ServeHTTP(w, r) if err = c.AfterSave(r, c, user); err != nil { return http.StatusInternalServerError, err } diff --git a/http_command.go b/http_command.go index eea6fa48..e95071b7 100644 --- a/http_command.go +++ b/http_command.go @@ -77,7 +77,7 @@ func command(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (i } // Gets the path and initializes a buffer. - path := strings.Replace(r.URL.Path, c.BaseURL, c.Scope, 1) + path := strings.Replace(r.URL.Path, c.BaseURL, c.scope, 1) path = filepath.Clean(path) buff := new(bytes.Buffer) diff --git a/http_listing.go b/http_listing.go index c4ea51b1..5b2a663b 100644 --- a/http_listing.go +++ b/http_listing.go @@ -20,7 +20,7 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *Use } listing.Context = httpserver.Context{ - Root: http.Dir(u.Scope), + Root: http.Dir(u.scope), Req: r, URL: r.URL, } diff --git a/http_search.go b/http_search.go index e35918c8..5cf27699 100644 --- a/http_search.go +++ b/http_search.go @@ -74,7 +74,7 @@ func search(w http.ResponseWriter, r *http.Request, c *FileManager, u *User) (in scope := strings.Replace(r.URL.Path, c.BaseURL, "", 1) scope = strings.TrimPrefix(scope, "/") scope = "/" + scope - scope = u.Scope + scope + scope = u.scope + scope scope = strings.Replace(scope, "\\", "/", -1) scope = filepath.Clean(scope) diff --git a/info.go b/info.go index b828476c..335ccbc3 100644 --- a/info.go +++ b/info.go @@ -41,7 +41,7 @@ func GetInfo(url *url.URL, c *FileManager, u *User) (*FileInfo, error) { i.VirtualPath = strings.TrimPrefix(i.VirtualPath, "/") i.VirtualPath = "/" + i.VirtualPath - i.Path = u.Scope + i.VirtualPath + i.Path = u.scope + i.VirtualPath i.Path = filepath.Clean(i.Path) info, err := os.Stat(i.Path) diff --git a/listing.go b/listing.go index b272c2af..5cb0d878 100644 --- a/listing.go +++ b/listing.go @@ -36,7 +36,7 @@ type Listing struct { func GetListing(u *User, filePath string, baseURL string) (*Listing, error) { // Gets the directory information using the Virtual File System of // the user configuration. - file, err := u.FileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) + file, err := u.fileSystem.OpenFile(context.TODO(), filePath, os.O_RDONLY, 0) if err != nil { return nil, err }