diff --git a/database/database.go b/database/database.go index a24b9de..5264739 100644 --- a/database/database.go +++ b/database/database.go @@ -99,14 +99,14 @@ func AddUser(username string, password []byte) error { } // AddAdmin register a user and set his role to admin -func AddAdmin(username string, password []byte) error { +/*func AddAdmin(username string, password []byte) error { user := &User{ Username: username, Password: password, Role: adminRole, } return db.Save(user).Error -} +}*/ // GameInfoById return information of a game func GameInfoById(userId, gameId int) (*Game, error) { diff --git a/database/model.go b/database/model.go index 7d41792..c61924b 100644 --- a/database/model.go +++ b/database/model.go @@ -3,20 +3,20 @@ package database import "time" type User struct { - ID int `json:"id"` Username string `json:"username"` Role string `json:"role"` Password []byte `json:"-"` + ID int `json:"id"` IsAdmin bool `json:"is_admin" gorm:"-:all"` } type Game struct { - ID int `json:"id"` Name string `json:"name"` - Revision int `json:"rev"` PathStorage string `json:"-"` - Hash *string `json:"hash"` - LastUpdate *time.Time `json:"last_update"` + ID int `json:"id"` + Revision int `json:"rev"` UserId int `json:"-"` Available bool `json:"available"` + Hash *string `json:"hash"` + LastUpdate *time.Time `json:"last_update"` } diff --git a/server/data.go b/server/data.go index b98f5f9..72ae580 100644 --- a/server/data.go +++ b/server/data.go @@ -5,6 +5,7 @@ import ( "github.com/go-chi/chi/v5" "io" "log" + "mime/multipart" "net/http" "opensavecloudserver/config" "opensavecloudserver/database" @@ -165,8 +166,13 @@ func UploadSave(w http.ResponseWriter, r *http.Request) { log.Println(err) return } - defer file.Close() - err = upload.UploadSave(file, game) + defer func(file multipart.File) { + err := file.Close() + if err != nil { + log.Println(err) + } + }(file) + err = upload.ProcessFile(file, game) if err != nil { internalServerError(w, r) log.Println(err) @@ -216,7 +222,12 @@ func Download(w http.ResponseWriter, r *http.Request) { log.Println(err) return } - defer file.Close() + defer func(file *os.File) { + err := file.Close() + if err != nil { + log.Println(err) + } + }(file) _, err = io.Copy(w, file) if err != nil { internalServerError(w, r) diff --git a/server/server.go b/server/server.go index 4ee2919..18eae88 100644 --- a/server/server.go +++ b/server/server.go @@ -44,6 +44,10 @@ func Serve() { secureRouter.Get("/information", UserInformation) secureRouter.Post("/passwd", ChangePassword) }) + r.Route("/admin", func(secureRouter chi.Router) { + secureRouter.Use(authMiddleware) + secureRouter.Use(adminMiddleware) + }) r.Route("/game", func(secureRouter chi.Router) { secureRouter.Use(authMiddleware) secureRouter.Post("/create", CreateGame) diff --git a/upload/upload.go b/upload/upload.go index bba616f..b2be337 100644 --- a/upload/upload.go +++ b/upload/upload.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/google/uuid" "io" + "log" "mime/multipart" "opensavecloudserver/config" "opensavecloudserver/database" @@ -43,16 +44,30 @@ func MoveFile(sourcePath, destPath string) error { } outputFile, err := os.Create(destPath) if err != nil { - inputFile.Close() + err := inputFile.Close() + if err != nil { + return err + } return fmt.Errorf("couldn't open dest file: %s", err) } - defer outputFile.Close() + defer func(outputFile *os.File) { + err := outputFile.Close() + if err != nil { + log.Println(err) + } + }(outputFile) _, err = io.Copy(outputFile, inputFile) if err != nil { - inputFile.Close() + err := inputFile.Close() + if err != nil { + return err + } return fmt.Errorf("writing to output file failed: %s", err) } - inputFile.Close() + err = inputFile.Close() + if err != nil { + return err + } // The copy was successful, so now delete the original file err = os.Remove(sourcePath) if err != nil { @@ -92,7 +107,7 @@ func CheckUploadToken(uploadToken string) (int, bool) { return -1, false } -func UploadSave(file multipart.File, game *database.Game) error { +func ProcessFile(file multipart.File, game *database.Game) error { filePath := path.Join(config.Path().Cache, strconv.Itoa(game.UserId)) if _, err := os.Stat(filePath); err != nil { err = os.Mkdir(filePath, 0766) @@ -105,7 +120,12 @@ func UploadSave(file multipart.File, game *database.Game) error { if err != nil { return err } - defer f.Close() + defer func(f *os.File) { + err := f.Close() + if err != nil { + log.Println(err) + } + }(f) _, err = io.Copy(f, file) if err != nil { return err