From 777d18e887524207a73bcb1ff936c78edc904488 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 23 Apr 2017 15:14:59 +0100 Subject: [PATCH] finnally doooo and close #11 Former-commit-id: b899f43722862ed4aafbca659670f26011ae727d [formerly 746709cdc2fa58bc69a71fa795a5589a1145d853] [formerly 5aab2327e90c4dd0a47b71d8ef90043e8918db06 [formerly eb22fd20ce78b48c6a2a3c3ffc59b1ca76feda5e]] Former-commit-id: ca8b01af19ef3bbd870636170f60fd7ae8e4cd7f [formerly be235a498e36298e07f1b5d07939668d57e08fe2] Former-commit-id: 6bccf20702c8b3867a3a2ebae711834a740a06ad --- _embed/public/css/styles.css | 9 +++--- _embed/public/js/common.js | 27 +++++++++++++++++ _embed/templates/base.tmpl | 8 +++++ assets/binary.go.REMOVED.git-id | 2 +- filemanager.go | 2 ++ handlers/checksum.go | 54 +++++++++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 handlers/checksum.go diff --git a/_embed/public/css/styles.css b/_embed/public/css/styles.css index 01f2ee86..eb9d8a5b 100644 --- a/_embed/public/css/styles.css +++ b/_embed/public/css/styles.css @@ -45,7 +45,6 @@ button { padding: .5em 1em; margin-left: .5em; border-radius: .1em; - background-color; cursor: pointer; background: #2196f3; color: #fff; @@ -376,10 +375,6 @@ header>div div { position: relative; } -header .actions { - /* margin-left: auto; */ -} - #logout { border-radius: 0; margin-left: auto; @@ -1010,6 +1005,10 @@ header .actions { padding: .3em; } +.prompt code { + word-wrap: break-word; +} + .prompt div, .help div { margin-top: 1em; diff --git a/_embed/public/js/common.js b/_embed/public/js/common.js index ae84d237..395e1c58 100644 --- a/_embed/public/js/common.js +++ b/_embed/public/js/common.js @@ -302,17 +302,40 @@ function openEvent (event) { return false } +function getHash (event, hash) { + event.preventDefault() + + let request = new window.XMLHttpRequest() + request.open('GET', `${window.location.pathname}?checksum=${hash}`, true) + + request.onload = () => { + if (request.status >= 300) { + console.log(request.statusText) + return + } + event.target.parentElement.innerHTML = request.responseText + } + request.onerror = (e) => console.log(e) + request.send() +} + function infoEvent (event) { event.preventDefault() if (event.currentTarget.classList.contains('disabled')) { return } + let dir = false let link if (selectedItems.length) { link = document.getElementById(selectedItems[0]).dataset.url + dir = document.getElementById(selectedItems[0]).dataset.dir } else { + if (document.getElementById('listing') !== null) { + dir = true + } + link = window.location.pathname } @@ -326,6 +349,10 @@ function infoEvent (event) { clone.getElementById('content_length').innerHTML = xml.getElementsByTagName('getcontentlength')[0].innerHTML clone.getElementById('last_modified').innerHTML = xml.getElementsByTagName('getlastmodified')[0].innerHTML + if (dir === true || dir === 'true') { + clone.querySelector('.file-only').style.display = 'none' + } + document.querySelector('body').appendChild(clone) document.querySelector('.overlay').classList.add('active') document.querySelector('.prompt').classList.add('active') diff --git a/_embed/templates/base.tmpl b/_embed/templates/base.tmpl index 85d68686..4913ffc2 100644 --- a/_embed/templates/base.tmpl +++ b/_embed/templates/base.tmpl @@ -215,6 +215,14 @@

Display Name:

Content Length: Bytes

Last Modified:

+ +
+

MD5: show

+

SHA1: show

+

SHA256: show

+

SHA512: show

+
+
diff --git a/assets/binary.go.REMOVED.git-id b/assets/binary.go.REMOVED.git-id index 9c8a929d..71568866 100644 --- a/assets/binary.go.REMOVED.git-id +++ b/assets/binary.go.REMOVED.git-id @@ -1 +1 @@ -bbb145fc8bd2b1a8c6896fb345e858cb02187a9d \ No newline at end of file +47a317d31e5cc5c338be174795c888342611b7d6 \ No newline at end of file diff --git a/filemanager.go b/filemanager.go index bf833282..a17983a8 100644 --- a/filemanager.go +++ b/filemanager.go @@ -173,6 +173,8 @@ func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, err case r.URL.Query().Get("raw") == "true" && !fi.IsDir: http.ServeFile(w, r, fi.Path) code, err = 0, nil + case !fi.IsDir && r.URL.Query().Get("checksum") != "": + code, err = handlers.Checksum(w, r, c, fi) case fi.IsDir: code, err = handlers.ServeListing(w, r, c, user, fi) default: diff --git a/handlers/checksum.go b/handlers/checksum.go new file mode 100644 index 00000000..cf5c2a64 --- /dev/null +++ b/handlers/checksum.go @@ -0,0 +1,54 @@ +package handlers + +import ( + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "encoding/hex" + e "errors" + "hash" + "io" + "net/http" + "os" + + "github.com/hacdias/caddy-filemanager/config" + "github.com/hacdias/caddy-filemanager/file" + "github.com/hacdias/caddy-filemanager/utils/errors" +) + +// Checksum calculates the hash of a file. Supports MD5, SHA1, SHA256 and SHA512. +func Checksum(w http.ResponseWriter, r *http.Request, c *config.Config, i *file.Info) (int, error) { + query := r.URL.Query().Get("checksum") + + file, err := os.Open(i.Path) + if err != nil { + return errors.ErrorToHTTPCode(err, true), err + } + + defer file.Close() + + var h hash.Hash + + switch query { + case "md5": + h = md5.New() + case "sha1": + h = sha1.New() + case "sha256": + h = sha256.New() + case "sha512": + h = sha512.New() + default: + return http.StatusBadRequest, e.New("Unknown HASH type") + } + + _, err = io.Copy(h, file) + if err != nil { + return http.StatusInternalServerError, err + } + + val := hex.EncodeToString(h.Sum(nil)) + w.Write([]byte(val)) + return http.StatusOK, nil +}