merging
authorSandro Knauß <knauss@netzguerilla.net>
Fri, 18 Nov 2011 22:36:50 +0100
changeset 69 67ecea2d9b67
parent 68 85fc1e5dea79 (current diff)
parent 67 d1912509f375 (diff)
child 70 a9ee0fe847a8
merging
--- a/iro/acounting.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/acounting.py	Fri Nov 18 22:36:50 2011 +0100
@@ -9,8 +9,13 @@
         Database.__init__(self,connection)
         self.id=id
 
-    def setId(self,id):
+    def setId(self,id, user):
         self.id=id
+        if user:
+            self.connect()
+            self.cursor.execute ("INSERT INTO %s (id,user) VALUES ('%s','%s')" % (self.connection['overview'], self.id,user.name))
+            self.disconnect()
+
 
     def getStatus(self):
         self.connect()
--- a/iro/anbieter/content.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/anbieter/content.py	Fri Nov 18 22:36:50 2011 +0100
@@ -24,6 +24,12 @@
     def getContent(self):
         return self.content
 
+    def __eq__(self,other):
+        return self.content == other.content
+
+    def __ne__(self,other):
+        return not self.__eq__(other)
+
 class SMS(content):
     def __init__(self, cont):
         content.__init__(self,cont)
@@ -31,6 +37,7 @@
     def sendto(self,anbieter,recipients):
         anbieter.sendSMS(self,recipients)
 
+
 class FAX(content):
     def __init__(self,header,cont,attachments):
         content.__init__(self,cont)
@@ -41,9 +48,26 @@
         anbieter.sendFAX(self,recipients)
 
     def getAttachment(self,i):
-        print self.attachments
         return self.attachments[i]
 
+    def __eq__(self,other):
+        if not  content.__eq__(self,other):
+            return False
+
+        if self.header != other.header:
+            return False
+
+        if len(self.attachments) != len(other.attachments):
+            return False
+
+        for i in range(len(self.attachments)):
+            if self.attachments[i] != other.attachments[i]:
+                return False
+
+        return True
+
+
+
 class Mail(content):
     def __init__(self, subject, body, frm):
         con=MIMEText(body.encode("utf-8"), _charset='utf-8')
@@ -60,3 +84,12 @@
 
     def getFrom(self):
         return self.frm
+    
+    def __eq__(self,other):
+        if self.as_string() != other.as_string():
+            return False
+
+        if self.frm != other.frm:
+            return False
+
+        return True
--- a/iro/anbieter/sipgate.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/anbieter/sipgate.py	Fri Nov 18 22:36:50 2011 +0100
@@ -16,12 +16,15 @@
 from telnumber import telnumber, NotATelNumber
 import ConfigParser
 import xmlrpclib
-import base64
 import logging
 logger=logging.getLogger("sipgate")
 
 class NoValidStatusCode(Exception):
