[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[minion-cvs] Patches branch: Make From address support optional, fix...
Update of /home/minion/cvsroot/src/minion/lib/mixminion/server
In directory moria.mit.edu:/tmp/cvs-serv20365/lib/mixminion/server
Modified Files:
Tag: mixminion-v0-0-5-patches
Modules.py
Log Message:
Patches branch: Make From address support optional, fix SMTP bug.
Modules:
Fix a bug where socket errors from smtplib would crash the
server. (If your smtp server was down, it would take mixminion
with it.)
ClientMain, ServerInfo, test, Modules:
Make "From" address support optional.
[Rationale: Previously, I'd argued for having only a single
supported "From" policy, as a measure to prevent linkability
based on client option preferences. Adam Back correctly pointed
out that this is silly. Consider that _any_ use or non-use of
From addresses makes messages linkable *in itself*. In other
words, Eve can already tell which messages set their from
addresses; she gains nothing by learning that those messages
have chosen an exit node with From support to do so.]
Some admins have been hesitant to support "From," even in the
limited form described in the spec. I still hope that it will
eventually prove itself to be relatively harmless, but given the
low number of Type I/II exits with *any* from support, it does
make sense to give both options a try (at least) for now.
Index: Modules.py
===================================================================
RCS file: /home/minion/cvsroot/src/minion/lib/mixminion/server/Modules.py,v
retrieving revision 1.54
retrieving revision 1.54.2.1
diff -u -d -r1.54 -r1.54.2.1
--- Modules.py 31 Aug 2003 19:29:29 -0000 1.54
+++ Modules.py 12 Sep 2003 15:35:47 -0000 1.54.2.1
@@ -862,6 +862,7 @@
# headers from body.
# maxMessageSize: Largest allowable size (after decompression, before
# base64) for outgoing messages.
+ # allowFromAddr: Boolean: do we support user-supplied from addresses?
def _formatEmailMessage(self, address, packet):
"""Given a RFC822 mailbox (delivery address), and an instance of
DeliveryMessage, return a string containing a message to be sent
@@ -876,7 +877,7 @@
headers = packet.getHeaders()
subject = headers.get("SUBJECT", self.subject)
fromAddr = headers.get("FROM")
- if fromAddr:
+ if fromAddr and self.allowFromAddr:
fromAddr = '"%s %s" <%s>' % (self.fromTag, fromAddr,
self.returnAddress)
else:
@@ -936,6 +937,7 @@
'AddressFile' : ('ALLOW', None, None),
'ReturnAddress' : ('ALLOW', None, None),
'RemoveContact' : ('ALLOW', None, None),
+ 'AllowFromAddress' : ('ALLOW', _parseBoolean, 'yes'),
'SMTPServer' : ('ALLOW', None, 'localhost'),
'MaximumSize' : ('ALLOW', _parseSize, "100K"),
}
@@ -970,6 +972,7 @@
self.returnAddress = sec['ReturnAddress']
self.contact = sec['RemoveContact']
self.retrySchedule = sec['Retry']
+ self.allowFromAddr = sec['AllowFromAddress']
# validate should have caught these.
assert (self.server and self.addressFile and self.returnAddress
and self.contact)
@@ -1021,10 +1024,15 @@
moduleManager.enableModule(self)
def getServerInfoBlock(self):
+ if self.allowFromAddr:
+ allowFrom = "yes"
+ else:
+ allowFrom = "no"
return """\
[Delivery/MBOX]
Version: 0.1
- """
+ Allow-From: %s
+ """ % (allowFrom)
def getName(self):
return "MBOX"
@@ -1057,8 +1065,13 @@
def __init__(self):
DeliveryModule.__init__(self)
def getServerInfoBlock(self):
- return "[Delivery/SMTP]\nVersion: 0.1\nMaximum-Size: %s\n" % (
- ceilDiv(self.maxMessageSize,1024) )
+ if self.allowFromAddr:
+ allowFrom = "yes"
+ else:
+ allowFrom = "no"
+ return ("[Delivery/SMTP]\nVersion: 0.1\n"
+ "Maximum-Size: %s\nAllow-From: %s\n") % (
+ ceilDiv(self.maxMessageSize,1024), allowFrom)
def getName(self):
return "SMTP"
def getExitTypes(self):
@@ -1089,6 +1102,7 @@
"7 hours for 6 days"),
'BlacklistFile' : ('ALLOW', None, None),
'SMTPServer' : ('ALLOW', None, 'localhost'),
+ 'AllowFromAddress': ('ALLOW', _parseBoolean, "yes"),
'Message' : ('ALLOW', None, ""),
'ReturnAddress': ('ALLOW', None, None), #Required on e
'FromTag' : ('ALLOW', None, "[Anon]"),
@@ -1130,6 +1144,7 @@
self.subject = sec['SubjectLine']
self.returnAddress = sec['ReturnAddress']
self.fromTag = sec.get('FromTag', "[Anon]")
+ self.allowFromAddr = sec['AllowFromAddress']
if message:
self.header = "X-Anonymous: yes\n\n%s" %(message)
else:
@@ -1200,6 +1215,7 @@
'SubjectLine' : ('ALLOW', None,
'Type III Anonymous Message'),
'MaximumSize' : ('ALLOW', _parseSize, "100K"),
+ 'AllowFromAddress' : ('ALLOW', _parseBoolean, "yes"),
}
}
@@ -1220,6 +1236,7 @@
self.subject = sec['SubjectLine']
self.retrySchedule = sec['Retry']
self.fromTag = sec.get('FromTag', "[Anon]")
+ self.allowFromAddr = sec['AllowFromAddress']
self.command = cmd[0]
self.options = tuple(cmd[1]) + ("-l", self.server)
self.returnAddress = "nobody"
@@ -1310,8 +1327,9 @@
try:
con.sendmail(fromAddr, toList, message)
res = DELIVER_OK
- except smtplib.SMTPException, e:
- LOG.warn("Unsuccessful smtp: "+str(e))
+ except (smtplib.SMTPException, socket.error), e:
+ LOG.warn("Unsuccessful SMTP connection to %s: %s",
+ server, str(e))
res = DELIVER_FAIL_RETRY
con.quit()