diff options
Diffstat (limited to 'id/server/idserverlib')
8 files changed, 247 insertions, 17 deletions
| diff --git a/id/server/idserverlib/.gitignore b/id/server/idserverlib/.gitignore index ea8c4bf7f..19f2e002c 100644 --- a/id/server/idserverlib/.gitignore +++ b/id/server/idserverlib/.gitignore @@ -1 +1,2 @@  /target +/target diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/exceptions/SchemaValidationException.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/exceptions/SchemaValidationException.java new file mode 100644 index 000000000..fc4ed1f28 --- /dev/null +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/exceptions/SchemaValidationException.java @@ -0,0 +1,52 @@ +/* + * Copyright 2014 Federal Chancellery Austria + * MOA-ID has been developed in a cooperation between BRZ, the Federal + * Chancellery Austria - ICT staff unit, and Graz University of Technology. + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://www.osor.eu/eupl/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + * + * This product combines work with different licenses. See the "NOTICE" text + * file for details on the various modules and licenses. + * The "NOTICE" text file is part of the distribution. Any derivative works + * that you distribute must include a readable copy of the "NOTICE" text file. + */ +package at.gv.egovernment.moa.id.protocols.pvp2x.exceptions; + +/** + * @author tlenz + * + */ +public class SchemaValidationException extends PVP2Exception { + +	/** +	 *  +	 */ +	private static final long serialVersionUID = 1L; + +	/** +	 * @param messageId +	 * @param parameters +	 */ +	public SchemaValidationException(String messageId, Object[] parameters) { +		super(messageId, parameters); +	} +	 +	/** +	 * @param messageId +	 * @param parameters +	 */ +	public SchemaValidationException(String messageId, Object[] parameters, Throwable e) { +		super(messageId, parameters, e); +	} + +} diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/metadata/MOAMetadataProvider.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/metadata/MOAMetadataProvider.java index cba64e080..12afa14bc 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/metadata/MOAMetadataProvider.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/metadata/MOAMetadataProvider.java @@ -57,6 +57,7 @@ import at.gv.egovernment.moa.id.config.auth.AuthConfigurationProvider;  import at.gv.egovernment.moa.id.protocols.pvp2x.PVPConstants;  import at.gv.egovernment.moa.id.protocols.pvp2x.verification.metadata.InterfederatedIDPPublicServiceFilter;  import at.gv.egovernment.moa.id.protocols.pvp2x.verification.metadata.MetadataFilterChain; +import at.gv.egovernment.moa.id.protocols.pvp2x.verification.metadata.SchemaValidationFilter;  import at.gv.egovernment.moa.logging.Logger;  import at.gv.egovernment.moa.util.MiscUtil; @@ -324,6 +325,7 @@ public class MOAMetadataProvider implements MetadataProvider {  	private MetadataFilterChain buildMetadataFilterChain(OnlineApplication oa, String metadataURL, byte[] certificate) throws CertificateException {  		MetadataFilterChain filterChain = new MetadataFilterChain(metadataURL, certificate); +		filterChain.getFilters().add(new SchemaValidationFilter());  		if (oa.isIsInterfederationIDP() != null && oa.isIsInterfederationIDP()) {  			Logger.info("Online-Application is an interfederated IDP. Add addional Metadata policies"); @@ -374,6 +376,8 @@ public class MOAMetadataProvider implements MetadataProvider {  			httpProvider.setMetadataFilter(filter);  			httpProvider.initialize(); +			httpProvider.setRequireValidMetadata(true); +			  			return httpProvider;  		} catch (Throwable e) { diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/SAMLVerificationEngine.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/SAMLVerificationEngine.java index 2247ad227..257f9dac4 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/SAMLVerificationEngine.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/SAMLVerificationEngine.java @@ -25,14 +25,20 @@ package at.gv.egovernment.moa.id.protocols.pvp2x.verification;  import java.util.ArrayList;  import java.util.List; +import javax.xml.transform.dom.DOMSource; +import javax.xml.validation.Schema; +import javax.xml.validation.Validator; +  import org.joda.time.DateTime;  import org.opensaml.common.xml.SAMLConstants; +import org.opensaml.common.xml.SAMLSchemaBuilder;  import org.opensaml.saml2.core.Conditions;  import org.opensaml.saml2.core.EncryptedAssertion;  import org.opensaml.saml2.core.RequestAbstractType;  import org.opensaml.saml2.core.Response;  import org.opensaml.saml2.core.StatusCode;  import org.opensaml.saml2.core.StatusResponseType; +import org.opensaml.saml2.core.validator.AuthnRequestSchemaValidator;  import org.opensaml.saml2.encryption.Decrypter;  import org.opensaml.saml2.encryption.EncryptedElementTypeEncryptedKeyResolver;  import org.opensaml.saml2.metadata.IDPSSODescriptor; @@ -51,11 +57,14 @@ import org.opensaml.xml.security.keyinfo.StaticKeyInfoCredentialResolver;  import org.opensaml.xml.security.x509.X509Credential;  import org.opensaml.xml.signature.SignatureTrustEngine;  import org.opensaml.xml.validation.ValidationException; +import org.w3c.dom.Element; +import org.xml.sax.SAXException;  import at.gv.egovernment.moa.id.auth.exception.InvalidProtocolRequestException;  import at.gv.egovernment.moa.id.config.ConfigurationException;  import at.gv.egovernment.moa.id.protocols.pvp2x.config.PVPConfiguration;  import at.gv.egovernment.moa.id.protocols.pvp2x.exceptions.AssertionValidationExeption; +import at.gv.egovernment.moa.id.protocols.pvp2x.exceptions.SchemaValidationException;  import at.gv.egovernment.moa.id.protocols.pvp2x.messages.InboundMessage;  import at.gv.egovernment.moa.id.protocols.pvp2x.messages.MOARequest;  import at.gv.egovernment.moa.id.protocols.pvp2x.messages.MOAResponse; @@ -81,9 +90,15 @@ public class SAMLVerificationEngine {  		SAMLSignatureProfileValidator profileValidator = new SAMLSignatureProfileValidator();  		try {  		    profileValidator.validate(samlObj.getSignature()); +		    performSchemaValidation(samlObj.getDOM()); +		      		} catch (ValidationException e) { -		    // Indicates signature did not conform to SAML Signature profile -		    e.printStackTrace(); +			 Logger.warn("Signature is not conform to SAML signature profile", e); +			 throw new InvalidProtocolRequestException("pvp2.21", new Object[] {}); +		 +		} catch (SchemaValidationException e) {			 +			throw new InvalidProtocolRequestException("pvp2.22", new Object[] {e.getMessage()}); +		  		}  		CriteriaSet criteriaSet = new CriteriaSet(); @@ -103,12 +118,17 @@ public class SAMLVerificationEngine {  	public void verifyRequest(RequestAbstractType samlObj, SignatureTrustEngine sigTrustEngine ) throws org.opensaml.xml.security.SecurityException, Exception {  		SAMLSignatureProfileValidator profileValidator = new SAMLSignatureProfileValidator(); -		  		try { -		    profileValidator.validate(samlObj.getSignature()); +		    profileValidator.validate(samlObj.getSignature());		     +		    performSchemaValidation(samlObj.getDOM()); +		      		} catch (ValidationException e) { -		    // Indicates signature did not conform to SAML Signature profile -		    e.printStackTrace(); +		    Logger.warn("Signature is not conform to SAML signature profile", e); +		    throw new InvalidProtocolRequestException("pvp2.21", new Object[] {}); +		     +		} catch (SchemaValidationException e) {			 +			throw new InvalidProtocolRequestException("pvp2.22", new Object[] {e.getMessage()}); +			  		}  		CriteriaSet criteriaSet = new CriteriaSet(); @@ -173,7 +193,10 @@ public class SAMLVerificationEngine {  				List<org.opensaml.saml2.core.Assertion> validatedassertions = new ArrayList<org.opensaml.saml2.core.Assertion>();				  				for (org.opensaml.saml2.core.Assertion saml2assertion : saml2assertions) { -					Conditions conditions = saml2assertion.getConditions(); +					try { +						performSchemaValidation(saml2assertion.getDOM()); +											 +						Conditions conditions = saml2assertion.getConditions();  					DateTime notbefore = conditions.getNotBefore().minusMinutes(5);  					DateTime notafter = conditions.getNotOnOrAfter();  					if ( notbefore.isAfterNow() || notafter.isBeforeNow() ) { @@ -181,12 +204,16 @@ public class SAMLVerificationEngine {  								+ "{ Current : " + new DateTime()   								+ " NotBefore: " + notbefore   								+ " NotAfter : " + notafter -								+ " }"); +								+ " }");; -					} else { -						validatedassertions.add(saml2assertion); +						} else { +							validatedassertions.add(saml2assertion); +						 +						} +						 +					} catch (SchemaValidationException e) { -					}							 +					}  				}  				if (validatedassertions.isEmpty()) { @@ -217,4 +244,35 @@ public class SAMLVerificationEngine {  			throw new AssertionValidationExeption("pvp.12", null, e);  		} 		  	} +	 +	private static void performSchemaValidation(Element source) throws SchemaValidationException { +		 +		String err = null; +		try { +			Schema test = SAMLSchemaBuilder.getSAML11Schema(); +			Validator val = test.newValidator();		 +			val.validate(new DOMSource(source)); +			Logger.debug("Schema validation check done OK"); +			return; +		 +		} catch (SAXException e) { +			err = e.getMessage(); +			if (Logger.isDebugEnabled() || Logger.isTraceEnabled()) +				Logger.warn("Schema validation FAILED with exception:", e); +			else +				Logger.warn("Schema validation FAILED with message: "+ e.getMessage()); +						 +		} catch (Exception e) { +			err = e.getMessage(); +			if (Logger.isDebugEnabled() || Logger.isTraceEnabled()) +				Logger.warn("Schema validation FAILED with exception:", e); +			else +				Logger.warn("Schema validation FAILED with message: "+ e.getMessage()); +						 +		} +		 +		throw new SchemaValidationException("pvp2.22", new Object[]{err}); +		 +	} +	  } diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/InterfederatedIDPPublicServiceFilter.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/InterfederatedIDPPublicServiceFilter.java index 3d608fd6d..4d9b97a52 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/InterfederatedIDPPublicServiceFilter.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/InterfederatedIDPPublicServiceFilter.java @@ -26,7 +26,6 @@ import org.opensaml.saml2.metadata.provider.FilterException;  import org.opensaml.saml2.metadata.provider.MetadataFilter;  import org.opensaml.xml.XMLObject; -import at.gv.egovernment.moa.id.commons.db.dao.config.InterfederationIDPType;  import at.gv.egovernment.moa.id.commons.validation.ValidationHelper;  import at.gv.egovernment.moa.logging.Logger; diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/SchemaValidationFilter.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/SchemaValidationFilter.java new file mode 100644 index 000000000..403b68524 --- /dev/null +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/pvp2x/verification/metadata/SchemaValidationFilter.java @@ -0,0 +1,103 @@ +/* + * Copyright 2014 Federal Chancellery Austria + * MOA-ID has been developed in a cooperation between BRZ, the Federal + * Chancellery Austria - ICT staff unit, and Graz University of Technology. + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://www.osor.eu/eupl/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + * + * This product combines work with different licenses. See the "NOTICE" text + * file for details on the various modules and licenses. + * The "NOTICE" text file is part of the distribution. Any derivative works + * that you distribute must include a readable copy of the "NOTICE" text file. + */ +package at.gv.egovernment.moa.id.protocols.pvp2x.verification.metadata; + +import java.io.IOException; + +import org.opensaml.saml2.metadata.provider.FilterException; +import org.opensaml.saml2.metadata.provider.MetadataFilter; +import org.opensaml.xml.XMLObject; + +import javax.xml.transform.dom.DOMSource; +import javax.xml.validation.Schema; +import javax.xml.validation.Validator; + +import org.opensaml.common.xml.SAMLSchemaBuilder; + +import org.xml.sax.SAXException; + +import at.gv.egovernment.moa.logging.Logger; + +/** + * @author tlenz + * + */ +public class SchemaValidationFilter implements MetadataFilter { + +	private boolean isActive = true; +	 +	public SchemaValidationFilter() { +		 +	} +	 +	/** +	 *  +	 */ +	public SchemaValidationFilter(boolean useSchemaValidation) { +		this.isActive = useSchemaValidation; +	} +	 +	 +	/* (non-Javadoc) +	 * @see org.opensaml.saml2.metadata.provider.MetadataFilter#doFilter(org.opensaml.xml.XMLObject) +	 */ +	@Override +	public void doFilter(XMLObject arg0) throws FilterException { +		 +		String errString = null; +		 +		if (isActive) { +			try { +				Schema test = SAMLSchemaBuilder.getSAML11Schema(); +				Validator val = test.newValidator(); +				DOMSource source = new DOMSource(arg0.getDOM());		 +				val.validate(source); +				Logger.info("Metadata Schema validation check done OK"); +				return; +			 +			} catch (SAXException e) { +				if (Logger.isDebugEnabled() || Logger.isTraceEnabled()) +					Logger.warn("Metadata Schema validation FAILED with exception:", e); +				else +					Logger.warn("Metadata Schema validation FAILED with message: "+ e.getMessage()); + +				errString = e.getMessage(); +				 +			} catch (Exception e) { +				if (Logger.isDebugEnabled() || Logger.isTraceEnabled()) +					Logger.warn("Metadata Schema validation FAILED with exception:", e); +				else +					Logger.warn("Metadata Schema validation FAILED with message: "+ e.getMessage()); +				 +				errString = e.getMessage(); +				 +			} +			 +			throw new FilterException("Metadata Schema validation FAILED with message: "+ errString); +			 +		} else		 +			Logger.info("Metadata Schema validation check is DEACTIVATED!"); +		 +	} + +} diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/util/client/mis/simple/MISSimpleClient.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/util/client/mis/simple/MISSimpleClient.java index 15b2a89b5..ab8d19803 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/util/client/mis/simple/MISSimpleClient.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/util/client/mis/simple/MISSimpleClient.java @@ -56,6 +56,7 @@ import javax.xml.parsers.ParserConfigurationException;  import javax.xml.transform.TransformerException;
  import org.apache.commons.codec.binary.Base64;
 +import org.apache.commons.httpclient.HostConfiguration;
  import org.apache.commons.httpclient.HttpClient;
  import org.apache.commons.httpclient.methods.PostMethod;
  import org.apache.commons.httpclient.methods.StringRequestEntity;
 diff --git a/id/server/idserverlib/src/test/java/test/tlenz/simpletest.java b/id/server/idserverlib/src/test/java/test/tlenz/simpletest.java index ec908f78b..549eb4f2b 100644 --- a/id/server/idserverlib/src/test/java/test/tlenz/simpletest.java +++ b/id/server/idserverlib/src/test/java/test/tlenz/simpletest.java @@ -1,3 +1,8 @@ +package test.tlenz; + +import at.gv.egovernment.moa.id.data.AuthenticationRole; +import at.gv.egovernment.moa.id.data.AuthenticationRoleFactory; +  /*******************************************************************************   * Copyright 2014 Federal Chancellery Austria   * MOA-ID has been developed in a cooperation between BRZ, the Federal @@ -38,12 +43,19 @@  //import at.gv.egovernment.moa.id.storage.AssertionStorage;  //import at.gv.egovernment.moa.util.MiscUtil;  // -//public class simpletest { +public class simpletest {  // -//	public static void main(String[] args) { +	public static void main(String[] args) { +		 +		AuthenticationRole test = AuthenticationRoleFactory.buildFormPVPole("ecas-demo-EUROPEAN_COMMISSION(key=A\\,B)"); +		 +		test = AuthenticationRoleFactory.buildFormPVPole("ecas-demo-EUROPEAN_COMMISSION"); +		test = AuthenticationRoleFactory.buildFormPVPole("ecas-demo-EUROPEAN_COMMISSION(key=A)"); +		test = AuthenticationRoleFactory.buildFormPVPole("ecas-demo-EUROPEAN_COMMISSION(keyA=A,keyB=B)"); +		  //		  //		System.setProperty("mandates.configuration", "D:/Projekte/svn/moa-id/moa-id.properties"); -//		String propertiesFileLocation = System.getProperty("mandates.configuration"); +//		String propertiesFileLocation = Systm.getProperty("mandates.configuration");  //		  //		MiscUtil.assertNotNull(propertiesFileLocation, "propertiesFileName");  //		File propertiesFile = new File(propertiesFileLocation); @@ -95,5 +107,5 @@  //		  //		  //		 -//	} -//} +	} +} | 
