package at.gv.util.client.szr; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.apache.commons.lang.StringUtils; import org.apache.cxf.message.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.util.MiscUtil; import at.gv.util.ex.EgovUtilException; import at.gv.util.xsd.szr.pvp.Param; import at.gv.util.xsd.szr.pvp.PvpTokenType; import at.gv.util.xsd.szr.pvp.PvpTokenType.Accounting; import at.gv.util.xsd.szr.pvp.PvpTokenType.Accounting.GvCostCenterId; import at.gv.util.xsd.szr.pvp.Role; public class PVP2XHTTPHeaderHandler implements SOAPHandler { private PvpTokenType pvpTokenType = null; private Logger log = LoggerFactory.getLogger(PVP2XHTTPHeaderHandler.class); public static final String PVP_HEADER_COSTCENTERID_DEFAULT = ""; public static final String PVP_HEADER_VALUE_DELIMITER = ","; public static final String PVP_HEADER_ROLE_VALUE_DELIMITER = ";"; private IRoleGenerationStrategy roleStrategy = null; public PVP2XHTTPHeaderHandler() { } public PVP2XHTTPHeaderHandler(IRoleGenerationStrategy roleGenerationStrategy) { log.info("PVP2XHTTPHeaderHandler uses RoleGenerationStrategy: " + roleGenerationStrategy.getClass().getName()); this.roleStrategy = roleGenerationStrategy; } public void close(MessageContext arg0) { } public boolean handleFault(SOAPMessageContext arg0) { return true; } public void configure(PvpTokenType pvpToken) { MiscUtil.assertNotNull(pvpToken, "pvpToken"); this.pvpTokenType = pvpToken; } public boolean handleMessage(SOAPMessageContext smc) { log.trace("Initializing SZR SOAP message handler."); boolean isOutMessage = ((Boolean) smc.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); log.trace("Outbound message: " + isOutMessage); if (pvpTokenType == null) { throw new NullPointerException("Please configure first the PVP token."); } if (!isOutMessage) { return true; } Map headers = (Map) smc.get(Message.PROTOCOL_HEADERS); //PVP 2.x header //setHeader(headers, "X-PVP-VERSION", pvpTokenType.getVersion()); setHeader(headers, "X-PVP-EGOVTOKEN-VERSION", pvpTokenType.getVersion()); setHeader(headers, "X-PVP-USERID", pvpTokenType.getAuthenticate().getUserPrincipal().getUserId()); setHeader(headers, "X-PVP-GID", pvpTokenType.getAuthenticate().getUserPrincipal().getGvGid()); setHeader(headers, "X-PVP-PARTICIPANT-ID", pvpTokenType.getAuthenticate().getParticipantId()); setHeader(headers, "X-PVP-OU-GV-OU-ID", pvpTokenType.getAuthenticate().getUserPrincipal().getGvOuId()); setHeader(headers, "X-PVP-OU", pvpTokenType.getAuthenticate().getUserPrincipal().getOu()); setHeader(headers, "X-PVP-FUNCTION", pvpTokenType.getAuthenticate().getUserPrincipal().getGvFunction()); setHeader(headers, "X-PVP-SECCLASS", String.valueOf(pvpTokenType.getAuthenticate().getUserPrincipal().getGvSecClass().intValue())); setHeader(headers, "X-PVP-PRINCIPAL-NAME", pvpTokenType.getAuthenticate().getUserPrincipal().getCn()); setHeader(headers, "X-PVP-BINDING", "http"); setHeader(headers, "X-PVP-OU-OKZ", "AT:OVS"); //PVP 1.x header //setHeader(headers, "X-VERSION", pvpTokenType.getVersion()); setHeader(headers, "X-VERSION", "1.8"); setHeader(headers, "X-AUTHENTICATE-UserID", pvpTokenType.getAuthenticate().getUserPrincipal().getUserId()); setHeader(headers, "X-AUTHENTICATE-GVGID", pvpTokenType.getAuthenticate().getUserPrincipal().getGvGid()); setHeader(headers, "X-AUTHENTICATE-PARTICIPANTID", pvpTokenType.getAuthenticate().getParticipantId()); setHeader(headers, "X-AUTHENTICATE-GVOUID", pvpTokenType.getAuthenticate().getUserPrincipal().getGvOuId()); setHeader(headers, "X-AUTHENTICATE-OU", pvpTokenType.getAuthenticate().getUserPrincipal().getOu()); setHeader(headers, "X-AUTHENTICATE-GVFUNCTION", pvpTokenType.getAuthenticate().getUserPrincipal().getGvFunction()); setHeader(headers, "X-AUTHENTICATE-gvSecClass", String.valueOf(pvpTokenType.getAuthenticate().getUserPrincipal().getGvSecClass().intValue())); setHeader(headers, "X-AUTHENTICATE-cn",pvpTokenType.getAuthenticate().getUserPrincipal().getCn()); //set roles attribute String roleString = null; List roles = pvpTokenType.getAuthorize().getRole(); if (roles != null && !roles.isEmpty()) { for (Role role : roles) { String roleElement = role.getValue(); List roleParams = role.getParam(); if (roleParams != null && !roleParams.isEmpty()) { roleElement = roleElement + "("; for (Param el : roleParams) { roleElement = roleElement + el.getKey() + "=" + el.getValue() + PVP_HEADER_VALUE_DELIMITER; } roleElement = roleElement.substring(0, roleElement.length()-1) + ")"; } if (roleString == null) roleString = roleElement; else roleString = roleString + PVP_HEADER_ROLE_VALUE_DELIMITER + roleElement; } } if (roleStrategy != null) { log.trace("Generate dynamic role ... "); try { String dynRoleString = roleStrategy.generateRoleString(roleString); setHeader(headers, "X-PVP-ROLES", dynRoleString); setHeader(headers, "X-AUTHORIZE-ROLES", dynRoleString); } catch (EgovUtilException e) { throw new RuntimeException("Can NOT generate dynamic VDDS role by using: " + roleStrategy.getClass().getName(), e); } } //set optional headers String costCenterId = StringUtils.EMPTY; String invoiceRecptId = StringUtils.EMPTY; Accounting accounting = pvpTokenType.getAccounting(); if (accounting != null) { invoiceRecptId = accounting.getInvoiceRecptId(); if (accounting.getGvCostCenterId() != null && !accounting.getGvCostCenterId().isEmpty()) { for (GvCostCenterId el : accounting.getGvCostCenterId()) { String value = StringUtils.EMPTY; if (el.isDefault()) value = PVP_HEADER_COSTCENTERID_DEFAULT; value = value + el.getValue(); if (costCenterId.isEmpty()) costCenterId = value; else costCenterId = PVP_HEADER_VALUE_DELIMITER + value; } } } setHeader(headers, "X-PVP-COST-CENTER-ID", costCenterId); setHeader(headers, "X-PVP-INVOICE-RECPT-ID", invoiceRecptId); setHeader(headers, "X-ACCOUNTING-CostCenterId", costCenterId); setHeader(headers, "X-ACCOUNTING-InvoiceRecptId", invoiceRecptId); return true; } public Set getHeaders() { return null; } private void setHeader(Map headers, String name, String value) { if (MiscUtil.isEmpty(value)) headers.put(name, Collections.singletonList(StringUtils.EMPTY)); else headers.put(name, Collections.singletonList(value)); } }