-    pass
+     def __init__(self, value):
+         self.value = value
+     
+     def __str__(self):
+         return repr(self.value)
 
 class sipgate(anbieter):
     """
@@ -53,30 +56,30 @@
     def sendFAX(self,fax,recipients):
         """send the PDF file $fax  to $recipients"""
         logger.debug('sipgate.sendFAX(%s,%s)'%(fax,  str(recipients)))
-        logger.debug(fax.getAttachment(0));
-        pdf=open(fax.getAttachment(0),"rb")
         args={
                 "TOS" : "fax",
-                "Content" : base64.encodestring(pdf.read())
+                "Content" : xmlrpclib.Binary(fax.getAttachment(0)),
                 }
-        pdf.close()
         self.__send(args,recipients)
 
     def __connect(self):
         """connect to sipgate XMLRPC Server"""
         logger.debug("sipgate.__connect()-"+self.url%(self.user,"XXXXXXXX"))
-   
-        self.samurai=xmlrpclib.Server(self.url%(self.user,self.password)).samurai
+        
+        self.serv=xmlrpclib.ServerProxy(self.url%(self.user,self.password)) 
+        self.samurai=self.serv.samurai
+
         args_identify = {
                 "ClientName"    : "anbieter.py",
                 "ClientVersion" : "V1.0",
                 "ClientVendor"  : "Sandro Knauss"
                 }
-                
         self.__send_method(self.samurai.ClientIdentify, args_identify)
+        return self.serv
 
     def __send_method(self, func, args=None):
         """execute $func and test weather if the func  ran successfully or not"""
+        logger.debug("sipgate.__send_method(func,%s)"%( args))
 
         if args==None:
             xmlrpc_result = func()
@@ -84,16 +87,15 @@
             xmlrpc_result = func(args)
         if xmlrpc_result['StatusCode'] != 200:
             raise NoValidStatusCode("There was an error during identification to the server! %d %s"% (xmlrpc_result['StatusCode'], xmlrpc_result['StatusString']))
-        
-  
+        logger.debug("sipgate.__send_method(..):ok"); 
         return xmlrpc_result
 
     def __send(self,args,recipients):
         """main sending method - sending the args to $recipients"""
         sended=[]
 
-        self.__connect()
-        logger.debug('sipgate.__send(%s,%s)'%(str(args),  str(recipients)))
+        serv=self.__connect()
+        logger.debug('sipgate.__send(%s,%s)'%(args,  recipients))
         for recipient in recipients:
             try:
                 tel = telnumber(recipient)
@@ -103,10 +105,10 @@
                 sended.append(tel)
 				
                 args["RemoteUri"]="sip:%s%s@sipgate.net"%(tel.land,tel.number)
-                self.__send_method(self.samurai.SessionInitiate, args)
+                self.__send_method(serv.samurai.SessionInitiate, args)
                 self.updateStatus(arranged=recipient)
             
-            except NotATelNumber, NoValidStatusCode:
+            except (NotATelNumber, NoValidStatusCode):
                 self.updateStatus(failed=recipient)
 
         self.__disconnect()
@@ -149,4 +151,7 @@
 
     def __disconnect(self):
         """disconnect xmlrpc client"""
+        logger.debug('sipgate.__disconnect()')
+        self.samurai=None
+        self.serv=None
         self.xmlrpc=None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/dump_test_log.py	Fri Nov 18 22:36:50 2011 +0100
@@ -0,0 +1,42 @@
+import time, os, signal
+LOG_FILE = 'test.log'
+
+log_file = open(LOG_FILE, 'a')
+
+def log(msg):
+    log_file.write(msg + '\n')
+    log_file.flush()
+
+def SigUSR1Handler(signum, frame):
+    print "Reacting on USR1 signal (signal 10)"
+    global log_file
+    log_file.close()
+    log_file = open(LOG_FILE, 'a')
+    return
+
+def init():
+    if os.path.isfile('/var/usr/dump_test_log.pid'):
+        print 'Have to stop server first'
+        os.exit(1)
+    else:
+        print 'Starting server...'
+        #write process id file
+        f = open('/var/run/dump_test_log.pid', 'w')
+        f.write(str(os.getpid()))
+        f.flush()
+        f.close()
+        print 'Process start with pid ', os.getpid()
+
+    signal.signal(signal.SIGUSR1, SigUSR1Handler)
+
+def main():
+    init()
+    count = 1
+    while True:
+      log('log line #%d, pid: %d' % (count, os.getpid()))
+    count = count + 1
+    time.sleep(1)
+
+if __name__ == '__main__':
+    main()
+
--- a/iro/iro.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/iro.py	Fri Nov 18 22:36:50 2011 +0100
@@ -34,7 +34,7 @@
         UserDB.__init__(self, None,userlist,jobqueue)
         
     def createUser(self, user):
-        self.userlist[self.createHash(user)]=user["class"](self.jobqueue)
+        self.userlist[self.createHash(user)]=user["class"](user["name"],self.jobqueue)
 
 
  
--- a/iro/joblist.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/joblist.py	Fri Nov 18 22:36:50 2011 +0100
@@ -12,7 +12,7 @@
 #along with this program; if not, see <http://www.gnu.org/licenses/>.
 
 from anbieter import content
-import md5, os,  time
+import hashlib, os,  time
 import logging
 logger=logging.getLogger("iro.joblist");
 
@@ -31,42 +31,42 @@
     def __getitem__(self,key):
         return self.jobs[key]
 
-    def __registerJob__(self, job):
+    def __registerJob__(self, job, user):
         id = self._createID()
         if self.dbconn:
             job.setAcounting(self.manager.Acounting(id,self.dbconn))
-        job.setId(id)
+        job.setId(id, user)
         self.jobs[id]=job
         self.queue.put(job)
         return id
 
-    def newSMS(self, message, recipients, provider="default"):
+    def newSMS(self, message, recipients, provider="default", user=None):
         '''
         creates a new SMS
         '''
         job=self.manager.SMSJob(self.providerlist, provider,message, content.SMS(message),recipients)
-        return self.__registerJob__(job)
+        return self.__registerJob__(job,user)
 
-    def newFAX(self,subject, fax,recipients,provider="default"):
+    def newFAX(self,subject, fax,recipients,provider="default",user=None):
         '''
         creates a new Fax
         '''
         job=self.manager.FaxJob(self.providerlist, provider,subject, content.FAX(subject,'' ,fax),recipients)
-        return self.__registerJob__(job)
+        return self.__registerJob__(job,user)
 
-    def newMail(self, subject, body, recipients, frm, provider="default"):
+    def newMail(self, subject, body, recipients, frm, provider="default",user=None):
         '''
         creates a new Mail
         '''
         job=self.manager.MailJob(self.providerlist, provider,subject, content.Mail(subject, body, frm),recipients)
-        return self.__registerJob__(job) 
+        return self.__registerJob__(job,user) 
 
     def _createID(self):
         '''
         creats a random hash id
         '''
         while True:
-            m = md5.new()
+            m = hashlib.sha1()
             m.update(str(time.time()))
             m.update(os.urandom(10))
             if not self.jobs.has_key(m.hexdigest):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/tests/stopableServer.py	Fri Nov 18 22:36:50 2011 +0100
@@ -0,0 +1,118 @@
+import ConfigParser
+
+import threading
+
+from multiprocessing import Queue
+from multiprocessing.managers import BaseManager
+
+from iro import xmlrpc,anbieter
+from iro.user import User, Admin
+from iro.iro import MySMTP,MySmstrade,MyUserDB
+from iro.job import SMSJob, FAXJob, MailJob
+from iro.joblist import Joblist
+from iro.providerlist import Providerlist
+
+class StoppableXMLRPCServer(xmlrpc.SecureUserDBXMLRPCServer, threading.Thread):
+    running=False
+    def __init__(self, *args, **kwargs):
+        xmlrpc.SecureUserDBXMLRPCServer.__init__(self, *args, **kwargs)
+        threading.Thread.__init__(self)
+        self.timeout=.5
+   
+    def start(self):
+        self.running=True
+        threading.Thread.start(self)
+ 
+   
+    def run(self):
+        # *serve_forever* muss in einem eigenen Thread laufen, damit man es
+        # unterbrochen werden kann!
+        while (self.running):
+            try:
+                self.handle_request()
+            except :
+                break
+   
+    def stop(self):
+        if (self.running):
+            self.running=False
+            self.server_close()
+            self.join()
+
+    def __del__(self):
+        self.stop()
+ 
+    def __enter__(self):
+        self.start()
+        return self
+
+    def __exit__(self,type,value,traceback):
+        self.stop()
+
+
+class Internal:
+    pass
+
+def init_server():
+    userlist=[{"name":"test","password":"test",  "class":User},
+              {"name":"test2","password":"test2", "class": User},
+              {"name":"admin","password":"admin", "class": Admin}]
+
+
+    
+    class MyManager(BaseManager):
+        pass
+
+    internal=Internal()
+    
+    MyManager.register('SMSJob', SMSJob) 
+    MyManager.register('FaxJob', FAXJob) 
+    MyManager.register('MailJob',MailJob) 
+    MyManager.register('Providerlist',Providerlist) 
+    manager = MyManager()
+    manager.start()
+    
+    internal.manager=manager
+    
+    #anbieter erzeugen und konfigurieren
+    sip=anbieter.sipgate()
+    sip.read_basic_config("iro.conf")
+    
+    localhost=MySMTP()
+    localhost.read_basic_config("iro.conf")
+
+    smstrade=MySmstrade()
+    smstrade.read_basic_config("iro.conf")
+
+    #Benutzerdatenbank erstellen
+    queue = Queue()
+    internal.queue=queue
+    provider=Providerlist()
+    internal.provider=provider
+    provider.add("sipgate", sip, ["sms", "fax", ])
+    provider.add("smstrade", smstrade, ["sms", ])
+    provider.add("geonet", None, ["sms", "fax", ])
+    provider.add("fax.de", None, ["sms", "fax", ])
+    provider.add("localhost", localhost, ["mail", ])
+    provider.setDefault("sms","smstrade")
+    provider.setDefault("fax","sipgate")
+    provider.setDefault("mail","localhost")
+    jobqueue=Joblist(manager,  queue, provider)
+    internal.jobqueue=jobqueue
+    userdb=MyUserDB(userlist,jobqueue)
+    internal.userdb=userdb
+
+
+    #Server starten
+    cp = ConfigParser.ConfigParser()
+    cp.read(["iro.conf"])
+    cert=cp.get('server', 'cert')
+    key=cp.get('server', 'key')
+    serv = StoppableXMLRPCServer(addr=("localhost", 8000), 
+                                      userdb=userdb,
+                                      certificate=cert,privatekey=key,
+                                      logRequests=False)
+    serv.relam="xmlrpc"
+    internal.serv=serv
+    return internal
+
Binary file iro/tests/test.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/tests/testJob.py	Fri Nov 18 22:36:50 2011 +0100
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+
+import unittest
+
+import xmlrpclib
+from stopableServer import init_server
+from iro.anbieter.content import SMS,FAX,Mail
+
+class TestServer(unittest.TestCase):
+    
+    def setUp(self):
+        self.i = init_server()
+        self.serv=self.i.serv
+        self.serv.start()
+
+    def tearDown(self):
+        self.serv.stop()
+
+   
+    def SendSMS(self,msg):
+        servstr="https://test:test@localhost:8000"
+        client=xmlrpclib.Server(servstr)
+        id=client.startSMS(msg,["01234", ] )
+        self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name':  unicode(msg)}} )
+        ele=self.i.queue.get(.1)
+        self.assertEqual(ele.getRecipients(),["01234", ] )
+        self.assertNotEqual(ele.getMessage(),SMS('') )
+        self.assertEqual(ele.getMessage(),SMS(msg) )
+    
+    def testSimpleSMS(self):
+        self.SendSMS("test")
+    
+    def testSpecialCharacters(self):
+        self.SendSMS(u"!\"§$%&/()=?\'")
+        self.SendSMS(u"@ł€ł€¶ŧł¼¼½¬¬↓ŧ←ĸ↓→øđŋħ“”µ·…–|")
+
+    def testSendFAX(self):
+        servstr="https://test:test@localhost:8000"
+        client=xmlrpclib.Server(servstr)
+        msg="2134wergsdfg4w56q34134æſðđæðſđŋ³@¼ŧæðđŋł€¶ŧ€¶ŧ"
+        id=client.startFAX("test",xmlrpclib.Binary(msg),["01234", ] )
+        self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name':  'test'}} )
+        ele=self.i.queue.get(.1)
+        self.assertEqual(ele.getRecipients(),["01234", ] )
+        self.assertEqual(ele.getMessage(),FAX('test','',[msg]))
+
+    def testDoubleFAX(self):
+        servstr="https://test:test@localhost:8000"
+        client=xmlrpclib.Server(servstr)
+        msg="2134wergsdfg4w56q34134æſðđæðſđŋ³@¼ŧæðđŋł€¶ŧ€¶ŧ"
+        pdf=open('tests/test.pdf').read()
+        id=client.startFAX("test",[xmlrpclib.Binary(msg),xmlrpclib.Binary(pdf)],["01234", ] )
+        self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name':  'test'}} )
+        ele=self.i.queue.get(.1)
+        self.assertEqual(ele.getRecipients(),["01234", ] )
+        self.assertEqual(ele.getMessage(),FAX('test','',[msg, pdf]))
+
+    def testSendMail(self):
+        servstr="https://test:test@localhost:8000"
+        client=xmlrpclib.Server(servstr)
+        msg=u"2134wergsdfg4w56q34134æſðđæðſđŋ³@¼ŧæðđŋł€¶ŧ€¶ŧ"
+        id=client.startMail("test",msg,["test@test.de", ],'absender@test.de' )
+        self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name':  'test'}} )
+        ele=self.i.queue.get(.1)
+        self.assertEqual(ele.getRecipients(),["test@test.de", ] )
+        self.assertEqual(ele.getMessage(),Mail('test',msg,'absender@test.de'))
+        self.assertEqual(ele.getMessage().as_string(),"""Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: base64
+Subject: =?utf-8?q?test?=
+
+MjEzNHdlcmdzZGZnNHc1NnEzNDEzNMOmxb/DsMSRw6bDsMW/xJHFi8KzQMK8xafDpsOwxJHFi8WC
+4oKswrbFp+KCrMK2xac=
+""")
+        sub=u"³¼½ſðđŋſ€¼½ÖÄÜß"
+        id=client.startMail(sub,msg,["test@test.de", ],'absender@test.de' )
+        self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name': sub}})
+        ele=self.i.queue.get(.1)
+        self.assertEqual(ele.getMessage(),Mail(sub, msg, 'absender@test.de'))
+
+if __name__ == "__main__":
+    unittest.main()  
--- a/iro/tests/testXMLRPCServer.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/tests/testXMLRPCServer.py	Fri Nov 18 22:36:50 2011 +0100
@@ -1,115 +1,16 @@
 # -*- coding: utf-8 -*-
 
-import unittest, ConfigParser
-
-import threading, xmlrpclib
-from multiprocessing import Queue
-from multiprocessing.managers import BaseManager
-
-from iro import xmlrpc,anbieter
-from iro.iro import MySMTP,MySmstrade,MyUserDB
-from iro.job import SMSJob, FAXJob, MailJob
-from iro.joblist import Joblist
-from iro.providerlist import Providerlist
-from iro.user import User, Admin
-
-
-class StoppableXMLRPCServer(xmlrpc.SecureUserDBXMLRPCServer, threading.Thread):
-    running=False
-    def __init__(self, *args, **kwargs):
-        xmlrpc.SecureUserDBXMLRPCServer.__init__(self, *args, **kwargs)
-        threading.Thread.__init__(self)
-        self.timeout=.5
-   
-    def start(self):
-        self.running=True
-        threading.Thread.start(self)
- 
-   
-    def run(self):
-        # *serve_forever* muss in einem eigenen Thread laufen, damit man es
-        # unterbrochen werden kann!
-        while (self.running):
-            self.handle_request()
-   
-    def stop(self):
-        if (self.running):
-            self.running=False
-            self.server_close()
-            self.join()
-
-    def __del__(self):
-        self.stop()
- 
-    def __enter__(self):
-        self.start()
-        return self
-
-    def __exit__(self,type,value,traceback):
-        self.stop()
-
-
+import unittest
 
-def init_server():
-    userlist=[{"name":"test","password":"test",  "class":User},
-              {"name":"test2","password":"test2", "class": User},
-              {"name":"admin","password":"admin", "class": Admin}]
-
-
-    
-    class MyManager(BaseManager):
-        pass
-    
-    MyManager.register('SMSJob', SMSJob) 
-    MyManager.register('FAXob', FAXJob) 
-    MyManager.register('MailJob',MailJob) 
-    MyManager.register('Providerlist',Providerlist) 
-    manager = MyManager()
-    manager.start()
-    
-    
-    #anbieter erzeugen und konfigurieren
-    sip=anbieter.sipgate()
-    sip.read_basic_config("iro.conf")
-    
-    localhost=MySMTP()
-    localhost.read_basic_config("iro.conf")
-
-    smstrade=MySmstrade()
-    smstrade.read_basic_config("iro.conf")
+import xmlrpclib
+from stopableServer import init_server
 
-    #Benutzerdatenbank erstellen
-    queue = Queue()
-    provider=Providerlist()
-    provider.add("sipgate", sip, ["sms", "fax", ])
-    provider.add("smstrade", smstrade, ["sms", ])
-    provider.add("geonet", None, ["sms", "fax", ])
-    provider.add("fax.de", None, ["sms", "fax", ])
-    provider.add("localhost", localhost, ["mail", ])
-    provider.setDefault("sms","smstrade")
-    provider.setDefault("fax","sipgate")
-    provider.setDefault("mail","localhost")
-    jobqueue=Joblist(manager,  queue, provider)
-    userdb=MyUserDB(userlist,jobqueue)
-
-
-    #Server starten
-    cp = ConfigParser.ConfigParser()
-    cp.read(["iro.conf"])
-    cert=cp.get('server', 'cert')
-    key=cp.get('server', 'key')
-    serv = StoppableXMLRPCServer(addr=("localhost", 8000), 
-                                      userdb=userdb,
-                                      certificate=cert,privatekey=key,
-                                      logRequests=False)
-    serv.relam="xmlrpc"
-    return serv
- 
-    
 class TestServer(unittest.TestCase):
     
     def setUp(self):
-        self.serv = init_server()
+        self.i = init_server()
+        self.serv=self.i.serv
+        
         self.serv.start()
 
     def tearDown(self):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/tests/testloglock.py	Fri Nov 18 22:36:50 2011 +0100
@@ -0,0 +1,98 @@
+
+import unittest
+import os
+import tempfile
+import signal
+import threading
+import time
+
+class testLogLock(unittest.TestCase):
+    def test_ThreadingAndLocks(self):
+        #create a thread, have that thread grab a lock, and sleep.
+        fd, file = tempfile.mkstemp('.nonlog')
+        _lock = threading.RLock()
+        os.close(fd)
+        def locker():
+            os.write(fd, 'Thread acquiring lock\n')
+            _lock.acquire()
+            os.write(fd, 'Thread acquired lock\n')
+            time.sleep(0.4)
+            os.write(fd, 'Thread releasing lock\n')
+            _lock.release()
+            os.write(fd, 'Thread released lock\n')
+
+        #Then in the main thread, throw a signal to self
+        def handleSignal(sigNum, frame):
+            os.write(fd, 'Main Thread acquiring lock\n')
+            lock = False
+            endtime = time.time() + 1.0
+            while not lock:
+                lock = _lock.acquire(blocking=0)
+                time.sleep(0.01)
+                if time.time() > endtime:
+                    break
+            if not lock:
+                os.write(fd, 'Main Thread could not acquire lock\n')
+                return
+            os.write(fd, 'Main Thread acquired lock\n')
+            os.write(fd, 'Main Thread releasing lock\n')
+            _lock.release()
+            os.write(fd, 'Main Thread released lock\n')
+
+        sighndlr = signal.signal(signal.SIGUSR1, handleSignal)
+        try:
+            fd = os.open(file, os.O_SYNC | os.O_WRONLY | os.O_CREAT)
+            thread = threading.Thread(target=locker)
+            thread.start()
+            time.sleep(0.1)
+            os.kill(os.getpid(), signal.SIGUSR1)
+            thread.join()
+
+            #check the results
+            os.close(fd)
+            fileconts = open(file, 'r').read()
+            self.assertTrue('Main Thread released lock' in fileconts)
+            self.assertEqual(fileconts,
+                '''Thread acquiring lock
+Thread acquired lock
+Main Thread acquiring lock
+Thread releasing lock
+Thread released lock
+Main Thread acquired lock
+Main Thread releasing lock
+Main Thread released lock
+''')
+
+            #Now try after acquiring the lock from the main thread
+            fd = os.open(file, os.O_SYNC | os.O_WRONLY | os.O_CREAT)
+            _lock.acquire()
+            thread = threading.Thread(target=locker)
+            thread.start()
+            time.sleep(0.1)
+            os.kill(os.getpid(), signal.SIGUSR1)
+            _lock.release()
+            thread.join()
+            os.close(fd)
+            fileconts = open(file, 'r').read()
+            self.assertEqual(fileconts,
+                '''Thread acquiring lock
+Main Thread acquiring lock
+Main Thread acquired lock
+Main Thread releasing lock
+Main Thread released lock
+Thread acquired lock
+Thread releasing lock
+Thread released lock
+''')
+
+        finally:
+            signal.signal(signal.SIGUSR1, sighndlr)
+            try:
+                os.close(fd)
+            except OSError:
+                pass
+            try:
+                os.unlink(file)
+            except OSError:
+                pass
+
--- a/iro/user.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/user.py	Fri Nov 18 22:36:50 2011 +0100
@@ -31,9 +31,10 @@
     '''
     class for a xmlrpc user
     '''
-    def __init__(self,jobqueue):
+    def __init__(self, name, jobqueue):
         self.jobqueue=jobqueue
         self.jobs={}
+        self.name=name
         self.features=["mail", "sms", "fax", ]
 
     def status(self,id=None,detailed=False):
@@ -82,7 +83,7 @@
         '''
         if not "sms" in self.features:
             raise NotSupportedFeature("sms")
-        id = self.jobqueue.newSMS(message,recipients,provider)
+        id = self.jobqueue.newSMS(message,recipients,provider,user=self)
         self.jobs[id]=self.jobqueue[id]
         return id
     
@@ -94,7 +95,12 @@
         logger.debug("startFAX(%s,%s,%s,%s)"%(subject, fax, recipients, provider))
         if not "fax" in self.features:
             raise NotSupportedFeature("fax")
-        id = self.jobqueue.newFAX(subject, fax,recipients,provider)
+        
+        if type(fax) != list:
+            fax=[fax]
+        f=[i.data for i in fax]
+
+        id = self.jobqueue.newFAX(subject, f,recipients,provider,user=self)
         self.jobs[id]=self.jobqueue[id]
         return id
 
@@ -102,7 +108,7 @@
         if not "mail" in self.features:
             raise NotSupportedFeature("mail")
         logger.debug("startMail(%s,%s,%s,%s,%s)"%(subject, body, recipients, frm, provider))
-        id = self.jobqueue.newMail(subject, body, recipients, frm,  provider)
+        id = self.jobqueue.newMail(subject, body, recipients, frm,  provider,user=self)
         self.jobs[id]=self.jobqueue[id]
         return id    
        
@@ -119,6 +125,6 @@
         return self.jobqueue.providerlist.getDefault(name)["name"]
         
 class Admin(User):
-    def __init__(self,jobqueue):
-        User.__init__(self, jobqueue)
+    def __init__(self, name, jobqueue):
+        User.__init__(self, name, jobqueue)
         self.jobs=jobqueue.jobs
--- a/iro/worker.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/worker.py	Fri Nov 18 22:36:50 2011 +0100
@@ -11,6 +11,7 @@
         self.queue=queue
         
     def run(self):
+        logger.info('Workerprocess läuft nun...')
         indifier=0
         while 1:
             job=self.queue.get()
--- a/iro/xmlrpc/SecureUserdbXMLRPCServer.py	Thu Nov 03 22:47:30 2011 +0100
+++ b/iro/xmlrpc/SecureUserdbXMLRPCServer.py	Fri Nov 18 22:36:50 2011 +0100
@@ -1,6 +1,6 @@
 from SecureAuthentificateXMLRPCServer import  SecureAuthentificateXMLRPCRequestHandler
 from SecureXMLRPCServer import SecureXMLRPCServer
-import os, md5
+import os, hashlib
 
 class UserDB:
     '''
@@ -20,14 +20,14 @@
         returns a hash out of username and the password and self.salt
         user is a directory with two keys: username and password
         """
-        m=md5.new()
+        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(self.jobqueue)
+        self.userlist[self.createHash(user)]=self.userClass(user["name"],self.jobqueue)
 
     def __getitem__(self,key):
         return self.userlist[key]