[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