package org.talend.esb.locator.service.internal; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.common.injection.NoJSR250Annotations; import org.apache.cxf.ws.policy.PolicyBuilder; import org.apache.cxf.ws.policy.PolicyEngine; import org.apache.cxf.ws.policy.WSPolicyFeature; import org.apache.cxf.ws.security.SecurityConstants; import org.apache.cxf.endpoint.Server; import org.apache.cxf.endpoint.ServerRegistry; import org.apache.cxf.feature.Feature; import org.apache.neethi.Policy; import org.apache.neethi.PolicyRegistry; import org.talend.esb.locator.service.LocatorServiceConstants; import org.talend.esb.locator.service.PolicyProvider; import org.talend.esb.locator.service.LocatorServiceConstants.EsbSecurity; //import org.apache.cxf.jaxws22.spring.JAXWS22SpringEndpointImpl; import org.apache.cxf.jaxws.EndpointImpl; //jaxws.spring.JAXWSSpringEndpointImpl; import org.apache.wss4j.dom.validate.JAASUsernameTokenValidator; @NoJSR250Annotations(unlessNull = "bus") public class PolicyProviderImpl implements PolicyProvider { private String policyToken; private String policySaml; private String signatureProperties; private String signatureUsername; private String signaturePassword; private String serviceAutentication; // private JAXWS22SpringEndpointImpl locatorEndpoint; private EndpointImpl locatorEndpoint; private PolicyBuilder policyBuilder; private static final String ENDPOINT_SIGNATURE_PASSWORD = "security.signature.password"; public void init() { final EsbSecurity esbSecurity = EsbSecurity .fromString((String) serviceAutentication); if (EsbSecurity.NO == esbSecurity) return; Bus currentBus = BusFactory.getThreadDefaultBus(); policyBuilder = currentBus.getExtension(PolicyBuilder.class); List<Policy> policies = new ArrayList<Policy>(); if (EsbSecurity.TOKEN == esbSecurity) { policies.add(getTokenPolicy()); } else if (EsbSecurity.SAML == esbSecurity) { policies.add(getSamlPolicy()); } ServerRegistry registry = currentBus.getExtension(ServerRegistry.class); List<Server> servers = registry.getServers(); Map<String, Object> endpointProps = new HashMap<String, Object>(); if (EsbSecurity.TOKEN == esbSecurity) { JAASUsernameTokenValidator jaasUTValidator = new JAASUsernameTokenValidator(); jaasUTValidator.setContextName("karaf"); endpointProps.put(SecurityConstants.USERNAME_TOKEN_VALIDATOR, jaasUTValidator); } if (EsbSecurity.SAML == esbSecurity) { endpointProps.put(SecurityConstants.SIGNATURE_PROPERTIES, getSignatureProperties()); endpointProps.put(SecurityConstants.SIGNATURE_USERNAME, getSignatureUsername()); endpointProps.put(ENDPOINT_SIGNATURE_PASSWORD, getSignaturePassword()); endpointProps.put(SecurityConstants.CALLBACK_HANDLER, new WSPasswordCallbackHandler(getSignatureUsername(), getSignaturePassword())); } locatorEndpoint.setProperties(endpointProps); Server srv = null; for (Server sr : servers) { if (sr.getEndpoint().getService() == locatorEndpoint.getService()) srv = sr; } List<Feature> activeFeatures = locatorEndpoint.getFeatures(); WSPolicyFeature policyFeature = new WSPolicyFeature(); activeFeatures.add(policyFeature); policyFeature.setPolicies(policies); policyFeature.initialize(srv, currentBus); } public void register(Bus cxf) { final PolicyRegistry policyRegistry = cxf.getExtension( PolicyEngine.class).getRegistry(); policyRegistry.register(LocatorServiceConstants.ID_POLICY_TOKEN, getTokenPolicy()); policyRegistry.register(LocatorServiceConstants.ID_POLICY_SAML, getSamlPolicy()); } private Policy loadPolicy(String location) { InputStream is = null; try { is = new FileInputStream(location); return policyBuilder.getPolicy(is); } catch (Exception e) { throw new RuntimeException("Cannot load policy", e); } finally { if (null != is) { try { is.close(); } catch (IOException e) { // just ignore } } } } public void setPolicyToken(String policyToken) { this.policyToken = policyToken; } public void setLocatorEndpoint(EndpointImpl locatorEndpoint) { this.locatorEndpoint = locatorEndpoint; } public void setserviceAutentication(String serviceAutentication) { this.serviceAutentication = serviceAutentication; } public void setPolicySaml(String policySaml) { this.policySaml = policySaml; } public Policy getTokenPolicy() { return loadPolicy(policyToken); } public Policy getSamlPolicy() { return loadPolicy(policySaml); } public void setSignatureProperties(String signatureProperties) { this.signatureProperties = signatureProperties; } public String getSignatureProperties() { return signatureProperties; } public void setSignatureUsername(String signatureUsername) { this.signatureUsername = signatureUsername; } public String getSignatureUsername() { return signatureUsername; } public void setSignaturePassword(String signaturePassword) { this.signaturePassword = signaturePassword; } public String getSignaturePassword() { return signaturePassword; } }