Hi Moin users, about a month ago I did ask for some hints how to get the xmlrpc access working under the following circumstances:
- moin version 1.9.3 - IIS with windows authentication SSPI(NTLM) - moin authentication is auth = [GivenAuth(strip_windomain=True,autocreate=1)] This means that the xmlrpc calls are only forwarded to the wiki after a successful ntlm authentication by the IIS webserver. The wiki then uses the REMOTE_USER variable to create or run the request under a specific account (this is explained here http://moinmo.in/HelpOnAuthentication) When I run the following script: import sys import xmlrpclib wikiurl = "http://nb-it-lt-ms/testwiki" homewiki = xmlrpclib.ServerProxy(wikiurl + "?action=xmlrpc2",allow_none=True) mc=xmlrpclib.MultiCall(homewiki) mc.getRPCVersionSupported() mc.getPage("StartPage") try: auth_token = homewiki.getAuthToken("mscheufe", "blah") if not auth_token: print "auth_token is empty" for i in mc(): print i except xmlrpclib.Fault as err: print str(err) I get the following error message: Traceback (most recent call last): File "test.py", line 15, in <module> auth_token = homewiki.getAuthToken("mscheufe", "blah") File "c:\python26\lib\xmlrpclib.py", line 1199, in __call__ return self.__send(self.__name, args) File "c:\python26\lib\xmlrpclib.py", line 1489, in __request verbose=self.__verbose File "c:\python26\lib\xmlrpclib.py", line 1243, in request headers xmlrpclib.ProtocolError: <ProtocolError for nb-it-lt-ms/testwiki?action=xmlrpc2: 401 Unauthorized> I managed to get the ntlm authentication against the webserver to work by writing my own xmlrpc.Transport object. (code see below). Now the ntlm authentication is working and my xmlrpc requests are forwarded to the wiki. But my calls are still not properly authenticated against the wiki by the xmlrpc interface. Have a look at this sample: import sys sys.path.append("c:/Temp/MoinXmlRPC") import xmlrpclib from ntlmTransport import * wikiurl = "http://nb-it-lt-ms/testwiki" p=ntlmTransport() homewiki = xmlrpclib.ServerProxy(wikiurl + "?action=xmlrpc2",allow_none=True,transport=p) mc=xmlrpclib.MultiCall(homewiki) mc.getRPCVersionSupported() mc.getPage("StartPage") try: auth_token = homewiki.getAuthToken("mscheufe", "blah") if not auth_token: print "auth_token is empty" for i in mc(): print i except xmlrpclib.Fault as err: print str(err) The output of the script is: auth_token is empty 2 <Fault 1: 'You are not allowed to read this page.'> As one can see the xmlrpc calls are forwarded to the wiki but as the getAuthToken() method does not return a token I cannot authenticate against the wiki. At the minute I am stuck here. I really would be interested to get the xmlrpc interface working with GivenAuth. It would be great if someone could point me into the right direction how this problem could be solved. Many thanks in advance, mark ################################### # ntlm xmlrpclib.Transport object # ################################### import xmlrpclib,sys,httplib,base64 from types import * #code for WindoewNtlmMessageGenerator orignates from http://stackoverflow.com/questions/2969481/ntlm-authentication-in-python class WindoewNtlmMessageGenerator: def __init__(self,user=None): import win32api,sspi if not user: user = win32api.GetUserName() self.sspi_client = sspi.ClientAuth("NTLM",user) def create_auth_req(self): import pywintypes output_buffer = None error_msg = None try: error_msg, output_buffer = self.sspi_client.authorize(None) except pywintypes.error: return None auth_req = output_buffer[0].Buffer auth_req = base64.b64encode(auth_req) return auth_req def create_challenge_response(self,challenge): import pywintypes output_buffer = None input_buffer = challenge error_msg = None try: error_msg, output_buffer = self.sspi_client.authorize(input_buffer) except pywintypes.error: return None response_msg = output_buffer[0].Buffer response_msg = base64.b64encode(response_msg) return response_msg class ntlmTransport(xmlrpclib.Transport): def __init__(self,use_datetime=0): xmlrpclib.Transport.__init__(self,use_datetime) def request(self, host, handler, request_body, verbose=0): # issue XML-RPC request h = self.make_connection(host) if verbose: h.set_debuglevel(1) #run the ntlm handshake to get an auth token extra_headers=self.get_ntlm_header(h,handler,request_body) self.send_request(h, handler, request_body) self.send_host(h,host,extra_headers) self.send_user_agent(h) self.send_content(h, request_body) errcode, errmsg, headers = h.getreply() if errcode != 200: raise ProtocolError( host + handler, errcode, errmsg, headers ) self.verbose = verbose try: sock = h._conn.sock except AttributeError: sock = None return self._parse_response(h.getfile(), sock) def get_ntlm_header(self,connection,handler,request_body): ntlm_gen = WindoewNtlmMessageGenerator() auth_req_msg = ntlm_gen.create_auth_req() extra_headers=[('Connection','Keep-Alive')] self.send_request(connection,handler,request_body) connection.putheader("Content-length","0") connection.putheader("Connection","Keep-Alive") connection.putheader('Authorization','NTLM'+' '+auth_req_msg) connection.endheaders() resp = connection._conn.getresponse() #always read from response otherwise the subsequent call with the current http connection handle won't work resp.read() #generate the NTLM auth_token challenge = resp.msg.get('WWW-Authenticate') challenge_dec = base64.b64decode(challenge.split()[1]) auth_token = ntlm_gen.create_challenge_response(challenge_dec) extra_headers.append(('Authorization','NTLM'+' '+auth_token)) return extra_headers def send_host(self,connection,host,extra_headers): host, not_used_headers, x509 = self.get_host_info(host) for key, value in extra_headers: connection.putheader(key, value) _______________________________________________________________________________________ Dialog Semiconductor GmbH Neue Str. 95 D-73230 Kirchheim Managing Director: Dr. Jalal Bagherli Chairman of the Supervisory Board: Gregorio Reyes Commercial register: Amtsgericht Stuttgart: HRB 231181 UST-ID-Nr. DE 811121668 Legal Disclaimer: This e-mail communication (and any attachment/s) is confidential and contains proprietary information, some or all of which may be legally privileged. It is intended solely for the use of the individual or entity to which it is addressed. Access to this email by anyone else is unauthorized. If you are not the intended recipient, any disclosure, copying, distribution or any action taken or omitted to be taken in reliance on it, is prohibited and may be unlawful. ------------------------------------------------------------------------------ Lotusphere 2011 Register now for Lotusphere 2011 and learn how to connect the dots, take your collaborative environment to the next level, and enter the era of Social Business. http://p.sf.net/sfu/lotusphere-d2d _______________________________________________ Moin-user mailing list Moin-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/moin-user