156 lines
2.6 KiB
Go
156 lines
2.6 KiB
Go
package routes
|
|
|
|
import (
|
|
"fmt"
|
|
"git.wh64.net/devproje/kuma-archive/internal/service"
|
|
"github.com/gin-gonic/gin"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func checkAuth(ctx *gin.Context) (bool, error) {
|
|
privdir := service.NewPrivDirService(nil)
|
|
dirs, err := privdir.Query()
|
|
if err != nil {
|
|
return true, nil
|
|
}
|
|
|
|
for _, dir := range dirs {
|
|
if !strings.HasPrefix(ctx.Request.URL.Path, dir.DirName) {
|
|
continue
|
|
}
|
|
|
|
auth := service.NewAuthService()
|
|
username, password, ok := ctx.Request.BasicAuth()
|
|
if !ok {
|
|
return false, nil
|
|
}
|
|
|
|
ok, err = auth.VerifyToken(username, password)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if !ok {
|
|
return false, nil
|
|
}
|
|
|
|
var acc *service.Account
|
|
acc, err = auth.Read(username)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
var path *service.PrivDir
|
|
privdir = service.NewPrivDirService(acc)
|
|
path, err = privdir.Read(dir.DirName)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if path == dir {
|
|
return true, nil
|
|
}
|
|
|
|
return false, nil
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func readPath(ctx *gin.Context) {
|
|
ok, err := checkAuth(ctx)
|
|
if err != nil {
|
|
ctx.Status(401)
|
|
return
|
|
}
|
|
|
|
if !ok {
|
|
ctx.Status(401)
|
|
return
|
|
}
|
|
|
|
worker := service.NewWorkerService()
|
|
path := ctx.Param("path")
|
|
|
|
data, err := worker.Read(path)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
ctx.Status(404)
|
|
return
|
|
}
|
|
|
|
if !data.IsDir {
|
|
ctx.JSON(200, gin.H{
|
|
"ok": 1,
|
|
"path": path,
|
|
"total": data.FileSize,
|
|
"is_dir": false,
|
|
"entries": nil,
|
|
})
|
|
return
|
|
}
|
|
|
|
raw, err := os.ReadDir(data.Path)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
ctx.Status(500)
|
|
return
|
|
}
|
|
|
|
entries := make([]service.DirEntry, 0)
|
|
for _, entry := range raw {
|
|
var finfo os.FileInfo
|
|
finfo, err = entry.Info()
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
continue
|
|
}
|
|
|
|
entries = append(entries, service.DirEntry{
|
|
Name: entry.Name(),
|
|
Path: filepath.Join(path, entry.Name()),
|
|
Date: finfo.ModTime().Unix(),
|
|
FileSize: uint64(finfo.Size()),
|
|
IsDir: finfo.IsDir(),
|
|
})
|
|
}
|
|
|
|
ctx.JSON(200, gin.H{
|
|
"ok": 1,
|
|
"path": path,
|
|
"total": data.FileSize,
|
|
"is_dir": true,
|
|
"entries": entries,
|
|
})
|
|
}
|
|
|
|
func downloadPath(ctx *gin.Context) {
|
|
ok, err := checkAuth(ctx)
|
|
if err != nil {
|
|
ctx.Status(401)
|
|
return
|
|
}
|
|
|
|
if !ok {
|
|
ctx.Status(401)
|
|
return
|
|
}
|
|
|
|
worker := service.NewWorkerService()
|
|
path := ctx.Param("path")
|
|
data, err := worker.Read(path)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
|
ctx.Status(404)
|
|
return
|
|
}
|
|
|
|
if data.IsDir {
|
|
ctx.String(400, "current path is not file")
|
|
return
|
|
}
|
|
|
|
ctx.FileAttachment(data.Path, data.Name)
|
|
}
|