dkforest

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

commit 44d4ca0f428f45d8bd815ee0d18efe0b895ef2e6
parent ed851a939d644b994430d7e9dd03294345e46bbe
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon,  3 Apr 2023 16:32:08 -0700

cleanup websocket test

Diffstat:
Mpkg/web/handlers/api/v1/handlers.go | 143+++++++++++--------------------------------------------------------------------
Mpkg/web/public/views/pages/home.gohtml | 3++-
Mpkg/web/web.go | 2+-
3 files changed, 23 insertions(+), 125 deletions(-)

diff --git a/pkg/web/handlers/api/v1/handlers.go b/pkg/web/handlers/api/v1/handlers.go @@ -84,9 +84,7 @@ var memeRenameRgx = regexp.MustCompile(`^/meme ([a-zA-Z0-9_-]{3,50}) ([a-zA-Z0-9 var memeRemoveRgx = regexp.MustCompile(`^/memerm ([a-zA-Z0-9_-]{3,50})$`) var memesRgx = regexp.MustCompile(`^/memes$`) -// ChatMessagesHandler room messages iframe handler -// The chat messages iframe use this endpoint to get the messages for a room. -func ChatMessagesHandler(c echo.Context) error { +func chatMessages(c echo.Context) (status int, data chatMessagesData) { authCookie, _ := c.Cookie(hutils.AuthCookieName) authUser := c.Get("authUser").(*database.User) db := c.Get("database").(*database.DkfDB) @@ -97,10 +95,10 @@ func ChatMessagesHandler(c echo.Context) error { room, err := db.GetChatRoomByName(roomName) if err != nil { - return c.NoContent(http.StatusNotFound) + return http.StatusNotFound, data } if !room.HasAccess(c) { - return c.NoContent(http.StatusForbidden) + return http.StatusForbidden, data } managers.ActiveUsers.UpdateUserInRoom(room, managers.NewUserInfo(*authUser, nil)) @@ -122,18 +120,16 @@ func ChatMessagesHandler(c echo.Context) error { if room.IsProtected() { key, err := hutils.GetRoomKeyCookie(c, int64(room.ID)) if err != nil { - return c.NoContent(http.StatusForbidden) + return http.StatusForbidden, data } if err := msgs.DecryptAll(key.Value); err != nil { - return c.NoContent(http.StatusInternalServerError) + return http.StatusInternalServerError, data } } // Update read record db.UpdateChatReadRecord(authUser.ID, room.ID) - var data chatMessagesData - data.Error = c.QueryParam("error") if data.Error != "" { errorDisplayTime := int64(4) // Time in seconds @@ -202,10 +198,19 @@ func ChatMessagesHandler(c echo.Context) error { data.TaggedSound = utils.TernaryOrZero(authUser.NotifyTagged, taggedSound) } + return http.StatusOK, data +} + +// ChatMessagesHandler room messages iframe handler +// The chat messages iframe use this endpoint to get the messages for a room. +func ChatMessagesHandler(c echo.Context) error { + status, data := chatMessages(c) + if status != http.StatusOK { + return c.NoContent(status) + } if c.QueryParams().Has("json") { return c.JSON(http.StatusOK, data) } - return c.Render(http.StatusOK, "chat-messages", data) } @@ -213,127 +218,19 @@ func ChatMessagesWSHandler(c echo.Context) error { websocket.Handler(func(ws *websocket.Conn) { defer ws.Close() for { - authCookie, _ := c.Cookie(hutils.AuthCookieName) - authUser := c.Get("authUser").(*database.User) - db := c.Get("database").(*database.DkfDB) - roomName := "general" - - pmOnlyQuery := dutils.DoParsePmDisplayMode(c.QueryParam("pmonly")) - mentionsOnlyQuery := utils.DoParseBool(c.QueryParam("mentionsOnly")) - - room, err := db.GetChatRoomByName(roomName) - if err != nil { - return - } - if !room.HasAccess(c) { + status, data := chatMessages(c) + if status != http.StatusOK { + logrus.Error(status) return } - managers.ActiveUsers.UpdateUserInRoom(room, managers.NewUserInfo(*authUser, nil)) - - ignoredSet := hashset.New[string]() - // Only fill the ignored set if the user does not display the ignored users ("Toggle ignored" chat setting) - // and if the user has "Hide ignored users from users lists" enabled (user setting) - if !authUser.DisplayIgnored && authUser.HideIgnoredUsersFromList { - ignoredUsers, _ := db.GetIgnoredUsers(authUser.ID) - for _, ignoredUser := range ignoredUsers { - ignoredSet.Insert(ignoredUser.IgnoredUser.Username) - } - } - - membersInRoom, membersInChat := managers.ActiveUsers.GetRoomUsers(room, ignoredSet) - displayHellbanned := authUser.DisplayHellbanned || authUser.IsHellbanned - displayIgnoredMessages := false - msgs, _ := db.GetChatMessages(room.ID, authUser.Username, authUser.ID, pmOnlyQuery, mentionsOnlyQuery, displayHellbanned, authUser.DisplayIgnored, authUser.DisplayModerators, displayIgnoredMessages) - if room.IsProtected() { - key, err := hutils.GetRoomKeyCookie(c, int64(room.ID)) - if err != nil { - return - } - if err := msgs.DecryptAll(key.Value); err != nil { - return - } - } - - // Update read record - db.UpdateChatReadRecord(authUser.ID, room.ID) - - var data chatMessagesData - - data.Error = c.QueryParam("error") - if data.Error != "" { - errorDisplayTime := int64(4) // Time in seconds - nowUnix := time.Now().Unix() - data.ErrorTs = utils.DoParseInt64(c.QueryParam("errorTs")) - if nowUnix > data.ErrorTs+errorDisplayTime { - data.Error = "" - } - } - - // If your tutorial was reset (you are not a new user), force display manual refresh popup - if ((room.IsOfficialRoom() || (room.IsListed && !room.IsProtected())) && !authUser.TutorialCompleted()) && - authUser.GeneralMessagesCount > 0 { - data.ForceManualRefresh = true - } - - data.ManualRefreshTimeout = authUser.RefreshRate + 25 - data.DateFormat = authUser.GetDateFormat() - data.IsModerator = authUser.IsModerator() - data.Messages = msgs - data.Members = membersInRoom - data.MembersInChat = membersInChat - for _, user := range membersInChat { - if !user.IsHellbanned { - data.VisibleMemberInChat = true - break - } - } - data.RoomName = room.Name - if _, found := c.QueryParams()["ml"]; found { - topBarQueryParams := url.Values{} - topBarQueryParams.Set("ml", "1") - topBarQueryParamsStr := topBarQueryParams.Encode() - if topBarQueryParamsStr != "" { - topBarQueryParamsStr = "&" + topBarQueryParamsStr - } - data.TopBarQueryParams = topBarQueryParamsStr - } - data.PreventRefresh = utils.DoParseBool(c.QueryParam("r")) - - sessionToken := "" - if authCookie != nil { - sessionToken = authCookie.Value - } - data.InboxCount = global.GetUserNotificationCount(db, authUser.ID, sessionToken) - - data.ReadMarker, _ = db.GetUserReadMarker(authUser.ID, room.ID) - data.OfficialRooms, _ = db.GetOfficialChatRooms1(authUser.ID) - data.SubscribedRooms, _ = db.GetUserRoomSubscriptions(authUser.ID) - - bools := []bool{authUser.DisplayDeleteButton} - if authUser.IsModerator() { - bools = append(bools, authUser.DisplayHellbanButton, authUser.DisplayKickButton) - } - data.NbButtons = utils.CountBools(bools...) - - if authUser.NotifyNewMessage || authUser.NotifyPmmed || authUser.NotifyTagged { - lastKnownDate := "" - if lastKnownDateCookie, err := hutils.GetLastMsgCookie(c, roomName); err == nil { - lastKnownDate = lastKnownDateCookie.Value - } - newMessageSound, pmSound, taggedSound, lastMessageCreatedAt := shouldPlaySound(authUser, lastKnownDate, msgs) - hutils.CreateLastMsgCookie(c, roomName, lastMessageCreatedAt) - data.NewMessageSound = utils.TernaryOrZero(authUser.NotifyNewMessage, newMessageSound) - data.PmSound = utils.TernaryOrZero(authUser.NotifyPmmed, pmSound) - data.TaggedSound = utils.TernaryOrZero(authUser.NotifyTagged, taggedSound) - } - buf := bytes.Buffer{} _ = c.Echo().Renderer.Render(&buf, "chat-messages", data, c) out := string(buf.Bytes()) out = strings.Replace(out, `http-equiv="refresh" content=`, `placeholder=`, 1) if err := websocket.Message.Send(ws, out); err != nil { - c.Logger().Error(err) + logrus.Error(err) + return } time.Sleep(5 * time.Second) diff --git a/pkg/web/public/views/pages/home.gohtml b/pkg/web/public/views/pages/home.gohtml @@ -355,7 +355,8 @@ FoEVD2av5BES9MvnPsQulj9bU2</span><span class="gpg_fw">l</span><span class="gpg_e <a class="button greenbtn" href='javascript:(function(){ window.stop(); document.getElementsByName("iframe2")[0].contentWindow.document.getElementsByTagName("meta")[0].remove(); - const socket = new WebSocket("ws://dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion/ws"); + const socket = new WebSocket("ws://dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion/ws/general"); + /*const socket = new WebSocket("ws://127.0.0.1:8080/ws/general");*/ socket.onmessage = function(evt) { document.getElementsByName("iframe2")[0].contentWindow.document.body.innerHTML = evt.data; }; diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -65,7 +65,7 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te e.POST("/bhc", handlers.BHCHandler, middlewares.CircuitRateLimitMiddleware(5*time.Second, 4, true)) e.GET("/public/css/:signupToken/signup.css", handlers.SignupCss, middlewares.CircuitRateLimitMiddleware(15*time.Second, 4, false)) e.GET("/public/img/:signupToken/:signal/:data", handlers.SignalCss, middlewares.CircuitRateLimitMiddleware(15*time.Second, 4, false)) - e.GET("/ws", v1.ChatMessagesWSHandler) + e.GET("/ws/:roomName", v1.ChatMessagesWSHandler) noAuthGroup := e.Group("", middlewares.NoAuthMiddleware) noAuthGroup.GET("/login", handlers.LoginHandler, middlewares.CircuitRateLimitMiddleware(1*time.Second, 4, false)) noAuthGroup.POST("/login", handlers.LoginHandler, middlewares.CircuitRateLimitMiddleware(1*time.Second, 4, false))