dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 4110fee2c067fa1c58b7b2ed5e326158b4fa0958
parent 6591a8106d5729653c96d5ba69d74e9526affaf3
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Sat, 28 Jan 2023 18:50:17 -0800

remove battleship hack

Diffstat:
Mpkg/web/handlers/api/v1/battleship.go | 63+++++++++++++++++++++++++++++++++++----------------------------
Mpkg/web/handlers/api/v1/handlers.go | 16++++++++++++++++
Mpkg/web/handlers/api/v1/topBarHandler.go | 4+---
Mpkg/web/middlewares/middlewares.go | 6++----
Mpkg/web/web.go | 1+
5 files changed, 55 insertions(+), 35 deletions(-)

diff --git a/pkg/web/handlers/api/v1/battleship.go b/pkg/web/handlers/api/v1/battleship.go @@ -280,7 +280,7 @@ func generateCard() *BSCard { return c } -func (g *BSGame) drawCardFor(tmp int, isNewGame, shipDead, gameEnded bool, shipStr, pos string) (out string) { +func (g *BSGame) drawCardFor(tmp int, roomName string, isNewGame, shipDead, gameEnded bool, shipStr, pos string) (out string) { you := g.player1 enemy := g.player2 if tmp == 1 { @@ -473,7 +473,9 @@ Against <span {{ .EnemyUserStyle | HTMLAttr }}>@{{ .EnemyUsername }}</span><br / <tr> <td><img src="data:image/png;base64,{{ .ImgB64 }}" alt="" /></td> <td style="vertical-align: top;"> - <form method="post" style="margin-left: 10px;" action="/api/v1/chat/top-bar/battleship" target="iframe1"> + <form method="post" style="margin-left: 10px;" action="/api/v1/battleship"> + <input type="hidden" name="room" value="{{ .RoomName }}" /> + <input type="hidden" name="enemyUsername" value="{{ .EnemyUsername }}" /> <table style="width: 177px; height: 177px; background-image: url(data:image/png;base64,{{ .Img1B64 }})"> <tr style="height: 16px;"><td colspan="11">&nbsp;</td></tr> {{- range $row := .Rows -}} @@ -483,7 +485,7 @@ Against <span {{ .EnemyUserStyle | HTMLAttr }}>@{{ .EnemyUsername }}</span><br / {{- if NotShot $row $col -}} {{- if and $.YourTurn (not $.GameEnded) -}} <td style="width: 16px;"> - <button style="height: 15px; width: 15px;" name="message" value="/pm {{ $.EnemyUsername }} /bs {{ GetRune $row }}{{ $col }}"></button> + <button style="height: 15px; width: 15px;" name="move" value="{{ GetRune $row }}{{ $col }}"></button> </td> {{- else -}} <td style="width: 16px;"></td> @@ -501,6 +503,7 @@ Against <span {{ .EnemyUserStyle | HTMLAttr }}>@{{ .EnemyUsername }}</span><br / </table> ` data := map[string]any{ + "RoomName": roomName, "EnemyUserStyle": enemy.userStyle, "EnemyUsername": enemy.username, "IsNewGame": isNewGame, @@ -532,68 +535,72 @@ Against <span {{ .EnemyUserStyle | HTMLAttr }}>@{{ .EnemyUsername }}</span><br / } func (b *Battleship) InterceptMsg(cmd *Command) { - b.Lock() - defer b.Unlock() m := bsRgx.FindStringSubmatch(cmd.message) if len(m) != 3 { return } + enemyUsername := m[1] + pos := m[2] + if err := b.playMove(cmd.room.Name, cmd.room.ID, cmd.roomKey, *cmd.authUser, enemyUsername, pos); err != nil { + cmd.err = err + return + } + cmd.err = ErrStop + return +} - user, err := database.GetUserByUsername(m[1]) +func (b *Battleship) playMove(roomName string, roomID database.RoomID, roomKey string, authUser database.User, enemyUsername, pos string) error { + b.Lock() + defer b.Unlock() + + user, err := database.GetUserByUsername(enemyUsername) if err != nil { - cmd.err = errors.New("invalid username") - return + return errors.New("invalid username") } var gameKey string - if cmd.fromUserID < user.ID { - gameKey = fmt.Sprintf("%d_%d", cmd.fromUserID, user.ID) + if authUser.ID < user.ID { + gameKey = fmt.Sprintf("%d_%d", authUser.ID, user.ID) } else { - gameKey = fmt.Sprintf("%d_%d", user.ID, cmd.fromUserID) + gameKey = fmt.Sprintf("%d_%d", user.ID, authUser.ID) } - pos := m[2] - var shipStr string var isNewGame, shipDead, gameEnded bool g, ok := b.games[gameKey] if ok { - if !g.IsPlayerTurn(cmd.fromUserID) { - cmd.err = errors.New("not your turn") - return + if !g.IsPlayerTurn(authUser.ID) { + return errors.New("not your turn") } shipStr, shipDead, gameEnded, err = g.Shot(pos) if err != nil { - cmd.err = err - return + return err } } else { if pos != "" { - cmd.err = errors.New("no Game ongoing") - return + return errors.New("no Game ongoing") } - g = newGame(user, *cmd.authUser) + g = newGame(user, authUser) b.games[gameKey] = g isNewGame = true } // Delete old messages sent by "0" to the players if err := database.DB. - Where("room_id = ? AND user_id = ? AND (to_user_id = ? OR to_user_id = ?)", cmd.room.ID, b.zeroID, g.player1.id, g.player2.id). + Where("room_id = ? AND user_id = ? AND (to_user_id = ? OR to_user_id = ?)", roomID, b.zeroID, g.player1.id, g.player2.id). Delete(&database.ChatMessage{}).Error; err != nil { logrus.Error(err) } - card1 := g.drawCardFor(0, isNewGame, shipDead, gameEnded, shipStr, pos) - _, _ = database.CreateMsg(card1, card1, cmd.roomKey, cmd.room.ID, b.zeroID, &g.player1.id) + card1 := g.drawCardFor(0, roomName, isNewGame, shipDead, gameEnded, shipStr, pos) + _, _ = database.CreateMsg(card1, card1, roomKey, roomID, b.zeroID, &g.player1.id) - card2 := g.drawCardFor(1, isNewGame, shipDead, gameEnded, shipStr, pos) - _, _ = database.CreateMsg(card2, card2, cmd.roomKey, cmd.room.ID, b.zeroID, &g.player2.id) + card2 := g.drawCardFor(1, roomName, isNewGame, shipDead, gameEnded, shipStr, pos) + _, _ = database.CreateMsg(card2, card2, roomKey, roomID, b.zeroID, &g.player2.id) if gameEnded { delete(b.games, gameKey) } - cmd.dataMessage = "/pm " + user.Username + " " - cmd.err = ErrStop + return nil } diff --git a/pkg/web/handlers/api/v1/handlers.go b/pkg/web/handlers/api/v1/handlers.go @@ -509,3 +509,19 @@ func CaptchaSolverHandler(c echo.Context) error { } return c.JSON(http.StatusOK, map[string]any{"answer": answer}) } + +func BattleshipHandler(c echo.Context) error { + authUser := c.Get("authUser").(*database.User) + roomName := c.Request().PostFormValue("room") + enemyUsername := c.Request().PostFormValue("enemyUsername") + pos := c.Request().PostFormValue("move") + redirectURL := "/api/v1/chat/messages/" + roomName + room, roomKey, err := dutils.GetRoomAndKey(c, roomName) + if err != nil { + return c.Redirect(http.StatusFound, redirectURL+"?error="+err.Error()+"&errorTs="+utils.FormatInt64(time.Now().Unix())) + } + if err = BattleshipInstance.playMove(roomName, room.ID, roomKey, *authUser, enemyUsername, pos); err != nil { + return c.Redirect(http.StatusFound, redirectURL+"?error="+err.Error()+"&errorTs="+utils.FormatInt64(time.Now().Unix())) + } + return c.Redirect(http.StatusFound, redirectURL) +} diff --git a/pkg/web/handlers/api/v1/topBarHandler.go b/pkg/web/handlers/api/v1/topBarHandler.go @@ -209,9 +209,7 @@ func ChatTopBarHandler(c echo.Context) error { authUser := c.Get("authUser").(*database.User) var data chatTopBarData data.RoomName = c.Param("roomName") - if data.RoomName == "battleship" { - data.RoomName = "general" - } else if data.RoomName == "chess" { + if data.RoomName == "chess" { data.RoomName = "general" } diff --git a/pkg/web/middlewares/middlewares.go b/pkg/web/middlewares/middlewares.go @@ -173,7 +173,8 @@ func CSRFMiddleware() echo.MiddlewareFunc { SameSite: http.SameSiteLaxMode, Skipper: func(c echo.Context) bool { apiKey := c.Request().Header.Get("DKF_API_KEY") - if apiKey != "" && strings.HasPrefix(c.Path(), "/api/v1/") { + if (apiKey != "" && strings.HasPrefix(c.Path(), "/api/v1/")) || + c.Path() == "/api/v1/battleship" { return true } if c.Path() == "/chess/:key" { @@ -182,9 +183,6 @@ func CSRFMiddleware() echo.MiddlewareFunc { if strings.HasPrefix(c.Path(), "/api/v1/chat/top-bar/:roomName") && c.Param("roomName") == "werewolf" { return true } - if strings.HasPrefix(c.Path(), "/api/v1/chat/top-bar/:roomName") && c.Param("roomName") == "battleship" { - return true - } if strings.HasPrefix(c.Path(), "/api/v1/chat/top-bar/:roomName") && c.Param("roomName") == "chess" { return true } diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -134,6 +134,7 @@ func getMainServer(i18nBundle *i18n.Bundle, renderer *tmp.Templates) echo.Handle authGroup.POST("/two-factor-authentication/disable", handlers.TwoFactorAuthenticationDisableHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 2)) authGroup.GET("/api/v1/captcha-svc", v1.GetCaptchaHandler) authGroup.POST("/api/v1/chat/:roomID/notifier", v1.RoomNotifierHandler) + authGroup.POST("/api/v1/battleship", v1.BattleshipHandler) authGroup.POST("/api/v1/captcha/solver", v1.CaptchaSolverHandler) authGroup.GET("/api/v1/chat/top-bar/:roomName", v1.ChatTopBarHandler) authGroup.POST("/api/v1/chat/top-bar/:roomName", v1.ChatTopBarHandler, middlewares.AuthRateLimitMiddleware(1*time.Second, 3))