diff --git a/main.go b/main.go index 37dea84..c54a580 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,7 @@ import ( "github.com/gin-gonic/gin" "github.com/hashicorp/go-version" "github.com/jinzhu/gorm" + "github.com/notnil/chess" ) func checkUser(c *gin.Context) (*db.User, *db.Client, uint64, error) { @@ -595,6 +596,20 @@ func checkPermissionExpr(expr string, user db.User, trainingRunId uint64, engine return value.(bool) } +func validatePgn(file string) error { + data, err := os.Open(file) + if err != nil { + log.Println("readfile error in file %v", file) + log.Println(err) + return err + } + + pgn, err := chess.PGN(data) + if pgn != nil {} + + return err +} + func uploadGame(c *gin.Context) { user, client, version, err := checkUser(c) if err != nil { @@ -724,6 +739,15 @@ func uploadGame(c *gin.Context) { return } + if config.Config.Clients.VerifyPgns { + parsingErr := validatePgn(game_path) + if parsingErr != nil { + fmt.Println("corrupt pgn file exited with error: %v", parsingErr) + c.String(500, "internal error") + return + } + } + // Save pgn pgn_path := fmt.Sprintf("pgns/run%d/%d.pgn", training_run.ID, nextGameNumber) os.MkdirAll(filepath.Dir(pgn_path), os.ModePerm) diff --git a/src/config/config.go b/src/config/config.go index 8e5b4ac..b6ff470 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -18,6 +18,7 @@ var Config struct { NextClientVersion uint64 MinEngineVersion string NextEngineVersion string + VerifyPgns bool } URLs struct { OnNewNetwork []string