Upload game save

This commit is contained in:
Aurélie Delhaie
2022-05-22 19:05:05 +02:00
parent c4985717d8
commit c23838b14c
3 changed files with 174 additions and 8 deletions

View File

@@ -9,11 +9,15 @@ import (
"net/http"
"opensavecloudserver/authentication"
"opensavecloudserver/config"
"opensavecloudserver/database"
)
type ContextKey string
const UserIdKey ContextKey = "userId"
const (
UserIdKey ContextKey = "userId"
GameIdKey ContextKey = "gameId"
)
// Serve start the http server
func Serve() {
@@ -30,11 +34,17 @@ func Serve() {
r.Route("/system", func(systemRouter chi.Router) {
systemRouter.Get("/information", Information)
})
r.Group(func(secureRouter chi.Router) {
r.Route("/game", func(secureRouter chi.Router) {
secureRouter.Use(authMiddleware)
secureRouter.Post("/game/create", CreateGame)
secureRouter.Post("/game/upload/init", AskForUpload)
secureRouter.Post("/create", CreateGame)
secureRouter.Get("/{id}", GameInfoByID)
secureRouter.Post("/upload/init", AskForUpload)
secureRouter.Group(func(uploadRouter chi.Router) {
uploadRouter.Use(uploadMiddleware)
uploadRouter.Post("/upload", UploadSave)
})
})
})
})
log.Println("Server is listening...")
@@ -44,7 +54,7 @@ func Serve() {
}
}
// authMiddleware filter the request
// authMiddleware check the authentication token before accessing to the resource
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
header := r.Header.Get("Authorization")
@@ -63,6 +73,22 @@ func authMiddleware(next http.Handler) http.Handler {
})
}
// uploadMiddleware check the upload key before allowing to upload a file
func uploadMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
header := r.Header.Get("X-Upload-Key")
if len(header) > 0 {
if gameId, ok := database.CheckUploadToken(header); ok {
ctx := context.WithValue(r.Context(), GameIdKey, gameId)
r = r.WithContext(ctx)
next.ServeHTTP(w, r)
return
}
}
unauthorized(w, r)
})
}
func userIdFromContext(ctx context.Context) (int, error) {
if userId, ok := ctx.Value(UserIdKey).(int); ok {
return userId, nil
@@ -70,6 +96,13 @@ func userIdFromContext(ctx context.Context) (int, error) {
return 0, errors.New("userId not found in context")
}
func gameIdFromContext(ctx context.Context) (int, error) {
if gameId, ok := ctx.Value(GameIdKey).(int); ok {
return gameId, nil
}
return 0, errors.New("gameId not found in context")
}
func recovery(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {