iro/xmlserver_test.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 22 Oct 2009 10:00:01 +0200
changeset 0 a3b6e531f0d2
permissions -rw-r--r--
[svn r93] creating iro package branch

# Server code

from xmlrpc import SecureXMLRPCServer,SecureAuthentificateXMLRPCRequestHandler
import md5, time, os

class Job:
    def __init__(self,provider,name):
        self.provider=provider
        self.name=name
        self.status="stopped"

    def start(self):
        self.status="started"

    def stop(self):
        self.status="stopped"

class SMSJob(Job):
    def __init__(self,provider,message,recipients):
        self.message=message
        self.recipients=recipients
        Job.__init__(self,provider,message)

class Jobs:
    def __init__(self,queue,provider):
        self.jobs={}
        self.queue=queue
        self.provider=provider

    def __getitem__(self,key):
        return self.jobs[key]

    def newSMS(self,message,recipients):
        job=SMSJob(self.provider,message,recipients)
        id = self._createID()
        self.jobs[id]=job
        #self.queue.put(job)
        return id

    def _createID(self):
        while True:
            m = md5.new()
            m.update(str(time.time()))
            m.update(os.urandom(10))
            if not self.jobs.has_key(m.hexdigest):
                self.jobs[m.hexdigest()]=None
                break
        return m.hexdigest()


class User: 
    def __init__(self,jobqueue):
        self.jobqueue=jobqueue
        self.jobs={}

    def status(self,id=None):
        if id==None:
            jobs=self.jobs
        else:
            try:
                jobs={id:self.jobs[id]}
            except:
                raise String("No Job with ID: %i" %(id))
        ret={}
        for key in jobs:
            job=jobs[key]
            ret[key]={"name":job.name,"status":job.status}
        return ret

    def stop(self,id):
        try:
            job=self.jobs[id]
        except:
            raise String("No Job with ID: %i" %(id))

        job.stop()

    
    def startSMS(self,message,recipients):
        id = self.jobqueue.newSMS(message,recipients)
        self.jobs[id]=self.jobqueue[id]
        return id

class UserDB:
    def __init__(self,userlist,jobqueue):
        self.salt=os.urandom(20)
        self.jobqueue=jobqueue
        self.userlist={}
        for user in userlist:
            self.createUser(user)

    def createHash(self,username,password):
        m=md5.new()
        m.update(self.salt)
        m.update(username)
        m.update(password)
        return m.hexdigest()

    def createUser(self,user):
        self.userlist[self.createHash(user.username,user.password)]=User(self.jobqueue)

    def __getitem__(self,key):
        return self.userlist[key]

    
class SecureAuthentificateXMLRPCRequestHandler2(SecureAuthentificateXMLRPCRequestHandler):

    def testUser(self,username,password):
        return self.server.activateUser(username,password)

class SecureUserDBXMLRPCServer(SecureXMLRPCServer):
    def __init__(self, addr, userdb, 
                 requestHandler=SecureAuthentificateXMLRPCRequestHandler2,
                 certificate="server.cert", privatekey="server.pem",
                 logRequests=1):
        SecureXMLRPCServer.__init__(self, addr, requestHandler, certificate, privatekey, logRequests)
        self.userdb=userdb

    def activateUser(self,username,password):
        try:
            user = self.userdb[self.userdb.createHash(username,password)]
            self.register_instance(user)
            return True
        except KeyError:
            return False
        


def test():
    server = SecureXMLRPCServer(("localhost", 8000),requestHandler=SecureAuthentificateXMLRPCRequestHandler,certificate="./certs/test.cert.pem",privatekey="./certs/test.key.pem")
    server.register_introspection_functions()
    server.register_instance(StringFunctions())
    server.register_function(lambda x: x*x, 'square')
    server.serve_forever()

if __name__ == '__main__':
    test()