From a6ca925340d44d5ce48f3e0065a77ead59126419 Mon Sep 17 00:00:00 2001 From: mposolda Date: Thu, 30 Oct 2014 23:02:48 +0100 Subject: [PATCH] KEYCLOAK-788 Ensure expired ClientSessions removed during UserSessionProvider.removeExpiredUserSessions --- .../InfinispanUserSessionProvider.java | 9 ++++++++ .../mapreduce/ClientSessionMapper.java | 22 +++++++++++++++++++ .../sessions/mem/MemUserSessionProvider.java | 2 +- .../model/UserSessionProviderTest.java | 15 +++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/InfinispanUserSessionProvider.java b/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/InfinispanUserSessionProvider.java index 617f68677e..96e7f853cc 100644 --- a/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/InfinispanUserSessionProvider.java +++ b/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/InfinispanUserSessionProvider.java @@ -210,6 +210,15 @@ public class InfinispanUserSessionProvider implements UserSessionProvider { for (String id : map.keySet()) { removeUserSession(realm, id); } + + map = new MapReduceTask(sessionCache) + .mappedWith(ClientSessionMapper.create(realm.getId()).expiredRefresh(expiredRefresh).requireNullUserSession(true).emitKey()) + .reducedWith(new FirstResultReducer()) + .execute(); + + for (String id : map.keySet()) { + tx.remove(sessionCache, id); + } } @Override diff --git a/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/mapreduce/ClientSessionMapper.java b/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/mapreduce/ClientSessionMapper.java index 369b7a6f5d..1502b2cc30 100644 --- a/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/mapreduce/ClientSessionMapper.java +++ b/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/mapreduce/ClientSessionMapper.java @@ -28,6 +28,10 @@ public class ClientSessionMapper implements Mapper expiredRefresh) { + return; + } + switch (emit) { case KEY: collector.emit(key, key); diff --git a/model/sessions-mem/src/main/java/org/keycloak/models/sessions/mem/MemUserSessionProvider.java b/model/sessions-mem/src/main/java/org/keycloak/models/sessions/mem/MemUserSessionProvider.java index a19af58914..cd5eef1534 100755 --- a/model/sessions-mem/src/main/java/org/keycloak/models/sessions/mem/MemUserSessionProvider.java +++ b/model/sessions-mem/src/main/java/org/keycloak/models/sessions/mem/MemUserSessionProvider.java @@ -194,7 +194,7 @@ public class MemUserSessionProvider implements UserSessionProvider { Iterator citr = clientSessions.values().iterator(); while (citr.hasNext()) { ClientSessionEntity c = citr.next(); - if (c.getSession() == null && c.getTimestamp() < Time.currentTime() - realm.getSsoSessionIdleTimeout()) { + if (c.getSession() == null && c.getRealmId().equals(realm.getId()) && c.getTimestamp() < Time.currentTime() - realm.getSsoSessionIdleTimeout()) { citr.remove(); } } diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserSessionProviderTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserSessionProviderTest.java index c68ae7dd56..420d66c14b 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserSessionProviderTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserSessionProviderTest.java @@ -244,12 +244,15 @@ public class UserSessionProviderTest { @Test public void testRemoveUserSessionsByExpired() { session.sessions().getUserSessions(realm, session.users().getUserByUsername("user1", realm)); + ClientModel client = realm.findClient("test-app"); try { Set expired = new HashSet(); + Set expiredClientSessions = new HashSet(); Time.setOffset(-(realm.getSsoSessionMaxLifespan() + 1)); expired.add(session.sessions().createUserSession(realm, session.users().getUserByUsername("user1", realm), "user1", "127.0.0.1", "form", true).getId()); + expiredClientSessions.add(session.sessions().createClientSession(realm, client).getId()); Time.setOffset(0); UserSessionModel s = session.sessions().createUserSession(realm, session.users().getUserByUsername("user2", realm), "user2", "127.0.0.1", "form", true); @@ -257,9 +260,15 @@ public class UserSessionProviderTest { s.setLastSessionRefresh(0); expired.add(s.getId()); + ClientSessionModel clSession = session.sessions().createClientSession(realm, client); + clSession.setUserSession(s); + expiredClientSessions.add(clSession.getId()); + Set valid = new HashSet(); + Set validClientSessions = new HashSet(); valid.add(session.sessions().createUserSession(realm, session.users().getUserByUsername("user1", realm), "user1", "127.0.0.1", "form", true).getId()); + validClientSessions.add(session.sessions().createClientSession(realm, client).getId()); resetSession(); @@ -269,10 +278,16 @@ public class UserSessionProviderTest { for (String e : expired) { assertNull(session.sessions().getUserSession(realm, e)); } + for (String e : expiredClientSessions) { + assertNull(session.sessions().getClientSession(realm, e)); + } for (String v : valid) { assertNotNull(session.sessions().getUserSession(realm, v)); } + for (String e : validClientSessions) { + assertNotNull(session.sessions().getClientSession(realm, e)); + } } finally { Time.setOffset(0); }