|
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 |