finnally doooo and close #11
							parent
							
								
									9d19467ad5
								
							
						
					
					
						commit
						eb22fd20ce
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -215,6 +215,14 @@
 | 
			
		|||
            <p><strong>Display Name:</strong> <span id="display_name"></span></p>
 | 
			
		||||
            <p><strong>Content Length:</strong> <span id="content_length"></span> Bytes</p>
 | 
			
		||||
            <p><strong>Last Modified:</strong> <span id="last_modified"></span></p>
 | 
			
		||||
 | 
			
		||||
            <section class="file-only">
 | 
			
		||||
                <p><strong>MD5:</strong> <code id="md5"><a href="#" onclick="getHash(event, 'md5')">show</a></code></p>
 | 
			
		||||
                <p><strong>SHA1:</strong> <code id="sha1"><a href="#" onclick="getHash(event, 'sha1')">show</a></code></p>
 | 
			
		||||
                <p><strong>SHA256:</strong> <code id="sha256"><a href="#" onclick="getHash(event, 'sha256')">show</a></code></p>
 | 
			
		||||
                <p><strong>SHA512:</strong> <code id="sha512"><a href="#" onclick="getHash(event, 'sha512')">show</a></code></p>
 | 
			
		||||
            </section>
 | 
			
		||||
 | 
			
		||||
            <div>
 | 
			
		||||
                <button type="submit" onclick="closePrompt(event);" class="ok">OK</button>
 | 
			
		||||
            </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue