package server; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.openslx.imagemaster.thrift.iface.UserInfo; import org.openslx.thrifthelper.ThriftManager; /** * Manages user sessions. Mainly used to map tokens to users. * */ public class SessionManager { private static final Logger LOGGER = Logger.getLogger(SessionManager.class); private static class Entry { private static final long SESSION_TIMEOUT = TimeUnit.DAYS.toMillis(1); private final UserInfo user; private long validUntil; private Entry(UserInfo user) { this.user = user; this.validUntil = System.currentTimeMillis() + SESSION_TIMEOUT; } public void touch(long now) { this.validUntil = now + SESSION_TIMEOUT; } } // saves the current tokens and the mapped userdata, returning from the server private static Map tokenManager = new ConcurrentHashMap<>(); /** * Get the user corresponding to the given token. Returns null if the token * is not known, or the session already timed out. * * @param token * user's token * @return UserInfo for the matching user */ public static UserInfo get(String token) { Entry e = tokenManager.get(token); if (e != null) { // User session already cached final long now = System.currentTimeMillis(); if (e.validUntil < now) { tokenManager.remove(token); return getRemote(token); } e.touch(now); return e.user; } return getRemote(token); } /** * Remove session matching the given token * * @param token */ public static void remove(String token) { tokenManager.remove(token); } private static UserInfo getRemote(String token) { UserInfo ui = null; try { ui = ThriftManager.getMasterClient().getUserFromToken(token); } catch (Exception e) { LOGGER.warn("Could not reach master server to query for user token of a client!", e); } if (ui == null) return null; tokenManager.put(token, new Entry(ui)); return ui; } // TODO: Clean map of old entries periodically }