summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java/server/SessionManager.java
diff options
context:
space:
mode:
authorSimon Rettberg2015-06-02 19:53:31 +0200
committerSimon Rettberg2015-06-02 19:53:31 +0200
commit1bc83891c68ee269727e81a13cc70da698bcc7a7 (patch)
treeb052a72ad7d65864068752f71c5ed2b49a171276 /dozentenmodulserver/src/main/java/server/SessionManager.java
parent[server] Started work on the internal file server (diff)
downloadtutor-module-1bc83891c68ee269727e81a13cc70da698bcc7a7.tar.gz
tutor-module-1bc83891c68ee269727e81a13cc70da698bcc7a7.tar.xz
tutor-module-1bc83891c68ee269727e81a13cc70da698bcc7a7.zip
[server] Compiling again, still lots of stubs
Diffstat (limited to 'dozentenmodulserver/src/main/java/server/SessionManager.java')
-rw-r--r--dozentenmodulserver/src/main/java/server/SessionManager.java84
1 files changed, 84 insertions, 0 deletions
diff --git a/dozentenmodulserver/src/main/java/server/SessionManager.java b/dozentenmodulserver/src/main/java/server/SessionManager.java
new file mode 100644
index 00000000..75336de0
--- /dev/null
+++ b/dozentenmodulserver/src/main/java/server/SessionManager.java
@@ -0,0 +1,84 @@
+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
+
+}