commit d68b8c161508531fac6b9d4fcb32f261a04089b9
parent 428c887f8cd2fce624928aefdb007582e939c893
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 22 Dec 2022 16:41:27 -0800
cleanup uploads
Diffstat:
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)