feat: middle save
This commit is contained in:
parent
69a0e226b7
commit
e1d0c5bc88
4 changed files with 91 additions and 10 deletions
8
internal/middleware/header.go
Normal file
8
internal/middleware/header.go
Normal 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()
|
||||||
|
}
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue