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

View File

@@ -22,7 +22,7 @@ var Software = SoftwareInfo{
Version: "0.0.1",
Developer: "Madobi Nanami",
BuildVer: 1,
BuildType: "debug",
BuildType: "release",
}
type StatusFlags struct {

View File

@@ -463,7 +463,7 @@ func getNumFromMap(m map[string]interface{}, key string) int {
}
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 {
utils.SendErrorResponse(w, http.StatusUnauthorized, "invalid token or timestamp")
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()
postLog.Debug(fmt.Sprintf("[ListInstancesHandler] Retrieved %d instances", len(instances)))
// postLog.Debug(fmt.Sprintf("[ListInstancesHandler] Retrieved %d instances", len(instances)))
if err != nil {
postLog.Error(fmt.Sprintf("[ListInstancesHandler] Failed to get all instances: %v", err))
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)
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) {

View File

@@ -182,9 +182,23 @@ func LoginHandler(w http.ResponseWriter, r *http.Request) {
existingTokenInfo, err := session.GetTokenInfo(user.UserID)
if err == nil && existingTokenInfo != nil {
utils.SendErrorResponse(w, http.StatusConflict, "User is already logged in")
postLog.Warning(fmt.Sprintf("[LoginHandler] Login failed: user \"%s\" is already logged in", req.Username))
return
// If the user is already logged in, then remove the existing session to allow the new login, instead of returning an error.
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
}
postLog.Info(fmt.Sprintf("[LoginHandler] User \"%s\" is already logged in, remove previous session", req.Username))
}
token, err := session.GenerateToken(user.UserID)

30
main.go
View File

@@ -73,23 +73,25 @@ func main() {
setupRoutes()
// Initialize watchdog connection
err = watchdog.Init()
if err != nil {
postLog.Error(fmt.Sprintf("Unable to initialize Watchdog: %s", err))
} else {
if !watchdog.Connect() {
postLog.Error("Failed to connect to Watchdog")
if global.CurrentConfig.Watchdog.Enabled {
err = watchdog.Init()
if err != nil {
postLog.Error(fmt.Sprintf("Unable to initialize Watchdog: %s", err))
} else {
postLog.Info("Connected to Watchdog successfully")
if !watchdog.Connect() {
postLog.Error("Failed to connect to Watchdog")
} else {
postLog.Info("Connected to Watchdog successfully")
go func() {
if err := watchdog.StartKeepAlive(); err != nil {
postLog.Error(fmt.Sprintf("Watchdog keepalive stopped: %v", err))
global.Is.WatchdogConnected = false
}
}()
go func() {
if err := watchdog.StartKeepAlive(); err != nil {
postLog.Error(fmt.Sprintf("Watchdog keepalive stopped: %v", err))
global.Is.WatchdogConnected = false
}
}()
}
}
}
}
addr := fmt.Sprintf("%s:%s", global.CurrentConfig.ListenAddr, global.CurrentConfig.ListenPort)
server := &http.Server{