diff options
Diffstat (limited to 'id/server/idserverlib')
3 files changed, 259 insertions, 10 deletions
| 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 e4cc7346d..ec64f7eb1 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 @@ -25,6 +25,7 @@ package at.gv.egovernment.moa.id.protocols.stork2;  import at.gv.egovernment.moa.id.commons.db.dao.config.AttributeProviderPlugin;  import at.gv.egovernment.moa.id.protocols.stork2.attributeproviders.AttributeProvider;  import at.gv.egovernment.moa.id.protocols.stork2.attributeproviders.EHvdAttributeProviderPlugin; +import at.gv.egovernment.moa.id.protocols.stork2.attributeproviders.EHvdAttribute_deprecatedProviderPlugin;  import at.gv.egovernment.moa.id.protocols.stork2.attributeproviders.MandateAttributeRequestProvider;  import at.gv.egovernment.moa.id.protocols.stork2.attributeproviders.SignedDocAttributeRequestProvider;  import at.gv.egovernment.moa.id.protocols.stork2.attributeproviders.StorkAttributeRequestProvider; @@ -46,6 +47,7 @@ public class AttributeProviderFactory {      public static List<String> getAvailablePlugins() {          List<String> result = new ArrayList<String>();          result.add("StorkAttributeRequestProvider"); +        result.add("EHvdAttributeProvider_deprecated");          result.add("EHvdAttributeProvider");          result.add("SignedDocAttributeRequestProvider");          result.add("MandateAttributeRequestProvider"); @@ -65,6 +67,8 @@ public class AttributeProviderFactory {              return new StorkAttributeRequestProvider(url, attributes);          } else if (shortname.equals("EHvdAttributeProvider")) {              return new EHvdAttributeProviderPlugin(url, attributes); +        } else if (shortname.equals("EHvdAttributeProvider_deprecated")) { +            return new EHvdAttribute_deprecatedProviderPlugin(url, attributes);          } else if (shortname.equals("SignedDocAttributeRequestProvider")) {              return new SignedDocAttributeRequestProvider(url, attributes);          } else if (shortname.equals("MandateAttributeRequestProvider")) { diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttributeProviderPlugin.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttributeProviderPlugin.java index 2328391ec..8af35673f 100644 --- a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttributeProviderPlugin.java +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttributeProviderPlugin.java @@ -180,23 +180,19 @@ public class EHvdAttributeProviderPlugin extends AttributeProvider {  			PersonalAttribute acquiredAttribute = null; -			if (collection.get("IsHealthcareProfessional").equals("false")) { +			if (collection.get("IsHealthcareProfessional").equals("false") || !collection.get("Type").equals("Medical doctor")) {  				// the citizen is no HCP  				acquiredAttribute = new PersonalAttribute("isHealthCareProfessional", false, new ArrayList<String>(), "NotAvailable");  			} else {  				// go on and parse the data  				IsHealthCareProfessionalType result = new IsHealthCareProfessionalType(); -				result.setNameOfOrganisation(collection.get("NameOfOrganisation")); -				if (collection.get("Type").equals("Medical doctor")) -					result.setHCPType("D"); -				else -					result.setHCPType("?"); +				// TODO: we do not have any list of possible values yet. Fix as soon as we get some. +//				if (collection.get("Type").equals("Medical doctor")) +					result.setTypeOfHCP("physician"); -				if (collection.get("Specialization").contains("Arzt für Allgemeinmedizin")) -					result.setSpecialisation("GP"); -				else -					result.setSpecialisation("??"); +				result.setNameOfOrganisation(collection.get("NameOfOrganisation")); +				result.setTypeOfOrganisation("Unknown");  				result.setAQAA(4); diff --git a/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttribute_deprecatedProviderPlugin.java b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttribute_deprecatedProviderPlugin.java new file mode 100644 index 000000000..2cd2af121 --- /dev/null +++ b/id/server/idserverlib/src/main/java/at/gv/egovernment/moa/id/protocols/stork2/attributeproviders/EHvdAttribute_deprecatedProviderPlugin.java @@ -0,0 +1,249 @@ +/******************************************************************************* + * 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.stork2.attributeproviders; + +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.bind.JAXBContext; +import javax.xml.bind.Marshaller; +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 at.gv.egovernment.moa.id.auth.builder.BPKBuilder; +import at.gv.egovernment.moa.id.auth.exception.MOAIDException; +import at.gv.egovernment.moa.id.config.auth.OAAuthParameter; +import at.gv.egovernment.moa.id.data.IAuthData; +import at.gv.egovernment.moa.id.protocols.stork2.ExternalAttributeRequestRequiredException; +import at.gv.egovernment.moa.id.protocols.stork2.UnsupportedAttributeException; +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; +import eu.stork.peps.complex.attributes.IsHealthCareProfessionalType; +import eu.stork.peps.complex.attributes.ObjectFactory; + +/** + * Fetches the attribute IsHealthcareProfessional from the BAGDAD SOAP service + */ +public class EHvdAttribute_deprecatedProviderPlugin extends AttributeProvider { +	 +	/** The destination. */ +	private Object destination; +	 +	/** +	 * Instantiates a new e hvd attribute provider plugin. +	 * +	 * @param url the service url +	 * @param attributes  +	 */ +	public EHvdAttribute_deprecatedProviderPlugin(String url, String supportedAttributes) { +		super(supportedAttributes); +		destination = url; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(eu.stork.peps.auth.commons.PersonalAttribute) +	 */ +	@Override +	protected IPersonalAttributeList acquire(PersonalAttribute attribute, String spCountryCode, IAuthData authData) +			throws UnsupportedAttributeException, +			ExternalAttributeRequestRequiredException, MOAIDException { + +		// break when we cannot handle the requested attribute +		if(!attributes.contains(attribute.getName())) +			throw new UnsupportedAttributeException(); +		 +		try { +	    	Logger.debug("initializing SOAP connections..."); +			// 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"); +			requestBodyElem.addAttribute(envelope.createName("xmlns"), "http://gesundheit.gv.at/BAGDAD/DataAccessService"); + +			SOAPElement requestBodyElem1 = requestBodyElem.addChildElement("bPK"); +			 +			//TODO: CHECK: IdentificationValue containts wbPK if MOA-ID is used as VIDP  +			requestBodyElem1.addTextNode(new BPKBuilder().buildBPK(authData.getIdentificationValue(), "GH")); + +			requestMessage.saveChanges(); + +			// perform SOAP call +	    	Logger.debug("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 +             */ +	    	Logger.debug("call successful. Parse..."); +			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("isHealthCareProfessional", false, new ArrayList<String>(), "NotAvailable"); +			} else { +				// go on and parse the data +				IsHealthCareProfessionalType result = new IsHealthCareProfessionalType(); +				result.setNameOfOrganisation(collection.get("NameOfOrganisation")); + +				if (collection.get("Type").equals("Medical doctor")) +					result.setHCPType("D"); +				else +					result.setHCPType("?"); + +				if (collection.get("Specialization").contains("Arzt für Allgemeinmedizin")) +					result.setSpecialisation("GP"); +				else +					result.setSpecialisation("??"); + +				result.setAQAA(4); + +				final Marshaller m = JAXBContext.newInstance(IsHealthCareProfessionalType.class).createMarshaller(); +			    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); +			     +			    StringWriter stringWriter = new StringWriter(); +			    m.marshal(new ObjectFactory().createIsHealthCareProfessional(result), stringWriter);		     +				 +				ArrayList<String> value = new ArrayList<String>(); +				value.add(stringWriter.toString()); + +				acquiredAttribute = new PersonalAttribute("isHealthCareProfessional", false, value, "Available"); +			} + +			// pack and return the result +			PersonalAttributeList result = new PersonalAttributeList(); +			result.add(acquiredAttribute); + +			// add stork id for verification +			ArrayList<String> value = new ArrayList<String>(); +			value.add(new BPKBuilder().buildStorkeIdentifier(authData.getIdentityLink(), spCountryCode)); +			result.add(new PersonalAttribute("eIdentifier", false, value, "Available")); + +			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) +     */ +	public void performRedirect(String url, +			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) +	 */ +	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(); +	} + + +} | 
