dkforest

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

commit 6acb4c819a1db4c179e78e332c8075c9d3b81a6d
parent e1762779dd795f8363ee876fd876f6bc4c78a34b
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed, 11 Jan 2023 10:21:20 -0800

move code

Diffstat:
Apkg/web/handlers/chat.go | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkg/web/handlers/handlers.go | 154-------------------------------------------------------------------------------
2 files changed, 167 insertions(+), 154 deletions(-)

diff --git a/pkg/web/handlers/chat.go b/pkg/web/handlers/chat.go @@ -0,0 +1,167 @@ +package handlers + +import ( + "dkforest/pkg/captcha" + "dkforest/pkg/config" + "dkforest/pkg/database" + "dkforest/pkg/utils" + hutils "dkforest/pkg/web/handlers/utils" + "github.com/labstack/echo" + "github.com/sirupsen/logrus" + "net/http" + "time" +) + +func chatHandler(c echo.Context, redRoom bool) error { + authUser := c.Get("authUser").(*database.User) + var data chatData + data.RedRoom = redRoom + preventRefresh := utils.DoParseBool(c.QueryParam("r")) + data.TogglePms = utils.DoParseInt64(c.QueryParam("pmonly")) + data.ToggleMentions = utils.DoParseBool(c.QueryParam("mentionsOnly")) + + v := c.QueryParams() + if preventRefresh { + v.Set("r", "1") + } + if data.TogglePms != 0 { + v.Set("pmonly", utils.FormatInt64(data.TogglePms)) + } + if data.ToggleMentions { + v.Set("mentionsOnly", "1") + } + if _, found := c.QueryParams()["ml"]; found { + v.Set("ml", "1") + data.Multiline = true + } + data.ChatQueryParams = "?" + v.Encode() + + if authUser == nil { + if config.SignupEnabled.IsFalse() { + return c.Render(http.StatusOK, "flash", FlashResponse{Message: "New signup are temporarily disabled", Redirect: "/", Type: "alert-danger"}) + } + + data.CaptchaID, data.CaptchaImg = captcha.New() + } + + roomName := c.Param("roomName") + if roomName == "" { + roomName = "general" + } + room, err := database.GetChatRoomByName(roomName) + if err != nil { + return c.Redirect(http.StatusFound, "/") + } + + if authUser != nil { + data.DisplayTutorial = (room.ID < 5 || (room.IsListed && !room.IsProtected())) && !authUser.TutorialCompleted() + + if data.DisplayTutorial { + data.TutoSecs = getTutorialStepDuration() + data.TutoFrames = generateCssFrames(data.TutoSecs, nil, true) + if c.Request().Method == http.MethodGet { + authUser.ChatTutorialTime = time.Now() + authUser.DoSave() + } + } + } + + if c.Request().Method == http.MethodPost { + + btnSubmit := c.Request().PostFormValue("btn_submit") + if btnSubmit == "logout" { + hutils.DeleteRoomCookie(c, int64(room.ID)) + return c.Redirect(http.StatusFound, "/chat") + } + + formName := c.Request().PostFormValue("formName") + switch formName { + case "toggle-hb": + if authUser.CanSeeHB() { + authUser.DisplayHellbanned = !authUser.DisplayHellbanned + authUser.DoSave() + } + return c.Redirect(http.StatusFound, c.Request().Referer()) + + case "toggle-m": + if authUser.IsModerator() { + authUser.DisplayModerators = !authUser.DisplayModerators + authUser.DoSave() + } + return c.Redirect(http.StatusFound, c.Request().Referer()) + + case "toggle-ignored": + authUser.DisplayIgnored = !authUser.DisplayIgnored + authUser.DoSave() + return c.Redirect(http.StatusFound, c.Request().Referer()) + + case "afk": + authUser.AFK = !authUser.AFK + authUser.DoSave() + return c.Redirect(http.StatusFound, c.Request().Referer()) + + case "update-read-marker": + database.UpdateChatReadMarker(authUser.ID, room.ID) + return c.Redirect(http.StatusFound, c.Request().Referer()) + + case "tutorialP1", "tutorialP2", "tutorialP3": + if authUser.ChatTutorial < 3 && time.Since(authUser.ChatTutorialTime) >= time.Duration(data.TutoSecs)*time.Second { + authUser.ChatTutorial++ + authUser.DoSave() + } + return c.Redirect(http.StatusFound, c.Request().Referer()) + + case "chat-password": + data.RoomPassword = c.Request().PostFormValue("password") + if authUser == nil { + data.GuestUsername = c.Request().PostFormValue("guest_username") + captchaID := c.Request().PostFormValue("captcha_id") + captchaInput := c.Request().PostFormValue("captcha") + if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil { + data.ErrCaptcha = err.Error() + return c.Render(http.StatusOK, "chat-password", data) + } + + if err := database.CanUseUsername(data.GuestUsername, false); err != nil { + data.ErrGuestUsername = err.Error() + return c.Render(http.StatusOK, "chat-password", data) + } + } + key := utils.Sha256([]byte(config.RoomPasswordSalt + data.RoomPassword))[:32] + hashedPassword := utils.Sha512([]byte(config.RoomPasswordSalt + data.RoomPassword)) + if hashedPassword != room.Password { + data.Error = "Invalid room password" + return c.Render(http.StatusOK, "chat-password", data) + } + + if authUser == nil { + password := utils.GenerateToken32() + newUser, errs := database.CreateGuestUser(data.GuestUsername, password) + if errs.HasError() { + data.ErrGuestUsername = errs.Username + return c.Render(http.StatusOK, "chat-password", data) + } + + session, err := database.CreateSession(newUser.ID, c.Request().UserAgent()) + if err != nil { + logrus.Error("Failed to create session : ", err) + } + c.SetCookie(createSessionCookie(session.Token)) + } + + hutils.CreateRoomCookie(c, int64(room.ID), hashedPassword, key) + return c.Redirect(http.StatusFound, "/chat/"+room.Name) + } + + return c.Redirect(http.StatusFound, c.Request().Referer()) + } + + if !room.HasAccess(c) { + return c.Render(http.StatusOK, "chat-password", data) + } + + data.IsSubscribed = database.IsUserSubscribedToRoom(authUser.ID, room.ID) + data.Room = room + data.IsOfficialRoom = room.IsOfficialRoom() + return c.Render(http.StatusOK, "chat", data) +} diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -2241,160 +2241,6 @@ func getTutorialStepDuration() int64 { return secs } -func chatHandler(c echo.Context, redRoom bool) error { - authUser := c.Get("authUser").(*database.User) - var data chatData - data.RedRoom = redRoom - preventRefresh := utils.DoParseBool(c.QueryParam("r")) - data.TogglePms = utils.DoParseInt64(c.QueryParam("pmonly")) - data.ToggleMentions = utils.DoParseBool(c.QueryParam("mentionsOnly")) - - v := c.QueryParams() - if preventRefresh { - v.Set("r", "1") - } - if data.TogglePms != 0 { - v.Set("pmonly", utils.FormatInt64(data.TogglePms)) - } - if data.ToggleMentions { - v.Set("mentionsOnly", "1") - } - if _, found := c.QueryParams()["ml"]; found { - v.Set("ml", "1") - data.Multiline = true - } - data.ChatQueryParams = "?" + v.Encode() - - if authUser == nil { - if config.SignupEnabled.IsFalse() { - return c.Render(http.StatusOK, "flash", FlashResponse{Message: "New signup are temporarily disabled", Redirect: "/", Type: "alert-danger"}) - } - - data.CaptchaID, data.CaptchaImg = captcha.New() - } - - roomName := c.Param("roomName") - if roomName == "" { - roomName = "general" - } - room, err := database.GetChatRoomByName(roomName) - if err != nil { - return c.Redirect(http.StatusFound, "/") - } - - if authUser != nil { - data.DisplayTutorial = (room.ID < 5 || (room.IsListed && !room.IsProtected())) && !authUser.TutorialCompleted() - - if data.DisplayTutorial { - data.TutoSecs = getTutorialStepDuration() - data.TutoFrames = generateCssFrames(data.TutoSecs, nil, true) - if c.Request().Method == http.MethodGet { - authUser.ChatTutorialTime = time.Now() - authUser.DoSave() - } - } - } - - if c.Request().Method == http.MethodPost { - - btnSubmit := c.Request().PostFormValue("btn_submit") - if btnSubmit == "logout" { - hutils.DeleteRoomCookie(c, int64(room.ID)) - return c.Redirect(http.StatusFound, "/chat") - } - - formName := c.Request().PostFormValue("formName") - switch formName { - case "toggle-hb": - if authUser.CanSeeHB() { - authUser.DisplayHellbanned = !authUser.DisplayHellbanned - authUser.DoSave() - } - return c.Redirect(http.StatusFound, c.Request().Referer()) - - case "toggle-m": - if authUser.IsModerator() { - authUser.DisplayModerators = !authUser.DisplayModerators - authUser.DoSave() - } - return c.Redirect(http.StatusFound, c.Request().Referer()) - - case "toggle-ignored": - authUser.DisplayIgnored = !authUser.DisplayIgnored - authUser.DoSave() - return c.Redirect(http.StatusFound, c.Request().Referer()) - - case "afk": - authUser.AFK = !authUser.AFK - authUser.DoSave() - return c.Redirect(http.StatusFound, c.Request().Referer()) - - case "update-read-marker": - database.UpdateChatReadMarker(authUser.ID, room.ID) - return c.Redirect(http.StatusFound, c.Request().Referer()) - - case "tutorialP1", "tutorialP2", "tutorialP3": - if authUser.ChatTutorial < 3 && time.Since(authUser.ChatTutorialTime) >= time.Duration(data.TutoSecs)*time.Second { - authUser.ChatTutorial++ - authUser.DoSave() - } - return c.Redirect(http.StatusFound, c.Request().Referer()) - - case "chat-password": - data.RoomPassword = c.Request().PostFormValue("password") - if authUser == nil { - data.GuestUsername = c.Request().PostFormValue("guest_username") - captchaID := c.Request().PostFormValue("captcha_id") - captchaInput := c.Request().PostFormValue("captcha") - if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil { - data.ErrCaptcha = err.Error() - return c.Render(http.StatusOK, "chat-password", data) - } - - if err := database.CanUseUsername(data.GuestUsername, false); err != nil { - data.ErrGuestUsername = err.Error() - return c.Render(http.StatusOK, "chat-password", data) - } - } - key := utils.Sha256([]byte(config.RoomPasswordSalt + data.RoomPassword))[:32] - hashedPassword := utils.Sha512([]byte(config.RoomPasswordSalt + data.RoomPassword)) - if hashedPassword != room.Password { - data.Error = "Invalid room password" - return c.Render(http.StatusOK, "chat-password", data) - } - - if authUser == nil { - password := utils.GenerateToken32() - newUser, errs := database.CreateGuestUser(data.GuestUsername, password) - if errs.HasError() { - data.ErrGuestUsername = errs.Username - return c.Render(http.StatusOK, "chat-password", data) - } - - session, err := database.CreateSession(newUser.ID, c.Request().UserAgent()) - if err != nil { - logrus.Error("Failed to create session : ", err) - } - c.SetCookie(createSessionCookie(session.Token)) - } - - hutils.CreateRoomCookie(c, int64(room.ID), hashedPassword, key) - return c.Redirect(http.StatusFound, "/chat/"+room.Name) - } - - return c.Redirect(http.StatusFound, c.Request().Referer()) - } - - if !room.HasAccess(c) { - return c.Render(http.StatusOK, "chat-password", data) - } - - data.IsSubscribed = database.IsUserSubscribedToRoom(authUser.ID, room.ID) - data.Room = room - data.IsOfficialRoom = room.IsOfficialRoom() - return c.Render(http.StatusOK, "chat", data) -} - func ChatHelpHandler(c echo.Context) error { var data chatHelpData return c.Render(http.StatusOK, "chat-help", data)