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:
# 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
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)
+ return quote(str(msg))
results_plain = []
results_html = []
for part in typed_subpart_iterator(msg, 'text', 'plain'):
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
+
+ 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[1][1]
- return 2
+ action = mlist.header_filter_rules[filterbase + 1][1]
+ filterlevel = 2
except:
- action = mlist.header_filter_rules[0][1]
+ action = mlist.header_filter_rules[filterbase][1]
if action == mm_cfg.HOLD:
- return 1
- if action == mm_cfg.DISCARD:
- return 3
+ 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 int(level) is 3:
+ 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
mlist.subject_prefix = '['+listname+'] '
mlist.max_message_size = 0
- inverted_listname = '_'.join(listname.split('_', 1)[-1::-1])
+ inverted_listname = listname.lower() + '_' + vhost.lower()
mlist.msg_footer = "_______________________________________________\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()
# 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: