diff --git a/internal/user/repository/view/user_session_view.go b/internal/user/repository/view/user_session_view.go index dec22a181..c891e69d0 100644 --- a/internal/user/repository/view/user_session_view.go +++ b/internal/user/repository/view/user_session_view.go @@ -100,7 +100,8 @@ func ActiveUserSessionsBySessionID(ctx context.Context, db *database.DB, session func scanActiveUserAgentUserIDs(rows *sql.Rows) (userAgentID string, sessions map[string]string, err error) { sessions = make(map[string]string) for rows.Next() { - var userID, sessionID string + var userID string + var sessionID sql.NullString err := rows.Scan( &userAgentID, &userID, @@ -109,7 +110,14 @@ func scanActiveUserAgentUserIDs(rows *sql.Rows) (userAgentID string, sessions ma if err != nil { return "", nil, err } - sessions[sessionID] = userID + // Sessions created before back-channel logout implementation and never updated + // since then, don't have an ID. + // In this case, we use the userID as sessionID to ensure uniqueness in the map. + // The ID will not be used for logout process itself. + if !sessionID.Valid { + sessionID.String = userID + } + sessions[sessionID.String] = userID } if err := rows.Close(); err != nil { return "", nil, zerrors.ThrowInternal(err, "VIEW-Sbrws", "Errors.Query.CloseRows")