iro/xmlrpc/SecureUserdbXMLRPCServer.py
author Sandro Knauß <knauss@netzguerilla.net>
Mon, 13 Feb 2012 15:38:50 +0100
branchdevel
changeset 144 1cc164bbb068
parent 67 d1912509f375
permissions -rw-r--r--
adding reload tests (not implemented)

from SecureAuthentificateXMLRPCServer import  SecureAuthentificateXMLRPCRequestHandler
from SecureXMLRPCServer import SecureXMLRPCServer
import os, hashlib

class UserDB:
    '''
    class for managing all xmlrpc users
    - each user is indyfied via a hash value, which is created out of the username + password
    '''
    def __init__(self,userClass, userlist,jobqueue):
        self.salt=os.urandom(20)
        self.jobqueue=jobqueue
        self.userClass=userClass
        self.userlist={}
        for user in userlist:
            self.createUser(user)

    def createHash(self,user):
        """
        returns a hash out of username and the password and self.salt
        user is a directory with two keys: username and password
        """
        m=hashlib.sha512()
        m.update(user["name"])
        m.update(self.salt)
        m.update(user["password"])
        return m.hexdigest()

    def createUser(self,user):
        self.userlist[self.createHash(user)]=self.userClass(user["name"],self.jobqueue)

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

        
class SecureAuthentificateXMLRPCRequestHandler2(SecureAuthentificateXMLRPCRequestHandler):
    def testUser(self,username,password):
        """
        Function for testing authentification
        """
        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.relam="xmlrpc"
        self.userdb=userdb

    def activateUser(self,username,password):
        """
        Function is executed, if someone ant to login
        -searches for a regular user in the userdb and then put all methods of the user as XMLRPC
        returns weather a user was found or not
        """
        try:
            user = self.userdb[self.userdb.createHash({"name":username,"password":password})]
            self.register_instance(user)
            return True
        except KeyError:
            return False