iro/xmlserver_test.py
changeset 1 18918fbc397c
parent 0 a3b6e531f0d2
child 2 5b7dd3bd728d
equal deleted inserted replaced
0:a3b6e531f0d2 1:18918fbc397c
     1 # Server code
       
     2 
       
     3 from xmlrpc import SecureXMLRPCServer,SecureAuthentificateXMLRPCRequestHandler
       
     4 import md5, time, os
       
     5 
       
     6 class Job:
       
     7     def __init__(self,provider,name):
       
     8         self.provider=provider
       
     9         self.name=name
       
    10         self.status="stopped"
       
    11 
       
    12     def start(self):
       
    13         self.status="started"
       
    14 
       
    15     def stop(self):
       
    16         self.status="stopped"
       
    17 
       
    18 class SMSJob(Job):
       
    19     def __init__(self,provider,message,recipients):
       
    20         self.message=message
       
    21         self.recipients=recipients
       
    22         Job.__init__(self,provider,message)
       
    23 
       
    24 class Jobs:
       
    25     def __init__(self,queue,provider):
       
    26         self.jobs={}
       
    27         self.queue=queue
       
    28         self.provider=provider
       
    29 
       
    30     def __getitem__(self,key):
       
    31         return self.jobs[key]
       
    32 
       
    33     def newSMS(self,message,recipients):
       
    34         job=SMSJob(self.provider,message,recipients)
       
    35         id = self._createID()
       
    36         self.jobs[id]=job
       
    37         #self.queue.put(job)
       
    38         return id
       
    39 
       
    40     def _createID(self):
       
    41         while True:
       
    42             m = md5.new()
       
    43             m.update(str(time.time()))
       
    44             m.update(os.urandom(10))
       
    45             if not self.jobs.has_key(m.hexdigest):
       
    46                 self.jobs[m.hexdigest()]=None
       
    47                 break
       
    48         return m.hexdigest()
       
    49 
       
    50 
       
    51 class User: 
       
    52     def __init__(self,jobqueue):
       
    53         self.jobqueue=jobqueue
       
    54         self.jobs={}
       
    55 
       
    56     def status(self,id=None):
       
    57         if id==None:
       
    58             jobs=self.jobs
       
    59         else:
       
    60             try:
       
    61                 jobs={id:self.jobs[id]}
       
    62             except:
       
    63                 raise String("No Job with ID: %i" %(id))
       
    64         ret={}
       
    65         for key in jobs:
       
    66             job=jobs[key]
       
    67             ret[key]={"name":job.name,"status":job.status}
       
    68         return ret
       
    69 
       
    70     def stop(self,id):
       
    71         try:
       
    72             job=self.jobs[id]
       
    73         except:
       
    74             raise String("No Job with ID: %i" %(id))
       
    75 
       
    76         job.stop()
       
    77 
       
    78     
       
    79     def startSMS(self,message,recipients):
       
    80         id = self.jobqueue.newSMS(message,recipients)
       
    81         self.jobs[id]=self.jobqueue[id]
       
    82         return id
       
    83 
       
    84 class UserDB:
       
    85     def __init__(self,userlist,jobqueue):
       
    86         self.salt=os.urandom(20)
       
    87         self.jobqueue=jobqueue
       
    88         self.userlist={}
       
    89         for user in userlist:
       
    90             self.createUser(user)
       
    91 
       
    92     def createHash(self,username,password):
       
    93         m=md5.new()
       
    94         m.update(self.salt)
       
    95         m.update(username)
       
    96         m.update(password)
       
    97         return m.hexdigest()
       
    98 
       
    99     def createUser(self,user):
       
   100         self.userlist[self.createHash(user.username,user.password)]=User(self.jobqueue)
       
   101 
       
   102     def __getitem__(self,key):
       
   103         return self.userlist[key]
       
   104 
       
   105     
       
   106 class SecureAuthentificateXMLRPCRequestHandler2(SecureAuthentificateXMLRPCRequestHandler):
       
   107 
       
   108     def testUser(self,username,password):
       
   109         return self.server.activateUser(username,password)
       
   110 
       
   111 class SecureUserDBXMLRPCServer(SecureXMLRPCServer):
       
   112     def __init__(self, addr, userdb, 
       
   113                  requestHandler=SecureAuthentificateXMLRPCRequestHandler2,
       
   114                  certificate="server.cert", privatekey="server.pem",
       
   115                  logRequests=1):
       
   116         SecureXMLRPCServer.__init__(self, addr, requestHandler, certificate, privatekey, logRequests)
       
   117         self.userdb=userdb
       
   118 
       
   119     def activateUser(self,username,password):
       
   120         try:
       
   121             user = self.userdb[self.userdb.createHash(username,password)]
       
   122             self.register_instance(user)
       
   123             return True
       
   124         except KeyError:
       
   125             return False
       
   126         
       
   127 
       
   128 
       
   129 def test():
       
   130     server = SecureXMLRPCServer(("localhost", 8000),requestHandler=SecureAuthentificateXMLRPCRequestHandler,certificate="./certs/test.cert.pem",privatekey="./certs/test.key.pem")
       
   131     server.register_introspection_functions()
       
   132     server.register_instance(StringFunctions())
       
   133     server.register_function(lambda x: x*x, 'square')
       
   134     server.serve_forever()
       
   135 
       
   136 if __name__ == '__main__':
       
   137     test()
       
   138 
       
   139