h = Utils.oneline(s, 'iso-8859-1')
else:
h = s
- h = str('').join(re.split('[\x00-\x09\x0B-\x1f]+', h))
- return Utils.uquote(h.replace('&', '&').replace('>', '>').replace('<', '<'))
+ h = str('').join(re.split('[\x00-\x08\x0B-\x1f]+', h))
+ return Utils.uquote(h.replace('&', '&').replace('>', '>').replace('<', '<'))
def to_forlife(email):
try:
return res
else:
return (None, None)
- return (email, mbox)
+ return (email.lower(), mbox)
##
# see /usr/lib/mailman/bin/rmlist
if email is None:
udesc = userdesc
else:
- udesc = UserDesc(email, email, None, 0)
+ udesc = UserDesc(email.lower(), email.lower(), None, 0)
prefix = vhost.lower()+VHOST_SEP
names = Utils.list_names()
names.sort()
# users procedures for [ index.php ]
#
+def get_name(member):
+ try:
+ return quote(mlist.getMemberName(member))
+ except:
+ return ''
+
def get_members(userdesc, perms, vhost, listname):
try:
mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
try:
details, members = get_list_info(userdesc, perms, mlist)
members.sort()
- members = map(lambda member: (quote(mlist.getMemberName(member)) or '', member), members)
+ members = map(lambda member: (get_name(member), member), members)
return (details, members, mlist.owner)
except:
return 0
# owners procedures [ admin.php ]
#
+def replace_email(userdesc, perms, vhost, listname, from_email, to_email):
+ try:
+ mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
+ except:
+ return 0
+ try:
+ if not is_admin_on(userdesc, perms, mlist):
+ return 0
+
+ mlist.Lock()
+ mlist.ApprovedChangeMemberAddress(from_email.lower(), to_email.lower(), 0)
+ mlist.Save()
+ mlist.Unlock()
+ return 1
+ except:
+ return 0
+
def mass_subscribe(userdesc, perms, vhost, listname, users):
try:
mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
helds = []
for id in mlist.GetHeldMessageIds():
ptime, sender, subject, reason, filename, msgdata = mlist.GetRecord(id)
+ fpath = os.path.join(mm_cfg.DATA_DIR, filename)
try:
- size = os.path.getsize(os.path.join(mm_cfg.DATA_DIR, filename))
+ size = os.path.getsize(fpath)
except OSError, e:
if e.errno <> errno.ENOENT: raise
continue
+ try:
+ msg = readMessage(fpath)
+ fromX = msg.has_key("X-Org-Mail")
+ except:
+ pass
helds.append({
'id' : id,
'sender': quote(sender, True),
'size' : size,
'subj' : quote(subject, True),
- 'stamp' : ptime
+ 'stamp' : ptime,
+ 'fromx' : fromX
})
if dosave: mlist.Save()
mlist.Unlock()
return 0
return (subs, helds)
-
def handle_request(userdesc, perms, vhost, listname, id, value, comment):
try:
mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
mlist.Unlock()
return 0
+def get_pending_sub(userdesc, perms, vhost, listname, id):
+ try:
+ mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
+ except:
+ return 0
+ try:
+ if not is_admin_on(userdesc, perms, mlist):
+ return 0
+
+ mlist.Lock()
+ sub = 0
+ id = int(id)
+ if id in mlist.GetSubscriptionIds():
+ time, addr, fullname, passwd, digest, lang = mlist.GetRecord(id)
+ try:
+ login = re.match("^[^.]*\.[^.]*\.\d\d\d\d$", addr.split('@')[0]).group()
+ sub = {'id': id, 'name': quote(fullname), 'addr': addr, 'login': login }
+ except:
+ sub = {'id': id, 'name': quote(fullname), 'addr': addr }
+ mlist.Unlock()
+ except:
+ mlist.Unlock()
+ return 0
+ return sub
def get_pending_mail(userdesc, perms, vhost, listname, id, raw=0):
try:
mlist.Unlock()
if raw:
- return str(msg)
- results = []
+ return quote(str(msg))
+ results_plain = []
+ results_html = []
for part in typed_subpart_iterator(msg, 'text', 'plain'):
c = part.get_payload()
- if c is not None: results.append (c)
- results = map(lambda x: quote(x), results)
+ if c is not None: results_plain.append (c)
+ results_plain = map(lambda x: quote(x), results_plain)
+ for part in typed_subpart_iterator(msg, 'text', 'html'):
+ c = part.get_payload()
+ if c is not None: results_html.append (c)
+ results_html = map(lambda x: quote(x), results_html)
return {'id' : id,
'sender': quote(sender, True),
'size' : size,
'subj' : quote(subject, True),
'stamp' : ptime,
- 'parts' : results }
+ 'parts_plain' : results_plain,
+ 'parts_html': results_html }
except:
mlist.Unlock()
return 0
return 0
def get_bogo_level(userdesc, perms, vhost, listname):
+ """ Compute bogo level from the filtering rules set up on the list. """
try:
mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
except:
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
- if mlist.header_filter_rules == []:
+ if len(mlist.header_filter_rules) == 0:
return 0
- action = mlist.header_filter_rules[0][1]
- if action == mm_cfg.HOLD:
- return 1
- if action == mm_cfg.DISCARD:
- return 2
+
+ unsurelevel = 0
+ filterlevel = 0
+ filterbase = 0
+
+ # The first rule filters Unsure mails
+ if mlist.header_filter_rules[0][0] == 'X-Spam-Flag: Unsure, tests=bogofilter':
+ unsurelevel = 1
+ filterbase = 1
+
+ # Check the other rules:
+ # - we have 2 rules: this is level 2 (drop > 0.999999, moderate Yes)
+ # - we have only one rule with HOLD directive : this is level 1 (moderate spams)
+ # - we have only one rule with DISCARD directive : this is level 3 (drop spams)
+ try:
+ action = mlist.header_filter_rules[filterbase + 1][1]
+ filterlevel = 2
+ except:
+ action = mlist.header_filter_rules[filterbase][1]
+ if action == mm_cfg.HOLD:
+ filterlevel = 1
+ elif action == mm_cfg.DISCARD:
+ filterlevel = 3
+ return (filterlevel << 1) + unsurelevel
except:
return 0
def set_bogo_level(userdesc, perms, vhost, listname, level):
+ """ set filter to the specified level. """
try:
mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
except:
if not is_admin_on(userdesc, perms, mlist):
return 0
hfr = []
- if int(level) is 1:
+
+ # The level is a combination of a spam filtering level and unsure filtering level
+ # - the unsure filtering level is only 1 bit (1 = HOLD unsures, 0 = Accept unsures)
+ # - the spam filtering level is a number growing with filtering strength
+ # (0 = no filtering, 1 = moderate spam, 2 = drop 0.999999 and moderate others, 3 = drop spams)
+ bogolevel = int(level)
+ filterlevel = bogolevel >> 1
+ unsurelevel = bogolevel & 1
+
+ # Set up unusre filtering
+ if unsurelevel == 1:
+ hfr.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False))
+
+ # Set up spam filtering
+ if filterlevel is 1:
hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False))
- elif int(level) is 2:
+ elif filterlevel is 2:
+ hfr.append(('X-Spam-Flag: Yes, tests=bogofilter, spamicity=(0\.999999|1\.000000)', mm_cfg.DISCARD, False))
+ hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False))
+ elif filterlevel is 3:
hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.DISCARD, False))
+
+ # save configuration
if mlist.header_filter_rules != hfr:
mlist.Lock()
mlist.header_filter_rules = hfr
}
def check_options(userdesc, perms, vhost, listname, correct=False):
+ listname = listname.lower()
try:
- mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0)
+ mlist = MailList.MailList(vhost+VHOST_SEP+listname, lock=0)
except:
return 0
try:
mlist.subject_prefix = '['+listname+'] '
mlist.max_message_size = 0
+ inverted_listname = listname.lower() + '_' + vhost.lower()
mlist.msg_footer = "_______________________________________________\n" \
- + "Liste de diffusion %(real_name)s\n"
+ + "Liste de diffusion %(real_name)s\n" \
+ + "http://listes.polytechnique.org/members/" + inverted_listname
mlist.header_filter_rules = []
+ mlist.header_filter_rules.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False))
mlist.header_filter_rules.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False))
mlist.Save()
server.register_function(get_members_limit)
server.register_function(get_owners)
# admin.php
+server.register_function(replace_email)
server.register_function(mass_subscribe)
server.register_function(mass_unsubscribe)
server.register_function(add_owner)
# moderate.php
server.register_function(get_pending_ops)
server.register_function(handle_request)
+server.register_function(get_pending_sub)
server.register_function(get_pending_mail)
# options.php
server.register_function(get_owner_options)
server.serve_forever()
-# vim:set et:
+# vim:set et sw=4 sts=4 sws=4: