-----Original Message----- From: Simon Laws [mailto:[email protected]] Sent: 24 May 2010 15:24 To: [email protected] Subject: Re: Exception with security (again)
On Mon, May 24, 2010 at 2:40 PM, Gregor Kiddie <[email protected]> wrote: > > > -----Original Message----- > From: Simon Laws [mailto:[email protected]] > Sent: 24 May 2010 13:54 > To: [email protected] > Subject: Re: Exception with security (again) > > On Mon, May 24, 2010 at 11:03 AM, Gregor Kiddie > <[email protected]> wrote: >> >> >> -----Original Message----- >> From: Simon Laws [mailto:[email protected]] >> Sent: 24 May 2010 09:54 >> To: [email protected] >> Subject: Re: Exception with security (again) >> >> On Fri, May 21, 2010 at 8:17 PM, Gregor Kiddie >> <[email protected]> wrote: >>> Ok, last one before I leave for the weekend cursing Tuscany! >>> >>> >>> >>> Using an authentication policy on a binding.ws generates the following >>> exception. >>> >>> >>> >>> Caused by: java.lang.ArrayIndexOutOfBoundsException: 1 >>> >>> at >>> org.apache.tuscany.sca.databinding.axiom.OMElementWrapperHandler.setChildren(OMElementWrapperHandler.java:76) >>> >>> It looks like childObjects passed into the method has all the parameters >>> wrapped up in a single piece of XML >>> >>> The ChildElements which is pulled from the operation which is passed in, has >>> them split up into three Elements. >>> >>> >>> >>> The loop in setChildren uses the size of the ChildElements as it's upper >>> bounds and references both objects. Unsurprisingly, when it gets to >>> childObjects[1] it blows up. >>> >>> >>> >>> I've been running through everything for a couple of hours and I'm now >>> calling defeat. I'm close to dumping Tuscany for this! >>> >>> >>> >>> Gk. >> >> Hi Gregor >> >> Sorry that you're having a frustrating time. Can you describe your >> scenario so I can reproduce it here. >> >> Thanks >> >> Simon >> >> >> -- >> Apache Tuscany committer: tuscany.apache.org >> Co-author of a book about Tuscany and SCA: tuscanyinaction.com >> >> My Composite looks like >> <?xml version="1.0" encoding="UTF-8"?> >> <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" >> targetNamespace="com.mycompany.myproduct.authentication" >> xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" >> name="authentication" > >> >> <component name="Authentication"> >> <implementation.spring >> location="WEB-INF/classes/applicationContext.xml" /> >> <service name="Authentication"> >> <binding.ws /> >> </service> >> <reference name="authenticationProvider" > >> <binding.ws >> wsdlElement="http://soa.mycompany.com/webservices/#wsdl.port(MyService/MyServiceSoap12)" >> requires="authentication" /> >> </reference> >> </component> >> </composite> >> >> My definitions file looks like >> <?xml version="1.0" encoding="UTF-8"?> >> <definitions xmlns="http://www.osoa.org/xmlns/sca/1.0" >> xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" >> >> xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" >> targetNamespace="com.mycompany.richfx.policy" > >> >> <policySet name="myCompanyPolicySet" provides="authentication" >> appliesTo="sca:binding.ws"> >> <tuscany:basicAuthentication> >> <tuscany:userName>someusername</tuscany:userName> >> <tuscany:password>some-password</tuscany:password> >> </tuscany:basicAuthentication> >> </policySet> >> </definitions> >> >> Application starts up fine, but when I make the call to the external >> webservice (the reference), I get the error in the OP. >> Remove the definitions file and the requires="authentication", and the calls >> works but gets rejected due to missing the basic authorisation. >> > > Hi Gregor > > There's something odd going on here. I set up a test where I deployed > our calculator service with the AddService deployed as a web service > to Tomcat with Basic Authentication turned on. > > I created a client project where the calculator has a reference to the > AddService with the "authentication" intent set. This was my > definitions file. > > <definitions xmlns="http://www.osoa.org/xmlns/sca/1.0" > targetNamespace="http://itest/policy" > xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" > xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" > xmlns:ip="http://itest/policy" > > > > <sca:policySet name="BasicAuthenticationPolicySet" > provides="authentication" > appliesTo="sca:binding.ws"> > <tuscany:basicAuthentication> > <tuscany:userName>tuscanyuser</tuscany:userName> > <tuscany:password>tuscanypwd</tuscany:password> > </tuscany:basicAuthentication> > </sca:policySet> > > > </definitions> > > I tried it with both a Java implementation and a spring > implementation. Here's my client component from the composite file... > > <component name="CalculatorServiceComponent"> > <!--implementation.java > class="calculator.CalculatorServiceImpl"/--> > <implementation.spring > location="META-INF/spring/CalculatorService-context.xml"/> > <reference name="addService" > > <interface.java interface="calculator.AddService" /> > <binding.ws requires="authentication" > uri="http://localhost:8080/sample-calculator-ws-webapp/AddServiceComponent"/> > </reference> > <reference name="subtractService" target="SubtractServiceComponent" /> > <reference name="multiplyService" target="MultiplyServiceComponent" /> > <reference name="divideService" target="DivideServiceComponent" /> > </component> > > With the password correctly set I get.... > > 24-May-2010 13:50:29 org.apache.tuscany.sca.node.impl.NodeImpl <init> > INFO: Creating node: Calculator.composite > 24-May-2010 13:50:29 org.apache.tuscany.sca.node.impl.NodeImpl configureNode > INFO: Loading contribution: > file:/D:/sca-java-1.x/samples/calculator/target/classes/ > 24-May-2010 13:50:30 org.apache.tuscany.sca.node.impl.NodeImpl start > INFO: Starting node: Calculator.composite > - Loading XML bean definitions from URL > [file:/D:/sca-java-1.x/samples/calculator/target/classes/META-INF/spring/CalculatorService-context.xml] > - Module validation failed: The system is attempting to engage a > module that is not available: rampart > - Refreshing > org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387: > display name > [org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387]; > startup date [Mon May 24 13:50:31 BST 2010]; parent: > org.apache.tuscany.sca.implementation.spring.runtime.context.scaparentapplicationcont...@18782a7 > - Bean factory for application context > [org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387]: > org.springframework.beans.factory.xml.xmlbeanfact...@192d604 > Spring parent context - containsBean called for name: loadTimeWeaver > - Pre-instantiating singletons in > org.springframework.beans.factory.xml.xmlbeanfact...@192d604: defining > beans [CalculatorServiceBean]; parent: > org.apache.tuscany.sca.implementation.spring.runtime.context.scaparentapplicationcont...@18782a7 > Spring parent context - getBean called for name: addService > Spring parent context - getBean called for name: subtractService > Spring parent context - getBean called for name: multiplyService > Spring parent context - getBean called for name: divideService > 3 + 2=5.0 > 3 - 2=1.0 > 3 * 2=6.0 > 3 / 2=1.5 > 24-May-2010 13:50:32 org.apache.tuscany.sca.node.impl.NodeImpl stop > INFO: Stopping node: Calculator.composite > - Closing > org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387: > display name > [org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387]; > startup date [Mon May 24 13:50:31 BST 2010]; parent: > org.apache.tuscany.sca.implementation.spring.runtime.context.scaparentapplicationcont...@18782a7 > - Destroying singletons in > org.springframework.beans.factory.xml.xmlbeanfact...@192d604: defining > beans [CalculatorServiceBean]; parent: > org.apache.tuscany.sca.implementation.spring.runtime.context.scaparentapplicationcont...@18782a7 > > > with the password set to "abcdefg" I get... > > 24-May-2010 13:45:01 org.apache.tuscany.sca.node.impl.NodeImpl <init> > INFO: Creating node: Calculator.composite > 24-May-2010 13:45:01 org.apache.tuscany.sca.node.impl.NodeImpl configureNode > INFO: Loading contribution: > file:/D:/sca-java-1.x/samples/calculator/target/classes/ > 24-May-2010 13:45:02 org.apache.tuscany.sca.node.impl.NodeImpl start > INFO: Starting node: Calculator.composite > - Loading XML bean definitions from URL > [file:/D:/sca-java-1.x/samples/calculator/target/classes/META-INF/spring/CalculatorService-context.xml] > - Module validation failed: The system is attempting to engage a > module that is not available: rampart > - Refreshing > org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387: > display name > [org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387]; > startup date [Mon May 24 13:45:03 BST 2010]; parent: > org.apache.tuscany.sca.implementation.spring.runtime.context.scaparentapplicationcont...@18782a7 > - Bean factory for application context > [org.apache.tuscany.sca.implementation.spring.runtime.context.scagenericapplicationcont...@14a9387]: > org.springframework.beans.factory.xml.xmlbeanfact...@192d604 > Spring parent context - containsBean called for name: loadTimeWeaver > - Pre-instantiating singletons in > org.springframework.beans.factory.xml.xmlbeanfact...@192d604: defining > beans [CalculatorServiceBean]; parent: > org.apache.tuscany.sca.implementation.spring.runtime.context.scaparentapplicationcont...@18782a7 > Spring parent context - getBean called for name: addService > Spring parent context - getBean called for name: subtractService > Spring parent context - getBean called for name: multiplyService > Spring parent context - getBean called for name: divideService > - Basic authentication scheme selected > - Failure authenticating with BASIC 'Application'@localhost:8080 > - Unable to sendViaPost to > url[http://localhost:8080/sample-calculator-ws-webapp/AddServiceComponent] > org.apache.axis2.AxisFault: Transport error: 401 Error: Unauthorized > > So it seems to be basically working so my suspicion is turning to the > WSDL you have? What style is the WSDL using, by default Tuscany is > expecting to deal with Doc/Lit/Wrapped. If the external service is > doing something else we'll have to look at how the WSDL is configured. > > > Regards > > Simon > > -- > Apache Tuscany committer: tuscany.apache.org > Co-author of a book about Tuscany and SCA: tuscanyinaction.com > > > The WSDL is huge. Cutting it down to the relevant parts > > <?xml version="1.0" encoding="utf-8"?> > <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" > xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" > xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" > xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" > xmlns:tns="http://soa.mycompany.com/webservices/" > xmlns:s1="http://microsoft.com/wsdl/types/" > xmlns:s="http://www.w3.org/2001/XMLSchema" > xmlns:s2="http://soa.mycompany.com/webservices/AbstractTypes" > xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" > xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" > targetNamespace="http://soa.mycompany.com/webservices/" > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> > <wsdl:types> > <s:schema elementFormDefault="qualified" > targetNamespace="http://soa.mycompany.com/webservices/"> > <s:import namespace="http://microsoft.com/wsdl/types/" /> > <s:complexType name="ArrayOfString"> > <s:sequence> > <s:element minOccurs="0" maxOccurs="unbounded" name="string" > nillable="true" type="s:string" /> > </s:sequence> > </s:complexType> > <s:simpleType name="LoginTokenType"> > <s:restriction base="s:string"> > <s:enumeration value="Unknown" /> > <s:enumeration value="SessionSecureToken" /> > <s:enumeration value="SessionHttpToken" /> > <s:enumeration value="PersistentSecureToken" /> > <s:enumeration value="PersistentHttpToken" /> > </s:restriction> > </s:simpleType> > <s:complexType name="WebServiceResult"> > <s:sequence> > <s:element minOccurs="1" maxOccurs="1" name="Success" > type="s:boolean" /> > <s:element minOccurs="0" maxOccurs="1" name="ResultStatus" > type="s:string" /> > </s:sequence> > </s:complexType> > <s:element name="Login"> > <s:complexType> > <s:sequence> > <s:element minOccurs="0" maxOccurs="1" name="userName" > type="s:string" /> > <s:element minOccurs="0" maxOccurs="1" name="password" > type="s:string" /> > <s:element minOccurs="0" maxOccurs="1" name="existingTokenIds" > type="tns:ArrayOfString" /> > </s:sequence> > </s:complexType> > </s:element> > <s:element name="LoginResponse"> > <s:complexType> > <s:sequence> > <s:element minOccurs="0" maxOccurs="1" name="LoginResult" > type="tns:LoginResult" /> > </s:sequence> > </s:complexType> > </s:element> > <s:complexType name="LoginResult"> > <s:complexContent mixed="false"> > <s:extension base="tns:WebServiceResult"> > <s:sequence> > <s:element minOccurs="1" maxOccurs="1" name="UserID" > type="s1:guid" /> > <s:element minOccurs="0" maxOccurs="1" name="LoginTokens" > type="tns:ArrayOfLoginToken" /> > <s:element minOccurs="1" maxOccurs="1" name="IsNewSplitUser" > type="s:boolean" /> > <s:element minOccurs="0" maxOccurs="1" > name="UserPropertyViolations" type="tns:ArrayOfString" /> > </s:sequence> > </s:extension> > </s:complexContent> > </s:complexType> > <s:complexType name="ArrayOfLoginToken"> > <s:sequence> > <s:element minOccurs="0" maxOccurs="unbounded" name="LoginToken" > nillable="true" type="tns:LoginToken" /> > </s:sequence> > </s:complexType> > <s:complexType name="LoginToken"> > <s:sequence> > <s:element minOccurs="1" maxOccurs="1" name="TokenID" type="s1:guid" > /> > <s:element minOccurs="1" maxOccurs="1" name="Type" > type="tns:LoginTokenType" /> > <s:element minOccurs="1" maxOccurs="1" name="ExpirationDateUTC" > type="s:dateTime" /> > </s:sequence> > </s:complexType> > <s:element name="LoginResult" nillable="true" type="tns:LoginResult" /> > <s:element name="LogoutResult" nillable="true" type="tns:LogoutResult" /> > <s:element name="string" nillable="true" type="s:string" /> > </s:schema> > <s:schema elementFormDefault="qualified" > targetNamespace="http://microsoft.com/wsdl/types/"> > <s:simpleType name="guid"> > <s:restriction base="s:string"> > <s:pattern > value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" > /> > </s:restriction> > </s:simpleType> > </s:schema> > <s:schema > targetNamespace="http://soa.mycompany.com/webservices/AbstractTypes"> > <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> > <s:complexType name="StringArray"> > <s:complexContent mixed="false"> > <s:restriction base="soapenc:Array"> > <s:sequence> > <s:element minOccurs="0" maxOccurs="unbounded" name="String" > type="s:string" /> > </s:sequence> > </s:restriction> > </s:complexContent> > </s:complexType> > </s:schema> > </wsdl:types> > <wsdl:message name="LoginSoapIn"> > <wsdl:part name="parameters" element="tns:Login" /> > </wsdl:message> > <wsdl:message name="LoginSoapOut"> > <wsdl:part name="parameters" element="tns:LoginResponse" /> > </wsdl:message> > <wsdl:portType name="MyModuleServiceSoap"> > <wsdl:operation name="Login"> > <wsdl:input message="tns:LoginSoapIn" /> > <wsdl:output message="tns:LoginSoapOut" /> > </wsdl:operation> > </wsdl:portType> > <wsdl:binding name="MyModuleServiceSoap" type="tns:MyModuleServiceSoap"> > <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> > <wsdl:operation name="Login"> > <soap:operation soapAction="http://soa.mycompany.com/webservices/Login" > style="document" /> > <wsdl:input> > <soap:body use="literal" /> > </wsdl:input> > <wsdl:output> > <soap:body use="literal" /> > </wsdl:output> > </wsdl:operation> > </wsdl:binding> > <wsdl:service name="MyModuleService"> > <wsdl:port name="MyModuleServiceSoap" binding="tns:MyModuleServiceSoap"> > <soap:address > location="http://soa.0002.dev.mycompany.com/MyModuleFacility/MyModuleService.asmx" > /> > </wsdl:port> > </wsdl:service> > </wsdl:definitions> > On the face of it that looks OK. Can you tell if the IOOB was on the request or the response? Do you still have the full stack trace? Simon -- Apache Tuscany committer: tuscany.apache.org Co-author of a book about Tuscany and SCA: tuscanyinaction.com It was on the request. Full stack below. Version 1.6 Remember, I noted that the OMElementWrapperHandler class changed in 2. org.apache.axis2.AxisFault: 1 at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) at org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInOutSyncMessageReceiver.invokeBusinessLogic(Axis2ServiceInOutSyncMessageReceiver.java:94) at org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.invokeBusinessLogic(AbstractInOutSyncMessageReceiver.java:42) at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176) at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:133) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.tuscany.sca.host.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:107) at org.apache.tuscany.sca.host.webapp.TuscanyServletFilter.doFilter(TuscanyServletFilter.java:94) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.ArrayIndexOutOfBoundsException: 1 at org.apache.tuscany.sca.databinding.axiom.OMElementWrapperHandler.setChildren(OMElementWrapperHandler.java:76) at org.apache.tuscany.sca.databinding.axiom.OMElementWrapperHandler.setChildren(OMElementWrapperHandler.java:48) at org.apache.tuscany.sca.core.databinding.transformers.Input2InputTransformer.transform(Input2InputTransformer.java:206) at org.apache.tuscany.sca.core.databinding.transformers.Input2InputTransformer.transform(Input2InputTransformer.java:45) at org.apache.tuscany.sca.databinding.impl.MediatorImpl.mediate(MediatorImpl.java:113) at org.apache.tuscany.sca.databinding.impl.MediatorImpl.mediateInput(MediatorImpl.java:431) at org.apache.tuscany.sca.core.databinding.wire.DataTransformationInterceptor.invoke(DataTransformationInterceptor.java:65) at org.apache.tuscany.sca.core.invocation.JDKInvocationHandler.invoke(JDKInvocationHandler.java:349) at org.apache.tuscany.sca.core.invocation.JDKInvocationHandler.invoke(JDKInvocationHandler.java:193) at $Proxy24.Login(Unknown Source) at com.mycompany.myproduct.authentication.impl.DefaultImplementation.doFoo(DefaultImplementation.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.tuscany.sca.implementation.spring.invocation.SpringInvoker.doInvoke(SpringInvoker.java:97) at org.apache.tuscany.sca.implementation.spring.invocation.SpringInvoker.invoke(SpringInvoker.java:113) at org.apache.tuscany.sca.core.databinding.wire.DataTransformationInterceptor.invoke(DataTransformationInterceptor.java:67) at org.apache.tuscany.sca.policy.authentication.basic.BasicAuthenticationServicePolicyInterceptor.invoke(BasicAuthenticationServicePolicyInterceptor.java:82) at org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:129) at org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:104) at org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:98) at org.apache.tuscany.sca.core.assembly.RuntimeWireImpl.invoke(RuntimeWireImpl.java:173) at org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.invokeTarget(Axis2ServiceProvider.java:766) at org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInOutSyncMessageReceiver.invokeBusinessLogic(Axis2ServiceInOutSyncMessageReceiver.java:70)
