/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: DatabaseSessions.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.authentication.sessionmanagers;
import com.uwyn.rife.authentication.sessionmanagers.exceptions.*;
import com.uwyn.rife.database.queries.*;
import com.uwyn.rife.authentication.ListSessions;
import com.uwyn.rife.authentication.SessionManager;
import com.uwyn.rife.authentication.exceptions.SessionManagerException;
import com.uwyn.rife.config.RifeConfig;
import com.uwyn.rife.database.Datasource;
import com.uwyn.rife.database.DbPreparedStatement;
import com.uwyn.rife.database.DbPreparedStatementHandler;
import com.uwyn.rife.database.DbQueryManager;
import com.uwyn.rife.database.DbRowProcessor;
import com.uwyn.rife.database.exceptions.DatabaseException;
import com.uwyn.rife.tools.UniqueID;
import com.uwyn.rife.tools.UniqueIDGenerator;
import java.sql.ResultSet;
import java.sql.SQLException;
public abstract class DatabaseSessions extends DbQueryManager implements SessionManager
{
private long mSessionDuration = RifeConfig.Authentication.getSessionDuration();
private boolean mRestrictHostIp = RifeConfig.Authentication.getSessionRestrictHostIp();
protected DatabaseSessions(Datasource datasource)
{
super(datasource);
}
public long getSessionDuration()
{
return mSessionDuration;
}
public void setSessionDuration(long milliseconds)
{
mSessionDuration = milliseconds;
}
public boolean getRestrictHostIp()
{
return mRestrictHostIp;
}
public void setRestrictHostIp(boolean flag)
{
mRestrictHostIp = flag;
}
public abstract boolean install()
throws SessionManagerException;
public abstract boolean remove()
throws SessionManagerException;
public abstract long countSessions()
throws SessionManagerException;
protected boolean _install(CreateTable createAuthentication, String createAuthenticationSessStartIndex)
{
assert createAuthentication != null;
assert createAuthenticationSessStartIndex != null;
executeUpdate(createAuthentication);
executeUpdate(createAuthenticationSessStartIndex);
return true;
}
protected boolean _remove(DropTable removeAuthentication, String removeAuthenticationSessStartIndex)
{
assert removeAuthentication != null;
assert removeAuthenticationSessStartIndex != null;
executeUpdate(removeAuthenticationSessStartIndex);
executeUpdate(removeAuthentication);
return true;
}
protected void _purgeSessions(Delete purgeSession)
throws SessionManagerException
{
try
{
executeUpdate(purgeSession, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement.setLong(1, System.currentTimeMillis()-getSessionDuration());
}
});
}
catch (DatabaseException e)
{
throw new PurgeSessionsErrorException(e);
}
}
protected String _startSession(Insert startSession, final long userId, final String hostIp, final boolean remembered)
throws SessionManagerException
{
assert startSession != null;
if (userId < 0 ||
null == hostIp ||
0 == hostIp.length())
{
throw new StartSessionErrorException(userId, hostIp);
}
final UniqueID auth_id = UniqueIDGenerator.generate(hostIp);
final String auth_id_string = auth_id.toString();
try
{
if (0 == executeUpdate(startSession, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("authId", auth_id_string)
.setLong("userId", userId)
.setString("hostIp", hostIp)
.setLong("sessStart", System.currentTimeMillis())
.setBoolean("remembered", remembered);
}
}))
{
throw new StartSessionErrorException(userId, hostIp);
}
}
catch (DatabaseException e)
{
throw new StartSessionErrorException(userId, hostIp, e);
}
return auth_id_string;
}
protected boolean _isSessionValid(Select sessionValidity, Select sessionValidityRestrictHostIp, final String authId, final String hostIp)
throws SessionManagerException
{
assert sessionValidity != null;
assert sessionValidityRestrictHostIp != null;
if (null == authId ||
0 == authId.length() ||
null == hostIp ||
0 == hostIp.length())
{
return false;
}
boolean result = false;
try
{
Select query;
if (mRestrictHostIp)
{
query = sessionValidityRestrictHostIp;
}
else
{
query = sessionValidity;
}
result = executeHasResultRows(query, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("authId", authId)
.setLong("sessStart", System.currentTimeMillis()-getSessionDuration());
if (mRestrictHostIp)
{
statement
.setString("hostIp", hostIp);
}
}
});
}
catch (DatabaseException e)
{
throw new IsSessionValidErrorException(authId, hostIp, e);
}
return result;
}
public boolean _continueSession(Update continueSession, final String authId)
throws SessionManagerException
{
assert continueSession != null;
if (null == authId ||
0 == authId.length())
{
return false;
}
boolean result = false;
try
{
if (0 != executeUpdate(continueSession, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setLong("sessStart", System.currentTimeMillis())
.setString("authId", authId);
}
}))
{
result = true;
}
}
catch (DatabaseException e)
{
throw new ContinueSessionErrorException(authId, e);
}
return result;
}
protected boolean _eraseSession(Delete eraseSession, final String authId)
throws SessionManagerException
{
assert eraseSession != null;
if (null == authId ||
0 == authId.length())
{
return false;
}
boolean result = false;
try
{
if (0 != executeUpdate(eraseSession, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("authId", authId);
}
}))
{
result = true;
}
}
catch (DatabaseException e)
{
throw new EraseSessionErrorException(authId, e);
}
return result;
}
protected boolean _wasRemembered(Select wasRemembered, final String authId)
throws SessionManagerException
{
assert wasRemembered != null;
if (null == authId ||
0 == authId.length())
{
return false;
}
boolean result = false;
try
{
result = executeGetFirstBoolean(wasRemembered, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("authId", authId);
}
});
}
catch (DatabaseException e)
{
throw new SessionRememberedCheckErrorException(authId, e);
}
return result;
}
protected boolean _eraseUserSessions(Delete eraseUserSessions, final long userId)
throws SessionManagerException
{
assert eraseUserSessions != null;
if (userId < 0)
{
return false;
}
boolean result = false;
try
{
if (0 != executeUpdate(eraseUserSessions, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setLong("userId", userId);
}
}))
{
result = true;
}
}
catch (DatabaseException e)
{
throw new EraseUserSessionsErrorException(userId, e);
}
return result;
}
protected void _eraseAllSessions(Delete eraseAllSessions)
throws SessionManagerException
{
assert eraseAllSessions != null;
try
{
executeUpdate(eraseAllSessions);
}
catch (DatabaseException e)
{
throw new EraseAllSessionsErrorException(e);
}
}
protected long _countSessions(Select countSessions)
throws SessionManagerException
{
assert countSessions != null;
long result = -1;
try
{
result = executeGetFirstLong(countSessions, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setLong("sessStart", System.currentTimeMillis()-getSessionDuration());
}
});
}
catch (DatabaseException e)
{
throw new CountSessionsErrorException(e);
}
return result;
}
protected long _getSessionUserId(Select getSessionUserId, final String authId)
throws SessionManagerException
{
assert getSessionUserId != null;
if (null == authId ||
0 == authId.length())
{
return -1;
}
long result = -1;
try
{
result = executeGetFirstLong(getSessionUserId, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("authId", authId);
}
});
}
catch (DatabaseException e)
{
throw new GetSessionUserIdErrorException(authId, e);
}
return result;
}
protected boolean _listSessions(Select listSessions, final ListSessions processor)
throws SessionManagerException
{
if (null == processor) throw new IllegalArgumentException("processor can't be null");
boolean result = false;
try
{
result = executeFetchAll(listSessions, new DbRowProcessor() {
public boolean processRow(ResultSet resultSet)
throws SQLException
{
return processor.foundSession(
resultSet.getInt("userId"),
resultSet.getString("hostIp"),
resultSet.getString("authId"));
}
}, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setLong("sessStart", System.currentTimeMillis()-getSessionDuration());
}
});
}
catch (DatabaseException e)
{
throw new CountSessionsErrorException(e);
}
return result;
}
}