[Nym3-commit] r486 - trunk/nymbaron/Server

laurent at conuropsis.org laurent at conuropsis.org
Sat Mar 18 22:01:42 CET 2006


Author: laurent
Date: 2006-03-18 22:01:41 +0100 (Sat, 18 Mar 2006)
New Revision: 486

Modified:
   trunk/nymbaron/Server/Main.py
Log:
Move code around to make it less ugly.


Modified: trunk/nymbaron/Server/Main.py
===================================================================
--- trunk/nymbaron/Server/Main.py	2006-03-18 21:01:02 UTC (rev 485)
+++ trunk/nymbaron/Server/Main.py	2006-03-18 21:01:41 UTC (rev 486)
@@ -121,6 +121,109 @@
     nymuser.store(msg)
     sys.exit(0)
 
+def findCommand(ccode, clist):
+    """Find a command of given code in the argument list, return index"""
+    for i in range(clist.len()):
+        if clist[i].ct() == ccode:
+            return i
+    return IndexError
+
+def processCreationRequest(msg):
+    """Process a list of Message objects, which should correspond
+       to a valid creation request. Also checks the signature.
+    """
+    sr = Message.StrReader(msg)
+    comList = sr.readCommandCToSList()
+    h = sr.readHeader()
+    digest = _cr.sha1(msg)
+    try:
+        if len(comList) != 3:
+            raise MalformedControlMessage()
+        #this may be an account setup message
+        #we suppose there is a exactly 1 Create Command in the message,
+        # 1 Newpk, and 1 surb. more will raise an error
+
+        nymUser = None
+        #phase 1 we look for the command create
+        try:
+            idx = findCommand(Message.CToSCODE['Create'], comList)
+        except IndexError:
+            logger.info("No Create Command")
+            raise MalformedControlMessage()
+        com = comList[idx]
+        for pnym in com.list:
+            try:
+                nymUser = User.User(pnym, config, 1)
+            except User.AlreadySuchUser:
+                #a nym pnym has been created : check it
+                #doesn't relate to the creat being processed
+                nymUser = User.User(pnym, config, 0)
+                if nymUser['inidgst'] == digest:
+                    #it does: we resend the challenge
+                    #and quit
+                    nymUser.received(h.seqNo)
+                    created = Message.Created()
+                    created.fromData(nymUser.username,
+                            nymUser['cr'])
+                    nymUser.advanced_send(
+                        Message.buildMessage([created]))
+                    return
+                else:
+                    #it doesn't: we clean and continue
+                    del nymUser
+                    nymUser = None
+            if nymUser is not None:
+                break
+        if nymUser is None:
+            #TODO send an Error message to the client when surbs become available?
+            #for the time being just ignore
+            logger.info("All nyms proposed in the list were already attributed")
+            raise MalformedControlMessage()
+        del comList[idx]
+                
+        #phase 2 we look for the command surb
+        try:
+            idx = findCommand(Message.CToSCODE['Surb'], comList)
+        except IndexError:
+            logger.info("No Surb Command")
+            nymUser.abort()
+            raise MalformedControlMessage()
+        nymUser.addSurbs(com.surbs)
+        if nymUser['nSurbs'] < 3:
+            logger.info("Not Enough Surbs")
+            raise MalformedControlMessage()
+        del comList[idx]
+
+        # There should be only one command left...
+        if len(comList) != 1:
+            nymUser.abort()
+            raise MalformedControlMessage()
+        # ... and it should be a Newpk
+        com = comList[0]
+        if com.ct() != Message.CToSCODE['Newpk']:
+            nymUser.abort()
+            raise MalformedControlMessage()
+        nymUser.setKeys(com.ekid, com.ekenc)
+        if not nymUser.checkMessageSign(msg[Message.sigLength:], h.sig):
+            nymUser.abort()
+            raise MalformedControlMessage()
+        else: # Valid account creation request. Send CREATED
+            #remember we received this register request
+            nymUser['inidgst'] = digest
+            nymUser.received(h.seqNo)
+            #we forget about CREATE2 message and consider the account as up
+            nymUser.setUp()
+            #send back the challenge
+            created = Message.Created()
+            #TODO non empty challenge?
+            created.fromData(nymUser.username, "")
+            nymUser.advanced_send(Message.buildMessage([created]))
+    except MalformedControlMessage:
+        #if you come here something went wrong during the account
+        #initialization
+        logger.debug("Bad formed account creation message")
+        sys.exit(2) #TODO smart error code
+
 def processMessage(msg):
     """process incoming control message from the Mixminion serveur
     - verifies signature
@@ -132,96 +235,9 @@
     try:
         h = sr.readHeader()
         if h.nym == "":
-            comList = sr.readCommandCToSList()
+            processCreationRequest(msg)
+        else:
             try:
-                if (len(comList) != 3):
-                    raise MalformedControlMessage()
-                #this may be an account setup message
-                #we suppose there is a exactly 1 Create Command in the message,
-                # 1 Newpk, and 1 surb. more will raise an error
-
-                nymUser = None
-                mdgst = _cr.sha1(msg)
-                #phase 1 we look for the command create
-                for idx, com in enumerate(comList):
-                    if com.ct() == 0: # TODO : evil numeric litteral
-                        #the Create command
-                        for pnym in com.list:
-                            try:
-                                nymUser = User.User(pnym, config, 1)
-                            except User.AlreadySuchUser:
-                                #a nym pnym has been created : check it
-                                #doesn't relate to the creat being processed
-                                nymUser = User.User(pnym, config, 0)
-                                if nymUser['inidgst'] == mdgst:
-                                    #it does: we resend the challenge
-                                    #and quit
-                                    nymUser.received(h.seqNo)
-                                    created = Message.Created()
-                                    created.fromData(nymUser.username,
-                                            nymUser['cr'])
-                                    nymUser.advanced_send(
-                                        Message.buildMessage([created]))
-                                    return
-                                else:
-                                    #it doesn't: we clean and continue
-                                    del nymUser
-                                    nymUser = None
-                            if nymUser is not None:
-                                break
-                        if nymUser is None:
-                            #TODO send an Error message to the client when surbs become available?
-                            #for the time being just ignore
-                            logger.info("All nyms proposed in the list were already attributed")
-                            raise MalformedControlMessage()
-                        del comList[idx]
-                        break
-                if nymUser is None:
-                    #TODO send an Error message to the client when surbs become available?
-                    #for the time being just ignore
-                    logger.info("No Create Command")
-                    raise MalformedControlMessage()
-                        
-                #phase 2 we look for the command surb
-                for idx, com in enumerate(comList):
-                    if com.ct() == 2: # TODO : evil numeric litteral
-                        nymUser.addSurbs(com.surbs)
-                        if nymUser['nSurbs'] < 3:
-                            logger.info("Not Enough Surbs")
-                            raise MalformedControlMessage()
-                        del comList[idx]
-                        break
-                if(len(comList) != 1):
-                    nymUser.abort()
-                    raise MalformedControlMessage()
-                #phase 3 the last command should be a Newpk
-                com = comList[0]
-                if(com.ct() != 3): # TODO : evil numeric litteral
-                    nymUser.abort()
-                    raise MalformedControlMessage()
-                nymUser.setKeys(com.ekid, com.ekenc)
-                if(not nymUser.checkMessageSign(msg[Message.sigLength:], h.sig)):
-                    nymUser.abort()
-                    raise MalformedControlMessage()
-                else: # Valid account creation request. Send CREATED
-                    #remember we received this register request
-                    nymUser['inidgst'] = mdgst
-                    nymUser.received(h.seqNo)
-                    #we forget about CREATE2 message and consider the account as
-                    #up
-                    nymUser.setUp()
-                    #send back the challenge
-                    created = Message.Created()
-                    #TODO non empty challenge?
-                    created.fromData(nymUser.username, "")
-                    nymUser.advanced_send(Message.buildMessage([created]))
-            except MalformedControlMessage:
-                #if you come here something went wrong during the account
-                #initialization
-                logger.debug("Bad formed account creation message")
-                sys.exit(2) #TODO smart error code
-        else: # NYM is not empty
-            try:
                 nymUser = User.User(h.nym, config)
             except User.NoSuchUser:
                 logger.debug("No such user %s" % h.nym)



More information about the Nym3-commit mailing list