From a31648586a785478b395369dc8d6f988c4ddb595 Mon Sep 17 00:00:00 2001 From: xtrafrancyz Date: Sun, 31 Mar 2019 22:13:51 +0300 Subject: [PATCH] Keep original file names --- backends/localfs/localfs.go | 16 +++++--- backends/meta.go | 1 + backends/s3/s3.go | 34 ++++++++-------- backends/storage.go | 2 +- delete.go | 2 +- display.go | 36 ++++++++++------- fileserve.go | 3 ++ static/css/linx.css | 9 +++++ templates/base.html | 8 ++-- templates/display/base.html | 4 +- templates/display/file.html | 2 +- templates/index.html | 2 +- upload.go | 79 +++++++++++++------------------------ 13 files changed, 100 insertions(+), 98 deletions(-) diff --git a/backends/localfs/localfs.go b/backends/localfs/localfs.go index 3f6f5ad..5bf0003 100644 --- a/backends/localfs/localfs.go +++ b/backends/localfs/localfs.go @@ -18,6 +18,7 @@ type LocalfsBackend struct { } type MetadataJSON struct { + OriginalName string `json:"original_name"` DeleteKey string `json:"delete_key"` Sha256sum string `json:"sha256sum"` Mimetype string `json:"mimetype"` @@ -56,6 +57,7 @@ func (b LocalfsBackend) Head(key string) (metadata backends.Metadata, err error) return metadata, backends.BadMetadata } + metadata.OriginalName = mjson.OriginalName metadata.DeleteKey = mjson.DeleteKey metadata.Mimetype = mjson.Mimetype metadata.ArchiveFiles = mjson.ArchiveFiles @@ -84,12 +86,13 @@ func (b LocalfsBackend) writeMetadata(key string, metadata backends.Metadata) er metaPath := path.Join(b.metaPath, key) mjson := MetadataJSON{ - DeleteKey: metadata.DeleteKey, - Mimetype: metadata.Mimetype, + OriginalName: metadata.OriginalName, + DeleteKey: metadata.DeleteKey, + Mimetype: metadata.Mimetype, ArchiveFiles: metadata.ArchiveFiles, - Sha256sum: metadata.Sha256sum, - Expiry: metadata.Expiry.Unix(), - Size: metadata.Size, + Sha256sum: metadata.Sha256sum, + Expiry: metadata.Expiry.Unix(), + Size: metadata.Size, } dst, err := os.Create(metaPath) @@ -108,7 +111,7 @@ func (b LocalfsBackend) writeMetadata(key string, metadata backends.Metadata) er return nil } -func (b LocalfsBackend) Put(key string, r io.Reader, expiry time.Time, deleteKey string) (m backends.Metadata, err error) { +func (b LocalfsBackend) Put(key string, originalName string, r io.Reader, expiry time.Time, deleteKey string) (m backends.Metadata, err error) { filePath := path.Join(b.filesPath, key) dst, err := os.Create(filePath) @@ -126,6 +129,7 @@ func (b LocalfsBackend) Put(key string, r io.Reader, expiry time.Time, deleteKey return m, err } + m.OriginalName = originalName m.Expiry = expiry m.DeleteKey = deleteKey m.Size = bytes diff --git a/backends/meta.go b/backends/meta.go index 7ba522d..4a1b52c 100644 --- a/backends/meta.go +++ b/backends/meta.go @@ -6,6 +6,7 @@ import ( ) type Metadata struct { + OriginalName string DeleteKey string Sha256sum string Mimetype string diff --git a/backends/s3/s3.go b/backends/s3/s3.go index 45067c1..79ca318 100644 --- a/backends/s3/s3.go +++ b/backends/s3/s3.go @@ -18,13 +18,13 @@ import ( type S3Backend struct { bucket string - svc *s3.S3 + svc *s3.S3 } func (b S3Backend) Delete(key string) error { _, err := b.svc.DeleteObject(&s3.DeleteObjectInput{ Bucket: aws.String(b.bucket), - Key: aws.String(key), + Key: aws.String(key), }) if err != nil { return err @@ -35,7 +35,7 @@ func (b S3Backend) Delete(key string) error { func (b S3Backend) Exists(key string) (bool, error) { _, err := b.svc.HeadObject(&s3.HeadObjectInput{ Bucket: aws.String(b.bucket), - Key: aws.String(key), + Key: aws.String(key), }) return err == nil, err } @@ -44,7 +44,7 @@ func (b S3Backend) Head(key string) (metadata backends.Metadata, err error) { var result *s3.HeadObjectOutput result, err = b.svc.HeadObject(&s3.HeadObjectInput{ Bucket: aws.String(b.bucket), - Key: aws.String(key), + Key: aws.String(key), }) if err != nil { if aerr, ok := err.(awserr.Error); ok { @@ -63,7 +63,7 @@ func (b S3Backend) Get(key string) (metadata backends.Metadata, r io.ReadCloser, var result *s3.GetObjectOutput result, err = b.svc.GetObject(&s3.GetObjectInput{ Bucket: aws.String(b.bucket), - Key: aws.String(key), + Key: aws.String(key), }) if err != nil { if aerr, ok := err.(awserr.Error); ok { @@ -81,11 +81,12 @@ func (b S3Backend) Get(key string) (metadata backends.Metadata, r io.ReadCloser, func mapMetadata(m backends.Metadata) map[string]*string { return map[string]*string{ - "Expiry": aws.String(strconv.FormatInt(m.Expiry.Unix(), 10)), - "Delete_key": aws.String(m.DeleteKey), - "Size": aws.String(strconv.FormatInt(m.Size, 10)), - "Mimetype": aws.String(m.Mimetype), - "Sha256sum": aws.String(m.Sha256sum), + "Original_name": aws.String(m.OriginalName), + "Expiry": aws.String(strconv.FormatInt(m.Expiry.Unix(), 10)), + "Delete_key": aws.String(m.DeleteKey), + "Size": aws.String(strconv.FormatInt(m.Size, 10)), + "Mimetype": aws.String(m.Mimetype), + "Sha256sum": aws.String(m.Sha256sum), } } @@ -101,13 +102,14 @@ func unmapMetadata(input map[string]*string) (m backends.Metadata, err error) { return } + m.OriginalName = aws.StringValue(input["Original_name"]) m.DeleteKey = aws.StringValue(input["Delete_key"]) m.Mimetype = aws.StringValue(input["Mimetype"]) m.Sha256sum = aws.StringValue(input["Sha256sum"]) return } -func (b S3Backend) Put(key string, r io.Reader, expiry time.Time, deleteKey string) (m backends.Metadata, err error) { +func (b S3Backend) Put(key string, originalName string, r io.Reader, expiry time.Time, deleteKey string) (m backends.Metadata, err error) { tmpDst, err := ioutil.TempFile("", "linx-server-upload") if err != nil { return m, err @@ -122,6 +124,7 @@ func (b S3Backend) Put(key string, r io.Reader, expiry time.Time, deleteKey stri return m, err } + m.OriginalName = originalName m.Expiry = expiry m.DeleteKey = deleteKey m.Size = bytes @@ -132,9 +135,9 @@ func (b S3Backend) Put(key string, r io.Reader, expiry time.Time, deleteKey stri uploader := s3manager.NewUploaderWithClient(b.svc) input := &s3manager.UploadInput{ - Bucket: aws.String(b.bucket), - Key: aws.String(key), - Body: tmpDst, + Bucket: aws.String(b.bucket), + Key: aws.String(key), + Body: tmpDst, Metadata: mapMetadata(m), } _, err = uploader.Upload(input) @@ -148,7 +151,7 @@ func (b S3Backend) Put(key string, r io.Reader, expiry time.Time, deleteKey stri func (b S3Backend) Size(key string) (int64, error) { input := &s3.HeadObjectInput{ Bucket: aws.String(b.bucket), - Key: aws.String(key), + Key: aws.String(key), } result, err := b.svc.HeadObject(input) if err != nil { @@ -169,7 +172,6 @@ func (b S3Backend) List() ([]string, error) { return nil, err } - for _, object := range results.Contents { output = append(output, *object.Key) } diff --git a/backends/storage.go b/backends/storage.go index d40a2b9..aca5cd4 100644 --- a/backends/storage.go +++ b/backends/storage.go @@ -11,7 +11,7 @@ type StorageBackend interface { Exists(key string) (bool, error) Head(key string) (Metadata, error) Get(key string) (Metadata, io.ReadCloser, error) - Put(key string, r io.Reader, expiry time.Time, deleteKey string) (Metadata, error) + Put(key string, originalName string, r io.Reader, expiry time.Time, deleteKey string) (Metadata, error) Size(key string) (int64, error) } diff --git a/delete.go b/delete.go index 38e36e3..7394c3c 100644 --- a/delete.go +++ b/delete.go @@ -30,7 +30,7 @@ func deleteHandler(c web.C, w http.ResponseWriter, r *http.Request) { return } - fmt.Fprintf(w, "DELETED") + _, _ = fmt.Fprintf(w, "DELETED") return } else { diff --git a/display.go b/display.go index feb16da..30a4d73 100644 --- a/display.go +++ b/display.go @@ -51,12 +51,13 @@ func fileDisplayHandler(c web.C, w http.ResponseWriter, r *http.Request) { if strings.EqualFold("application/json", r.Header.Get("Accept")) { js, _ := json.Marshal(map[string]string{ - "filename": fileName, - "direct_url": getSiteURL(r) + Config.selifPath + fileName, - "expiry": strconv.FormatInt(metadata.Expiry.Unix(), 10), - "size": strconv.FormatInt(metadata.Size, 10), - "mimetype": metadata.Mimetype, - "sha256sum": metadata.Sha256sum, + "original_name": metadata.OriginalName, + "filename": fileName, + "direct_url": getSiteURL(r) + Config.selifPath + fileName, + "expiry": strconv.FormatInt(metadata.Expiry.Unix(), 10), + "size": strconv.FormatInt(metadata.Size, 10), + "mimetype": metadata.Mimetype, + "sha256sum": metadata.Sha256sum, }) w.Write(js) return @@ -130,16 +131,21 @@ func fileDisplayHandler(c web.C, w http.ResponseWriter, r *http.Request) { tpl = Templates["display/file.html"] } + if metadata.OriginalName == "" { + metadata.OriginalName = fileName + } + err = renderTemplate(tpl, pongo2.Context{ - "mime": metadata.Mimetype, - "filename": fileName, - "size": sizeHuman, - "expiry": expiryHuman, - "expirylist": listExpirationTimes(), - "extra": extra, - "forcerandom": Config.forceRandomFilename, - "lines": lines, - "files": metadata.ArchiveFiles, + "mime": metadata.Mimetype, + "original_name": metadata.OriginalName, + "filename": fileName, + "size": sizeHuman, + "expiry": expiryHuman, + "expirylist": listExpirationTimes(), + "extra": extra, + "forcerandom": Config.forceRandomFilename, + "lines": lines, + "files": metadata.ArchiveFiles, }, r, w) if err != nil { diff --git a/fileserve.go b/fileserve.go index 202e477..0689445 100644 --- a/fileserve.go +++ b/fileserve.go @@ -40,6 +40,9 @@ func fileServeHandler(c web.C, w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Security-Policy", Config.fileContentSecurityPolicy) w.Header().Set("Referrer-Policy", Config.fileReferrerPolicy) + if metadata.OriginalName != "" { + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", metadata.OriginalName)) + } w.Header().Set("Content-Type", metadata.Mimetype) w.Header().Set("Content-Length", strconv.FormatInt(metadata.Size, 10)) w.Header().Set("Etag", fmt.Sprintf("\"%s\"", metadata.Sha256sum)) diff --git a/static/css/linx.css b/static/css/linx.css index 213f0fd..212aacf 100644 --- a/static/css/linx.css +++ b/static/css/linx.css @@ -74,6 +74,13 @@ body { padding: 5px; } +#filename { + max-width: 500px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + .info-flex { display: flex; flex-wrap: wrap; @@ -326,6 +333,8 @@ body { .display-audio, .display-file { width: 100%; + max-width: 1000px; + word-break: break-word; } .display-image { diff --git a/templates/base.html b/templates/base.html index d1411d4..cbe4fec 100644 --- a/templates/base.html +++ b/templates/base.html @@ -4,7 +4,7 @@ {% block title %}{{ sitename }}{% endblock %} - + {% block head %}{% endblock %} @@ -16,8 +16,8 @@ diff --git a/templates/display/base.html b/templates/display/base.html index 935979f..7e8a0c7 100644 --- a/templates/display/base.html +++ b/templates/display/base.html @@ -1,6 +1,6 @@ {% extends "../base.html" %} -{% block title %}{{ filename }}{% endblock %} +{% block title %}{{ original_name }}{% endblock %} {% block bodymore %}{% endblock %} @@ -8,7 +8,7 @@
- {{ filename }} + {{ original_name }}
diff --git a/templates/display/file.html b/templates/display/file.html index 203bfb8..50e660f 100644 --- a/templates/display/file.html +++ b/templates/display/file.html @@ -2,7 +2,7 @@ {% block main %}
-

You are requesting {{ filename }}, click below to download.

+

You are requesting {{ original_name }}, click below to download.

Download {% if files|length > 0 %} diff --git a/templates/index.html b/templates/index.html index 2843109..9ef9648 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,7 @@
- +