diff --git a/assets/embed/public/css/styles.css b/assets/embed/public/css/styles.css index 7fe9d964..bb21074c 100644 --- a/assets/embed/public/css/styles.css +++ b/assets/embed/public/css/styles.css @@ -774,7 +774,7 @@ header .action span { border: 0; box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24); padding: .5em; - width: 10em; + width: 22em; border-radius: .2em; } @@ -1166,4 +1166,4 @@ i.spin { column-count: 1; column-gap: 0; } -} \ No newline at end of file +} diff --git a/assets/embed/public/js/application.js b/assets/embed/public/js/application.js index e326f9b4..ee333a21 100644 --- a/assets/embed/public/js/application.js +++ b/assets/embed/public/js/application.js @@ -431,7 +431,9 @@ var newDirEvent = function(event) { let button = document.getElementById('new'); let html = button.changeToLoading(); let request = new XMLHttpRequest(); - request.open("MKCOL", toWebDavURL(window.location.pathname + document.getElementById('newdir').value + "/")); + let name = document.getElementById('newdir').value; + + request.open((name.endsWith("/") ? "MKCOL" : "PUT"), toWebDavURL(window.location.pathname + name)); request.setRequestHeader('Token', token); request.send(); request.onreadystatechange = function() { diff --git a/assets/embed/templates/listing.tmpl b/assets/embed/templates/listing.tmpl index 70f443d7..c03f5f34 100644 --- a/assets/embed/templates/listing.tmpl +++ b/assets/embed/templates/listing.tmpl @@ -38,7 +38,7 @@ {{ end }} {{ if .User.AllowNew }} - +
add diff --git a/config/config.go b/config/config.go index c5f0145e..952cb134 100644 --- a/config/config.go +++ b/config/config.go @@ -69,6 +69,7 @@ func Parse(c *caddy.Controller) ([]Config, error) { cfg.AllowEdit = true cfg.AllowNew = true cfg.Commands = []string{"git", "svn", "hg"} + cfg.WebDav = true cfg.Rules = []*Rule{&Rule{ Regex: true, Allow: false, @@ -85,6 +86,7 @@ func Parse(c *caddy.Controller) ([]Config, error) { cfg.BaseURL = strings.TrimPrefix(cfg.BaseURL, "/") cfg.BaseURL = strings.TrimSuffix(cfg.BaseURL, "/") cfg.BaseURL = "/" + cfg.BaseURL + cfg.WebDavURL = cfg.BaseURL + "webdav" if cfg.BaseURL == "/" { cfg.BaseURL = "" @@ -105,23 +107,15 @@ func Parse(c *caddy.Controller) ([]Config, error) { return configs, c.Err("frontmatter type not supported") } case "webdav": - cfg.WebDav = true - - prefix := "webdav" - if c.NextArg() { - prefix = c.Val() + if !c.NextArg() { + return configs, c.ArgErr() } + prefix := c.Val() prefix = strings.TrimPrefix(prefix, "/") prefix = strings.TrimSuffix(prefix, "/") prefix = cfg.BaseURL + "/" + prefix - cfg.WebDavURL = prefix - cfg.WebDavHandler = &webdav.Handler{ - Prefix: prefix, - FileSystem: webdav.Dir(cfg.PathScope), - LockSystem: webdav.NewMemLS(), - } case "show": if !c.NextArg() { return configs, c.ArgErr() @@ -240,6 +234,12 @@ func Parse(c *caddy.Controller) ([]Config, error) { } } + cfg.WebDavHandler = &webdav.Handler{ + Prefix: cfg.WebDavURL, + FileSystem: webdav.Dir(cfg.PathScope), + LockSystem: webdav.NewMemLS(), + } + caddyConf := httpserver.GetConfig(c) cfg.AbsoluteURL = strings.TrimSuffix(caddyConf.Addr.Path, "/") + "/" + cfg.BaseURL cfg.AbsoluteURL = strings.Replace(cfg.AbsoluteURL, "//", "/", -1) diff --git a/filemanager.go b/filemanager.go index 3bf02019..2c0c5009 100644 --- a/filemanager.go +++ b/filemanager.go @@ -56,7 +56,24 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err user = c.User } - if c.WebDav && strings.HasPrefix(r.URL.Path, c.WebDavURL) { + if strings.HasPrefix(r.URL.Path, c.WebDavURL) { + url := strings.TrimPrefix(r.URL.Path, c.WebDavURL) + + if !user.Allowed(url) { + return http.StatusForbidden, nil + } + + switch r.Method { + case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": + if !user.AllowEdit { + return http.StatusForbidden, nil + } + case "MKCOL", "COPY": + if !user.AllowNew { + return http.StatusForbidden, nil + } + } + if r.Method == http.MethodPut { _, err = fi.Update(w, r, c, user) if err != nil { @@ -64,24 +81,6 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err } } - //url := strings.TrimPrefix(r.URL.Path, c.WebDavURL) - - /* - if !user.Allowed(url) { - return http.StatusForbidden, nil - } - - switch r.Method { - case "PROPPATCH", "MOVE", "PATCH", "PUT", "DELETE": - if !user.AllowEdit { - return http.StatusForbidden, nil - } - case "MKCOL", "COPY": - if !user.AllowNew { - return http.StatusForbidden, nil - } - } */ - c.WebDavHandler.ServeHTTP(w, r) return 0, nil } @@ -122,9 +121,7 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err } } - // Route the request depending on the HTTP Method. - switch r.Method { - case http.MethodGet: + if r.Method == http.MethodGet { // Read and show directory or file. if serveAssets { return assets.Serve(w, r, c) @@ -136,13 +133,18 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err if !fi.IsDir { query := r.URL.Query() if val, ok := query["raw"]; ok && val[0] == "true" { + // TODO: change URL to webdav and continue as webdav return fi.ServeRawFile(w, r, c) } if val, ok := query["download"]; ok && val[0] == "true" { w.Header().Set("Content-Disposition", "attachment; filename="+fi.Name) + // TODO: change URL to webdav and continue as webdav return fi.ServeRawFile(w, r, c) + } + + // c.WebDavHandler.ServeHTTP(w, r) } code, err := fi.ServeAsHTML(w, r, c, user) @@ -150,7 +152,9 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err return errors.PrintHTML(w, code, err) } return code, err - case http.MethodPost: + } + + if r.Method == http.MethodPost { // Upload a new file. if r.Header.Get("Upload") == "true" { if !user.AllowNew { @@ -173,11 +177,9 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err return command(w, r, c, user) } - - fallthrough - default: - return http.StatusNotImplemented, nil } + + return http.StatusNotImplemented, nil } }