Author: gawor
Date: Wed Jul 15 16:08:51 2009
New Revision: 794318
URL: http://svn.apache.org/viewvc?rev=794318&view=rev
Log:
1) set arbitrary port properties for service-references in geronimo
plan and 2) recognize wss4j properties to enable ws-security for
service-references (using CXF provider). Based on patch/work of
Rahul Mehta (GERONIMO-4642)
Added:
geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFPasswordHandler.java (with props)
geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFPortMethodInterceptor.java (with
props)
Modified:
geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml
geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFServiceReference.java
geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/
main/xsd/geronimo-naming-1.2.xsd
geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/
main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
org/apache/geronimo/jaxws/client/EndpointInfo.java
geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
org/apache/geronimo/jaxws/client/PortMethodInterceptor.java
Modified: geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml?rev=794318&r1=794317&r2=794318&view=diff
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml (original)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/pom.xml Wed Jul
15 16:08:51 2009
@@ -61,6 +61,11 @@
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-ws-security</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
Added: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/
org/apache/geronimo/cxf/client/CXFPasswordHandler.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java?rev=794318&view=auto
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFPasswordHandler.java (added)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFPasswordHandler.java Wed Jul 15
16:08:51 2009
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
with
+ * this work for additional information regarding copyright
ownership.
+ * The ASF licenses this file to You under the Apache License,
Version 2.0
+ * (the "License"); you may not use this file except in compliance
with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
+ * See the License for the specific language governing permissions
and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.cxf.client;
+
+import java.io.IOException;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+import org.apache.ws.security.WSPasswordCallback;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CXFPasswordHandler implements CallbackHandler {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(CXFPasswordHandler.class);
+
+ private String password;
+
+ public CXFPasswordHandler(String password) {
+ this.password = password;
+ }
+
+ public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
+ WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
+ pc.setPassword(this.password);
+ }
+}
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFPasswordHandler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/
org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java?rev=794318&view=auto
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFPortMethodInterceptor.java (added)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFPortMethodInterceptor.java Wed Jul 15
16:08:51 2009
@@ -0,0 +1,112 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
with
+ * this work for additional information regarding copyright
ownership.
+ * The ASF licenses this file to You under the Apache License,
Version 2.0
+ * (the "License"); you may not use this file except in compliance
with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
+ * See the License for the specific language governing permissions
and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.cxf.client;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
+import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
+import org.apache.geronimo.jaxws.client.EndpointInfo;
+import org.apache.geronimo.jaxws.client.PortMethodInterceptor;
+import org.apache.ws.security.handler.WSHandlerConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CXFPortMethodInterceptor extends PortMethodInterceptor {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(CXFPortMethodInterceptor.class);
+
+ private static final String IN_PREFIX = "wss4j.in.";
+ private static final String OUT_PREFIX = "wss4j.out.";
+
+ public CXFPortMethodInterceptor(Map<Object, EndpointInfo>
seiInfoMap) {
+ super(seiInfoMap);
+ }
+
+ @Override
+ protected void setProperties(BindingProvider proxy,
EndpointInfo info, Map<String, Object> props) {
+ if (info == null) {
+ return;
+ }
+
+ Map<String, Object> wss4jInProps = new HashMap<String,
Object>();
+ Map<String, Object> wss4jOutProps = new HashMap<String,
Object>();
+ Map<String, Object> otherProps = new HashMap<String,
Object>();
+
+ for (Map.Entry<String, Object> entry : props.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ if (key.startsWith(IN_PREFIX)) {
+ key = key.substring(IN_PREFIX.length());
+ wss4jInProps.put(key, value);
+ } else if (key.startsWith(OUT_PREFIX)) {
+ key = key.substring(OUT_PREFIX.length());
+ wss4jOutProps.put(key, value);
+ } else {
+ otherProps.put(key, value);
+ }
+ }
+
+ super.setProperties(proxy, info, otherProps);
+
+ Client client = ClientProxy.getClient(proxy);
+ Endpoint cxfEndpoint = client.getEndpoint();
+
+ if (!wss4jOutProps.isEmpty()) {
+ // pass the security properties to the WSS4J out
interceptor
+ updateSecurityProperties(wss4jOutProps);
+ WSS4JOutInterceptor wssOut = new
WSS4JOutInterceptor(wss4jOutProps);
+ cxfEndpoint.getOutInterceptors().add(wssOut);
+ }
+
+ if (!wss4jInProps.isEmpty()) {
+ // pass the security properties to the WSS4J in
interceptor
+ WSS4JInInterceptor wssIn = new
WSS4JInInterceptor(wss4jInProps);
+ cxfEndpoint.getInInterceptors().add(wssIn);
+ }
+
+ }
+
+ private static void updateSecurityProperties(Map<String,
Object> properties) {
+ String action = (String)
properties.get(WSHandlerConstants.ACTION);
+ if (containsValue(action,
WSHandlerConstants.USERNAME_TOKEN) &&
+ !
properties.containsKey(WSHandlerConstants.PW_CALLBACK_CLASS)) {
+ String password = (String) properties.get("password");
+ properties.put(WSHandlerConstants.PW_CALLBACK_REF,
+ new CXFPasswordHandler(password));
+ }
+ }
+
+ private static boolean containsValue(String property, String
value) {
+ if (property != null) {
+ String[] entries = property.split(" ");
+ for (String entry : entries) {
+ if (value.equals(entry)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFPortMethodInterceptor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/
java/org/apache/geronimo/cxf/client/CXFServiceReference.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/apache/geronimo/cxf/client/CXFServiceReference.java?rev=794318&r1=794317&r2=794318&view=diff
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFServiceReference.java (original)
+++ geronimo/server/trunk/plugins/cxf/geronimo-cxf/src/main/java/org/
apache/geronimo/cxf/client/CXFServiceReference.java Wed Jul 15
16:08:51 2009
@@ -38,6 +38,7 @@
import org.apache.geronimo.jaxws.JNDIResolver;
import org.apache.geronimo.jaxws.client.EndpointInfo;
import org.apache.geronimo.jaxws.client.JAXWSServiceReference;
+import org.apache.geronimo.jaxws.client.PortMethodInterceptor;
import org.apache.geronimo.jaxws.handler.GeronimoHandlerResolver;
import org.apache.geronimo.xbeans.javaee.HandlerChainsType;
@@ -93,4 +94,9 @@
new GeronimoHandlerResolver(classLoader,
serviceClass, getHandlerChains(), annotationProcessor);
return handlerResolver;
}
+
+ protected PortMethodInterceptor getPortMethodInterceptor() {
+ return new CXFPortMethodInterceptor(this.seiInfoMap);
+ }
+
}
Modified: geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/
src/main/xsd/geronimo-naming-1.2.xsd
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/xsd/geronimo-naming-1.2.xsd?rev=794318&r1=794317&r2=794318&view=diff
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/
main/xsd/geronimo-naming-1.2.xsd (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/
main/xsd/geronimo-naming-1.2.xsd Wed Jul 15 16:08:51 2009
@@ -986,9 +986,19 @@
</xsd:documentation>
</xsd:annotation>
</xsd:element>
+ <xsd:element name="property"
type="gernaming:portPropertyType"
+ minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
+ <xsd:complexType name="portPropertyType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="name" type="xsd:string"
use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
<xsd:complexType name="service-refType">
<xsd:sequence>
<xsd:element name="service-ref-name" type="xsd:string">
Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/
src/main/java/org/apache/geronimo/jaxws/builder/
EndpointInfoBuilder.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java?rev=794318&r1=794317&r2=794318&view=diff
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/
main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
(original)
+++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-builder/src/
main/java/org/apache/geronimo/jaxws/builder/EndpointInfoBuilder.java
Wed Jul 15 16:08:51 2009
@@ -26,6 +26,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import javax.wsdl.Binding;
import javax.wsdl.Definition;
@@ -47,6 +48,7 @@
import org.apache.geronimo.jaxws.client.EndpointInfo;
import org.apache.geronimo.jaxws.wsdl.CatalogJarWSDLLocator;
import org.apache.geronimo.jaxws.wsdl.CatalogWSDLLocator;
+import
org.apache.geronimo.xbeans.geronimo.naming.GerPortPropertyType;
import org.apache.geronimo.xbeans.geronimo.naming.GerPortType;
import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
import org.apache.geronimo.xbeans.javaee.PortComponentRefType;
@@ -118,7 +120,8 @@
URL location = getLocation(gerPort);
String credentialsName =
getCredentialsName(gerPort);
boolean mtomEnabled = isMTOMEnabled(portName);
- EndpointInfo info = new
EndpointInfo(location, credentialsName, mtomEnabled);
+ Map<String, Object> props =
getProperties(gerPort);
+ EndpointInfo info = new
EndpointInfo(location, credentialsName, mtomEnabled, props);
this.portInfoMap.put(portName, info);
}
}
@@ -240,7 +243,9 @@
boolean mtomEnabled =
isMTOMEnabled(portType.getQName());
- EndpointInfo info = new EndpointInfo(location,
credentialsName, mtomEnabled);
+ Map<String, Object> props = getProperties(gerPort);
+
+ EndpointInfo info = new EndpointInfo(location,
credentialsName, mtomEnabled, props);
this.portInfoMap.put(portName, info);
// prefer first binding listed in wsdl
if (!
this.portInfoMap.containsKey(portType.getQName())) {
@@ -272,6 +277,16 @@
return null;
}
+ private Map<String, Object> getProperties(GerPortType port) {
+ Map<String, Object> props = new HashMap<String, Object>();
+ if (port.getPropertyArray() != null) {
+ for (GerPortPropertyType propertyType :
port.getPropertyArray()) {
+ props.put(propertyType.getName(),
propertyType.getStringValue().trim());
+ }
+ }
+ return props;
+ }
+
private String getCredentialsName(GerPortType port) {
String credentialsName = port.getCredentialsName();
return (credentialsName == null) ? null :
credentialsName.trim();
Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/
main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/EndpointInfo.java?rev=794318&r1=794317&r2=794318&view=diff
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
org/apache/geronimo/jaxws/client/EndpointInfo.java (original)
+++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
org/apache/geronimo/jaxws/client/EndpointInfo.java Wed Jul 15
16:08:51 2009
@@ -18,17 +18,20 @@
import java.io.Serializable;
import java.net.URL;
+import java.util.Map;
public class EndpointInfo implements Serializable {
private URL location;
private String credentialsName;
private boolean mtomEnabled;
+ private Map<String, Object> properties;
- public EndpointInfo(URL location, String credentialsName,
boolean mtomEnabled) {
+ public EndpointInfo(URL location, String credentialsName,
boolean mtomEnabled, Map<String, Object> properties) {
this.location = location;
this.credentialsName = credentialsName;
this.mtomEnabled = mtomEnabled;
+ this.properties = properties;
}
public boolean isMTOMEnabled() {
@@ -43,7 +46,11 @@
return this.credentialsName;
}
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
public String toString() {
- return this.location + " " + this.credentialsName + " " +
this.mtomEnabled;
+ return this.location + " " + this.credentialsName + " " +
this.mtomEnabled + " " + this.properties;
}
}
Modified: geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/
main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java
URL:
http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/PortMethodInterceptor.java?rev=794318&r1=794317&r2=794318&view=diff
=
=
=
=
=
=
=
=
======================================================================
--- geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
org/apache/geronimo/jaxws/client/PortMethodInterceptor.java (original)
+++ geronimo/server/trunk/plugins/jaxws/geronimo-jaxws/src/main/java/
org/apache/geronimo/jaxws/client/PortMethodInterceptor.java Wed Jul
15 16:08:51 2009
@@ -97,7 +97,14 @@
setProperties(proxy, info);
}
- private void setProperties(BindingProvider proxy, EndpointInfo
info) {
+ protected void setProperties(BindingProvider proxy,
EndpointInfo info) {
+ if (info == null) {
+ return;
+ }
+ setProperties(proxy, info, info.getProperties());
+ }
+
+ protected void setProperties(BindingProvider proxy,
EndpointInfo info, Map<String, Object> properties) {
if (info == null) {
return;
}
@@ -119,29 +126,35 @@
// set credentials
String credentialsName = info.getCredentialsName();
if (credentialsName != null) {
- Subject subject = ContextManager.getNextCaller();
- if (subject == null) {
- throw new IllegalStateException("Subject missing
but authentication turned on");
- } else {
- Set creds =
subject.getPrivateCredentials(NamedUsernamePasswordCredential.class);
- boolean found = false;
-
- for (Iterator iterator = creds.iterator();
iterator.hasNext();) {
- NamedUsernamePasswordCredential
namedUsernamePasswordCredential = (NamedUsernamePasswordCredential)
iterator.next();
- if
(credentialsName.equals(namedUsernamePasswordCredential.getName())) {
-
proxy.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
-
namedUsernamePasswordCredential.getUsername());
-
proxy.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
- new
String(namedUsernamePasswordCredential.getPassword()));
- LOG.debug("Set username/password property:
" + credentialsName);
- found = true;
- break;
- }
- }
- if (!found) {
- throw new IllegalStateException("no
NamedUsernamePasswordCredential found for name " + credentialsName);
+ NamedUsernamePasswordCredential
namedUsernamePasswordCredential = findCredential(credentialsName);
+
proxy.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
+
namedUsernamePasswordCredential.getUsername());
+
proxy.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
+ new
String(namedUsernamePasswordCredential.getPassword()));
+ LOG.debug("Set username/password property: " +
credentialsName);
+ }
+
+ // set user-specified properties
+ if (properties != null) {
+ for (Map.Entry<String, Object> entry :
properties.entrySet()) {
+ proxy.getRequestContext().put(entry.getKey(),
entry.getValue());
+ }
+ }
+ }
+
+ protected NamedUsernamePasswordCredential findCredential(String
credentialsName) {
+ Subject subject = ContextManager.getNextCaller();
+ if (subject == null) {
+ throw new IllegalStateException("Subject missing but
authentication turned on");
+ } else {
+ Set creds =
subject.getPrivateCredentials(NamedUsernamePasswordCredential.class);
+ for (Iterator iterator = creds.iterator();
iterator.hasNext();) {
+ NamedUsernamePasswordCredential
namedUsernamePasswordCredential = (NamedUsernamePasswordCredential)
iterator.next();
+ if
(credentialsName.equals(namedUsernamePasswordCredential.getName())) {
+ return namedUsernamePasswordCredential;
}
}
+ throw new IllegalStateException("No
NamedUsernamePasswordCredential found for name " + credentialsName);
}
}
}