/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: DatabaseRemember.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.authentication.remembermanagers;
import com.uwyn.rife.authentication.remembermanagers.exceptions.*;
import com.uwyn.rife.authentication.RememberManager;
import com.uwyn.rife.authentication.exceptions.RememberManagerException;
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.exceptions.DatabaseException;
import com.uwyn.rife.database.queries.CreateTable;
import com.uwyn.rife.database.queries.Delete;
import com.uwyn.rife.database.queries.DropTable;
import com.uwyn.rife.database.queries.Insert;
import com.uwyn.rife.database.queries.Select;
import com.uwyn.rife.tools.StringEncryptor;
import com.uwyn.rife.tools.UniqueID;
import com.uwyn.rife.tools.UniqueIDGenerator;
import java.security.NoSuchAlgorithmException;
public abstract class DatabaseRemember extends DbQueryManager implements RememberManager
{
private long mRememberDuration = RifeConfig.Authentication.getRememberDuration();
protected DatabaseRemember(Datasource datasource)
{
super(datasource);
}
public long getRememberDuration()
{
return mRememberDuration;
}
public void setRememberDuration(long milliseconds)
{
mRememberDuration = milliseconds;
}
public abstract boolean install()
throws RememberManagerException;
public abstract boolean remove()
throws RememberManagerException;
protected boolean _install(CreateTable createRemember, String createRememberMomentIndex)
{
executeUpdate(createRemember);
executeUpdate(createRememberMomentIndex);
return true;
}
protected boolean _remove(DropTable removeRemember, String removeRememberMomentIndex)
{
executeUpdate(removeRememberMomentIndex);
executeUpdate(removeRemember);
return true;
}
protected String _createRememberId(Insert createRememberId, final long userId, String hostIp)
throws RememberManagerException
{
assert createRememberId != null;
if (userId < 0)
{
throw new CreateRememberIdErrorException(userId);
}
final UniqueID remember_id = UniqueIDGenerator.generate(hostIp);
final String remember_id_string = remember_id.toString();
try
{
if (0 == executeUpdate(createRememberId, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("rememberId", remember_id_string)
.setLong("userId", userId)
.setLong("moment", System.currentTimeMillis());
}
}))
{
throw new CreateRememberIdErrorException(userId);
}
}
catch (DatabaseException e)
{
throw new CreateRememberIdErrorException(userId, e);
}
try
{
return StringEncryptor.SHA.encrypt(String.valueOf(userId))+"|"+remember_id_string;
}
catch (NoSuchAlgorithmException e)
{
throw new CreateRememberIdErrorException(userId, e);
}
}
protected boolean _eraseRememberId(Delete eraseRememberId, final String rememberId)
throws RememberManagerException
{
assert eraseRememberId != null;
if (null == rememberId ||
0 == rememberId.length())
{
return false;
}
final int rememberid_slash = rememberId.indexOf("|");
if (-1 == rememberid_slash)
{
return false;
}
boolean result = false;
try
{
if (0 != executeUpdate(eraseRememberId, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("rememberId", rememberId.substring(rememberid_slash+1));
}
}))
{
result = true;
}
}
catch (DatabaseException e)
{
throw new EraseRememberIdErrorException(rememberId, e);
}
return result;
}
protected boolean _eraseUserRememberIds(Delete eraseUserRememberIds, final long userId)
throws RememberManagerException
{
assert eraseUserRememberIds != null;
if (userId < 0)
{
return false;
}
boolean result = false;
try
{
if (0 != executeUpdate(eraseUserRememberIds, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setLong("userId", userId);
}
}))
{
result = true;
}
}
catch (DatabaseException e)
{
throw new EraseUserRememberIdsErrorException(userId, e);
}
return result;
}
protected void _eraseAllRememberIds(Delete eraseAllRememberIds)
throws RememberManagerException
{
assert eraseAllRememberIds != null;
try
{
executeUpdate(eraseAllRememberIds);
}
catch (DatabaseException e)
{
throw new EraseAllRememberIdsErrorException(e);
}
}
protected long _getRememberedUserId(Select getRememberedUserId, final String rememberId)
throws RememberManagerException
{
assert getRememberedUserId != null;
if (null == rememberId ||
0 == rememberId.length())
{
return -1;
}
final int rememberid_slash = rememberId.indexOf("|");
if (-1 == rememberid_slash)
{
return -1;
}
final String encrypted_userid = rememberId.substring(0, rememberid_slash);
final String real_rememberid = rememberId.substring(rememberid_slash+1);
long result = -1;
try
{
result = executeGetFirstLong(getRememberedUserId, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement
.setString("rememberId", real_rememberid);
}
});
}
catch (DatabaseException e)
{
throw new GetRememberedUserIdErrorException(rememberId, e);
}
try
{
if (!encrypted_userid.equals(StringEncryptor.SHA.encrypt(String.valueOf(result))))
{
return -1;
}
}
catch (NoSuchAlgorithmException e)
{
throw new GetRememberedUserIdErrorException(rememberId, e);
}
return result;
}
protected void _purgeRememberIds(Delete purgeRememberIds)
throws RememberManagerException
{
try
{
executeUpdate(purgeRememberIds, new DbPreparedStatementHandler() {
public void setParameters(DbPreparedStatement statement)
{
statement.setLong(1, System.currentTimeMillis()-getRememberDuration());
}
});
}
catch (DatabaseException e)
{
throw new PurgeRememberIdsErrorException(e);
}
}
}