[Nym3-commit] r201 - trunk/nym3/Client

jr at conuropsis.org jr at conuropsis.org
Thu Apr 28 15:36:33 CEST 2005


Author: jr
Date: 2005-04-28 15:36:32 +0200 (Thu, 28 Apr 2005)
New Revision: 201

Modified:
   trunk/nym3/Client/Account.py
   trunk/nym3/Client/Main.py
Log:
- add relaying command
- correct some bug in Tagmap and Account
- add the case create = False in Account.__init__


Modified: trunk/nym3/Client/Account.py
===================================================================
--- trunk/nym3/Client/Account.py	2005-04-27 19:54:27 UTC (rev 200)
+++ trunk/nym3/Client/Account.py	2005-04-28 13:36:32 UTC (rev 201)
@@ -50,8 +50,9 @@
 class TagMap:
     """Contains mapping between idTag and nickname"""
     def __init__(self, filename):
-        self.id2nick = {}
-        self.nick2id = {}
+	self.lock = None
+        self.id2nick = None
+        self.nick2id = None
 	self.filename = filename
 
     def __del__(self):
@@ -77,8 +78,11 @@
 	    f.close()
 	except IOError:
 	    self.id2nick = {}
+	self.nick2id = {}
 	for i in self.id2nick.keys():
 	    self.nick2id[self.id2nick[i]] = i
+	print self.nick2id.keys()
+	print self.id2nick.keys()
     
     def _loadifneeded(self):
 	if self.id2nick == None:
@@ -95,11 +99,17 @@
 
     def nickFromId(self, idTag):
         self._loadifneeded()
-        return self.id2nick[idTag]
+	try:
+	    return self.id2nick[idTag]
+	except KeyError:
+	    raise NoSuchAccount()
 
     def idFromNick(self, nick):
         self._loadifneeded()
-        return self.nick2id[nick]
+	try:
+	    return self.nick2id[nick]
+	except KeyError:
+	    raise NoSuchAccount()
 
     def getnewId(self, nick):
         self._lock()
@@ -147,10 +157,10 @@
 	# Some data related to the account are loaded only on demand,
 	# this includes the journal, the mailbox, the synbox.
 	self.lock = None
+	self.succeded = True
 	self.config = config
-
+	tagmap = TagMap(config.path + os.sep + 'tagmap')
 	if create:
-	    tagmap = TagMap(config.path + os.sep + 'tagmap')
 	    self.data = {}
 	    self.succeded = False
 	    self['idTag'] = tagmap.getnewId(nickname)
@@ -170,14 +180,17 @@
 	    self.idKey = None
 	    self.pendingKey = None
 	else:
+	    print "nickname: %s" % nickname
+	    self.data_status = 'unloaded'
+	    self.journal_status = 'unloaded'
+	    self.mbox_status = 'unloaded'
+	    self.synbox_status = 'unloaded'
+	    idTag = tagmap.idFromNick(nickname)
+	    self.base_path = config.path + os.sep + idTag
 	    self._load_data()
 	    self.journal = None
-	    self.journal_status = 'unloaded'
 	    self.mbox = None
-	    self.mbox_status = 'unloaded'
 	    self.synbox = None
-	    self.synbox_status = 'unloaded'
-	    self.base_path = config.path + os.sep + self['idTag']
 	self.succeded = True
 	self._lock()
 
@@ -336,6 +349,18 @@
 	    self.mbox = {} # ?
 	self.mbox_status = 'ok'
 
+    def _load_data(self):
+	"""Loads the datafile from the disk"""
+	if not self.data_status == 'unloaded': return
+	datafile = self.datafile()
+	try:
+	    f = open(datafile, 'r')
+	    self.data = pickle.load(f)
+	    f.close()
+	except IOError:
+	    self.data = {}
+	self.data_status = 'ok'
+
     def _load_synbox(self):
 	"""Loads the synbox from the disk"""
 	if not self.synbox_status == 'unloaded': return

Modified: trunk/nym3/Client/Main.py
===================================================================
--- trunk/nym3/Client/Main.py	2005-04-27 19:54:27 UTC (rev 200)
+++ trunk/nym3/Client/Main.py	2005-04-28 13:36:32 UTC (rev 201)
@@ -38,6 +38,7 @@
 import nym3.Mail as Mail
 import nym3.Client.Keyring as Keyring
 import mixminion.Crypto as _cr
