commit 44d4ca0f428f45d8bd815ee0d18efe0b895ef2e6
parent ed851a939d644b994430d7e9dd03294345e46bbe
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Mon, 3 Apr 2023 16:32:08 -0700
cleanup websocket test
Diffstat:
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))