/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: MemorySessions.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.authentication.sessionmanagers;
import com.uwyn.rife.authentication.ListSessions;
import com.uwyn.rife.authentication.SessionManager;
import com.uwyn.rife.authentication.exceptions.SessionManagerException;
import com.uwyn.rife.authentication.sessionmanagers.exceptions.StartSessionErrorException;
import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.tools.UniqueID;
import com.uwyn.rife.tools.UniqueIDGenerator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MemorySessions implements SessionManager
{
private long mSessionDuration = RifeConfig.Authentication.getSessionDuration();
private boolean mRestrictHostIp = RifeConfig.Authentication.getSessionRestrictHostIp();
private final Map<String, MemorySession> mSessions = new HashMap<String, MemorySession>();
MemorySessions()
{
}
public long getSessionDuration()
{
return mSessionDuration;
}
public void setSessionDuration(long milliseconds)
{
mSessionDuration = milliseconds;
}
public boolean getRestrictHostIp()
{
return mRestrictHostIp;
}
public void setRestrictHostIp(boolean flags)
{
mRestrictHostIp = flags;
}
public void purgeSessions()
{
new PurgeSessions().start();
}
private class PurgeSessions extends Thread
{
public void run()
{
synchronized (mSessions)
{
ArrayList<String> stale_sessions = new ArrayList<String>();
long expiration = System.currentTimeMillis()-getSessionDuration();
for (MemorySession session : mSessions.values())
{
if (session.getStart() <= expiration)
{
stale_sessions.add(session.getAuthId());
}
}
if (stale_sessions != null)
{
for (String authid : stale_sessions)
{
mSessions.remove(authid);
}
}
}
}
}
public String startSession(long userId, String hostIp, boolean remembered)
throws SessionManagerException
{
if (userId < 0 ||
null == hostIp ||
0 == hostIp.length())
{
throw new StartSessionErrorException(userId, hostIp);
}
UniqueID auth_id = UniqueIDGenerator.generate(hostIp);
String auth_id_string = auth_id.toString();
MemorySession session = new MemorySession(auth_id_string, userId, hostIp, remembered);
synchronized (mSessions)
{
mSessions.put(auth_id_string, session);
}
return auth_id_string;
}
public boolean isSessionValid(String authId, String hostIp)
throws SessionManagerException
{
if (null == authId ||
0 == authId.length() ||
null == hostIp ||
0 == hostIp.length())
{
return false;
}
MemorySession session = getSession(authId);
if (session != null)
{
if (session.getStart() > System.currentTimeMillis()-getSessionDuration() &&
(!mRestrictHostIp || session.getHostIp().equals(hostIp)))
{
return true;
}
}
return false;
}
public long getSessionUserId(String authId)
throws SessionManagerException
{
MemorySession session = mSessions.get(authId);
if (null == session)
{
return -1;
}
return session.getUserId();
}
public boolean continueSession(String authId)
throws SessionManagerException
{
if (null == authId ||
0 == authId.length())
{
return false;
}
synchronized (mSessions)
{
if (mSessions.containsKey(authId))
{
MemorySession session = mSessions.get(authId);
session.setStart(System.currentTimeMillis());
mSessions.put(authId, session);
return true;
}
}
return false;
}
public boolean eraseSession(String authId)
throws SessionManagerException
{
if (null == authId ||
0 == authId.length())
{
return false;
}
synchronized (mSessions)
{
if (mSessions.containsKey(authId))
{
mSessions.remove(authId);
return true;
}
}
return false;
}
public boolean wasRemembered(String authId)
throws SessionManagerException
{
if (null == authId ||
0 == authId.length())
{
return false;
}
synchronized (mSessions)
{
MemorySession session = mSessions.get(authId);
if (null == session)
{
return false;
}
return session.getRemembered();
}
}
public boolean eraseUserSessions(long userId)
throws SessionManagerException
{
if (userId < 0)
{
return false;
}
boolean result = false;
synchronized (mSessions)
{
ArrayList<String> sessions_to_erase = new ArrayList<String>();
// collect the sessions that have to be erased
for (Map.Entry<String, MemorySession> sessions_entry : mSessions.entrySet())
{
if (userId == sessions_entry.getValue().getUserId())
{
sessions_to_erase.add(sessions_entry.getKey());
}
}
// erased the collected sessions
for (String authid : sessions_to_erase)
{
mSessions.remove(authid);
}
if (sessions_to_erase.size() > 0)
{
result = true;
}
}
return result;
}
public void eraseAllSessions()
throws SessionManagerException
{
mSessions.clear();
}
public MemorySession getSession(String authId)
{
return mSessions.get(authId);
}
public long countSessions()
{
long valid_session_count = 0;
synchronized (mSessions)
{
long expiration = System.currentTimeMillis()-getSessionDuration();
for (MemorySession session : mSessions.values())
{
if (session.getStart() > expiration)
{
valid_session_count++;
}
}
}
return valid_session_count;
}
public boolean listSessions(ListSessions processor)
{
if (null == processor) throw new IllegalArgumentException("processor can't be null");
boolean result = false;
synchronized (mSessions)
{
long expiration = System.currentTimeMillis()-getSessionDuration();
for (MemorySession session : mSessions.values())
{
if (session.getStart() > expiration)
{
result = true;
if (!processor.foundSession(session.getUserId(), session.getHostIp(), session.getAuthId()))
{
break;
}
}
}
}
return result;
}
}