From 50380ebc5c351c42e71e1d926b21041d7a7d8680 Mon Sep 17 00:00:00 2001 From: Roi Feng <37480123+Rayzggz@users.noreply.github.com> Date: Sat, 14 Jun 2025 21:11:50 -0400 Subject: [PATCH] feat: waiting room --- internal/server/checker.go | 28 +++-------- internal/server/torii.go | 99 +++++++++++++------------------------- 2 files changed, 40 insertions(+), 87 deletions(-) diff --git a/internal/server/checker.go b/internal/server/checker.go index bec7a59..4a99b4f 100644 --- a/internal/server/checker.go +++ b/internal/server/checker.go @@ -10,7 +10,6 @@ import ( "server_torii/internal/config" "server_torii/internal/dataType" "server_torii/internal/utils" - "strings" "time" ) @@ -116,29 +115,16 @@ func CheckMain(w http.ResponseWriter, userRequestData dataType.UserRequest, rule return } - responseData := string(decision.ResponseData) - parts := strings.Split(responseData, "|") - if len(parts) < 2 { - utils.LogError(userRequestData, fmt.Sprintf("Invalid responseData format: %s", responseData), "CheckMain") - http.Error(w, "500 - Internal Server Error", http.StatusInternalServerError) - return - } - sessionID := parts[0] - userKey := parts[1] - position, totalQueue := sharedMem.WaitingRoom.GetQueueInfo(sessionID, userKey) + sessionID := string(decision.ResponseData) data := struct { - EdgeTag string - ConnectIP string - Date string - QueuePosition int - TotalQueue int + EdgeTag string + ConnectIP string + Date string }{ - EdgeTag: cfg.NodeName, - ConnectIP: userRequestData.RemoteIP, - Date: time.Now().Format("2006-01-02 15:04:05"), - QueuePosition: position, - TotalQueue: totalQueue, + EdgeTag: cfg.NodeName, + ConnectIP: userRequestData.RemoteIP, + Date: time.Now().Format("2006-01-02 15:04:05"), } w.Header().Set("Set-Cookie", "__torii_session_id="+sessionID+"; Path=/; Max-Age=86400; Priority=High; HttpOnly;") diff --git a/internal/server/torii.go b/internal/server/torii.go index 804f04e..f9c3dea 100644 --- a/internal/server/torii.go +++ b/internal/server/torii.go @@ -109,27 +109,20 @@ func handleWaitingRoomStatus(w http.ResponseWriter, r *http.Request, reqData dat } sessionID := reqData.ToriiSessionID + clearance := reqData.ToriiClearance userKey := check.GenerateUserKey(reqData) + secretKey := ruleSet.CAPTCHARule.SecretKey - var position, totalQueue int - var canEnter bool - - if sessionID != "" { - validSessionID := check.VerifyWaitingRoomSessionID(sessionID, reqData, ruleSet.CAPTCHARule.SecretKey, ruleSet.WaitingRoomRule.SessionTimeout) - if validSessionID { - canEnter, _ = sharedMem.WaitingRoom.CanEnterSite(sessionID, userKey) - position, totalQueue = sharedMem.WaitingRoom.GetQueueInfo(sessionID, userKey) - } - } + // Check queue status using new core logic + inQueue, position, totalQueue, canEnter := sharedMem.WaitingRoom.GetQueueStatus(sessionID, clearance, userKey, secretKey) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) err := json.NewEncoder(w).Encode(map[string]interface{}{ + "inQueue": inQueue, "position": position, "totalQueue": totalQueue, "canEnter": canEnter, - "sessionID": sessionID, - "inQueue": sessionID != "" && position > 0, }) if err != nil { return @@ -159,57 +152,19 @@ func handleWaitingRoomJoin(w http.ResponseWriter, r *http.Request, reqData dataT return } - userKey := check.GenerateUserKey(reqData) sessionID := reqData.ToriiSessionID + userKey := check.GenerateUserKey(reqData) + secretKey := ruleSet.CAPTCHARule.SecretKey - if sessionID != "" { - validSessionID := check.VerifyWaitingRoomSessionID(sessionID, reqData, ruleSet.CAPTCHARule.SecretKey, ruleSet.WaitingRoomRule.SessionTimeout) - if validSessionID { - canEnter, _ := sharedMem.WaitingRoom.CanEnterSite(sessionID, userKey) - if canEnter { - sharedMem.WaitingRoom.AddToActiveSession(sessionID, userKey) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err := json.NewEncoder(w).Encode(map[string]interface{}{ - "success": true, - "canEnter": true, - "message": "可以进入网站", - }) - if err != nil { - return - } - return - } - position, totalQueue := sharedMem.WaitingRoom.GetQueueInfo(sessionID, userKey) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - err := json.NewEncoder(w).Encode(map[string]interface{}{ - "success": true, - "canEnter": false, - "position": position, - "totalQueue": totalQueue, - "message": "已在队列中,请等待", - }) - if err != nil { - return - } - return - } - } + // Join queue using new core logic + success, positiveID, clearance, canEnter := sharedMem.WaitingRoom.JoinQueue(sessionID, userKey, secretKey) - newSessionID := genWaitingRoomSessionID(reqData, ruleSet.CAPTCHARule.SecretKey) - - canEnter, _ := sharedMem.WaitingRoom.CanEnterSite("", userKey) - if canEnter { - sharedMem.WaitingRoom.AddToActiveSession(newSessionID, userKey) - w.Header().Set("Set-Cookie", "__torii_session_id="+newSessionID+"; Path=/; Max-Age=86400; Priority=High; HttpOnly;") + if !success { w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) + w.WriteHeader(http.StatusBadRequest) err := json.NewEncoder(w).Encode(map[string]interface{}{ - "success": true, - "canEnter": true, - "sessionID": newSessionID, - "message": "成功加入,可以进入网站", + "success": false, + "message": "Invalid session or unable to join queue", }) if err != nil { return @@ -217,25 +172,37 @@ func handleWaitingRoomJoin(w http.ResponseWriter, r *http.Request, reqData dataT return } - sharedMem.WaitingRoom.AddToQueue(newSessionID, userKey) - position, totalQueue := sharedMem.WaitingRoom.GetQueueInfo(newSessionID, userKey) + if canEnter { + // User can enter directly + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + err := json.NewEncoder(w).Encode(map[string]interface{}{ + "success": true, + "canEnter": true, + "message": "可以进入网站", + }) + if err != nil { + return + } + return + } - w.Header().Set("Set-Cookie", "__torii_session_id="+newSessionID+"; Path=/; Max-Age=86400; Priority=High; HttpOnly;") + // User is in queue, set clearance cookie and return position info + inQueue, position, totalQueue, _ := sharedMem.WaitingRoom.GetQueueStatus(sessionID, clearance, userKey, secretKey) + + w.Header().Set("Set-Cookie", "__torii_clearance="+clearance+"; Path=/; Max-Age=86400; Priority=High; HttpOnly;") w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) err := json.NewEncoder(w).Encode(map[string]interface{}{ "success": true, "canEnter": false, - "sessionID": newSessionID, + "inQueue": inQueue, "position": position, "totalQueue": totalQueue, + "positiveID": positiveID, "message": "已加入排队", }) if err != nil { return } } - -func genWaitingRoomSessionID(reqData dataType.UserRequest, secretKey string) string { - return check.GenWaitingRoomSessionID(reqData, secretKey) -}