diff --git a/src/main/java/org/gcube/portal/oidc/lr62/IntraVMJWTCacheProxy.java b/src/main/java/org/gcube/portal/oidc/lr62/IntraVMJWTCacheProxy.java index 7ffefde..b3e163b 100644 --- a/src/main/java/org/gcube/portal/oidc/lr62/IntraVMJWTCacheProxy.java +++ b/src/main/java/org/gcube/portal/oidc/lr62/IntraVMJWTCacheProxy.java @@ -5,104 +5,139 @@ import java.util.Comparator; import java.util.Map; import java.util.TreeMap; -import javax.servlet.http.HttpSession; - import org.gcube.oidc.rest.JWTToken; import com.liferay.portal.model.User; public class IntraVMJWTCacheProxy extends JWTCacheProxy { - private Map> oidcTokens; - private Map> rptTokens; + Map> oidcTokens; + Map> rptTokens; + + private Comparator userComparator = new Comparator() { + @Override + public int compare(User u1, User u2) { + return u1.getScreenName().compareTo(u2.getScreenName()); + } + }; protected IntraVMJWTCacheProxy() { + super(); log.info("Initializing tokens caches"); - oidcTokens = Collections.synchronizedMap(new TreeMap<>()); - rptTokens = Collections.synchronizedMap(new TreeMap<>()); + oidcTokens = Collections.synchronizedMap(new TreeMap<>(userComparator)); + rptTokens = Collections.synchronizedMap(new TreeMap<>(userComparator)); } - public void checkMap(Map> map, User user) { + protected void checkMap(Map> map, User user) { if (!map.containsKey(user)) { - log.debug("Initializing map for user: " + user.getScreenName()); - map.put(user, Collections.synchronizedMap(new TreeMap<>(new Comparator() { - @Override - public int compare(HttpSession s1, HttpSession s2) { - return s1.getId().compareTo(s2.getId()); - } - }))); + if (log.isDebugEnabled()) { + log.debug("Initializing map for user: " + user.getScreenName()); + } + map.put(user, Collections.synchronizedMap(new TreeMap<>())); } } @Override - public void setOIDCToken(User user, HttpSession session, JWTToken token) { + public void setOIDCToken(User user, String sessionId, JWTToken token) { checkMap(oidcTokens, user); - Map oidcUserMap = oidcTokens.get(user); - log.trace("OIDC user's sessions recorded: " + oidcUserMap.keySet().toArray()); - oidcUserMap.put(session, JWTTokenUtil.getRawContent(token)); - } - - @Override - public void setUMAToken(User user, HttpSession session, JWTToken token) { - checkMap(rptTokens, user); - Map umaUserMap = rptTokens.get(user); - log.trace("UMA user's sessions recorded objs: " + umaUserMap.keySet().toArray()); - umaUserMap.put(session, JWTTokenUtil.getRawContent(token)); - } - - @Override - public JWTToken getOIDCToken(User user, HttpSession session) { - checkMap(oidcTokens, user); - log.trace("Getting OIDC token for user '" + user.getScreenName() + "' and session obj: " + session); - return JWTTokenUtil.fromString(oidcTokens.get(user).get(session)); - } - - @Override - public JWTToken getUMAToken(User user, HttpSession session) { - checkMap(rptTokens, user); - log.trace("Getting UMA token for user '" + user.getScreenName() + "' and session obj: " + session); - return JWTTokenUtil.fromString(rptTokens.get(user).get(session)); - } - - @Override - public void removeOIDCToken(User user, HttpSession session) { - checkMap(oidcTokens, user); - if (oidcTokens.get(user).containsKey(session)) { - log.trace("Removing OIDC token for user '" + user.getScreenName() + "' and session obj: " + session); - oidcTokens.get(user).remove(session); + Map oidcUserMap = oidcTokens.get(user); + if (log.isTraceEnabled()) { + log.trace("Setting OIDC token for user '" + user.getScreenName() + "' and session: " + sessionId); + } + oidcUserMap.put(sessionId, JWTTokenUtil.getRawContent(token)); + if (log.isTraceEnabled()) { + log.trace("OIDC user's sessions recorded objs: " + oidcUserMap.keySet().toArray()); } } @Override - public void removeUMAToken(User user, HttpSession session) { + public void setUMAToken(User user, String sessionId, JWTToken token) { checkMap(rptTokens, user); - if (rptTokens.get(user).containsKey(session)) { - log.trace("Removing UMA token for user '" + user.getScreenName() + "' and session obj: " + session); - oidcTokens.get(user).remove(session); + Map umaUserMap = rptTokens.get(user); + if (log.isTraceEnabled()) { + log.trace("Setting UMA token for user '" + user.getScreenName() + "' and session: " + sessionId); + } + umaUserMap.put(sessionId, JWTTokenUtil.getRawContent(token)); + if (log.isTraceEnabled()) { + log.trace("UMA user's sessions recorded objs: " + umaUserMap.keySet().toArray()); + } + } + + @Override + public JWTToken getOIDCToken(User user, String sessionId) { + checkMap(oidcTokens, user); + if (log.isTraceEnabled()) { + log.trace("Getting OIDC token for user '" + user.getScreenName() + "' and session: " + sessionId); + } + return JWTTokenUtil.fromString(oidcTokens.get(user).get(sessionId)); + } + + @Override + public JWTToken getUMAToken(User user, String sessionId) { + checkMap(rptTokens, user); + if (log.isTraceEnabled()) { + log.trace("Getting UMA token for user '" + user.getScreenName() + "' and session: " + sessionId); + } + return JWTTokenUtil.fromString(rptTokens.get(user).get(sessionId)); + } + + @Override + public void removeOIDCToken(User user, String sessionId) { + checkMap(oidcTokens, user); + if (oidcTokens.get(user).containsKey(sessionId)) { + if (log.isTraceEnabled()) { + log.trace("Removing OIDC token for user '" + user.getScreenName() + "' and session: " + sessionId); + } + oidcTokens.get(user).remove(sessionId); + } else { + log.info("No OIDC token is stored for user '" + user.getScreenName() + "' and session: " + sessionId); + } + } + + @Override + public void removeUMAToken(User user, String sessionId) { + checkMap(rptTokens, user); + if (rptTokens.get(user).containsKey(sessionId)) { + if (log.isTraceEnabled()) { + log.trace("Removing UMA token for user '" + user.getScreenName() + "' and session: " + sessionId); + } + oidcTokens.get(user).remove(sessionId); + } else { + if (log.isTraceEnabled()) { + log.debug("No UMA token is stored for user '" + user.getScreenName() + "' and session: " + sessionId); + } } } @Override public void removeAllOIDCTokens(User user) { - log.trace("Removing OIDC session's tokens of user: " + user.getScreenName()); + if (log.isTraceEnabled()) { + log.trace("Removing all OIDC session's tokens of user: " + user.getScreenName()); + } oidcTokens.remove(user); } @Override public void removeAllUMATokens(User user) { - log.trace("Removing UMA session's tokens of user: " + user.getScreenName()); + if (log.isTraceEnabled()) { + log.trace("Removing all UMA session's tokens of user: " + user.getScreenName()); + } rptTokens.remove(user); } @Override public void clearOIDCTokens() { - log.trace("Clearing OIDC tokens cache"); + if (log.isTraceEnabled()) { + log.trace("Clearing OIDC tokens cache"); + } oidcTokens.clear(); } @Override public void clearUMATokens() { - log.trace("Clearing UMA tokens cache"); + if (log.isTraceEnabled()) { + log.trace("Clearing UMA tokens cache"); + } rptTokens.clear(); } @@ -112,4 +147,29 @@ public class IntraVMJWTCacheProxy extends JWTCacheProxy { clearUMATokens(); } + @Override + public synchronized Map getMutexFor(User user) { + checkMap(oidcTokens, user); + return oidcTokens.get(user); + } + + @Override + public void dumpOnLog() { + if (log.isTraceEnabled()) { + log.trace("Cached OIDC objects: " + dumpMap(oidcTokens)); + log.trace("Cached UMA objects: " + dumpMap(rptTokens)); + } + } + + protected String dumpMap(Map> map) { + StringBuffer sb = new StringBuffer(); + map.forEach((u, v) -> { + sb.append(u.getScreenName() + " :"); + v.forEach((s, t) -> { + sb.append(" " + s + " -> " + JWTToken.fromString(t).getTokenEssentials()); + }); + sb.append(", "); + }); + return sb.toString(); + } } diff --git a/src/main/java/org/gcube/portal/oidc/lr62/JWTCacheProxy.java b/src/main/java/org/gcube/portal/oidc/lr62/JWTCacheProxy.java index 3ab8ffd..4f9390c 100644 --- a/src/main/java/org/gcube/portal/oidc/lr62/JWTCacheProxy.java +++ b/src/main/java/org/gcube/portal/oidc/lr62/JWTCacheProxy.java @@ -1,6 +1,8 @@ package org.gcube.portal.oidc.lr62; -import javax.servlet.http.HttpSession; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; import org.gcube.oidc.rest.JWTToken; @@ -16,22 +18,30 @@ public abstract class JWTCacheProxy { public JWTCacheProxy() { instance = this; + Timer timer = new Timer(true); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + instance.dumpOnLog(); + } + }, 0, 60 * 1000); } + public static synchronized JWTCacheProxy getInstance() { return instance != null ? instance : new IntraVMJWTCacheProxy(); } - public abstract void setOIDCToken(User user, HttpSession session, JWTToken token); + public abstract void setOIDCToken(User user, String sessionId, JWTToken token); - public abstract void setUMAToken(User user, HttpSession session, JWTToken token); + public abstract void setUMAToken(User user, String sessionId, JWTToken token); - public abstract JWTToken getOIDCToken(User user, HttpSession session); + public abstract JWTToken getOIDCToken(User user, String sessionId); - public abstract JWTToken getUMAToken(User user, HttpSession session); + public abstract JWTToken getUMAToken(User user, String sessionId); - public abstract void removeOIDCToken(User user, HttpSession session); + public abstract void removeOIDCToken(User user, String sessionId); - public abstract void removeUMAToken(User user, HttpSession session); + public abstract void removeUMAToken(User user, String sessionId); public abstract void removeAllOIDCTokens(User user); @@ -43,4 +53,8 @@ public abstract class JWTCacheProxy { public abstract void clearAllTokens(); + public abstract Map getMutexFor(User user); + + public abstract void dumpOnLog(); + } \ No newline at end of file