fix(user): allow re-login by removing existing session if user is already logged in

fix(main): conditionally initialize and connect to watchdog based on configuration

fix(instance): remove unused userID variable and commented debug logs in ListInstancesHandler
This commit is contained in:
2026-05-10 21:54:49 +08:00
parent a7d6bb0cb8
commit 5c748dafcd
4 changed files with 37 additions and 21 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ var Software = SoftwareInfo{
Version: "0.0.1", Version: "0.0.1",
Developer: "Madobi Nanami", Developer: "Madobi Nanami",
BuildVer: 1, BuildVer: 1,
BuildType: "debug", BuildType: "release",
} }
type StatusFlags struct { type StatusFlags struct {
+3 -3
View File
@@ -463,7 +463,7 @@ func getNumFromMap(m map[string]interface{}, key string) int {
} }
func ListInstancesHandler(w http.ResponseWriter, r *http.Request) { func ListInstancesHandler(w http.ResponseWriter, r *http.Request) {
userID, err := utils.Auth(w, r, http.MethodGet, "visitor", "admin", "superuser") _, err := utils.Auth(w, r, http.MethodGet, "visitor", "admin", "superuser")
if err != nil { if err != nil {
utils.SendErrorResponse(w, http.StatusUnauthorized, "invalid token or timestamp") utils.SendErrorResponse(w, http.StatusUnauthorized, "invalid token or timestamp")
postLog.Warning(fmt.Sprintf("[ListInstancesHandler] Auth failed: %v", err)) postLog.Warning(fmt.Sprintf("[ListInstancesHandler] Auth failed: %v", err))
@@ -471,7 +471,7 @@ func ListInstancesHandler(w http.ResponseWriter, r *http.Request) {
} }
instances, err := database.DBListFrpcInstances() instances, err := database.DBListFrpcInstances()
postLog.Debug(fmt.Sprintf("[ListInstancesHandler] Retrieved %d instances", len(instances))) // postLog.Debug(fmt.Sprintf("[ListInstancesHandler] Retrieved %d instances", len(instances)))
if err != nil { if err != nil {
postLog.Error(fmt.Sprintf("[ListInstancesHandler] Failed to get all instances: %v", err)) postLog.Error(fmt.Sprintf("[ListInstancesHandler] Failed to get all instances: %v", err))
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get instances") utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to get instances")
@@ -499,7 +499,7 @@ func ListInstancesHandler(w http.ResponseWriter, r *http.Request) {
} }
utils.SendSuccessResponse(w, "Instances retrieved successfully", instanceList) utils.SendSuccessResponse(w, "Instances retrieved successfully", instanceList)
postLog.Info(fmt.Sprintf("[ListInstancesHandler] Retrieved %d instances for user %d", len(instances), userID)) // postLog.Info(fmt.Sprintf("[ListInstancesHandler] Retrieved %d instances for user %d", len(instances), userID))
} }
func StartInstanceHandler(w http.ResponseWriter, r *http.Request) { func StartInstanceHandler(w http.ResponseWriter, r *http.Request) {
+16 -2
View File
@@ -182,10 +182,24 @@ func LoginHandler(w http.ResponseWriter, r *http.Request) {
existingTokenInfo, err := session.GetTokenInfo(user.UserID) existingTokenInfo, err := session.GetTokenInfo(user.UserID)
if err == nil && existingTokenInfo != nil { if err == nil && existingTokenInfo != nil {
utils.SendErrorResponse(w, http.StatusConflict, "User is already logged in") // If the user is already logged in, then remove the existing session to allow the new login, instead of returning an error.
postLog.Warning(fmt.Sprintf("[LoginHandler] Login failed: user \"%s\" is already logged in", req.Username)) sessionTokenMux := session.GetSessionTokenMap()
sessionTokenMux.RLock()
sessionID := ""
for sid, tokenLogout := range session.GetSessionTokenMapSnapshot() {
if tokenLogout == existingTokenInfo.Token {
sessionID = sid
break
}
}
sessionTokenMux.RUnlock()
if err := session.RemoveSession(sessionID); err != nil {
utils.SendErrorResponse(w, http.StatusInternalServerError, "Failed to logout")
postLog.Error(fmt.Sprintf("[LoginHandler] Failed to logout user [%d]%s: %v", user.UserID, session.GetUsernameByID(user.UserID), err))
return return
} }
postLog.Info(fmt.Sprintf("[LoginHandler] User \"%s\" is already logged in, remove previous session", req.Username))
}
token, err := session.GenerateToken(user.UserID) token, err := session.GenerateToken(user.UserID)
if err != nil { if err != nil {
+2
View File
@@ -73,6 +73,7 @@ func main() {
setupRoutes() setupRoutes()
// Initialize watchdog connection // Initialize watchdog connection
if global.CurrentConfig.Watchdog.Enabled {
err = watchdog.Init() err = watchdog.Init()
if err != nil { if err != nil {
postLog.Error(fmt.Sprintf("Unable to initialize Watchdog: %s", err)) postLog.Error(fmt.Sprintf("Unable to initialize Watchdog: %s", err))
@@ -90,6 +91,7 @@ func main() {
}() }()
} }
} }
}
addr := fmt.Sprintf("%s:%s", global.CurrentConfig.ListenAddr, global.CurrentConfig.ListenPort) addr := fmt.Sprintf("%s:%s", global.CurrentConfig.ListenAddr, global.CurrentConfig.ListenPort)
server := &http.Server{ server := &http.Server{