Another question. 2011/5/27 Ernesto Revilla Derksen <[email protected]>
> Hi again. > > Now I am extracting de security data as follows (really easy!): > ... > ns_wsse = " > http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd > " > > class UsernameTokenType(ClassModel): > __namespace__ = ns_wsse > Username = String > Password = String > Nonce = String > I would like to add a datetime variable from another namespace (wsu). How would I do that? Erny > > > class Security(ClassModel): > __namespace__ = ns_wsse > UsernameToken = UsernameTokenType > > > class HelloWorldService(DefinitionBase): > __in_header__ = Security > > def on_method_call(self, method_name, py_params, soap_params): > # I can't access self.in_header here! > pass > > @soap(String, Integer, _returns=Array(String)) > def say_hello(self, name, times): > # We have access to self.in_header here. > results = [] > for i in range(0, times): > results.append('Hello, %s' % name) > return results > > To implement a service wide authentication procedure, I would have to > implement it as decorator, as the method "on_method_call" has no access to > "in_header". > > Any other suggestions? > > Regards. > Erny > > 2011/5/27 Chris Austin <[email protected]> > >> On Thu, May 26, 2011 at 5:16 PM, Ernesto Revilla Derksen >> <[email protected]> wrote: >> > Hi. >> > First of all, you're doing a great work with soaplib!!! >> > I was just running the debugger to see how soaplibs treats the headers. >> > In soaplib/core/_base.py:decompose_incoming_envelope (near line 335), we >> get >> > the header & body parsed. Fine! >> > But just below, there is no self.validateHeader or self.checkHeader. So >> the >> > body is validated before (!) any headers can be validades. Could there >> be a >> > hook? >> > In method deserialize_soap (lines 406-417): >> > # decode header object >> > if (ctx.in_header_xml is not None and >> > len(ctx.in_header_xml) > 0 and >> > header_class is not None): >> > ctx.service.in_header = >> > header_class.from_xml(ctx.in_header_xml) >> > >> > how do IN-wrappers supposed to work? could you give an example? >> >> Sure, this is taken from the test at >> >> https://github.com/soaplib/soaplib/blob/master/src/soaplib/core/test/interop/server/_service.py >> >> You can define your headers as follows. >> >> class InHeader(ClassModel): >> s=String >> i=Integer >> >> class OutHeader(ClassModel): >> dt=DateTime >> f=Float >> >> Now, you can write a service that references your headers and, you >> can get access to the headers in your web methods as echo_in_header() >> and send_out_header() do below. >> >> class InteropServiceWithHeader(service.DefinitionBase): >> __in_header__ = InHeader >> __out_header__ = OutHeader >> >> @soap(_returns=InHeader) >> def echo_in_header(self): >> return self.in_header >> >> @soap(_returns=OutHeader) >> def send_out_header(self): >> self.out_header = OutHeader() >> self.out_header.dt = datetime(year=2000, month=01, day=01) >> self.out_header.f = 3.141592653 >> >> return self.out_header >> >> >> Now, you can work with the headers in you client following something >> similar to the following example which is also take from an interop >> test found at : >> https://github.com/soaplib/soaplib/blob/master/src/soaplib/core/test/interop/test_suds.py >> >> So, you can treat headers just like any other datatype exposed by the >> service. >> >> def test_echo_in_header(self): >> in_header = self.client.factory.create('InHeader') >> in_header.s = 'a' >> in_header.i = 3 >> >> self.client.set_options(soapheaders=in_header) >> ret = self.client.service.echo_in_header() >> self.client.set_options(soapheaders=None) >> >> print ret >> >> self.assertEquals(in_header.s, ret.s) >> self.assertEquals(in_header.i, ret.i) >> >> def test_send_out_header(self): >> out_header = self.client.factory.create('OutHeader') >> out_header.dt = datetime(year=2000, month=01, day=01) >> out_header.f = 3.141592653 >> >> ret = self.client.service.send_out_header() >> >> self.assertTrue(isinstance(ret,type(out_header))) >> self.assertEquals(ret.dt, out_header.dt) >> self.assertEquals(ret.f, out_header.f) >> >> >> I hope this helps. >> >> > In process_request (line 436): >> > ctx.service.on_method_call(ctx.method_name,req_obj,ctx.in_body_xml) >> > the header is NOT sent to the service hook >> > As I can see (and sure that I'm wrong), I have the following >> alternatives of >> > processing SOAP headers: >> > - using IN-wrappers: >> > - override Application object customizing one of: >> > - deserialize_soap (says: not meant to be override!) >> > - decompose_incoming_envelope >> > - process_request (says: not meant to be override!) >> > Where would be the best place to implement header checking? (e.g. >> security= >> > Thanks in advance. >> > Best regards. >> > Erny >> > Spain >> > Ernesto Revilla >> > Yaco Sistemas >> > +34 954 500 057 >> > >> > _______________________________________________ >> > Soap mailing list >> > [email protected] >> > http://mail.python.org/mailman/listinfo/soap >> > >> > >> > >
_______________________________________________ Soap mailing list [email protected] http://mail.python.org/mailman/listinfo/soap
