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:
+1
-1
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
+17
-3
@@ -182,9 +182,23 @@ 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()
|
||||||
return
|
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)
|
token, err := session.GenerateToken(user.UserID)
|
||||||
|
|||||||
@@ -73,21 +73,23 @@ func main() {
|
|||||||
setupRoutes()
|
setupRoutes()
|
||||||
|
|
||||||
// Initialize watchdog connection
|
// Initialize watchdog connection
|
||||||
err = watchdog.Init()
|
if global.CurrentConfig.Watchdog.Enabled {
|
||||||
if err != nil {
|
err = watchdog.Init()
|
||||||
postLog.Error(fmt.Sprintf("Unable to initialize Watchdog: %s", err))
|
if err != nil {
|
||||||
} else {
|
postLog.Error(fmt.Sprintf("Unable to initialize Watchdog: %s", err))
|
||||||
if !watchdog.Connect() {
|
|
||||||
postLog.Error("Failed to connect to Watchdog")
|
|
||||||
} else {
|
} 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() {
|
go func() {
|
||||||
if err := watchdog.StartKeepAlive(); err != nil {
|
if err := watchdog.StartKeepAlive(); err != nil {
|
||||||
postLog.Error(fmt.Sprintf("Watchdog keepalive stopped: %v", err))
|
postLog.Error(fmt.Sprintf("Watchdog keepalive stopped: %v", err))
|
||||||
global.Is.WatchdogConnected = false
|
global.Is.WatchdogConnected = false
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user