feat: middle save

This commit is contained in:
Project_IO 2025-03-22 17:36:36 +09:00
parent 69a0e226b7
commit e1d0c5bc88
4 changed files with 91 additions and 10 deletions

View file

@ -0,0 +1,8 @@
package middleware
import "github.com/gin-gonic/gin"
func Header(ctx *gin.Context) {
ctx.Header("X-Powered-By", "Golang")
ctx.Next()
}

View file

@ -9,14 +9,13 @@ import (
func New(app *gin.Engine, version *service.Version, apiOnly bool) { func New(app *gin.Engine, version *service.Version, apiOnly bool) {
app.Use(middleware.CORS) app.Use(middleware.CORS)
app.Use(middleware.Header)
app.Use(middleware.BasicAuth) app.Use(middleware.BasicAuth)
api := app.Group("/api") api := app.Group("/api")
api.GET("/path/*path", readPath) api.GET("/path/*path", readPath)
api.GET("/download/*path", downloadPath) api.GET("/download/*path", downloadPath)
api.POST("/private")
authentication(api.Group("/auth")) authentication(api.Group("/auth"))
api.GET("/version", func(ctx *gin.Context) { api.GET("/version", func(ctx *gin.Context) {

View file

@ -6,9 +6,71 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"os" "os"
"path/filepath" "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) { 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() worker := service.NewWorkerService()
path := ctx.Param("path") path := ctx.Param("path")
@ -42,7 +104,7 @@ func readPath(ctx *gin.Context) {
var finfo os.FileInfo var finfo os.FileInfo
finfo, err = entry.Info() finfo, err = entry.Info()
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err) _, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
continue continue
} }
@ -65,6 +127,17 @@ func readPath(ctx *gin.Context) {
} }
func downloadPath(ctx *gin.Context) { 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() worker := service.NewWorkerService()
path := ctx.Param("path") path := ctx.Param("path")
data, err := worker.Read(path) data, err := worker.Read(path)

View file

@ -32,10 +32,11 @@ func init() {
owner varchar(25), owner varchar(25),
constraint PK_PrivDir_ID primary key(id), constraint PK_PrivDir_ID primary key(id),
constraint FK_Owner_ID foreign key(owner) constraint FK_Owner_ID foreign key(owner)
references(Account.username) on update cascade on delete cascade references Account(username) on update cascade on delete cascade
); );
`)) `))
if err != nil { if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
return return
} }
defer stmt.Close() defer stmt.Close()
@ -52,7 +53,7 @@ func NewPrivDirService(acc *Account) *PrivDirService {
} }
} }
func (sv *PrivDirService) CreatePriv(dirname string) error { func (sv *PrivDirService) Create(dirname string) error {
db, err := Open() db, err := Open()
if err != nil { if err != nil {
return err return err
@ -70,7 +71,7 @@ func (sv *PrivDirService) CreatePriv(dirname string) error {
return nil return nil
} }
func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) { func (sv *PrivDirService) Read(dirname string) (*PrivDir, error) {
db, err := Open() db, err := Open()
if err != nil { if err != nil {
return nil, err return nil, err
@ -83,7 +84,7 @@ func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) {
} }
defer stmt.Close() defer stmt.Close()
row := stmt.QueryRow(name, sv.acc.Username) row := stmt.QueryRow(dirname, sv.acc.Username)
var data PrivDir var data PrivDir
if err = row.Scan(&data.Id, &data.DirName, &data.Owner); err != nil { if err = row.Scan(&data.Id, &data.DirName, &data.Owner); err != nil {
@ -93,7 +94,7 @@ func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) {
return &data, nil return &data, nil
} }
func (sv *PrivDirService) DeletePriv(name string) error { func (sv *PrivDirService) Delete(dirname string) error {
db, err := Open() db, err := Open()
if err != nil { if err != nil {
return err return err
@ -106,7 +107,7 @@ func (sv *PrivDirService) DeletePriv(name string) error {
} }
defer stmt.Close() defer stmt.Close()
_, err = stmt.Exec(name, sv.acc.Username) _, err = stmt.Exec(dirname, sv.acc.Username)
if err != nil { if err != nil {
return err return err
} }
@ -114,7 +115,7 @@ func (sv *PrivDirService) DeletePriv(name string) error {
return nil return nil
} }
func (sv *PrivDirService) QueryPriv() ([]*PrivDir, error) { func (sv *PrivDirService) Query() ([]*PrivDir, error) {
db, err := Open() db, err := Open()
if err != nil { if err != nil {
return nil, err return nil, err