/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at opensso/legal/CDDLv1.0.txt. * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id: PPRequestHandler.java,v 1.2 2008/06/25 05:47:14 qcheng Exp $ * */ package com.sun.identity.liberty.ws.idpp; import com.sun.identity.shared.xml.XMLUtils; import com.sun.identity.liberty.ws.idpp.jaxb.QueryResponseElement; import com.sun.identity.liberty.ws.idpp.jaxb.QueryElement; import com.sun.identity.liberty.ws.idpp.jaxb.QueryType; import com.sun.identity.liberty.ws.idpp.jaxb.QueryResponseType; import com.sun.identity.liberty.ws.idpp.jaxb.ModifyElement; import com.sun.identity.liberty.ws.idpp.jaxb.ModifyResponseElement; import com.sun.identity.liberty.ws.idpp.jaxb.ModifyType; import com.sun.identity.liberty.ws.idpp.jaxb.StatusType; import com.sun.identity.liberty.ws.dst.DSTQueryItem; import com.sun.identity.liberty.ws.dst.DSTModification; import com.sun.identity.liberty.ws.dst.DSTConstants; import com.sun.identity.liberty.ws.dst.DSTException; import com.sun.identity.liberty.ws.dst.service.DSTRequestHandler; import com.sun.identity.liberty.ws.idpp.common.*; import com.sun.identity.liberty.ws.soapbinding.Message; import com.sun.identity.liberty.ws.soapbinding.SOAPFaultException; import com.sun.identity.liberty.ws.soapbinding.SOAPBindingException; import com.sun.identity.liberty.ws.soapbinding.NamespacePrefixMapperImpl; import com.sun.identity.liberty.ws.soapbinding.SOAPFault; import com.sun.identity.liberty.ws.soapbinding.SOAPFaultDetail; import com.sun.identity.liberty.ws.soapbinding.SOAPBindingConstants; import com.sun.identity.liberty.ws.soapbinding.ServiceInstanceUpdateHeader; import com.sun.identity.liberty.ws.soapbinding.ProviderHeader; import com.sun.identity.liberty.ws.interfaces.Authorizer; import com.sun.identity.liberty.ws.interfaces.ServiceInstanceUpdate; import com.sun.identity.liberty.ws.common.LogUtil; import com.sun.identity.saml.common.SAMLUtils; import java.util.List; import java.util.Set; import java.util.Iterator; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.logging.Level; import javax.xml.namespace.QName; import javax.xml.bind.JAXBException; import org.w3c.dom.Document; //Interaction imports import com.sun.identity.liberty.ws.interaction.JAXBObjectFactory; import com.sun.identity.liberty.ws.interaction.InteractionSOAPFaultException; import com.sun.identity.liberty.ws.interaction.InteractionManager; import com.sun.identity.liberty.ws.interaction.InteractionUtils; import com.sun.identity.liberty.ws.interaction.jaxb.InquiryElement; import com.sun.identity.liberty.ws.interaction.jaxb.InquiryType.Confirm; import com.sun.identity.liberty.ws.interaction.jaxb.TextElement; import com.sun.identity.liberty.ws.interaction.jaxb.InteractionResponseElement; /** * The class PPRequestHandler is used to process the * query or modify requests for a personal profile service. */ public class PPRequestHandler extends DSTRequestHandler { private PersonalProfile pp; private String logMsg = null; /** *Default constructor */ public PPRequestHandler() { pp = new PersonalProfile(); } /** * Processes query/modify request. * @param request query or modify object. * @param requestMsg Request Message. * @param responseMsg Response Message. * @return Object processed response object. * @exception SOAPFaultException for the interaction redirects * @exception Exception for any failure. */ public Object processDSTRequest( Object request, Message requestMsg, Message responseMsg) throws SOAPFaultException, DSTException { IDPPUtils.debug.message("PPRequestHandler:processRequest:Init"); try { IDPPServiceManager serviceManager = IDPPServiceManager.getInstance(); String providerID = serviceManager.getProviderID(); ProviderHeader ph = new ProviderHeader(providerID); responseMsg.setProviderHeader(ph); if(serviceManager.isServiceInstanceUpdateEnabled()) { ServiceInstanceUpdateHeader siuHeader = getServiceInstanceUpdateHeader(); responseMsg.setServiceInstanceUpdateHeader(siuHeader); } if(request instanceof QueryElement) { QueryElement query = (QueryElement)request; Document doc = IDPPUtils.getDocumentBuilder().newDocument(); IDPPUtils.getMarshaller().setProperty( "com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapperImpl()); IDPPUtils.getMarshaller().marshal(query, doc); return processQueryRequest(query, providerID, requestMsg, doc); } else if (request instanceof ModifyElement) { ModifyElement modify = (ModifyElement)request; Document doc = IDPPUtils.getDocumentBuilder().newDocument(); IDPPUtils.getMarshaller().setProperty( "com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapperImpl()); IDPPUtils.getMarshaller().marshal(modify, doc); return processModifyRequest(modify, providerID, requestMsg, doc); } else { IDPPUtils.debug.error("PPRequestHandler:processRequest:invalid" + " Request."); throw new DSTException( IDPPUtils.bundle.getString("invalidRequest")); } } catch(IDPPException ie) { IDPPUtils.debug.error("PPRequestHandler:processRequest fail",ie); throw new DSTException(ie); } catch (JAXBException je) { IDPPUtils.debug.error("PPRequestHandler:processRequest fail",je); throw new DSTException( IDPPUtils.bundle.getString("jaxbFailure")); } catch (SOAPBindingException sbe) { IDPPUtils.debug.error("PPRequestHandler:processRequest fail",sbe); throw new DSTException(sbe); } } /** * Processes Query Request. * @param query JAXBQ QueryElement Object * @param request queryRequest. * @param providerID Provider ID. * @param requestMsg Request Message. * @return QueryResponseElement response. * @exception IDPPException for a failure in processing the request * @exception SOAPFaultException if the interaction is required */ public QueryResponseElement processQueryRequest(QueryElement query, String providerID, Message requestMsg, Document request) throws IDPPException, SOAPFaultException { IDPPUtils.debug.message("PPRequestHandler:processQueryRequest:Init"); if(query == null || request == null) { IDPPUtils.debug.error("PPRequestHandler:processQueryRequest:" + "null values "); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler:processQueryRequest:" + "request received:" + XMLUtils.print(request.getDocumentElement())); } Object resObj = query.getResourceID(); if(resObj == null) { resObj = query.getEncryptedResourceID(); } QueryResponseElement response = getQueryResponse(query); String resourceID = getResourceID(resObj, providerID, IDPPConstants.XMLNS_IDPP); if(resourceID == null || !pp.isResourceIDValid(resourceID)) { if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler:processQuery" + "Request: resource id is invalid."); } response.setStatus(setStatusType(false, DSTConstants.NO_RESOURCE, IDPPUtils.bundle.getString("invalidResourceID"), null)); return response; } if(LogUtil.isLogEnabled()) { logMsg = IDPPUtils.bundle.getString("messageID") + "=" + requestMsg.getCorrelationHeader().getMessageID() + " "+ IDPPUtils.bundle.getString("providerID") + "=" + providerID + " " + IDPPUtils.bundle.getString("resourceID") + "=" + resourceID + " " + IDPPUtils.bundle.getString( "securityMechID") + "=" + requestMsg.getAuthenticationMechanism() + " "; } List queryItems = query.getQueryItem(); if (queryItems.size() == 0) { if(IDPPUtils.debug.warningEnabled()) { IDPPUtils.debug.warning("PPRequestHandler:processQuery" + "Request: The request does not have any query items."); } response.setStatus(setStatusType(false, DSTConstants.UNEXPECTED_ERROR, IDPPUtils.bundle.getString("nullQueryItems"), null)); return response; } Map interactQueries = new HashMap(); Map interactedData = new HashMap(); List dstQueryItems = new ArrayList(); int queryItemsSize = queryItems.size(); for(int i= 0; i < queryItemsSize; i++) { boolean isQueryItemValid = true; QueryType.QueryItemType item = (QueryType.QueryItemType)queryItems.get(i); String select = item.getSelect(); String ref = item.getItemID(); if(ref == null || ref.length() == 0) { ref = item.getId(); } if((select == null) || (select.length() == 0)) { if(IDPPUtils.debug.warningEnabled()) { IDPPUtils.debug.warning("PPRequestHandler:process"+ "QueryRequest: There is no Select in the request."); } response.setStatus( setStatusType(false, DSTConstants.MISSING_SELECT, IDPPUtils.bundle.getString("missingSelect"), ref)); isQueryItemValid = false; } if(!pp.isSelectDataSupported(select)) { if(IDPPUtils.debug.warningEnabled()) { IDPPUtils.debug.warning("PPRequestHandler:process"+ "QueryRequest: Data not supported"); } response.setStatus(setStatusType(false, DSTConstants.INVALID_SELECT, IDPPUtils.bundle.getString("invalidSelect"), ref)); isQueryItemValid = false; } //Check for authorization & interaction. String resource = IDPPUtils.getResourceExpression(select); String authZAction = pp.getAuthZAction(requestMsg.getToken(), DSTConstants.QUERY_ACTION, resource, getPolicyEnvMap(resourceID, requestMsg)); if(authZAction == null || authZAction.equalsIgnoreCase( IDPPConstants.AUTHZ_DENY)) { response.setStatus(setStatusType(false, DSTConstants.NOT_AUTHORIZED, IDPPUtils.bundle.getString("notAuthorized"), ref)); if(LogUtil.isLogEnabled()) { String[] data = {resourceID}; LogUtil.error(Level.INFO,LogUtil.PP_QUERY_FAILURE,data); } continue; } if(authZAction.equalsIgnoreCase( IDPPConstants.INTERACT_FOR_CONSENT)) { if(isInteractionResponseExists(requestMsg)) { if(!processInteractionConsentResponse( true, requestMsg, select)) { if(LogUtil.isLogEnabled()) { String[] data = { resourceID }; LogUtil.error(Level.INFO, LogUtil.PP_INTERACTION_FAILURE,data); } response.setStatus(setStatusType(false, DSTConstants.NOT_AUTHORIZED, IDPPUtils.bundle.getString("interactionFailed"),ref)); isQueryItemValid = false; } } else { interactQueries.put(resource, authZAction); } } else if(authZAction.equalsIgnoreCase( IDPPConstants.INTERACT_FOR_VALUE)) { if(isInteractionResponseExists(requestMsg)) { Map intrData = processInteractionValueResponse(true, requestMsg, select); if(intrData == null || intrData.isEmpty()) { if(LogUtil.isLogEnabled()) { //String[] data = { logMsg }; String[] data = { resourceID }; LogUtil.error(Level.INFO, LogUtil.PP_INTERACTION_FAILURE,data); } response.setStatus(setStatusType(false, DSTConstants.NOT_AUTHORIZED, IDPPUtils.bundle.getString("interactionFailed"),ref)); isQueryItemValid = false; } else { interactedData.putAll(intrData); } } else { interactQueries.put(resource, authZAction); } } if(isQueryItemValid) { Calendar changedSince = item.getChangedSince(); Date date = null; if(changedSince != null) { date = changedSince.getTime(); } DSTQueryItem dstQueryItem = new DSTQueryItem(select, item.isIncludeCommonAttributes(), date, null); dstQueryItem.setId(item.getId()); dstQueryItem.setItemID(item.getItemID()); dstQueryItems.add(dstQueryItem); } } //Check for interfaction before processing the actual response. if(interactQueries != null && !interactQueries.isEmpty()) { initInteraction(true, interactQueries, requestMsg); } Map queryResults = pp.queryData(requestMsg.getToken(), resourceID, dstQueryItems, interactedData, request); List data = getData(queryResults); if(data != null && !data.isEmpty()) { response.getData().addAll(data); } if(LogUtil.isLogEnabled()) { String[] msgData = { resourceID }; LogUtil.access(Level.INFO, LogUtil.PP_QUERY_SUCCESS,msgData); } return response; } /** * Get the data from the queried results * @param queryResults map of DSTQueryItems and the corresponding results. * @return List queried data. * @exception IDPPException. */ private List getData(Map queryResults) throws IDPPException { IDPPUtils.debug.message("PPRequestHandler:getData:Init"); List dataResults = new ArrayList(); Set queryItems = queryResults.keySet(); Iterator iter = queryItems.iterator(); while(iter.hasNext()) { QueryResponseType.DataType data = null; try { data = IDPPUtils.getIDPPFactory(). createQueryResponseTypeDataType(); } catch (JAXBException je) { IDPPUtils.debug.error("PPRequestHandler:getData:jaxb fail", je); throw new IDPPException( IDPPUtils.bundle.getString("jaxbFailure")); } DSTQueryItem dstQueryItem = (DSTQueryItem)iter.next(); List values = (List)queryResults.get(dstQueryItem); if(values.isEmpty()) { continue; } data.getAny().addAll(values); data.setItemIDRef(dstQueryItem.getItemID()); data.setId(dstQueryItem.getId()); dataResults.add(data); } return dataResults; } /** * sets the response status. * @param success This flag indicates whether the status is ok or failed. * @param statusCode status code. * @param comment. * @param itemID Item ID for the reference. * @return StatusType JAXB Object. * @exception IDPPException for any failure */ private StatusType setStatusType(boolean success, String statusCode, String comment, String ref) throws IDPPException { IDPPUtils.debug.message("PPRequestHandler:setStatusType:Init"); if(statusCode == null) { throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } try { StatusType status = IDPPUtils.getIDPPFactory().createStatusType(); if(success) { QName qName = new QName(IDPPConstants.XMLNS_IDPP, statusCode); status.setCode(qName); } else { QName qName = new QName(IDPPConstants.XMLNS_IDPP, DSTConstants.FAILED); status.setCode(qName); StatusType secondStatus = IDPPUtils.getIDPPFactory().createStatusType(); QName secondQ = new QName(IDPPConstants.XMLNS_IDPP, statusCode); secondStatus.setCode(secondQ); if(comment != null) { secondStatus.setComment(comment); } if(ref != null) { secondStatus.setRef(ref); } status.getStatus().add(secondStatus); } return status; } catch (JAXBException je) { IDPPUtils.debug.error("PPRequestHandler:setStatusType:" + "jaxb failure:" , je); throw new IDPPException(IDPPUtils.bundle.getString("jaxbFailure")); } } /** * Processes modify request. * @param modify ModifyElement JAXB Object * @param request modify request. * @param providerID Provider ID. * @param requestMsg Request Message. * @return ModifyResponseElement response JAXB Object * @exception IDPPException for failure in processing the request * @exception SOAPFaultException for interaction redirect */ public ModifyResponseElement processModifyRequest( ModifyElement modify, String providerID, Message requestMsg, Document request) throws IDPPException, SOAPFaultException { IDPPUtils.debug.message("PPRequestHandler:processModifyRequest:Init"); if(modify == null) { IDPPUtils.debug.error("PPRequestHandler:processModify"+ "Request. null values"); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler:processModifyRequest:"+ "request received:" + XMLUtils.print(request.getDocumentElement())); } Map interactedData = new HashMap(); ModifyResponseElement response = getModifyResponse(modify); Object resObj = modify.getResourceID(); if(resObj == null) { resObj = modify.getEncryptedResourceID(); } String resourceID = getResourceID(resObj, providerID, IDPPConstants.XMLNS_IDPP); if(resourceID == null || !pp.isResourceIDValid(resourceID)) { if(IDPPUtils.debug.warningEnabled()) { IDPPUtils.debug.warning("PPRequestHandler:processModify" + "Request: resource id is invalid."); } response.setStatus(setStatusType(false, DSTConstants.NO_RESOURCE, IDPPUtils.bundle.getString("invalidResourceID"), null)); return response; } if(LogUtil.isLogEnabled()) { logMsg = IDPPUtils.bundle.getString("messageID") + "=" + requestMsg.getCorrelationHeader().getMessageID() + " "+ IDPPUtils.bundle.getString("providerID") + "=" + providerID + " " + IDPPUtils.bundle.getString("resourceID") + "=" + resourceID + " " + IDPPUtils.bundle.getString( "securityMechID") + "=" + requestMsg.getAuthenticationMechanism() + " "; } List modificationElements = modify.getModification(); if(modificationElements.size() == 0) { IDPPUtils.debug.error("PPRequestHandler:process" + "ModifyRequest: Modification elements are null"); response.setStatus(setStatusType(false, DSTConstants.UNEXPECTED_ERROR, IDPPUtils.bundle.getString("nullModifications"),null)); return response; } Map interactSelects = new HashMap(); List dstModifications = new ArrayList(); int size = modificationElements.size(); for (int i=0; i < size; i++) { ModifyType.ModificationType modificationType = (ModifyType.ModificationType)modificationElements.get(i); String select = modificationType.getSelect(); String ref = modificationType.getId(); if(select == null || select.length() == 0) { if(IDPPUtils.debug.warningEnabled()) { IDPPUtils.debug.warning("PersonalProfileService:process"+ "ModifyRequest: select is null"); } response.setStatus(setStatusType(false, DSTConstants.MISSING_SELECT, IDPPUtils.bundle.getString("missingSelect"), ref)); return response; } if(!pp.isSelectDataSupported(select)){ if(IDPPUtils.debug.warningEnabled()) { IDPPUtils.debug.warning("PersonalProfileService:process"+ "ModifyRequest: Data not supported"); } response.setStatus(setStatusType(false, DSTConstants.INVALID_SELECT, IDPPUtils.bundle.getString("invalidSelect"), ref)); return response; } //Check for authorization & interaction. String resource = IDPPUtils.getResourceExpression(select); String authZAction = pp.getAuthZAction(requestMsg.getToken(), DSTConstants.MODIFY_ACTION, resource, getPolicyEnvMap(resourceID, requestMsg)); if(authZAction == null || authZAction.equalsIgnoreCase( IDPPConstants.AUTHZ_DENY)) { response.setStatus(setStatusType(false, DSTConstants.NOT_AUTHORIZED, IDPPUtils.bundle.getString("notAuthorized"), ref)); if(LogUtil.isLogEnabled()) { String[] data = { resourceID }; LogUtil.error(Level.INFO,LogUtil.PP_MODIFY_FAILURE,data); } return response; } if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.processModifyRequest:" + " Authorization action" + authZAction); } if(authZAction.equalsIgnoreCase( IDPPConstants.INTERACT_FOR_CONSENT)) { if(isInteractionResponseExists(requestMsg)) { if(!processInteractionConsentResponse( false, requestMsg, select)) { if(LogUtil.isLogEnabled()) { String[] data = { resourceID }; LogUtil.error(Level.INFO, LogUtil.PP_INTERACTION_FAILURE,data); } response.setStatus(setStatusType(false, DSTConstants.NOT_AUTHORIZED, IDPPUtils.bundle.getString("interactionFailed"), ref)); return response; } } else { interactSelects.put(resource, authZAction); } } else if (authZAction.equalsIgnoreCase( IDPPConstants.INTERACT_FOR_VALUE)) { if(isInteractionResponseExists(requestMsg)) { Map intrData = processInteractionValueResponse( false, requestMsg, select); if(intrData == null || intrData.isEmpty()) { if(LogUtil.isLogEnabled()) { String[] data = { resourceID }; LogUtil.error(Level.INFO, LogUtil.PP_INTERACTION_FAILURE,data); } response.setStatus(setStatusType(false, DSTConstants.NOT_AUTHORIZED, IDPPUtils.bundle.getString("interactionFailed"), ref)); return response; } else { interactedData.putAll(intrData); } } else { interactSelects.put(resource, authZAction); } } boolean override = modificationType.isOverrideAllowed(); ModifyType.ModificationType.NewDataType newData = modificationType.getNewData(); DSTModification dstModification = new DSTModification(); dstModification.setSelect(select); dstModification.setOverrideAllowed(override); dstModification.setId(modificationType.getId()); dstModifications.add(dstModification); if(newData != null && newData.getAny() != null && newData.getAny().size() != 0) { dstModification.setNewDataValue(newData.getAny()); } } //Check for interfaction before processing the actual response. if(interactSelects != null && !interactSelects.isEmpty()) { initInteraction(false, interactSelects, requestMsg); } if(pp.modifyData(requestMsg.getToken(),resourceID, dstModifications, interactedData, request)) { if(LogUtil.isLogEnabled()) { String[] data = { resourceID }; LogUtil.access(Level.INFO, LogUtil.PP_MODIFY_SUCCESS,data); } return response; } else { response.setStatus(setStatusType(false, DSTConstants.UNEXPECTED_ERROR, IDPPUtils.bundle.getString("modifyFailed"), null)); if(LogUtil.isLogEnabled()) { String[] data = { logMsg }; LogUtil.error(Level.INFO,LogUtil.PP_MODIFY_FAILURE,data); } return response; } } /** * Returns Policy Environment map * @param resourceID resource id * @param requestMsg Request Message * @return Map Policy Environment map */ private Map getPolicyEnvMap(String resourceID, Message requestMsg) { Map env = new HashMap(); env.put(Authorizer.MESSAGE, requestMsg); env.put(Authorizer.USER_ID, pp.getUserDN(resourceID)); env.put(Authorizer.AUTH_TYPE, requestMsg.getAuthenticationMechanism()); return env; } /** * Gets the query response and set the status to OK. * @param query JAXB query object. * @return QueryResponseElement JAXB query response. * @exception IDPPException */ public QueryResponseElement getQueryResponse(QueryElement query) throws IDPPException { if(query == null) { IDPPUtils.debug.error("PPRequestHandler:getQueryResponse:" + "Query is null."); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } try { QueryResponseElement response = IDPPUtils.getIDPPFactory().createQueryResponseElement(); response.setStatus(setStatusType(true, DSTConstants.OK, null,null)); response.setId(SAMLUtils.generateID()); response.setItemIDRef(query.getItemID()); return response; } catch (JAXBException je) { IDPPUtils.debug.error("PPRequestHandler:getQueryResponse:" + "JAXB failure.", je); throw new IDPPException(IDPPUtils.bundle.getString("jaxbFailure")); } } /** * Gets the modify response and set the status to OK. * @param modify JAXB modify object. * @return ModifyResponseElement JAXB modify response. * @exception IDPPException */ public ModifyResponseElement getModifyResponse(ModifyElement modify) throws IDPPException { if(modify == null) { IDPPUtils.debug.error("PPRequestHandler:getModifyResponse:" + "Modify is null."); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } try { ModifyResponseElement response = IDPPUtils.getIDPPFactory().createModifyResponseElement(); response.setStatus(setStatusType(true, DSTConstants.OK, null,null)); response.setId(SAMLUtils.generateID()); response.setItemIDRef(modify.getItemID()); return response; } catch (JAXBException je) { IDPPUtils.debug.error("PPRequestHandler:getModifyResponse:" + "JAXB failure.", je); throw new IDPPException(IDPPUtils.bundle.getString("jaxbFailure")); } } /** * Checks if the interaction response exists for this message * @param msg SOAP Request Message * @return true if exists */ private boolean isInteractionResponseExists(Message msg) { try { return (InteractionManager.getInstance(). getInteractionResponseElement(msg) != null); } catch (Exception e) { IDPPUtils.debug.error("PPRequestHandler.isInteractionResponse" + "Exists: Exception while getting interaction response.", e); return false; } } /** * Initialize interaction for the queries that require interaction * @param isQuery true if this is a PP query request, * false if this is a PP modify request. * @param interactResourceMap map of resources that need an interaction * This map will have key as the resource * and the value as interaction type. * @param msg SOAP request message * @exception SOAPFaultException for interaction redirection * @exception IDPPException for any other failure. */ private void initInteraction(boolean isQuery, Map interactResourceMap, Message msg) throws SOAPFaultException, IDPPException { IDPPUtils.debug.message("PPRequestHandler.initInteraction:Init"); if(msg == null || interactResourceMap == null || interactResourceMap.isEmpty()) { IDPPUtils.debug.error("PPRequestHandler.initInteraction:Null"+ "Input parameters"); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } try { //Create Interaction inquiry element InquiryElement inquiry = JAXBObjectFactory.getObjectFactory().createInquiryElement(); inquiry.setTitle(IDPPUtils.bundle.getString( IDPPConstants.INTERACTION_TITLE)); List selectElements = inquiry.getSelectOrConfirmOrText(); Set inquirySelects = interactResourceMap.keySet(); Iterator iter = inquirySelects.iterator(); while(iter.hasNext()) { String resource = (String)iter.next(); String interactionType = (String)interactResourceMap.get(resource); if(interactionType.equals(IDPPConstants.INTERACT_FOR_CONSENT)) { selectElements.add( getInteractConfirmElement(isQuery, resource, msg)); } else if(interactionType.equals( IDPPConstants.INTERACT_FOR_VALUE)) { selectElements.addAll( getInteractTextElements(isQuery, resource, msg)); } } String lang = getLanguage(msg); if(LogUtil.isLogEnabled()) { String[] data = { logMsg }; LogUtil.access(Level.INFO, LogUtil.PP_INTERACTION_SUCCESS,data); } InteractionManager.getInstance().handleInteraction(msg, inquiry, lang); } catch (InteractionSOAPFaultException ise) { if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.initInteraction:"+ "Interact redirection happened"); } throw ise.getSOAPFaultException(); } catch(Exception ex) { IDPPUtils.debug.error("PPRequestHandler.initInteraction:Failed"); throw new IDPPException(ex); } } /** * Returns interaction confirm element * @param isQuery true if this is a PP query request, * false if this is a PP modify request. * @param resource resource that needs an interaction * @param msg Message. * @return Confirm Interaction JAXB Confirm Element * @exception IDPPException */ private Confirm getInteractConfirmElement( boolean isQuery, String resource, Message msg) throws IDPPException { if(resource == null) { IDPPUtils.debug.error("PPRequestHandler.getInteractConfirmElement:"+ "Null input:"); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } resource = IDPPUtils.getExpressionContext(resource); if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.getInteractConfirm:" + "Resource Context:" + resource); } try { Confirm confirmElement = JAXBObjectFactory.getObjectFactory().createInquiryTypeConfirm(); PPInteractionHelper helper = new PPInteractionHelper(getLanguage(msg)); confirmElement.setName(resource); confirmElement.setLabel( helper.getInteractForConsentQuestion(isQuery, resource)); confirmElement.setHint( helper.getInteractForConsentQuestion(isQuery, resource)); return confirmElement; } catch(Exception e) { IDPPUtils.debug.error("PPRequestHandler.getInteractConfirm:"+ "Exception while creating interact select.", e); throw new IDPPException(e); } } /** * Returns interaction text elements. * @param isQuery true if this is a PP query request, * false if this is a PP modify request. * @param resource resource that needs an interaction * @param msg Message. * @return List list of Interaction JAXB TextElements. * @exception IDPPException */ private List getInteractTextElements( boolean isQuery, String resource, Message msg) throws IDPPException { if(resource == null) { IDPPUtils.debug.error("PPRequestHandler.getInteractText:"+ "Null input:"); throw new IDPPException( IDPPUtils.bundle.getString("nullInputParams")); } resource = IDPPUtils.getExpressionContext(resource); if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.getInteractText:" + "Resource Context:" + resource); } try { List textElements = new ArrayList(); PPInteractionHelper helper = new PPInteractionHelper(getLanguage(msg)); Map interactQueries = helper.getInteractForValueQuestions(isQuery, resource); Iterator iter = interactQueries.keySet().iterator(); while(iter.hasNext()) { String resourceKey = (String)iter.next(); TextElement textElement = JAXBObjectFactory.getObjectFactory().createTextElement(); textElement.setName(resourceKey); textElement.setLabel((String)interactQueries.get(resourceKey)); textElement.setMinChars(helper.getTextMinChars(resourceKey)); textElement.setMaxChars(helper.getTextMaxChars(resourceKey)); textElements.add(textElement); } return textElements; } catch(Exception e) { IDPPUtils.debug.error("PPRequestHandler.getInteractText:"+ "Exception while creating interact text element.", e); throw new IDPPException(e); } } /** * Process the interaction response * @param isQuery true if this is a PP query request, * false if this is a PP modify request. * @param msg SOAP Request Message * @param resource interaction resource * @return true if the consent is allowed. */ private boolean processInteractionConsentResponse( boolean isQuery, Message msg, String resource) { if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.processInteraction" + "Response:Init"); } if(msg == null || resource == null) { IDPPUtils.debug.error("PPRequestHandler:processInteraction" + "Response:null input params"); return false; } resource = IDPPUtils.getExpressionContext(resource); if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler:processInteraction" + "PP Element that was trying to access:" + resource); } try { InteractionResponseElement ire = InteractionManager.getInstance(). getInteractionResponseElement(msg); if(ire == null) { return false; } Map responses = InteractionUtils.getParameters(ire); if(responses == null || responses.isEmpty()) { return false; } String value = (String)responses.get(resource); if(value == null || value.equals("false")) { if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.process" + "Interaction: response is deny"); } return false; } else { return true; } } catch (Exception e) { IDPPUtils.debug.error("PPRequestHandler.processInteraction" + "Response: Exception occured.", e); return false; } } /** * Process the interaction response for values. * @param isQuery true if this is a PP query request, * false if this is a PP modify request. * @param msg SOAP Request Message * @param resource interaction resource * @return Map map of interacted data. */ private Map processInteractionValueResponse( boolean isQuery, Message msg, String resource) { if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.processInteraction" + "Response:Init"); } if(msg == null || resource == null) { IDPPUtils.debug.error("PPRequestHandler:processInteraction" + "Response:null input params"); return null; } //Get the actual element resource = IDPPUtils.getExpressionContext(resource); if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler:processInteraction" + "PP Element that was trying to access:" + resource); } try { Map interactedData = new HashMap(); InteractionResponseElement ire = InteractionManager.getInstance(). getInteractionResponseElement(msg); if(ire == null) { return null; } Map responses = InteractionUtils.getParameters(ire); if(responses == null || responses.isEmpty()) { return null; } String lang = getLanguage(msg); PPInteractionHelper interactionHelper = new PPInteractionHelper(lang); Map queries = interactionHelper.getInteractForValueQuestions( isQuery, resource); Iterator iter = queries.keySet().iterator(); while(iter.hasNext()) { String query = (String)iter.next(); String value = (String)responses.get(query); if(value == null || value.length() == 0) { continue; } interactedData.put( interactionHelper.getPPAttribute(query), value); } return interactedData; } catch (Exception e) { IDPPUtils.debug.error("PPRequestHandler.processInteraction" + "Response: Exception occured.", e); return null; } } /** * Gets the language from the locale header. * @param requestMsg RequestMsg. * @return String Language string from the message. */ private String getLanguage(Message requestMsg) { List langHeaders = InteractionUtils.getInteractionLangauge(requestMsg); if(langHeaders == null || langHeaders.isEmpty()) { if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.setLanguage: Language" + "Headers are empty in the interaction message."); } return null; } String lang = (String)langHeaders.iterator().next(); if(IDPPUtils.debug.messageEnabled()) { IDPPUtils.debug.message("PPRequestHandler.setLanguage:Lang:"+ lang); } return lang; } /** * Gets the service instance update header. * * @exception SOAPFaultException. */ private ServiceInstanceUpdateHeader getServiceInstanceUpdateHeader() throws SOAPFaultException { ServiceInstanceUpdate siu = IDPPServiceManager.getInstance().getServiceInstanceUpdate(); ServiceInstanceUpdateHeader siuHeader = siu.getServiceInstanceUpdateHeader(); if(siu.isSOAPFaultNeeded()) { QName faultCodeServer = new QName(SOAPBindingConstants.NS_SOAP, "Server"); SOAPFaultDetail detail = new SOAPFaultDetail( SOAPFaultDetail.ENDPOINT_MOVED, null, null); SOAPFault sf = new SOAPFault(faultCodeServer, IDPPUtils.bundle.getString("endPointMoved"), null, detail); Message sfmsg = new Message(sf); sfmsg.setServiceInstanceUpdateHeader(siuHeader); SOAPFaultException sfe = new SOAPFaultException(sfmsg); throw sfe; } return siuHeader; } }