blob: 75336de05ea608ca5f85b77b20ccff9f24b780f5 (
plain) (
tree)
|
|
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<String, Entry> 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
}
|