summaryrefslogblamecommitdiffstats
path: root/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/SessionManager.java
blob: bf444a2005ec3c767d1b23be52ad5a30b8bc9f50 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                                    





                                              


                                                             




























                                                                                       















                                                                                       


                                                                                   
                                    









































                                                                                                             
package org.openslx.bwlp.sat.thrift;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.AuthorizationError;
import org.openslx.bwlp.thrift.iface.TAuthorizationException;
import org.openslx.bwlp.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.
	 * 
	 * @param token user's token
	 * @return UserInfo for the matching user
	 * @throws TAuthorizationException if the token is not known or the session
	 *             expired
	 */
	public static UserInfo getOrFail(String token) throws TAuthorizationException {
		UserInfo ui = get(token);
		if (ui != null)
			return ui;
		throw new TAuthorizationException(AuthorizationError.NOT_AUTHENTICATED,
				"Your session token is not known to the server");
	}

	/**
	 * 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

}