/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: DatabaseSessionValidator.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.authentication.sessionvalidators; import com.uwyn.rife.authentication.CredentialsManager; import com.uwyn.rife.authentication.RememberManager; import com.uwyn.rife.authentication.SessionAttributes; import com.uwyn.rife.authentication.SessionManager; import com.uwyn.rife.authentication.SessionValidator; import com.uwyn.rife.authentication.exceptions.SessionValidatorException; import com.uwyn.rife.authentication.sessionvalidators.exceptions.SessionValidityCheckErrorException; 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.Select; public abstract class DatabaseSessionValidator extends DbQueryManager implements SessionValidator { public static final int SESSION_INVALID = 0; public static final int SESSION_VALID = 1; protected CredentialsManager mCredentialsManager = null; protected SessionManager mSessionManager = null; protected RememberManager mRememberManager = null; protected DatabaseSessionValidator(Datasource datasource) { super(datasource); } public void setCredentialsManager(CredentialsManager credentialsManager) { assert credentialsManager != null; mCredentialsManager = credentialsManager; } public CredentialsManager getCredentialsManager() { return mCredentialsManager; } public void setSessionManager(SessionManager sessionManager) { assert sessionManager != null; mSessionManager = sessionManager; } public void setRememberManager(RememberManager rememberManager) { assert rememberManager != null; mRememberManager = rememberManager; } public RememberManager getRememberManager() { return mRememberManager; } public SessionManager getSessionManager() { return mSessionManager; } public boolean isAccessAuthorized(int id) { return SESSION_VALID == id; } protected int _validateSession(Select sessionValidityNoRole, Select sessionValidityNoRoleRestrictHostIp, Select sessionValidityRole, Select sessionValidityRoleRestrictHostIp, ProcessSessionValidity processSessionValidity, final String authId, final String hostIp, final SessionAttributes attributes) throws SessionValidatorException { if (null == authId || 0 == authId.length() || null == hostIp || 0 == hostIp.length() || null == attributes) { return SESSION_INVALID; } int result = SESSION_INVALID; Select query = null; // select which query to use according to the role attribute if (attributes.hasAttribute("role")) { if (mSessionManager.getRestrictHostIp()) { query = sessionValidityRoleRestrictHostIp; } else { query = sessionValidityRole; } } else { if (mSessionManager.getRestrictHostIp()) { query = sessionValidityNoRoleRestrictHostIp; } else { query = sessionValidityNoRole; } } // role has been specified, use optimized validity check to limit the amount of db queries try { executeFetchFirst(query, processSessionValidity, new DbPreparedStatementHandler() { public void setParameters(DbPreparedStatement statement) { statement .setString("authId", authId) .setLong("sessStart", System.currentTimeMillis()-mSessionManager.getSessionDuration()); if (attributes.hasAttribute("role")) { statement .setString("role", attributes.getAttribute("role")); } if (mSessionManager.getRestrictHostIp()) { statement .setString("hostIp", hostIp); } } }); result = processSessionValidity.getValidity(); } catch (DatabaseException e) { throw new SessionValidityCheckErrorException(authId, hostIp, e); } return result; } }