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:
@@ -22,7 +22,7 @@ var Software = SoftwareInfo{
|
||||
Version: "0.0.1",
|
||||
Developer: "Madobi Nanami",
|
||||
BuildVer: 1,
|
||||
BuildType: "debug",
|
||||
BuildType: "release",
|
||||
}
|
||||
|
||||
type StatusFlags struct {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
30
main.go
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user