kuma-archive/internal/routes/worker.go
2025-03-22 17:36:36 +09:00

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)
}