[Nym3-commit] r39 - trunk

nym3-devel@lists.noreply.org nym3-devel@lists.noreply.org
Thu, 29 Jul 2004 00:28:32 +0200


Author: laurent
Date: 2004-07-29 00:28:31 +0200 (Thu, 29 Jul 2004)
New Revision: 39

Added:
   trunk/Config.py
   trunk/Main.py
   trunk/User.py
Modified:
   trunk/Mail.py
Log:
Add user and incoming mail handling.


Added: trunk/Config.py
===================================================================
--- trunk/Config.py	2004-07-28 22:11:49 UTC (rev 38)
+++ trunk/Config.py	2004-07-28 22:28:31 UTC (rev 39)
@@ -0,0 +1,2 @@
+
+path = '/var/lib/nym3'

Modified: trunk/Mail.py
===================================================================
--- trunk/Mail.py	2004-07-28 22:11:49 UTC (rev 38)
+++ trunk/Mail.py	2004-07-28 22:28:31 UTC (rev 39)
@@ -5,6 +5,7 @@
 
 slen = 180
 random.seed(None)
+midLen = 20
 
 def synopsize(msg):
     vheaders = [ 'Cc', 'From', 'Date', 'In-Reply-To', 'Sender',
@@ -25,7 +26,7 @@
 	
     return res + 'X-Octets: ' + repr(len(msg)) + "\n" + body
 
-def genMid(length):
+def genMid(length = midLen):
     res = ""
     for i in range(0, length): res = res + chr(random.randint(0, 255))
     return res

Added: trunk/Main.py
===================================================================
--- trunk/Main.py	2004-07-28 22:11:49 UTC (rev 38)
+++ trunk/Main.py	2004-07-28 22:28:31 UTC (rev 39)
@@ -0,0 +1,20 @@
+#!/usr/bin/env python2.3
+
+import sys
+import os
+import User
+import Config
+
+def processIncoming(localpart, msg):
+    try:
+	nymuser = User.User(localpart)
+    except NoSuchUser:
+	print "No such user"
+	sys.exit(73)
+    if nymuser.usage() + len(msg) > nymuser.quota():
+	print "Quota exceeded."
+	sys.exit(75)
+    # Valid user, not over quota. Filtering policy can wait.
+    nymuser.store(msg)
+    sys.exit(0)
+

Added: trunk/User.py
===================================================================
--- trunk/User.py	2004-07-28 22:11:49 UTC (rev 38)
+++ trunk/User.py	2004-07-28 22:28:31 UTC (rev 39)
@@ -0,0 +1,50 @@
+
+import os
+import Config
+import Mail
+import pickle
+
+class User:
+    """Hold user data"""
+    def __init__(self, username):
+	self.datafile = Config.path + '/' + username + '.dat'
+	f = open(self.datafile, 'r') # TODO : Locks?
+	self.data = pickle.load(f)
+	f.close()
+
+    def quota(self):
+	return self.data.quota
+
+    def usage(self):
+	return self.data.usage
+
+    def save(self):
+	f = open(self.filename, 'w') # TODO : Locks?
+	pickle.dump(self.data, f)
+	f.close()
+
+    def store(msg):
+	"Store an incoming message"
+	syn = Mail.synopsize(msg)
+	mbox = Config.path + '/' + self.data.username + '.mbox'
+	f = open(mbox, 'r') # TODO : Locks?
+	self.mbox = pickle.load(f)
+	f.close()
+	mid = Mail.genMid()
+	while self.mbox.has_key(mid): mid = Mail.genMid()
+	self.mbox[mid] = msg # TODO : this is where we're supposed to crypt.
+	f = open(mbox, 'w') # TODO : Locks?
+	pickle.dump(self.mbox, f)
+	f.close()
+
+	synbox = Config.path + '/' + self.data.username + '.syn'
+	f = open(synbox, 'r') # TODO : Locks?
+	self.syn = pickle.load(f)
+	f.close()
+	self.syn.append({'time' : int(time.time()), 'encrypted' : 0,
+			 'mid' : mid, 'synopsis' : syn})
+	f = open(synbox, 'w') # TODO : Locks?
+	pickle.dump(self.syn, f)
+	f.close()
+	
+