All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openid4java.consumer.JdbcConsumerAssociationStore Maven / Gradle / Ivy

The newest version!

package org.openid4java.consumer ;

import java.util.Date;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openid4java.association.Association;
import org.openid4java.association.AssociationException;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
 * 
 * The specified table must have the following structure:
 * 
    *
  • opurl : string
  • *
  • handle : string : primary key
  • *
  • type : string
  • *
  • mackey : string
  • *
  • expdate : date
  • *
* * @author Andrew Evenson, Graff Haley * @created May 19, 2008 */ public class JdbcConsumerAssociationStore extends JdbcDaoSupport implements ConsumerAssociationStore { private static Log _log = LogFactory.getLog ( JdbcConsumerAssociationStore.class ) ; private String _tableName ; private String _sqlInsert ; private String _sqlDelete ; private String _sqlCleanup ; private String _sqlSelect ; private String _sqlSelectAlt ; public JdbcConsumerAssociationStore ( ) { } public JdbcConsumerAssociationStore ( String tableName ) { setTableName ( tableName ) ; } public String getTableName ( ) { return _tableName ; } public void setTableName ( String tableName ) { this._tableName = tableName ; this._sqlInsert = "INSERT INTO " + _tableName + " VALUES (?,?,?,?,?)" ; this._sqlDelete = "DELETE FROM " + _tableName + " WHERE opurl=? AND handle=?" ; this._sqlCleanup = "DELETE FROM " + _tableName + " WHERE expdate < ?" ; this._sqlSelect = "SELECT * FROM " + _tableName + " WHERE opurl=? AND handle=?" ; this._sqlSelectAlt = "SELECT * FROM " + _tableName + " T1 JOIN (SELECT opurl, max(expdate) AS expdate FROM " + _tableName + " WHERE opurl=? GROUP BY opurl) T2 ON (T1.expdate = T2.expdate AND T1.opurl = T2.opurl)" ; } public Association load ( String opUrl, String handle ) { try { JdbcTemplate jdbcTemplate = getJdbcTemplate ( ) ; Map res = jdbcTemplate.queryForMap ( _sqlSelect, new Object[] { opUrl, handle } ) ; String type = (String) res.get ( "type" ) ; String macKey = (String) res.get ( "mackey" ) ; Date expDate = (Date) res.get ( "expdate" ) ; if ( type == null || macKey == null || expDate == null ) throw new AssociationException ( "Invalid association data retrived from database; cannot create Association " + "object for handle: " + handle ) ; Association assoc ; if ( Association.TYPE_HMAC_SHA1.equals ( type ) ) assoc = Association.createHmacSha1 ( handle, Base64.decodeBase64 ( macKey.getBytes ( ) ), expDate ) ; else if ( Association.TYPE_HMAC_SHA256.equals ( type ) ) assoc = Association.createHmacSha256 ( handle, Base64.decodeBase64 ( macKey.getBytes ( ) ), expDate ) ; else throw new AssociationException ( "Invalid association type " + "retrieved from database: " + type ) ; if ( _log.isDebugEnabled ( ) ) _log.debug ( "Retrieved association for handle: " + handle + " from table: " + _tableName ) ; return assoc ; } catch ( AssociationException ase ) { _log.error ( "Error retrieving association from table: " + _tableName, ase ) ; return null ; } catch ( IncorrectResultSizeDataAccessException rse ) { _log.warn ( "Association not found for handle: " + handle + " in the table: " + _tableName ) ; return null ; } catch ( DataAccessException dae ) { _log.error ( "Error retrieving association for handle: " + handle + "from table: " + _tableName, dae ) ; return null ; } } public Association load ( String opUrl ) { try { JdbcTemplate jdbcTemplate = getJdbcTemplate ( ) ; Map res = jdbcTemplate.queryForMap ( _sqlSelectAlt, new Object[] { opUrl } ) ; String handle = (String) res.get ( "handle" ) ; String type = (String) res.get ( "type" ) ; String macKey = (String) res.get ( "mackey" ) ; Date expDate = (Date) res.get ( "expdate" ) ; Association assoc ; if ( expDate == null || ( type == null || macKey == null ) && ! Association.FAILED_ASSOC_HANDLE.equals(handle) ) { throw new AssociationException ( "Invalid expiry date retrived from database; cannot create Association " + "object for handle: " + handle ) ; } else if (Association.FAILED_ASSOC_HANDLE.equals(handle)) { assoc = Association.getFailedAssociation(expDate); } else if ( Association.TYPE_HMAC_SHA1.equals ( type ) ) { assoc = Association.createHmacSha1 ( handle, Base64.decodeBase64 ( macKey.getBytes ( ) ), expDate ) ; } else if ( Association.TYPE_HMAC_SHA256.equals ( type ) ) { assoc = Association.createHmacSha256 ( handle, Base64.decodeBase64 ( macKey.getBytes ( ) ), expDate ) ; } else { throw new AssociationException ( "Invalid association type " + "retrieved from database: " + type ) ; } if ( _log.isDebugEnabled ( ) ) _log.debug ( "Retrieved association for handle: " + handle + " from table: " + _tableName ) ; return assoc ; } catch ( AssociationException ase ) { _log.error ( "Error retrieving association from table: " + _tableName, ase ) ; return null ; } catch ( IncorrectResultSizeDataAccessException rse ) { _log.warn ( "Association not found for opUrl: " + opUrl + " in the table: " + _tableName ) ; return null ; } catch ( DataAccessException dae ) { _log.error ( "Error retrieving association for opUrl: " + opUrl + "from table: " + _tableName, dae ) ; return null ; } } public void remove ( String opUrl, String handle ) { try { JdbcTemplate jdbcTemplate = getJdbcTemplate ( ) ; int cnt = jdbcTemplate.update ( _sqlDelete, new Object[] { opUrl, handle } ) ; } catch ( Exception e ) { _log.error ( "Error removing association from table: " + _tableName, e ) ; } } public void save ( String opUrl, Association association ) { cleanupExpired ( ) ; try { JdbcTemplate jdbcTemplate = getJdbcTemplate ( ) ; int cnt = jdbcTemplate.update ( _sqlInsert, new Object[] { opUrl, association.getHandle ( ), association.getType ( ), association.getMacKey ( ) == null ? null : new String ( Base64.encodeBase64 ( association.getMacKey ( ).getEncoded ( ) ) ), association.getExpiry ( ) } ) ; } catch ( Exception e ) { _log.error ( "Error saving association to table: " + _tableName, e ) ; } } private void cleanupExpired ( ) { try { Date boundary = new Date ( ) ; JdbcTemplate jdbcTemplate = getJdbcTemplate ( ) ; int cnt = jdbcTemplate.update ( _sqlCleanup, new Object[] { boundary } ) ; if ( _log.isDebugEnabled ( ) ) _log.debug ( "Client associations cleanup removed " + cnt + " entries" ) ; } catch ( Exception e ) { _log.error ( "Error cleaning up client associations from table: " + _tableName, e ) ; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy