From e636b25da0973e9986b6fcd2a7f0f5a48d3e0265 Mon Sep 17 00:00:00 2001
From: Dipankar Patro <dipankar@seeta.in>
Date: Sat, 4 Sep 2010 19:53:54 +0530
Subject: [PATCH] Register Bug Solution: LP bug #617813

---
 src/jarabe/desktop/schoolserver.py |   40 ++++++++++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/jarabe/desktop/schoolserver.py b/src/jarabe/desktop/schoolserver.py
index 62519df..58ffb88 100644
--- a/src/jarabe/desktop/schoolserver.py
+++ b/src/jarabe/desktop/schoolserver.py
@@ -16,10 +16,12 @@
 
 import logging
 from gettext import gettext as _
-from xmlrpclib import ServerProxy, Error
+
+import httplib
+import xmlrpclib
 import socket
 import os
-import string
+from string import ascii_uppercase
 import random
 import time
 import uuid
@@ -37,8 +39,8 @@ def generate_serial_number():
 
     serial_part1 = []
 
-    for y in range(3) :
-        serial_part1.append(random.choice(string.ascii_uppercase))
+    for y_ in range(3) :
+        serial_part1.append(random.choice(ascii_uppercase))
 
     serial_part1 = ''.join(serial_part1)
     serial_part2 = str(int(time.time()))[-8:]
@@ -76,6 +78,30 @@ def store_identifiers(serial_number, uuid, backup_url):
 class RegisterError(Exception):
     pass
 
+# New class TimeoutServerProxy to implement timeout controlled connection, derived from xmlrpclib.ServerProxy()
+# LP Bug #617813
+class TimeoutHTTP(httplib.HTTP):
+   def __init__(self, host='', port=None, strict=None,
+                timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
+        if port == 0:
+            port = None
+        self._setup(self._connection_class(host, port, strict, timeout))
+
+class TimeoutTransport(xmlrpclib.Transport):
+    def __init__(self, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *args, **kwargs):
+        xmlrpclib.Transport.__init__(self, *args, **kwargs)
+        self.timeout = timeout
+
+    def make_connection(self, host):
+        host, extra_headers, x509 = self.get_host_info(host)
+        conn = TimeoutHTTP(host, timeout=self.timeout)
+        return conn
+        
+class TimeoutServerProxy(xmlrpclib.ServerProxy):
+    def __init__(self, url, timeout, *args, **kwargs):
+        kwargs['transport'] = TimeoutTransport(timeout=timeout, use_datetime=kwargs.get('use_datetime', 0))
+        xmlrpclib.ServerProxy.__init__(self, url, *args, **kwargs)
+
 def register_laptop(url=REGISTER_URL):
 
     profile = get_profile()
@@ -89,13 +115,15 @@ def register_laptop(url=REGISTER_URL):
     else:
         sn = generate_serial_number()
         uuid_ = str(uuid.uuid1())
-        jabber_server = client.get_string('/desktop/sugar/collaboration/jabber_server')
+        setting_name = '/desktop/sugar/collaboration/jabber_server'
+        jabber_server = client.get_string(setting_name)
         store_identifiers(sn, uuid_, jabber_server)
         url = 'http://' + jabber_server + ':8080/'
 
     nick = client.get_string('/desktop/sugar/user/nick')
 
-    server = ServerProxy(url)
+    server = TimeoutServerProxy(url)
+    
     try:
         data = server.register(sn, nick, uuid_, profile.pubkey)
     except (Error, socket.error):
-- 
1.7.0.4

