iro/xmlrpc/AuthentificateXMLRPCServer.py
branchdevel
changeset 240 3406d3bf05d4
parent 239 4cf5e664c847
child 241 546316b0b09c
equal deleted inserted replaced
239:4cf5e664c847 240:3406d3bf05d4
     1 # Server code
       
     2 import SimpleXMLRPCServer
       
     3 import string,base64
       
     4 
       
     5 class AuthentificateXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
       
     6     def do_POST(self):
       
     7         try:
       
     8             header =  self.headers['Authorization']
       
     9             type, user_passwd = header.split()
       
    10             username, password = string.split(base64.decodestring(user_passwd), ':')
       
    11             if self.testUser(username,password):
       
    12                 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.do_POST(self)
       
    13             else:
       
    14                 self.report_error(401)  
       
    15         except:
       
    16             self.report_error(401)
       
    17 
       
    18     def report_error (self,code):
       
    19         '''
       
    20         Send back an errorcode
       
    21         '''
       
    22         #it is important to read out the complete sended request , 
       
    23         # but throw the data away, because an error should be send back
       
    24         try:
       
    25             max_chunk_size = 10*1024*1024
       
    26             size_remaining = int(self.headers["content-length"])
       
    27             while size_remaining:
       
    28                 chunk_size = min(size_remaining, max_chunk_size)
       
    29                 size_remaining -= len(self.rfile.read(chunk_size))
       
    30         except:
       
    31             pass
       
    32 
       
    33         #now just send the error back
       
    34         special_errors={401:self.report_401, 
       
    35                                     404:self.report_404}
       
    36         if special_errors.has_key(code):
       
    37              special_errors[code]()
       
    38         else:
       
    39             self.send_response(code)
       
    40             self.end_headers()
       
    41             self.connection.shutdown(1)
       
    42     
       
    43     def report_401(self):
       
    44         self.send_response(401)
       
    45         self.send_header("WWW-Authenticate", 'Basic realm="%s"'% self.server.relam)
       
    46         response = 'Unauthorised'
       
    47         self.send_header("Content-type", "text/plain")
       
    48         self.send_header("Content-length", str(len(response)))
       
    49         self.end_headers()
       
    50         self.wfile.write(response)
       
    51         # shut down the connection
       
    52         self.wfile.flush()
       
    53         self.connection.shutdown(1)
       
    54         
       
    55     def testUser(self,username,password):
       
    56         """
       
    57         Function for testing authentification
       
    58         """
       
    59         if username=="test" and password=="test":
       
    60                 return True
       
    61 
       
    62         return False
       
    63 
       
    64 
       
    65 
       
    66 def test():
       
    67     server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8000),AuthentificateXMLRPCRequestHandler)
       
    68     server.relam="xmlrpc"
       
    69     server.register_introspection_functions()
       
    70     server.register_function(lambda x: x*x, 'square')
       
    71     server.serve_forever()
       
    72 
       
    73 if __name__ == '__main__':
       
    74     test()
       
    75 
       
    76