diff --git a/app.go b/app.go index 0c3d3ee..ffd6e1e 100644 --- a/app.go +++ b/app.go @@ -26,6 +26,12 @@ func main() { command := commando.NewCommando(os.Args[1:]) cnf := config.Get() + // init auth module + auth := service.NewAuthService() + + // init priv module + _ = service.NewPrivDirService(nil) + ver := service.NewVersion(version, branch, hash) command.Root("daemon", "run file server", func(n *commando.Node) error { fmt.Printf("Kuma Archive %s\n", version) @@ -43,13 +49,10 @@ func main() { gin.SetMode(gin.ReleaseMode) } - // init auth module - service.NewAuthService() - app := gin.Default() routes.New(app, ver, apiOnly) - fmt.Fprintf(os.Stdout, "binding server at: http://0.0.0.0:%d\n", cnf.Port) + _, _ = fmt.Fprintf(os.Stdout, "binding server at: http://0.0.0.0:%d\n", cnf.Port) if err = app.Run(fmt.Sprintf(":%d", cnf.Port)); err != nil { return err } @@ -100,7 +103,6 @@ func main() { return errors.New("password check is not correct") } - auth := service.NewAuthService() if err = auth.Create(&service.Account{Username: username, Password: password}); err != nil { return err } diff --git a/internal/routes/mod.go b/internal/routes/mod.go index cc26daa..65a09bf 100644 --- a/internal/routes/mod.go +++ b/internal/routes/mod.go @@ -1,10 +1,6 @@ package routes import ( - "fmt" - "os" - "path/filepath" - "git.wh64.net/devproje/kuma-archive/internal/middleware" "git.wh64.net/devproje/kuma-archive/internal/service" "github.com/gin-contrib/static" @@ -42,78 +38,3 @@ func New(app *gin.Engine, version *service.Version, apiOnly bool) { ctx.File("/web/assets/favicon.ico") }) } - -func readPath(ctx *gin.Context) { - worker := service.NewWorkerService() - path := ctx.Param("path") - // TODO: prefix detect - // if strings.HasPrefix(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 { - 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) { - 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) -} diff --git a/internal/routes/privdir.go b/internal/routes/privdir.go new file mode 100644 index 0000000..0db51ae --- /dev/null +++ b/internal/routes/privdir.go @@ -0,0 +1 @@ +package routes diff --git a/internal/routes/worker.go b/internal/routes/worker.go new file mode 100644 index 0000000..98a762f --- /dev/null +++ b/internal/routes/worker.go @@ -0,0 +1,83 @@ +package routes + +import ( + "fmt" + "git.wh64.net/devproje/kuma-archive/internal/service" + "github.com/gin-gonic/gin" + "os" + "path/filepath" +) + +func readPath(ctx *gin.Context) { + 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) { + 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) +} diff --git a/internal/service/priv.go b/internal/service/priv.go deleted file mode 100644 index d97e309..0000000 --- a/internal/service/priv.go +++ /dev/null @@ -1,90 +0,0 @@ -package service - -import ( - "fmt" - "github.com/google/uuid" - "os" - "strings" -) - -type PrivDirService struct{} - -type PrivDir struct { - Id string `json:"id"` - DirName string `json:"dirname"` - Owner string `json:"owner"` -} - -func init() { - db, err := Open() - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "%v\n", err) - return - } - defer db.Close() - - stmt, err := db.Prepare(strings.TrimSpace(` - create table PrivDir( - id varchar(36), - dirname varchar(250) unique, - 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 - ); - `)) - if err != nil { - return - } - defer stmt.Close() - - if _, err = stmt.Exec(); err != nil { - _, _ = fmt.Fprintf(os.Stderr, "%v\n", err) - return - } -} - -func NewPrivDirService() *PrivDirService { - return &PrivDirService{} -} - -func (sv *PrivDirService) CreatePriv(dirname string, acc *Account) error { - db, err := Open() - if err != nil { - return err - } - defer db.Close() - - id := uuid.NewString() - stmt, err := db.Prepare("insert into PrivDir(id, name, owner) values (?, ?, ?);") - if err != nil { - return err - } - defer stmt.Close() - - _, err = stmt.Exec(id, dirname, acc.Username) - return nil -} - -func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) { - db, err := Open() - if err != nil { - return nil, err - } - defer db.Close() - - stmt, err := db.Prepare("select * from PrivDir where name = ?;") - if err != nil { - return nil, err - } - defer stmt.Close() - - row := stmt.QueryRow(name) - var data PrivDir - - if err = row.Scan(&data.Id, &data.DirName, &data.Owner); err != nil { - return nil, err - } - - return &data, nil -} diff --git a/internal/service/privdir.go b/internal/service/privdir.go new file mode 100644 index 0000000..a32f9ad --- /dev/null +++ b/internal/service/privdir.go @@ -0,0 +1,147 @@ +package service + +import ( + "fmt" + "github.com/google/uuid" + "os" + "strings" +) + +type PrivDirService struct { + acc *Account +} + +type PrivDir struct { + Id string `json:"id"` + DirName string `json:"dirname"` + Owner string `json:"owner"` +} + +func init() { + db, err := Open() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "%v\n", err) + return + } + defer db.Close() + + stmt, err := db.Prepare(strings.TrimSpace(` + create table PrivDir( + id varchar(36), + dirname varchar(250) unique, + 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 + ); + `)) + if err != nil { + return + } + defer stmt.Close() + + if _, err = stmt.Exec(); err != nil { + _, _ = fmt.Fprintf(os.Stderr, "%v\n", err) + return + } +} + +func NewPrivDirService(acc *Account) *PrivDirService { + return &PrivDirService{ + acc: acc, + } +} + +func (sv *PrivDirService) CreatePriv(dirname string) error { + db, err := Open() + if err != nil { + return err + } + defer db.Close() + + id := uuid.NewString() + stmt, err := db.Prepare("insert into PrivDir(id, dirname, owner) values (?, ?, ?);") + if err != nil { + return err + } + defer stmt.Close() + + _, err = stmt.Exec(id, dirname, sv.acc.Username) + return nil +} + +func (sv *PrivDirService) ReadPriv(name string) (*PrivDir, error) { + db, err := Open() + if err != nil { + return nil, err + } + defer db.Close() + + stmt, err := db.Prepare("select * from PrivDir where dirname = ? and owner = ?;") + if err != nil { + return nil, err + } + defer stmt.Close() + + row := stmt.QueryRow(name, sv.acc.Username) + var data PrivDir + + if err = row.Scan(&data.Id, &data.DirName, &data.Owner); err != nil { + return nil, err + } + + return &data, nil +} + +func (sv *PrivDirService) DeletePriv(name string) error { + db, err := Open() + if err != nil { + return err + } + defer db.Close() + + stmt, err := db.Prepare("delete from PrivDir where dirname = ? and owner = ?;") + if err != nil { + return err + } + defer stmt.Close() + + _, err = stmt.Exec(name, sv.acc.Username) + if err != nil { + return err + } + + return nil +} + +func (sv *PrivDirService) QueryPriv() ([]*PrivDir, error) { + db, err := Open() + if err != nil { + return nil, err + } + defer db.Close() + + stmt, err := db.Prepare("select * from PrivDir;") + if err != nil { + return nil, err + } + defer stmt.Close() + + rows, err := stmt.Query() + if err != nil { + return nil, err + } + defer rows.Close() + + var dirs []*PrivDir + for rows.Next() { + var data PrivDir + if err = rows.Scan(&data.Id, &data.DirName, &data.Owner); err != nil { + return nil, err + } + + dirs = append(dirs, &data) + } + + return dirs, nil +}