diff options
| author | Florian Reimair <florian.reimair@iaik.tugraz.at> | 2014-02-26 15:11:09 +0100 | 
|---|---|---|
| committer | Florian Reimair <florian.reimair@iaik.tugraz.at> | 2014-02-26 15:11:09 +0100 | 
| commit | 441df8869fffe2129c551ace40e67602fb2f748c (patch) | |
| tree | a20bac5ad1a1ff95f6832bbc732f3115b0991815 /id/server/idserverlib | |
| parent | 3640475187ba8f2bfd4b72b2e6b7fa105432f889 (diff) | |
| parent | 03952b60036874105f8d5575ca2d06594e70c759 (diff) | |
| download | moa-id-spss-441df8869fffe2129c551ace40e67602fb2f748c.tar.gz moa-id-spss-441df8869fffe2129c551ace40e67602fb2f748c.tar.bz2 moa-id-spss-441df8869fffe2129c551ace40e67602fb2f748c.zip | |
Merge branch 'eHVDapPlugin' into ap
Diffstat (limited to 'id/server/idserverlib')
8 files changed, 244 insertions, 10 deletions
| diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeCollector.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeCollector.java index 937f6da74..b7fa37757 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeCollector.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeCollector.java @@ -79,7 +79,7 @@ public class AttributeCollector implements IAction {  			container.getResponse().getPersonalAttributeList().add(current);      	// see if we need some more attributes -    	return processRequest(container, httpReq, httpResp, oaParam); +    	return processRequest(container, httpReq, httpResp, moasession, oaParam);      }      /** @@ -90,7 +90,7 @@ public class AttributeCollector implements IAction {       * @return the string       * @throws MOAIDException        */ -    public String processRequest(DataContainer container, HttpServletRequest request, HttpServletResponse response, OAAuthParameter oaParam) throws MOAIDException { +    public String processRequest(DataContainer container, HttpServletRequest request, HttpServletResponse response, AuthenticationSession moasession, OAAuthParameter oaParam) throws MOAIDException {      	// check if there are attributes we need to fetch      	IPersonalAttributeList requestAttributeList = container.getRequest().getPersonalAttributeList();      	IPersonalAttributeList responseAttributeList = container.getResponse().getPersonalAttributeList(); @@ -106,13 +106,16 @@ public class AttributeCollector implements IAction {  				for (AttributeProvider currentProvider : AttributeProviderFactory.getConfiguredPlugins(oaParam.getStorkAPs())) {  					try {  						// - hand over control to the suitable plugin -						IPersonalAttributeList aquiredAttributes = currentProvider.acquire(currentAttribute); +						IPersonalAttributeList aquiredAttributes = currentProvider.acquire(currentAttribute, moasession);  						// - add the aquired attribute to the container  						for(PersonalAttribute current : aquiredAttributes)  							container.getResponse().getPersonalAttributeList().add(current);  					} catch(UnsupportedAttributeException e) {  						// ok, try the next attributeprovider +					} catch(MOAIDException e) { +						// the current plugin had an error. Try the next one. +						// TODO we might want to add the non-fetchable attribute as "NotAvailable" to prevent an infinite loop  					}  	    		} diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProvider.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProvider.java index adf57d77b..59376fef6 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProvider.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProvider.java @@ -3,6 +3,7 @@ package at.gv.egovernment.moa.id.protocols.stork2;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse; +import at.gv.egovernment.moa.id.auth.data.AuthenticationSession;  import at.gv.egovernment.moa.id.auth.exception.MOAIDException;  import at.gv.egovernment.moa.id.config.auth.OAAuthParameter; @@ -21,11 +22,13 @@ public interface AttributeProvider {  	 * the response.  	 *  	 * @param attributes the list of attributes to be acquired +	 * @param moasession the moasession  	 * @return the personal attribute  	 * @throws UnsupportedAttributeException the unsupported attribute exception  	 * @throws ExternalAttributeRequestRequiredException an attribute request to an external service has to be done +	 * @throws MOAIDException the mOAID exception  	 */ -	public IPersonalAttributeList acquire(PersonalAttribute attributes) throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException; +	public IPersonalAttributeList acquire(PersonalAttribute attributes, AuthenticationSession moasession) throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException, MOAIDException;  	/**  	 * Perform redirect. diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProviderFactory.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProviderFactory.java index 98d354e8a..23edf69f9 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProviderFactory.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/AttributeProviderFactory.java @@ -18,6 +18,7 @@ public class AttributeProviderFactory {  	public static List<String> getAvailablePlugins() {  		List<String> result = new ArrayList<String>();  		result.add("StorkAttributeRequestProvider"); +		result.add("EHvdAttributeProvider");  		return result;  	} @@ -31,10 +32,11 @@ public class AttributeProviderFactory {  	 * @return the attribute provider  	 */  	public static AttributeProvider create(String shortname, String url) { -		switch (shortname) { -		case "StorkAttributeRequestProvider": +        	if (shortname.equals("StorkAttributeRequestProvider"))  {  			return new StorkAttributeRequestProvider(url); -		default: +		} else if(shortname.equals("EHvdAttributeProvider")) { +			return new EHvdAttributeProviderPlugin(url); +		}       else {  			return null;  		}  	} diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoNoRedirectAttributeProvider.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoNoRedirectAttributeProvider.java index e6f340c77..669a9389b 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoNoRedirectAttributeProvider.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoNoRedirectAttributeProvider.java @@ -5,6 +5,7 @@ import java.util.ArrayList;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse; +import at.gv.egovernment.moa.id.auth.data.AuthenticationSession;  import at.gv.egovernment.moa.id.config.auth.OAAuthParameter;  import eu.stork.peps.auth.commons.IPersonalAttributeList; @@ -20,7 +21,7 @@ public class DemoNoRedirectAttributeProvider implements AttributeProvider {  	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(java.lang.String)  	 */  	@Override -	public IPersonalAttributeList acquire(PersonalAttribute attributeName) +	public IPersonalAttributeList acquire(PersonalAttribute attributeName, AuthenticationSession moasession)  			throws UnsupportedAttributeException {  		PersonalAttributeList requestedAttributes = new PersonalAttributeList(1);  		requestedAttributes.add(new PersonalAttribute("sepp", true, new ArrayList<String>(), "")); diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoRedirectAttributeProvider.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoRedirectAttributeProvider.java index 5d4336149..2f6b69075 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoRedirectAttributeProvider.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/DemoRedirectAttributeProvider.java @@ -5,6 +5,7 @@ import java.util.ArrayList;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse; +import at.gv.egovernment.moa.id.auth.data.AuthenticationSession;  import at.gv.egovernment.moa.id.config.auth.OAAuthParameter;  import eu.stork.peps.auth.commons.IPersonalAttributeList; @@ -20,7 +21,7 @@ public class DemoRedirectAttributeProvider implements AttributeProvider {  	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(java.lang.String)  	 */  	@Override -	public IPersonalAttributeList acquire(PersonalAttribute attributeName) +	public IPersonalAttributeList acquire(PersonalAttribute attributeName, AuthenticationSession moasession)  			throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException {  		throw new ExternalAttributeRequestRequiredException(this);  	} diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/EHvdAttributeProviderPlugin.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/EHvdAttributeProviderPlugin.java new file mode 100644 index 000000000..8b96e0d10 --- /dev/null +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/EHvdAttributeProviderPlugin.java @@ -0,0 +1,222 @@ +package at.gv.egovernment.moa.id.protocols.stork2; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPConnection; +import javax.xml.soap.SOAPConnectionFactory; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPEnvelope; +import javax.xml.soap.SOAPMessage; +import javax.xml.soap.SOAPPart; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import at.gv.egovernment.moa.id.auth.data.AuthenticationSession; +import at.gv.egovernment.moa.id.auth.exception.MOAIDException; +import at.gv.egovernment.moa.id.config.auth.OAAuthParameter; +import at.gv.egovernment.moa.logging.Logger; +import eu.stork.peps.auth.commons.IPersonalAttributeList; +import eu.stork.peps.auth.commons.PersonalAttribute; +import eu.stork.peps.auth.commons.PersonalAttributeList; + +/** + * Fetches the attribute IsHealthcareProfessional from the BAGDAD SOAP service + */ +public class EHvdAttributeProviderPlugin implements AttributeProvider { +	 +	/** The destination. */ +	private Object destination; + +	/** +	 * Instantiates a new e hvd attribute provider plugin. +	 * +	 * @param url the service url +	 */ +	public EHvdAttributeProviderPlugin(String url) { +		destination = url; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(eu.stork.peps.auth.commons.PersonalAttribute) +	 */ +	@Override +	public IPersonalAttributeList acquire(PersonalAttribute attributes, AuthenticationSession moasession) +			throws UnsupportedAttributeException, +			ExternalAttributeRequestRequiredException, MOAIDException { + +		// break when we cannot handle the requested attribute +		if(!attributes.getFriendlyName().equals("isHCP")) +			throw new UnsupportedAttributeException(); +		 +		try { +			// create SOAP connection +			SOAPConnection soapConnection = SOAPConnectionFactory.newInstance().createConnection(); +			 +			// assemble SOAP request +			MessageFactory messageFactory = MessageFactory.newInstance(); +			SOAPMessage requestMessage = messageFactory.createMessage(); +			SOAPPart requestPart = requestMessage.getSOAPPart(); + +			// (soap 1.1 relevant part. could not find a solution to use soap 1.2 in time. +			requestMessage.getMimeHeaders().setHeader("SOAPAction", "http://gesundheit.gv.at/BAGDAD/DataAccessService/IsHealthcareProfessional"); + +            /* +            Construct SOAP Request Message: +			<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> +			  <soap:Body> +			    <IsHealthcareProfessional xmlns="http://gesundheit.gv.at/BAGDAD/DataAccessService"> +			      <bPK>string</bPK> +			    </IsHealthcareProfessional> +			  </soap:Body> +			</soap:Envelope> + +			see https://stork.ehealth.gv.at/GDAService.asmx?op=IsHealthcareProfessional +             */ + +			// SOAP Envelope +			SOAPEnvelope envelope = requestPart.getEnvelope(); + +			// SOAP Body +			SOAPBody requestBody = envelope.getBody(); +			SOAPElement requestBodyElem = requestBody.addChildElement("IsHealthcareProfessional"); +			SOAPElement requestBodyElem1 = requestBodyElem.addChildElement("bPK"); +			requestBodyElem1.addTextNode(moasession.getIdentityLink().getIdentificationValue()); + +			requestMessage.saveChanges(); + +			// perform SOAP call +			SOAPMessage responseMessage = soapConnection.call(requestMessage, destination); + +			// parse SOAP response + +            /* +			<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> +			  <soap:Body> +			    <IsHealthcareProfessionalResponse xmlns="http://gesundheit.gv.at/BAGDAD/DataAccessService"> +			      <IsHealthcareProfessionalResult> +			        <RequestOK>boolean</RequestOK> +			        <Message>string</Message> +			        <IsHealthcareProfessional>boolean</IsHealthcareProfessional> +			        <NameOfOrganisation>string</NameOfOrganisation> +			        <Type>string</Type> +			        <Specialization>string</Specialization> +			      </IsHealthcareProfessionalResult> +			    </IsHealthcareProfessionalResponse> +			  </soap:Body> +			</soap:Envelope> + +			see https://stork.ehealth.gv.at/GDAService.asmx?op=IsHealthcareProfessional +             */ +			SOAPBody responseBody = responseMessage.getSOAPBody(); + +			// iterate through tree +			SOAPElement responseElement = (SOAPElement) responseBody.getChildElements().next(); +			SOAPElement resultElement = (SOAPElement) responseElement.getChildElements().next(); + +			// collect all info in a map +			Iterator it = resultElement.getChildElements(); +			Map<String, String> collection = new HashMap<String, String>(); +			while (it.hasNext()) { +				SOAPElement current = (SOAPElement) it.next(); + +				collection.put(current.getNodeName(), current.getTextContent()); +			} + +			// check if there is anything valid in the map +			if (collection.isEmpty() || collection.size() != 6) { +				Logger.warn("eHVD returned an unexpected count of values. Expected 6 got " + collection.size()); +				throw new IndexOutOfBoundsException("response attributes not like specified"); +			} + +			// - fetch request validity +			if (collection.get("RequestOK").equals("false")) { +				Logger.warn("eHVD reported an invalid request. The error message is: " + collection.get("Message")); +				throw new Exception("eHVD reported an invalid request"); +			} + +			PersonalAttribute acquiredAttribute = null; + +			if (collection.get("IsHealthcareProfessional").equals("false")) { +				// the citizen is no HCP +				acquiredAttribute = new PersonalAttribute("isHCP", false, new ArrayList<String>(), "NotAvailable"); +			} else { +				// go on and parse the data + +				Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + +				Element orgname = doc.createElement("nameOfOrganisation"); +				orgname.appendChild(doc.createTextNode(collection.get("NameOfOrganization"))); +				doc.appendChild(orgname); + +				Element type = doc.createElement("HCP"); +				// TODO fix value mapping +				if (collection.get("Type").equals("Medical Doctors")) +					type.appendChild(doc.createTextNode("D")); +				doc.appendChild(type); + +				Element specialization = doc.createElement("specialisation"); +				// TODO fix value mapping +				specialization.appendChild(doc.createTextNode(collection.get("Specialization").substring(0, 2))); +				doc.appendChild(specialization); + +				// get string from dom tree +				Source source = new DOMSource(doc); +				StringWriter out = new StringWriter(); +				Result result = new StreamResult(out); + +				TransformerFactory tFactory = TransformerFactory.newInstance(); +				Transformer transformer = tFactory.newTransformer(); +				transformer.transform(source, result); + +				ArrayList<String> value = new ArrayList<String>(); +				value.add(out.toString()); + +				acquiredAttribute = new PersonalAttribute("isHCP", false, value, "Available"); +			} + +			// pack and return the result +			PersonalAttributeList result = new PersonalAttributeList(); +			result.add(acquiredAttribute); + +			return result; +		} catch (Exception e) { +			throw new MOAIDException("stork.13", new Object[] { e }); +		} +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#performRedirect(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, at.gv.egovernment.moa.id.config.auth.OAAuthParameter) +	 */ +	@Override +	public void performRedirect(String url, String citizenCountyCode, +			HttpServletRequest req, HttpServletResponse resp, +			OAAuthParameter oaParam) throws MOAIDException { +		// there is no redirect required +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#parse(javax.servlet.http.HttpServletRequest) +	 */ +	@Override +	public IPersonalAttributeList parse(HttpServletRequest httpReq) +			throws UnsupportedAttributeException, MOAIDException { +		// there is no redirect required, so we throw an exception when someone asks us to parse a response +		throw new UnsupportedAttributeException(); +	} +} diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/StorkAttributeRequestProvider.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/StorkAttributeRequestProvider.java index 3c689cac9..bd6f192dc 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/StorkAttributeRequestProvider.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/StorkAttributeRequestProvider.java @@ -8,6 +8,7 @@ import org.apache.velocity.Template;  import org.apache.velocity.VelocityContext;  import org.apache.velocity.app.VelocityEngine; +import at.gv.egovernment.moa.id.auth.data.AuthenticationSession;  import at.gv.egovernment.moa.id.auth.exception.MOAIDException;  import at.gv.egovernment.moa.id.auth.stork.VelocityProvider;  import at.gv.egovernment.moa.id.config.auth.OAAuthParameter; @@ -47,7 +48,7 @@ public class StorkAttributeRequestProvider implements AttributeProvider {  	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(java.lang.String)  	 */  	@Override -	public IPersonalAttributeList acquire(PersonalAttribute attribute) +	public IPersonalAttributeList acquire(PersonalAttribute attribute, AuthenticationSession moasession)  			throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException {  		requestedAttributes = new PersonalAttributeList(1);  		requestedAttributes.add(attribute); diff --git a/id/server/idserverlib/src/main/resources/resources/properties/id_messages_de.properties b/id/server/idserverlib/src/main/resources/resources/properties/id_messages_de.properties index 0e252e981..4007eacdc 100644 --- a/id/server/idserverlib/src/main/resources/resources/properties/id_messages_de.properties +++ b/id/server/idserverlib/src/main/resources/resources/properties/id_messages_de.properties @@ -207,6 +207,7 @@ stork.09=Fehler beim \u00FCberpr\u00FCfen der STORK B\u00FCrgerInnen Signatur  stork.10=Fehler in der Verbindung zum SZR-Gateway
  stork.11=Fehler beim Sammeln von StorkAttributen
  stork.12=Konnte keine VIDP Konfiguration finden
 +stork.13=Fehler beim Sammeln eines Attributes in einem AttributProviderPlugin
  pvp2.00={0} ist kein gueltiger consumer service index
  pvp2.01=Fehler beim kodieren der PVP2 Antwort
 | 
