aboutsummaryrefslogtreecommitdiff
path: root/id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java')
-rw-r--r--id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java105
1 files changed, 99 insertions, 6 deletions
diff --git a/id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java b/id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java
index d8fcd1694..f347022b8 100644
--- a/id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java
+++ b/id/server/modules/moa-id-module-eIDAS/src/main/java/at/gv/egovernment/moa/id/auth/modules/eidas/engine/MOAProtocolEngine.java
@@ -1,16 +1,17 @@
package at.gv.egovernment.moa.id.auth.modules.eidas.engine;
-import java.security.cert.X509Certificate;
-
-import org.apache.commons.lang3.StringUtils;
+import org.opensaml.saml2.core.AuthnRequest;
import org.opensaml.saml2.core.Response;
+import org.w3c.dom.Document;
import at.gv.egovernment.moa.logging.Logger;
-import eu.eidas.auth.commons.EidasErrorKey;
-import eu.eidas.auth.commons.protocol.IAuthenticationRequest;
+import at.gv.egovernment.moa.util.MiscUtil;
+import eu.eidas.auth.engine.Correlated;
import eu.eidas.auth.engine.ProtocolEngine;
import eu.eidas.auth.engine.configuration.ProtocolConfigurationAccessor;
-import eu.eidas.auth.engine.xml.opensaml.SAMLEngineUtils;
+import eu.eidas.auth.engine.core.ProtocolProcessorI;
+import eu.eidas.auth.engine.metadata.MetadataFetcherI;
+import eu.eidas.auth.engine.xml.opensaml.XmlSchemaUtil;
import eu.eidas.engine.exceptions.EIDASSAMLEngineException;
public class MOAProtocolEngine extends ProtocolEngine {
@@ -20,6 +21,98 @@ public class MOAProtocolEngine extends ProtocolEngine {
}
+ /**
+ * Add SAML2 metadata refresh functionality if first validation failed
+ *
+ */
+ @Override
+ public Correlated unmarshallResponse(byte[] responseBytes) throws EIDASSAMLEngineException {
+ try {
+ return super.unmarshallResponse(responseBytes);
+
+ } catch (EIDASSAMLEngineException e) {
+ if (responseBytes != null ) {
+ Logger.info("eIDAS Response validation FAILED. Starting metadata reloading process ...");
+ Document document = XmlSchemaUtil.validateSamlSchema(responseBytes);
+ Response response = (Response) unmarshall(document);
+ String entityID = response.getIssuer().getValue();
+
+ if (MiscUtil.isEmpty(entityID)) {
+ Logger.debug("eIDAS Response contains no EntityID.");
+ throw e;
+
+ }
+
+ if (startInternalMetadataRefesh(entityID)) {
+ Logger.debug("Metadata refresh success. Revalidate eIDAS Response ...");
+ return super.unmarshallResponse(responseBytes);
+
+ }
+ Logger.info("eIDAS metadata refresh not possible or not successful.");
+
+ }
+ throw e;
+
+ }
+ }
+
+ /**
+ * Add SAML2 metadata refresh functionality if first validation failed
+ *
+ */
+ @Override
+ public AuthnRequest unmarshallRequest(byte[] requestBytes) throws EIDASSAMLEngineException {
+ try {
+ return super.unmarshallRequest(requestBytes);
+
+
+ } catch (EIDASSAMLEngineException e) {
+ if (null != requestBytes) {
+ Logger.info("eIDAS Request validation FAILED. Starting metadata reloading process ...");
+ Document document = XmlSchemaUtil.validateSamlSchema(requestBytes);
+ AuthnRequest request = (AuthnRequest) unmarshall(document);
+ String entityID = request.getIssuer().getValue();
+
+ if (MiscUtil.isEmpty(entityID)) {
+ Logger.debug("eIDAS Authn. Request contains no EntityID.");
+ throw e;
+
+ }
+
+ if (startInternalMetadataRefesh(entityID)) {
+ Logger.debug("Metadata refresh success. Revalidate eIDAS Authn. Request ...");
+ return super.unmarshallRequest(requestBytes);
+
+ }
+
+ Logger.info("eIDAS metadata refresh not possible or not successful.");
+ }
+
+ throw e;
+
+ }
+ }
+
+ /**
+ * Refresh SAML2 metadata if the internal metadata provider supports this functionality
+ *
+ * @param entityID
+ * @return true if refresh was success, otherwise false
+ */
+ private boolean startInternalMetadataRefesh(String entityID) {
+ //check if eIDAS SAML-Engine implementation supports metadata refresh
+ ProtocolProcessorI protocolProcessor = this.getProtocolProcessor();
+ if (protocolProcessor instanceof MOAEidasProtocolProcesser) {
+ MetadataFetcherI metadataFetcher =
+ ((MOAEidasProtocolProcesser)protocolProcessor).getMetadataFetcher();
+ if (metadataFetcher instanceof MOAeIDASMetadataProviderDecorator)
+ return ((MOAeIDASMetadataProviderDecorator)metadataFetcher).refreshMetadata(entityID);
+
+ }
+
+ return false;
+ }
+
// @Override
// protected X509Certificate getEncryptionCertificate(String requestIssuer,
// String destinationCountryCode) throws EIDASSAMLEngineException {