diff --git a/transfersh-server/handlers.go b/transfersh-server/handlers.go index f457805..41bb9cd 100644 --- a/transfersh-server/handlers.go +++ b/transfersh-server/handlers.go @@ -35,7 +35,6 @@ import ( "errors" "fmt" "github.com/dutchcoders/go-clamd" - "github.com/golang/gddo/httputil/header" "github.com/gorilla/mux" "github.com/kennygrant/sanitize" html_template "html/template" @@ -57,23 +56,60 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Approaching Neutral Zone, all systems normal and functioning.") } +/* The preview handler will show a preview of the content for browsers (accept type text/html), and referer is not transfer.sh */ +func previewHandler(w http.ResponseWriter, r *http.Request) { + log.Printf("preview") + + vars := mux.Vars(r) + + token := vars["token"] + filename := vars["filename"] + + reader, contentType, contentLength, err := storage.Get(token, filename) + if err != nil { + } + + reader.Close() + + templatePath := "static/download.html" + + if strings.HasPrefix(contentType, "image") { + templatePath = "static/download.image.html" + } + + tmpl, err := html_template.ParseFiles(templatePath) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + data := struct { + ContentType string + Filename string + Url string + ContentLength uint64 + }{ + contentType, + filename, + r.URL.String(), + contentLength, + } + + if err := tmpl.Execute(w, data); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + +} + // this handler will output html or text, depending on the // support of the client (Accept header). func viewHandler(w http.ResponseWriter, r *http.Request) { // vars := mux.Vars(r) - actual := header.ParseAccept(r.Header, "Accept") - - html := false - - for _, s := range actual { - if s.Value == "text/html" { - html = true - } - } - - if html { + if acceptsHtml(r.Header) { tmpl, err := html_template.ParseFiles("static/index.html") if err != nil { @@ -482,20 +518,7 @@ func getHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", contentType) w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10)) - - mediaType, _, _ := mime.ParseMediaType(contentType) - - switch { - case mediaType == "text/html": - w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) - break - case strings.HasPrefix(mediaType, "text"): - case mediaType == "": - break - default: - w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) - } - + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) w.Header().Set("Connection", "close") if _, err = io.Copy(w, reader); err != nil { diff --git a/transfersh-server/main.go b/transfersh-server/main.go index c41f5dd..512f6bb 100644 --- a/transfersh-server/main.go +++ b/transfersh-server/main.go @@ -34,6 +34,7 @@ import ( "log" "math/rand" "net/http" + "net/url" "os" "time" ) @@ -79,23 +80,26 @@ func main() { r.HandleFunc("/({files:.*}).tar.gz", tarGzHandler).Methods("GET") r.HandleFunc("/download/{token}/{filename}", getHandler).Methods("GET") - /*r.HandleFunc("/{token}/{filename}", viewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool { - u, err := url.Parse(r.Referer()) - if err != nil { - log.Fatal(err) - return true - } + r.HandleFunc("/{token}/{filename}", previewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool { + if !acceptsHtml(r.Header) { + return false + } - if u.Host == "transfer.sh" { - return false - } + match := (r.Referer() == "") - if u.Host == "" { - return false - } + u, err := url.Parse(r.Referer()) + if err != nil { + log.Fatal(err) + return false + } - return true - }).Methods("GET")*/ + match = match || (u.Host == "transfer.sh") + + match = match || (u.Host == "127.0.0.1") + + log.Printf("%s %s match %s", r.Referer(), u.Host, match) + return match + }).Methods("GET") r.HandleFunc("/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/get/{token}/{filename}", getHandler).Methods("GET") diff --git a/transfersh-server/static/download.image.html b/transfersh-server/static/download.image.html new file mode 100644 index 0000000..23211d8 --- /dev/null +++ b/transfersh-server/static/download.image.html @@ -0,0 +1,7 @@ + + +{{.ContentType}} +{{.ContentLength}} +{{.Filename}} +Download + \ No newline at end of file diff --git a/transfersh-server/utils.go b/transfersh-server/utils.go index 9f668f6..3426886 100644 --- a/transfersh-server/utils.go +++ b/transfersh-server/utils.go @@ -27,6 +27,7 @@ package main import ( "github.com/goamz/goamz/aws" "github.com/goamz/goamz/s3" + "github.com/golang/gddo/httputil/header" "net/http" "net/mail" "strings" @@ -78,3 +79,15 @@ func encodeRFC2047(String string) string { addr := mail.Address{String, ""} return strings.Trim(addr.String(), " <>") } + +func acceptsHtml(hdr http.Header) bool { + actual := header.ParseAccept(hdr, "Accept") + + for _, s := range actual { + if s.Value == "text/html" { + return (true) + } + } + + return (false) +} diff --git a/transfersh-web/download.image.html b/transfersh-web/download.image.html new file mode 100644 index 0000000..9c6389f --- /dev/null +++ b/transfersh-web/download.image.html @@ -0,0 +1,7 @@ + + +{{.ContentType}} +{{.ContentLength}} +{{.Filename}} +Download +