diff options
| author | Thomas Lenz <tlenz@iaik.tugraz.at> | 2015-09-15 12:55:30 +0200 | 
|---|---|---|
| committer | Thomas Lenz <tlenz@iaik.tugraz.at> | 2015-09-15 15:18:04 +0200 | 
| commit | 7927c964cc477054a20ae91c7f0e2bbed087a830 (patch) | |
| tree | 87c43dac44e860aa7b377290e7728803a46c9dc2 | |
| parent | aa1dda4e14e7aebd3ec0df5e50493d273a65d999 (diff) | |
| download | moa-id-spss-7927c964cc477054a20ae91c7f0e2bbed087a830.tar.gz moa-id-spss-7927c964cc477054a20ae91c7f0e2bbed087a830.tar.bz2 moa-id-spss-7927c964cc477054a20ae91c7f0e2bbed087a830.zip | |
fix problems with OracleDB and configuration storage implementation
13 files changed, 494 insertions, 280 deletions
| diff --git a/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/config/ConfigurationProvider.java b/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/config/ConfigurationProvider.java index 849e81967..e2a55db60 100644 --- a/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/config/ConfigurationProvider.java +++ b/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/config/ConfigurationProvider.java @@ -188,6 +188,13 @@ public class ConfigurationProvider {  	/** +	 * @return the props +	 */ +	public Properties getConfigurationProperties() { +		return props; +	} + +	/**  	 * @return the deprecatedDBWrite  	 */  	public FileBasedUserConfiguration getUserManagement() { diff --git a/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/validation/oa/OAPVP2ConfigValidation.java b/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/validation/oa/OAPVP2ConfigValidation.java index 18452ed2d..35b69274f 100644 --- a/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/validation/oa/OAPVP2ConfigValidation.java +++ b/id/ConfigWebTool/src/main/java/at/gv/egovernment/moa/id/configuration/validation/oa/OAPVP2ConfigValidation.java @@ -76,7 +76,11 @@ public class OAPVP2ConfigValidation {  			else {  				try { -					Map<String, String> oa = ConfigurationProvider.getInstance().getDbRead().getOnlineApplicationKeyValueWithId(oaID); +					//OracleDB does not allow the selection of a lob in SQL where expression   +					String dbDriver = ConfigurationProvider.getInstance().getConfigurationProperties().getProperty("hibernate.connection.driver_class"); +					boolean backupVersion = MiscUtil.isNotEmpty(dbDriver) && dbDriver.startsWith("oracle.jdbc."); + +					Map<String, String> oa = ConfigurationProvider.getInstance().getDbRead().getOnlineApplicationKeyValueWithId(oaID, backupVersion);  					if (oa != null &&   							MiscUtil.isNotEmpty(oa.get(MOAIDConfigurationConstants.SERVICE_PROTOCOLS_PVP2X_CERTIFICATE))) {  						certSerialized = Base64Utils.decode(oa.get(MOAIDConfigurationConstants.SERVICE_PROTOCOLS_PVP2X_CERTIFICATE), false); diff --git a/id/server/data/deploy/conf/moa-id-configuration/moa-id-configtool.properties b/id/server/data/deploy/conf/moa-id-configuration/moa-id-configtool.properties index 9a3b3675a..825a9f138 100644 --- a/id/server/data/deploy/conf/moa-id-configuration/moa-id-configtool.properties +++ b/id/server/data/deploy/conf/moa-id-configuration/moa-id-configtool.properties @@ -35,6 +35,7 @@ dbcp.maxWaitMillis=-1  dbcp.testOnBorrow=true  dbcp.testOnReturn=false  dbcp.testWhileIdle=false +dbcp.validationQuery=SELECT 1  ##Mail  general.mail.host=smtp.localhost... diff --git a/id/server/data/deploy/conf/moa-id/moa-id.properties b/id/server/data/deploy/conf/moa-id/moa-id.properties index 66f9afac6..49e69c561 100644 --- a/id/server/data/deploy/conf/moa-id/moa-id.properties +++ b/id/server/data/deploy/conf/moa-id/moa-id.properties @@ -107,6 +107,7 @@ configuration.dbcp.maxWaitMillis=-1  configuration.dbcp.testOnBorrow=true  configuration.dbcp.testOnReturn=false  configuration.dbcp.testWhileIdle=false +configuration.dbcp.validationQuery=SELECT 1  #  #Hibnerate configuration for MOA-ID 2.0 advanced statistic logging diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/config/auth/PropertyBasedAuthConfigurationProvider.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/config/auth/PropertyBasedAuthConfigurationProvider.java index 0500a38aa..26c4e3157 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/config/auth/PropertyBasedAuthConfigurationProvider.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/config/auth/PropertyBasedAuthConfigurationProvider.java @@ -981,9 +981,17 @@ public class PropertyBasedAuthConfigurationProvider extends ConfigurationProvide  	 * @return the requested online application or {@code null}  	 */  	public Map<String, String> getActiveOnlineApplication(String id) { -		Logger.trace("Get active OnlineApplication with ID " + id + " from database.");		 +		Logger.trace("Get active OnlineApplication with ID " + id + " from database."); +		Map<String, String> oaConfig = null;  		try { -			Map<String, String> oaConfig = configuration.getOnlineApplication(id); +			//OracleDB does not allow the selection of a lob in SQL where expression   +			String dbDriver = properties.getProperty("configuration.hibernate.connection.driver_class"); +			if (MiscUtil.isNotEmpty(dbDriver) && dbDriver.startsWith("oracle.jdbc.")) +				oaConfig = configuration.getOnlineApplicationBackupVersion(id); +			 +			else +				oaConfig = configuration.getOnlineApplication(id); +									  			if (oaConfig != null) {  				String isActiveString = oaConfig.get(MOAIDConfigurationConstants.SERVICE_ISACTIVE);  				if (isActiveString != null && Boolean.valueOf(isActiveString)) diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/storage/AuthenticationSessionStoreage.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/storage/AuthenticationSessionStoreage.java index 4b4b5ddc5..829383cb4 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/storage/AuthenticationSessionStoreage.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/storage/AuthenticationSessionStoreage.java @@ -206,26 +206,34 @@ public class AuthenticationSessionStoreage {  		Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			   -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getSessionWithID"); -			  query.setParameter("sessionid", moaSessionID); -			  result = query.list(); - -		   -			  Logger.trace("Found entries: " + result.size()); +		  Transaction tx = null; +		  try { +			  synchronized (session) { +				   +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getSessionWithID"); +				  query.setParameter("sessionid", moaSessionID); +				  result = query.list(); +	 -			  //Assertion requires an unique artifact -			  if (result.size() != 1) { -				 Logger.trace("No entries found."); -			   	throw new MOADatabaseException("No session found with this sessionID"); +				  Logger.trace("Found entries: " + result.size()); +				   +				  //Assertion requires an unique artifact +				  if (result.size() != 1) { +					 Logger.trace("No entries found."); +				   	throw new MOADatabaseException("No session found with this sessionID"); +				  } +				   +				 AuthenticatedSessionStore dbsession = (AuthenticatedSessionStore) result.get(0);			  +				 tx.commit(); +				 cleanDelete(dbsession);			  			  } -			 AuthenticatedSessionStore dbsession = (AuthenticatedSessionStore) result.get(0);			  -			 session.getTransaction().commit();			   -			 cleanDelete(dbsession);			 +		  } catch (Exception e) { +			  if (tx != null && !tx.wasCommitted()) +				  tx.rollback(); +			  throw e; +			    		  }  	} @@ -290,28 +298,36 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getSessionWithSSOID"); -			  query.setParameter("sessionid", SSOSessionID); -			  result = query.list(); +		  Transaction tx = null; +		  try {		   +			  synchronized (session) { + +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getSessionWithSSOID"); +				  query.setParameter("sessionid", SSOSessionID); +				  result = query.list(); -			  //send transaction -			  session.getTransaction().commit(); -		  } +				  //send transaction +				  tx.commit(); +				   +			  } -		  Logger.trace("Found entries: " + result.size()); +			  Logger.trace("Found entries: " + result.size()); -		  //Assertion requires an unique artifact -		  if (result.size() != 1) { -			 Logger.trace("No entries found."); -			 return null; +			  //Assertion requires an unique artifact +			  if (result.size() != 1) { +				  Logger.trace("No entries found."); +				  return null; -		  } else { -			  return result.get(0).getSessionid(); +			  } else { +				  return result.get(0).getSessionid(); -		  }		   +			  } +		  } catch (Exception e) { +			  if (tx != null && !tx.wasCommitted()) +				  tx.rollback(); +			  throw e; +		  }  	}  	public static boolean isSSOSession(String sessionID) throws MOADatabaseException { @@ -331,27 +347,33 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getSessionWithSSOID"); -			  query.setParameter("sessionid", SSOId); -			  result = query.list(); +		  Transaction tx = null; +		  try {	 +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getSessionWithSSOID"); +				  query.setParameter("sessionid", SSOId); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } +			   +			  Logger.trace("Found entries: " + result.size()); -			  //send transaction -			  session.getTransaction().commit(); +			  //Assertion requires an unique artifact +			  if (result.size() != 1) { +				 Logger.trace("No entries found."); +				 return null; +						  +			  } else { +				  return result.get(0); +			  } +		  } catch (Exception e) { +			  if (tx != null && !tx.wasCommitted()) +				  tx.rollback(); +			  throw e;  		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() != 1) { -			 Logger.trace("No entries found."); -			 return null; -					  -		  } else { -			  return result.get(0); -		  }		  	}  	public static void addSSOInformation(String moaSessionID, String SSOSessionID,  @@ -453,13 +475,15 @@ public class AuthenticationSessionStoreage {  		} catch(HibernateException e) {  	  		Logger.warn("Error during database saveOrUpdate. Rollback.", e); -	  		 tx.rollback(); -	  		 throw new AuthenticationException("SSO Session information can not be stored!  --> SSO is deactivated", null);	 -	  	 } +	  		if (tx != null && !tx.wasCommitted()) +	  			tx.rollback(); +	  		throw new AuthenticationException("SSO Session information can not be stored!  --> SSO is deactivated", null);	 +	  	}  	}  	public static List<OASessionStore> getAllActiveOAFromMOASession(AuthenticationSession moaSession) {  		MiscUtil.assertNotNull(moaSession, "MOASession"); +		Session session = null;  		try {  			List<OASessionStore> oas = new ArrayList<OASessionStore>(); @@ -467,7 +491,7 @@ public class AuthenticationSessionStoreage {  			AuthenticatedSessionStore dbsession = searchInDatabase(moaSession.getSessionID(), false);  			oas.addAll(dbsession.getActiveOAsessions()); -			Session session = MOASessionDBUtils.getCurrentSession(); +			session = MOASessionDBUtils.getCurrentSession();  			session.getTransaction().commit();  			return oas; @@ -475,6 +499,14 @@ public class AuthenticationSessionStoreage {  		} catch (MOADatabaseException e) {  			Logger.warn("NO session information found for sessionID " + moaSession.getSessionID(), e); +		} catch (Exception e) { +			if (session != null && session.getTransaction() != null  +					&& !session.getTransaction().wasCommitted()) { +				session.getTransaction().rollback(); +				throw e; +				 +			} +			  		}  		return null; @@ -482,13 +514,13 @@ public class AuthenticationSessionStoreage {  	public static List<InterfederationSessionStore> getAllActiveIDPsFromMOASession(AuthenticationSession moaSession) {  		MiscUtil.assertNotNull(moaSession, "MOASession"); -		 +		Session session = null;  		try {  			List<InterfederationSessionStore> idps = new ArrayList<InterfederationSessionStore>();			  			AuthenticatedSessionStore dbsession = searchInDatabase(moaSession.getSessionID(), false);  			idps.addAll(dbsession.getInderfederation()); -			Session session = MOASessionDBUtils.getCurrentSession(); +			session = MOASessionDBUtils.getCurrentSession();  			session.getTransaction().commit();  			return idps; @@ -496,6 +528,14 @@ public class AuthenticationSessionStoreage {  		} catch (MOADatabaseException e) {  			Logger.warn("NO session information found for sessionID " + moaSession.getSessionID(), e); +		} catch (Exception e) { +			if (session != null && session.getTransaction() != null  +					&& !session.getTransaction().wasCommitted()) { +				session.getTransaction().rollback(); +				throw e; +				 +			} +			  		}  		return null; @@ -507,35 +547,42 @@ public class AuthenticationSessionStoreage {  		  Logger.trace("Get moaSession for userNameID " + userNameID + " and OA "   				  + oaID + " from database.");  		  Session session = MOASessionDBUtils.getCurrentSession(); - -		  List<AuthenticatedSessionStore> result; +		  Transaction tx = null; -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getMOASessionWithNameIDandOAID"); -			  query.setParameter("oaID", oaID); -			  query.setParameter("nameID", userNameID); -			  result = query.list(); +		  List<AuthenticatedSessionStore> result = null;; +		  try {   +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getMOASessionWithNameIDandOAID"); +				  query.setParameter("oaID", oaID); +				  query.setParameter("nameID", userNameID); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } -			  //send transaction -			  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() != 1) { -			 Logger.trace("No unique entry found."); -		   	 return null; -		   	 -		  } -		try {  		   -			return  decryptSession(result.get(0)); +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() != 1) { +				 Logger.trace("No unique entry found."); +			   	 return null; +			   	 +			  } +			  		   +			  return  decryptSession(result.get(0));  		} catch (BuildException e) { -			Logger.warn("MOASession deserialization-exception by using MOASessionID=" + result.get(0).getSessionid(), e); +			Logger.warn("MOASession deserialization-exception by using MOASessionID=" + result.get(0).getSessionid(), e);			  			return null; +			 +		} catch (Exception e) { +			if (tx != null && !tx.wasCommitted()) +				tx.rollback(); +			throw e;  		} +		  	}  	public static OASessionStore searchActiveOASSOSession(AuthenticationSession moaSession, String oaID, String protocolType) { @@ -547,29 +594,36 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getActiveOAWithSessionIDandOAIDandProtocol"); -			  query.setParameter("sessionID", moaSession.getSessionID()); -			  query.setParameter("oaID", oaID); -			  query.setParameter("protocol", protocolType); -			  result = query.list(); +		  Transaction tx = null; +		  try { +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getActiveOAWithSessionIDandOAIDandProtocol"); +				  query.setParameter("sessionID", moaSession.getSessionID()); +				  query.setParameter("oaID", oaID); +				  query.setParameter("protocol", protocolType); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } -			  //send transaction -			  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() == 0) { -			 Logger.trace("No entries found."); -		   	 return null; -		   	 -		  } -		   -		  return  result.get(0).getActiveOAsessions().get(0); +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() == 0) { +				 Logger.trace("No entries found."); +			   	 return null; +			   	 +			  } +			   +			  return  result.get(0).getActiveOAsessions().get(0); +			   +		  } catch (Exception e) { +				if (tx != null && !tx.wasCommitted()) +					tx.rollback(); +				throw e; +			}  	}  	public static String getPendingRequestID(String sessionID) { @@ -584,6 +638,7 @@ public class AuthenticationSessionStoreage {  	}  	public static AuthenticationSession getSessionWithPendingRequestID(String pedingRequestID) { +		Transaction tx = null;  		try {  			  MiscUtil.assertNotNull(pedingRequestID, "pedingRequestID");	    			  Logger.trace("Get authenticated session with pedingRequestID " + pedingRequestID + " from database."); @@ -592,13 +647,13 @@ public class AuthenticationSessionStoreage {  			  List<AuthenticatedSessionStore> result;  			  synchronized (session) { -				  session.beginTransaction(); +				  tx  = session.beginTransaction();  				  Query query = session.getNamedQuery("getSessionWithPendingRequestID");  				  query.setParameter("sessionid", pedingRequestID);  				  result = query.list();  				  //send transaction -				  session.getTransaction().commit(); +				  tx.commit();  			  }  			  Logger.trace("Found entries: " + result.size()); @@ -613,8 +668,13 @@ public class AuthenticationSessionStoreage {  		} catch (Throwable e) {  			Logger.warn("MOASession deserialization-exception by using MOASessionID=" + pedingRequestID); +			 +			if (tx != null && !tx.wasCommitted()) +				tx.rollback(); +			  			return null; -		} +			 +		}   	}  	public static boolean deleteSessionWithPendingRequestID(String id) { @@ -623,34 +683,39 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getSessionWithPendingRequestID"); -			  query.setParameter("sessionid", id); -			  result = query.list(); +		  Transaction tx = null; +		  try { +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getSessionWithPendingRequestID"); +				  query.setParameter("sessionid", id); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } -			  //send transaction -			  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() != 1) { -			 Logger.trace("No entries found."); -			 return false; -					  -		  } else { -			  cleanDelete(result.get(0)); -			  return true; -		  } -		 -		 +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() != 1) { +				 Logger.trace("No entries found."); +				 return false; +						  +			  } else { +				  cleanDelete(result.get(0)); +				  return true; +			  } +		  } catch (Exception e) { +				if (tx != null && !tx.wasCommitted()) +					tx.rollback(); +				throw e; +		  }		  	}  	public static AuthenticationSession getSessionWithUserNameID(String nameID) { +		Transaction tx = null;  		try {  			  MiscUtil.assertNotNull(nameID, "nameID");	    			  Logger.trace("Get authenticated session with pedingRequestID " + nameID + " from database."); @@ -659,13 +724,13 @@ public class AuthenticationSessionStoreage {  			  List<AuthenticatedSessionStore> result;  			  synchronized (session) { -				  session.beginTransaction(); +				  tx  = session.beginTransaction();  				  Query query = session.getNamedQuery("getMOAISessionWithUserNameID");  				  query.setParameter("usernameid", StringEscapeUtils.escapeHtml(nameID));  				  result = query.list();  				  //send transaction -				  session.getTransaction().commit(); +				  tx.commit();  			  }  			  Logger.trace("Found entries: " + result.size()); @@ -679,7 +744,9 @@ public class AuthenticationSessionStoreage {  			  return decryptSession(result.get(0));  		} catch (Throwable e) { -			Logger.warn("MOASession deserialization-exception by using MOASessionID=" + nameID); +			Logger.warn("MOASession deserialization-exception by using MOASessionID=" + nameID);			 +			if (tx != null && !tx.wasCommitted()) +				tx.rollback();  			return null;  		} @@ -691,27 +758,33 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getInterfederatedIDPForSSOWithSessionID"); -			  query.setParameter("sessionID", sessionID); -			  result = query.list(); +		  Transaction tx = null; +		  try { +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getInterfederatedIDPForSSOWithSessionID"); +				  query.setParameter("sessionID", sessionID); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } -			  //send transaction -			  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() == 0) { -			 Logger.trace("No entries found."); -		   	return null; -		   	 -		  } -		   -		  return result.get(0).getInderfederation().get(0); +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() == 0) { +				 Logger.trace("No entries found."); +			   	return null; +			   	 +			  } +			   +			  return result.get(0).getInderfederation().get(0); +		} catch (Exception e) { +			if (tx != null && !tx.wasCommitted()) +				tx.rollback(); +			throw e; +		}	  	}  	public static InterfederationSessionStore searchInterfederatedIDPFORSSOWithMOASessionIDPID(String sessionID, String idpID) { @@ -721,28 +794,34 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getInterfederatedIDPForSSOWithSessionIDIDPID"); -			  query.setParameter("sessionID", sessionID); -			  query.setParameter("idpID", idpID); -			  result = query.list(); +		  Transaction tx = null; +		  try {		   +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getInterfederatedIDPForSSOWithSessionIDIDPID"); +				  query.setParameter("sessionID", sessionID); +				  query.setParameter("idpID", idpID); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } -			  //send transaction -			  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() == 0) { -			 Logger.trace("No entries found."); -		   	return null; -		   	 -		  } -		   -		  return result.get(0).getInderfederation().get(0); +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() == 0) { +				 Logger.trace("No entries found."); +			   	return null; +			   	 +			  } +			   +			  return result.get(0).getInderfederation().get(0); +		  } catch (Exception e) { +				if (tx != null && !tx.wasCommitted()) +					tx.rollback(); +				throw e; +		  }	  	}  	public static String createInterfederatedSession(IRequest req, boolean isAuthenticated, String ssoID) throws MOADatabaseException, AssertionAttributeExtractorExeption, BuildException {		 @@ -847,27 +926,33 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List<AuthenticatedSessionStore> result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getInterfederatedIDPForAttributeQueryWithSessionID"); -			  query.setParameter("sessionID", moaSession.getSessionID()); -			  result = query.list(); +		  Transaction tx = null; +		  try { +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getInterfederatedIDPForAttributeQueryWithSessionID"); +				  query.setParameter("sessionID", moaSession.getSessionID()); +				  result = query.list(); +				   +				  //send transaction +				  tx.commit(); +			  } -			  //send transaction -			  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() == 0) { -			 Logger.trace("No entries found."); -		   	return null; -		   	 -		  } -		   -		  return result.get(0).getInderfederation().get(0); +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() == 0) { +				 Logger.trace("No entries found."); +			   	return null; +			   	 +			  } +			   +			  return result.get(0).getInderfederation().get(0); +		} catch (Exception e) { +			if (tx != null && !tx.wasCommitted()) +				tx.rollback(); +			throw e; +		}	  	}  	/** @@ -930,28 +1015,34 @@ public class AuthenticationSessionStoreage {  		List<AuthenticatedSessionStore> results;  		Session session = MOASessionDBUtils.getCurrentSession(); -		 -		synchronized (session) {			 -			session.beginTransaction(); -			Query query = session.getNamedQuery("getMOAISessionsWithTimeOut"); -			query.setTimestamp("timeoutcreate", expioredatecreate); -			query.setTimestamp("timeoutupdate", expioredateupdate); -			results = query.list(); -			session.getTransaction().commit(); -		} -		 -		if (results.size() != 0) { -			for(AuthenticatedSessionStore result : results) { -				try {  -					cleanDelete(result); -					Logger.info("Authenticated session with sessionID=" + result.getSessionid()  -							+ " after session timeout."); -				 -				} catch (HibernateException e){ -					Logger.warn("Authenticated session with sessionID=" + result.getSessionid()  -							+ " not removed after timeout! (Error during Database communication)", e); -				} -			}	 +		Transaction tx = null; +		try { +			synchronized (session) {			 +				tx = session.beginTransaction(); +				Query query = session.getNamedQuery("getMOAISessionsWithTimeOut"); +				query.setTimestamp("timeoutcreate", expioredatecreate); +				query.setTimestamp("timeoutupdate", expioredateupdate); +				results = query.list(); +				tx.commit(); +			} +			 +			if (results.size() != 0) { +				for(AuthenticatedSessionStore result : results) { +					try {  +						cleanDelete(result); +						Logger.info("Authenticated session with sessionID=" + result.getSessionid()  +								+ " after session timeout."); +					 +					} catch (HibernateException e){ +						Logger.warn("Authenticated session with sessionID=" + result.getSessionid()  +								+ " not removed after timeout! (Error during Database communication)", e); +					} +				}	 +			} +		} catch (Exception e) { +			if (tx != null && !tx.wasCommitted()) +				tx.rollback(); +			throw e;  		}	  	} @@ -1004,26 +1095,32 @@ public class AuthenticationSessionStoreage {  		  Session session = MOASessionDBUtils.getCurrentSession();  		  List result; -		   -		  synchronized (session) { -			  session.beginTransaction(); -			  Query query = session.getNamedQuery("getSessionWithID"); -			  query.setParameter("sessionid", sessionID); -			  result = query.list(); +		  Transaction tx = null; +		  try { +			  synchronized (session) { +				  tx = session.beginTransaction(); +				  Query query = session.getNamedQuery("getSessionWithID"); +				  query.setParameter("sessionid", sessionID); +				  result = query.list(); +				   +				  //send transaction +				  if (commit) +					  tx.commit(); +			  } -			  //send transaction -			  if (commit) -				  session.getTransaction().commit(); -		  } -		   -		  Logger.trace("Found entries: " + result.size()); -		   -		  //Assertion requires an unique artifact -		  if (result.size() != 1) { -			 Logger.trace("No entries found."); -		   	throw new MOADatabaseException("No session found with this sessionID"); -		  } -		   -		  return (AuthenticatedSessionStore) result.get(0); +			  Logger.trace("Found entries: " + result.size()); +			   +			  //Assertion requires an unique artifact +			  if (result.size() != 1) { +				 Logger.trace("No entries found."); +			   	throw new MOADatabaseException("No session found with this sessionID"); +			  } +			   +			  return (AuthenticatedSessionStore) result.get(0); +		  } catch (Exception e) { +				if (tx != null && !tx.wasCommitted() && commit) +					tx.rollback(); +				throw e; +		}	  	}  } diff --git a/id/server/idserverlib/src/main/resources/moaid.configuration.beans.xml b/id/server/idserverlib/src/main/resources/moaid.configuration.beans.xml index 206fde87d..7e319e235 100644 --- a/id/server/idserverlib/src/main/resources/moaid.configuration.beans.xml +++ b/id/server/idserverlib/src/main/resources/moaid.configuration.beans.xml @@ -29,7 +29,7 @@  		<property name="testOnBorrow" value="${configuration.dbcp.testOnBorrow}" />  		<property name="testOnReturn" value="${configuration.dbcp.testOnReturn}" />  		<property name="testWhileIdle" value="${configuration.dbcp.testWhileIdle}" /> -		<property name="validationQuery" value="SELECT 1" /> +		<property name="validationQuery" value="${configuration.dbcp.validationQuery}" />  	</bean>  	<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfiguration.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfiguration.java index 223f29a0b..4bd459f23 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfiguration.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfiguration.java @@ -61,4 +61,16 @@ public interface MOAIDConfiguration extends Configuration {  	 * @throws ConfigurationException in case of an configuration access error  	 */  	public Map<String, String> getOnlineApplication(String publicURLPrefix) throws ConfigurationException; +	 +	 +	/** +	 * Load an OnlineApplication configuration and remove the OA key prefix +	 * This is a backup version if direct UniqueID selection does not work +	 *  +	 * @param publicURLPrefix: Unique identifier of online application +	 * @return Properties of the online application or null if no OA is found +	 * @throws ConfigurationException in case of an configuration access error +	 */ +	public Map<String, String> getOnlineApplicationBackupVersion(String publicURLPrefix) throws ConfigurationException; +	  }
\ No newline at end of file diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfigurationImpl.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfigurationImpl.java index 297c63d7d..b9b5ad611 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfigurationImpl.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/config/persistence/MOAIDConfigurationImpl.java @@ -1,5 +1,7 @@  package at.gv.egovernment.moa.id.commons.config.persistence; +import java.sql.SQLSyntaxErrorException; +import java.util.ArrayList;  import java.util.HashMap;  import java.util.Iterator;  import java.util.List; @@ -131,13 +133,88 @@ public class MOAIDConfigurationImpl extends DatabaseConfigPropertyImpl implement  		String keyId = MOAIDConfigurationConstants.PREFIX_MOAID_SERVICES  				+ ".%."  				+ MOAIDConfigurationConstants.SERVICE_UNIQUEIDENTIFIER; -				 +		 +		List<ConfigProperty> oaSearchResult = null;  		TypedQuery<ConfigProperty> oaSearchQuery = em.createQuery("select dbconfig from ConfigProperty dbconfig where dbconfig.key like :key and dbconfig.value = SUBSTRING(:uniqueID, 1, LENGTH(dbconfig.value))", ConfigProperty.class);  		oaSearchQuery.setParameter("key", keyId);  		oaSearchQuery.setParameter("uniqueID", publicURLPrefix); -		List<ConfigProperty> oaSearchResult = oaSearchQuery.getResultList(); +		oaSearchResult = oaSearchQuery.getResultList(); +			 +		return postProcessLoadOnlineApplication(em, oaSearchResult); + +	} +		 +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.commons.config.persistence.MOAIDConfiguration#getOnlineApplicationBackupVersion(java.lang.String) +	 */ +	@Override +	public Map<String, String> getOnlineApplicationBackupVersion( +			String publicURLPrefix) throws ConfigurationException { +		Logger.debug("Use backup implementation to query configuration database"); +		 +		EntityManager em = this.getPersistenceContext(); +		if (null == em) { +			Logger.error("No EntityManager set!"); +			throw new ConfigurationException("No EntityManager set!"); +			 +		} +		 +		//search key prefix for online application with this publicURLPrefix +		String keyId = MOAIDConfigurationConstants.PREFIX_MOAID_SERVICES +				+ ".%." +				+ MOAIDConfigurationConstants.SERVICE_UNIQUEIDENTIFIER; -        if (oaSearchResult.size() == 0) { +		List<ConfigProperty> oaSearchResult = new ArrayList<ConfigProperty>(); +		 +		TypedQuery<ConfigProperty> oaSearchQuery = em.createQuery("select dbconfig from ConfigProperty dbconfig where dbconfig.key like :key", ConfigProperty.class); +		oaSearchQuery.setParameter("key", keyId); +		List<ConfigProperty> intermResult = oaSearchQuery.getResultList(); +		if (intermResult != null) {			 +			for (ConfigProperty el : intermResult) { +				if (publicURLPrefix.startsWith(el.getValue())) +					oaSearchResult.add(el); +				 +			}				 +		}	 +		 +		return postProcessLoadOnlineApplication(em, oaSearchResult); +		 +	} +	 +	/** +	 * Small helper method. NOTE: may return empty configuration properties, but never {@code null}. +	 *  +	 * @param propPrefix: the prefix of the desired property. +	 * @param input: List of database objects with key/value information. +	 * @param removePrefix: Indicates if the prefix should be removed from the result key +	 * @return the {@link Map} of configuration properties +	 */ +	private Map<String, String> getKeyValueFromDatabaseDAO(Iterator<ConfigProperty> input, final String prefix, boolean removePrefix) { +		Map<String, String> configProp = new HashMap<String, String>(); +		 while (input.hasNext()) { +	        ConfigProperty el = input.next(); +	        if (removePrefix) { +	        	if (el.getKey().startsWith(prefix)) {	        	 +	        		String propertyName = KeyValueUtils.removePrefixFromKey(el.getKey(), prefix);	        		 +	        		configProp.put(propertyName, el.getValue()); +	        		 +	        	}	 +	        } else +	        	configProp.put(el.getKey(), el.getValue()); +	        		                	 +		} +		return configProp; +	} + +	/** +	 * Online-Application load operation post-processing +	 *  +	 * @param em EntityManager for Database access +	 * @param oaSearchResult Search result of first OA selection operation +	 * @return Map of post-processed OA configuration key/value pairs +	 */	 +	private Map<String, String> postProcessLoadOnlineApplication(EntityManager em, List<ConfigProperty> oaSearchResult) {		 +		if (oaSearchResult == null || oaSearchResult.size() == 0) {              Logger.debug("No entries found.");              return null;      } @@ -170,31 +247,6 @@ public class MOAIDConfigurationImpl extends DatabaseConfigPropertyImpl implement  		result.put(MOAIDConfigurationConstants.PREFIX_MOAID_SERVICES, oaType);  		return result; +		  	} -	 -	/** -	 * Small helper method. NOTE: may return empty configuration properties, but never {@code null}. -	 *  -	 * @param propPrefix: the prefix of the desired property. -	 * @param input: List of database objects with key/value information. -	 * @param removePrefix: Indicates if the prefix should be removed from the result key -	 * @return the {@link Map} of configuration properties -	 */ -	private Map<String, String> getKeyValueFromDatabaseDAO(Iterator<ConfigProperty> input, final String prefix, boolean removePrefix) { -		Map<String, String> configProp = new HashMap<String, String>(); -		 while (input.hasNext()) { -	        ConfigProperty el = input.next(); -	        if (removePrefix) { -	        	if (el.getKey().startsWith(prefix)) {	        	 -	        		String propertyName = KeyValueUtils.removePrefixFromKey(el.getKey(), prefix);	        		 -	        		configProp.put(propertyName, el.getValue()); -	        		 -	        	}	 -	        } else -	        	configProp.put(el.getKey(), el.getValue()); -	        		                	 -		} -		return configProp; -	} -  } diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java index 76215528d..49e0634cb 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/MOASessionDBUtils.java @@ -163,8 +163,9 @@ public final class MOASessionDBUtils {  	  	 } catch(HibernateException e) {  	  		Logger.warn("Error during MOASession database saveOrUpdate. Rollback.", e); -	  		 tx.rollback(); -	  		 throw new MOADatabaseException(e); +	  		if (tx != null) +	  			tx.rollback(); +	  		throw new MOADatabaseException(e);  	  	 }  	   } @@ -183,8 +184,9 @@ public final class MOASessionDBUtils {  	  	 } catch(HibernateException e) {  	  		Logger.warn("Error during MOASession database delete. Rollback.", e); -	  		 tx.rollback(); -	  		 return false; +	  		if (tx != null) +	  			tx.rollback(); +	  		return false;  	  	 }  	   } diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/NewConfigurationDBRead.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/NewConfigurationDBRead.java index 0f157f109..c049eebc4 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/NewConfigurationDBRead.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/NewConfigurationDBRead.java @@ -41,9 +41,12 @@ public class NewConfigurationDBRead {  	} -	public Map<String, String> getOnlineApplicationKeyValueWithId(String id) { +	public Map<String, String> getOnlineApplicationKeyValueWithId(String id, boolean backupVersion) {  		try { -			return conf.getOnlineApplication(id); +			if (backupVersion) +				return conf.getOnlineApplicationBackupVersion(id); +			else +				return conf.getOnlineApplication(id);  		} catch (ConfigurationException e) {  			Logger.warn("OnlineApplication with Id: " + id + " not found.", e); diff --git a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/dao/config/DatabaseConfigPropertyImpl.java b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/dao/config/DatabaseConfigPropertyImpl.java index f59e39ac6..aad830d65 100644 --- a/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/dao/config/DatabaseConfigPropertyImpl.java +++ b/id/server/moa-id-commons/src/main/java/at/gv/egovernment/moa/id/commons/db/dao/config/DatabaseConfigPropertyImpl.java @@ -1,6 +1,10 @@  package at.gv.egovernment.moa.id.commons.db.dao.config; +import java.util.ArrayList; +import java.util.Iterator;  import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Pattern;  import javax.persistence.EntityManager;  import javax.persistence.PersistenceContext; @@ -137,10 +141,33 @@ public class DatabaseConfigPropertyImpl extends AbstractConfigurationImpl {  			throw new ConfigurationException("No EntityManager set!");  		} -		TypedQuery<String> query = em.createQuery("select key from ConfigProperty dbconfig where dbconfig.value like :value", String.class); -		query.setParameter("value", searchString.replace("*", "%")); -		List<String> result = query.getResultList(); -		return result.toArray(new String[result.size()]); +		TypedQuery<ConfigProperty> query = em.createQuery("select * from ConfigProperty dbconfig", ConfigProperty.class); +		List<ConfigProperty> all = query.getResultList(); +		 +		searchString = searchString.replace(".", "\\."); +		String regex = searchString.replace("*", ".*"); +		regex = regex.replace("%", "\\w*"); +		log.debug("Searching with regex: {}", regex);	 +		Pattern pattern = Pattern.compile(regex); +		 +		List<String> keyList = new ArrayList<String>();	 +		Iterator<ConfigProperty> keyIt; +		if (all != null) { +			keyIt = all.iterator(); +			while(keyIt.hasNext()) { +				ConfigProperty entry = keyIt.next(); +				String value = entry.getValue(); +				String key = entry.getKey(); +				 +				if(pattern.matcher(value).matches()) { +					keyList.add(key); +				}								 +			} +		} +				 +		String[] result = new String[keyList.size()];		 +		return keyList.toArray(result); +			  	}  	/* (non-Javadoc) diff --git a/id/server/moa-id-commons/src/main/resources/moaid.migration.beans.xml b/id/server/moa-id-commons/src/main/resources/moaid.migration.beans.xml index 3bd122254..c758e230e 100644 --- a/id/server/moa-id-commons/src/main/resources/moaid.migration.beans.xml +++ b/id/server/moa-id-commons/src/main/resources/moaid.migration.beans.xml @@ -31,7 +31,7 @@  		<property name="testOnBorrow" value="${dbcp.testOnBorrow}" />  		<property name="testOnReturn" value="${dbcp.testOnReturn}" />  		<property name="testWhileIdle" value="${dbcp.testWhileIdle}" /> -		<property name="validationQuery" value="SELECT 1" /> +		<property name="validationQuery" value="${dbcp.validationQuery}" />  	</bean> | 
