X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=bin%2Flists.rpc.py;h=ccf3654fe5aee5636b45ece7ab09154d36d379f8;hb=12a587df92f7bc9efeb91c1a2d27f763070b8609;hp=7f5a5f0d8a4f9abfe7a1ff3064fdb5beff1a65f1;hpb=50c655ee0afa88ef9b0fab7c6f90fae36cc0b3cf;p=platal.git diff --git a/bin/lists.rpc.py b/bin/lists.rpc.py index 7f5a5f0..ccf3654 100755 --- a/bin/lists.rpc.py +++ b/bin/lists.rpc.py @@ -171,8 +171,8 @@ def quote(s, is_header=False): 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: @@ -191,7 +191,7 @@ def to_forlife(email): return res else: return (None, None) - return (email, mbox) + return (email.lower(), mbox) ## # see /usr/lib/mailman/bin/rmlist @@ -295,7 +295,7 @@ def get_lists(userdesc, perms, vhost, email=None): 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() @@ -355,6 +355,12 @@ def unsubscribe(userdesc, perms, vhost, listname): # 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) @@ -363,7 +369,7 @@ def get_members(userdesc, perms, vhost, listname): 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 @@ -391,6 +397,23 @@ def get_owners(userdesc, perms, vhost, listname): # 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) @@ -505,17 +528,24 @@ def get_pending_ops(userdesc, perms, vhost, listname): 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() @@ -524,7 +554,6 @@ def get_pending_ops(userdesc, perms, vhost, listname): 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) @@ -542,6 +571,30 @@ def handle_request(userdesc, perms, vhost, listname, id, value, comment): 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: @@ -559,7 +612,7 @@ def get_pending_mail(userdesc, perms, vhost, listname, id, raw=0): mlist.Unlock() if raw: - return str(msg) + return quote(str(msg)) results_plain = [] results_html = [] for part in typed_subpart_iterator(msg, 'text', 'plain'): @@ -631,6 +684,7 @@ def del_from_wl(userdesc, perms, vhost, listname, addr): 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: @@ -638,17 +692,37 @@ def get_bogo_level(userdesc, perms, vhost, listname): 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: @@ -657,10 +731,29 @@ def set_bogo_level(userdesc, perms, vhost, listname, level): 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 @@ -734,8 +827,9 @@ check_opts = { } 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: @@ -814,12 +908,13 @@ def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, ins 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() @@ -946,6 +1041,7 @@ server.register_function(get_members) 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) @@ -953,6 +1049,7 @@ server.register_function(del_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) @@ -975,4 +1072,4 @@ server.register_function(kill) server.serve_forever() -# vim:set et: +# vim:set et sw=4 sts=4 sws=4: