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) {
|
||||
app.Use(middleware.CORS)
|
||||
app.Use(middleware.Header)
|
||||
app.Use(middleware.BasicAuth)
|
||||
|
||||
api := app.Group("/api")
|
||||
api.GET("/path/*path", readPath)
|
||||
api.GET("/download/*path", downloadPath)
|
||||
|
||||
api.POST("/private")
|
||||
|
||||
authentication(api.Group("/auth"))
|
||||
|
||||
api.GET("/version", func(ctx *gin.Context) {
|
||||
|
|
|
@ -6,9 +6,71 @@ import (
|
|||
"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")
|
||||
|
||||
|
@ -42,7 +104,7 @@ func readPath(ctx *gin.Context) {
|
|||
var finfo os.FileInfo
|
||||
finfo, err = entry.Info()
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -65,6 +127,17 @@ func readPath(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()
|
||||
path := ctx.Param("path")
|
||||
data, err := worker.Read(path)
|
||||
|
|
|
@ -32,10 +32,11 @@ func init() {
|
|||
owner varchar(25),
|
||||
constraint PK_PrivDir_ID primary key(id),
|
||||
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 {
|
||||
_, _ = fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
return
|
||||
}
|
||||
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()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -70,7 +71,7 @@ func (sv *PrivDirService) CreatePriv(dirname string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) {
|
||||
func (sv *PrivDirService) Read(dirname string) (*PrivDir, error) {
|
||||
db, err := Open()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -83,7 +84,7 @@ func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) {
|
|||
}
|
||||
defer stmt.Close()
|
||||
|
||||
row := stmt.QueryRow(name, sv.acc.Username)
|
||||
row := stmt.QueryRow(dirname, sv.acc.Username)
|
||||
var data PrivDir
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func (sv *PrivDirService) DeletePriv(name string) error {
|
||||
func (sv *PrivDirService) Delete(dirname string) error {
|
||||
db, err := Open()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -106,7 +107,7 @@ func (sv *PrivDirService) DeletePriv(name string) error {
|
|||
}
|
||||
defer stmt.Close()
|
||||
|
||||
_, err = stmt.Exec(name, sv.acc.Username)
|
||||
_, err = stmt.Exec(dirname, sv.acc.Username)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -114,7 +115,7 @@ func (sv *PrivDirService) DeletePriv(name string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sv *PrivDirService) QueryPriv() ([]*PrivDir, error) {
|
||||
func (sv *PrivDirService) Query() ([]*PrivDir, error) {
|
||||
db, err := Open()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
Loading…
Reference in a new issue