+import mixminion.ClientDirectory as _cl
 
 class CLI:
     def __init__(self):
@@ -77,13 +78,17 @@
     def display(self, s):
 	print s
 
+    def promptblock(self, s):
+	print s
+	return sys.stdin.read()
+
 def processMessage(msg, config, ui, nickname):
     """process incoming control message"""
       
     sr = Message.StrReader(msg)
     comList = sr.readCommandCToSList()
     for com in comList:
-	if (com.ct() == SToCCODE['Created']):
+        if (com.ct() == SToCCODE['Created']):
 	    account = Account.Account(config, nickname)
 	    # No challenge/response scheme decided yet:
 	    account['handshake'] = 'completed'
@@ -172,8 +177,60 @@
     surbc = Message.Surb()
     surbc.fromData(account.generateSurbs(7))
     account.sendControl([createc, newpkc, surbc], idKey)
-    account['handshake'] = "initiated"
-	
+
+def relayMessage(ui, config, nickname = None, to = None, input = None):
+    body = None
+    exAdr = None
+    if not to:
+	ui.display("No destination given, abort")
+	ui.display("Use -t <dest>")
+	sys.exit()
+    try:
+        exAdr = _cl.parseAddress(to)
+    except _cl.ParseError:
+	ui.display("Address format unknown")
+	#TODO add here the supported formats?
+	sys.exit()
+    if not nickname:
+	ui.display("No nickname given, abort")
+	ui.display("Use -n <nickname>")
+	sys.exit()
+    account = None
+    try:
+	account = Account.Account(config, nickname)
+    except Account.NoSuchAccount:
+	ui.display("No account relative to the provided nickname, abort")
+	sys.exit(42)
+    if input:
+	try:
+	    fd = open(input)
+	    body = fd.read()
+	    fd.close()
+	except IOError:
+	    ui.display("Unable to read message from input file")
+	    sys.exit()
+    else:
+	try:
+	    body = ui.promptblock("Enter your message:")
+	except IOError:
+	    ui.display("Unable to read message from stdin")
+	    sys.exit()
+    rt, ri, lh = exAdr.getRouting()
+    relayc = Message.Relay()
+    relayc.fromData(Message.intToStrBE(rt, 2), ri, body)
+    try:
+	secring = Keyring.Keyring(config.secring_path)
+	ui.display("You need to provide your passphrase to unlock your keyring")
+	while True:
+		passphrase1 = ui.prompthidden("Passphrase")
+		if secring.decrypt(passphrase1): break
+		ui.display("wrong passphrase")
+    except Keyring.NewKeyring:
+	# The Keyring is new. That shouldn't happen
+	raise Exception('Bug keyring?')
+    idKey = _cr.pk_decode_private_key(secring.get_key(account['idKey']))
+    account.sendControl([relayc], idKey)
+
 def main(args):
     if len(args) < 2:
 	print "Usage: WRITEME"
@@ -201,8 +258,28 @@
 	setupAccount(config, ui, serverName = options.server, 
 		     usernamelist = myusernamelist,
 		     emailAddress = options.email, nickname = options.nickname)
+<<<<<<< .mine
+	sys.exit(0)
+    if args[1] == "send":
+	parser = OptionParser()
+	parser.add_option("-n", "--nickname", action = "store",
+			  dest = "nickname", help = "The nickname refering "
+			  "to the account used to send a message")
+	parser.add_option("-t", "--to", help = "Specify the recipient's "
+			  "address", action = "store",
+			  dest = "to")
+	parser.add_option("-i", "--input", action = "store",
+			dest = "input", help = "The file to read the message "
+			"from (defaults to stdin)")
+	(options, args) = parser.parse_args(args[2:])
+	ui = CLI()
+	config = Config.Config()
+	relayMessage(ui, config, options.nickname, options.to, options.input)
+	sys.exit(0)
+=======
 	sys.exit(1)
 
+>>>>>>> .r200
     if args[1] == "process":
 	parser = OptionParser()
 	parser.add_option("-i", "--idtag", action = "store",
@@ -234,6 +311,7 @@
 		sys.exit(1)
 	else: msg = sys.stdin.read()
 	processMessage(msg, config, ui, nick)
+	sys.exit(0)
 
 if __name__ == '__main__':
     main(sys.argv)



More information about the Nym3-commit mailing list