dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit d68b8c161508531fac6b9d4fcb32f261a04089b9
parent 428c887f8cd2fce624928aefdb007582e939c893
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 22 Dec 2022 16:41:27 -0800

cleanup uploads

Diffstat:
Mpkg/database/tableUploads.go | 37+++++++++++++++++++++++++++++++++++--
Mpkg/web/handlers/admin.go | 5+----
Mpkg/web/handlers/handlers.go | 25+++----------------------
3 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/pkg/database/tableUploads.go b/pkg/database/tableUploads.go @@ -3,6 +3,7 @@ package database import ( "dkforest/pkg/config" "dkforest/pkg/utils" + "io" "io/ioutil" "os" "path/filepath" @@ -11,6 +12,8 @@ import ( "github.com/sirupsen/logrus" ) +const UploadFolder = "uploads" + type UploadID int64 type Upload struct { @@ -24,6 +27,36 @@ type Upload struct { User User } +func (u *Upload) GetContent() (os.FileInfo, []byte, error) { + filePath1 := filepath.Join(UploadFolder, u.FileName) + f, err := os.Open(filePath1) + if err != nil { + return nil, nil, err + } + defer f.Close() + + fileBytes, _ := io.ReadAll(f) + decFileBytes, err := utils.DecryptAES(fileBytes, []byte(config.Global.MasterKey())) + if err != nil { + decFileBytes = fileBytes + } + fi, err := f.Stat() + if err != nil { + return nil, nil, err + } + return fi, decFileBytes, nil +} + +func (u *Upload) Delete() error { + if err := os.Remove(filepath.Join(UploadFolder, u.FileName)); err != nil { + return err + } + if err := DB.Delete(&u).Error; err != nil { + return err + } + return nil +} + // CreateUpload create file on disk in "uploads" folder, and save upload in database as well. func CreateUpload(fileName string, content []byte, userID UserID) (*Upload, error) { return createUploadWithSize(fileName, content, userID, int64(len(content))) @@ -39,7 +72,7 @@ func CreateEncryptedUploadWithSize(fileName string, content []byte, userID UserI func createUploadWithSize(fileName string, content []byte, userID UserID, size int64) (*Upload, error) { newFileName := utils.MD5([]byte(utils.GenerateToken32())) - if err := ioutil.WriteFile(filepath.Join("uploads", newFileName), content, 0644); err != nil { + if err := ioutil.WriteFile(filepath.Join(UploadFolder, newFileName), content, 0644); err != nil { return nil, err } upload := Upload{ @@ -94,7 +127,7 @@ func DeleteOldUploads() { now := time.Now() for _, info := range fileInfo { if diff := now.Sub(info.ModTime()); diff > 24*time.Hour { - if err := os.Remove(filepath.Join("uploads", info.Name())); err != nil { + if err := os.Remove(filepath.Join(UploadFolder, info.Name())); err != nil { logrus.Error(err.Error()) } } diff --git a/pkg/web/handlers/admin.go b/pkg/web/handlers/admin.go @@ -129,10 +129,7 @@ func AdminUploadsHandler(c echo.Context) error { if err != nil { return c.Redirect(http.StatusFound, "/") } - if err := os.Remove(filepath.Join("uploads", file.FileName)); err != nil { - logrus.Error(err.Error()) - } - if err := database.DB.Delete(&file).Error; err != nil { + if err := file.Delete(); err != nil { logrus.Error(err) } return c.Redirect(http.StatusFound, c.Request().Referer()) diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -2672,10 +2672,7 @@ func SettingsUploadsHandler(c echo.Context) error { if authUser.ID != file.UserID { return c.Redirect(http.StatusFound, "/") } - if err := os.Remove(filepath.Join("uploads", file.FileName)); err != nil { - logrus.Error(err.Error()) - } - if err := database.DB.Delete(&file).Error; err != nil { + if err := file.Delete(); err != nil { logrus.Error(err) } return c.Redirect(http.StatusFound, c.Request().Referer()) @@ -3916,17 +3913,10 @@ func UploadsDownloadHandler(c echo.Context) error { } if file.FileSize < 1<<20 { - f, err := os.Open(filePath1) + fi, decFileBytes, err := file.GetContent() if err != nil { return echo.NotFoundHandler(c) } - defer f.Close() - - fileBytes, _ := io.ReadAll(f) - decFileBytes, err := utils.DecryptAES(fileBytes, []byte(config.Global.MasterKey())) - if err != nil { - decFileBytes = fileBytes - } buf := bytes.NewReader(decFileBytes) // Validate image type and determine extension @@ -3936,8 +3926,6 @@ func UploadsDownloadHandler(c echo.Context) error { return echo.NotFoundHandler(c) } - fi, _ := f.Stat() - // Serve images if mimeType == "image/jpeg" || mimeType == "image/png" || @@ -4014,18 +4002,11 @@ func UploadsDownloadHandler(c echo.Context) error { logrus.Error(err) } - f, err := os.Open(filePath1) + fi, decFileBytes, err := file.GetContent() if err != nil { return echo.NotFoundHandler(c) } - defer f.Close() - fileBytes, _ := io.ReadAll(f) - decFileBytes, err := utils.DecryptAES(fileBytes, []byte(config.Global.MasterKey())) - if err != nil { - decFileBytes = fileBytes - } buf := bytes.NewReader(decFileBytes) - fi, _ := f.Stat() c.Response().Header().Set(echo.HeaderContentDisposition, fmt.Sprintf("%s; filename=%q", "attachment", file.OrigFileName)) http.ServeContent(c.Response(), c.Request(), fi.Name(), fi.ModTime(), buf)