Merge branch 'master' of /home/git/platal into profile_edit
[platal.git] / bin / lists.rpc.py
index ade8a0e..ea7e412 100755 (executable)
@@ -52,6 +52,7 @@ class AuthFailed(Exception): pass
 #------------------------------------------------
 
 config = ConfigParser.ConfigParser()
+config.read(os.path.dirname(__file__)+'/../configs/platal.ini')
 config.read(os.path.dirname(__file__)+'/../configs/platal.conf')
 
 def get_config(sec, val, default=None):
@@ -64,7 +65,6 @@ def get_config(sec, val, default=None):
         else:
             return default
 
-BASEURL        = get_config('Core', 'baseurl')
 MYSQL_USER     = get_config('Core', 'dbuser')
 MYSQL_PASS     = get_config('Core', 'dbpwd')
 
@@ -171,7 +171,7 @@ def quote(s, is_header=False):
         h = Utils.oneline(s, 'iso-8859-1')
     else:
         h = s
-    h = str('').join(re.split('[\x00-\x1f]+', s))
+    h = str('').join(re.split('[\x00-\x08\x0B-\x1f]+', h))
     return Utils.uquote(h.replace('&', '&amp;').replace('>', '&gt;').replace('<', '&lt;'))
 
 def to_forlife(email):
@@ -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)
@@ -524,7 +547,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 +564,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,18 +605,24 @@ def get_pending_mail(userdesc, perms, vhost, listname, id, raw=0):
         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
@@ -634,11 +686,15 @@ def get_bogo_level(userdesc, perms, vhost, listname):
             return 0
         if mlist.header_filter_rules == []:
             return 0
-        action = mlist.header_filter_rules[0][1]
-        if action == mm_cfg.HOLD:
-            return 1
-        if action == mm_cfg.DISCARD:
+        try:
+            action = mlist.header_filter_rules[1][1]
             return 2
+        except:
+            action = mlist.header_filter_rules[0][1]
+            if action == mm_cfg.HOLD:
+                return 1
+            if action == mm_cfg.DISCARD:
+                return 3
     except:
         return 0
 
@@ -654,6 +710,9 @@ def set_bogo_level(userdesc, perms, vhost, listname, level):
         if int(level) is 1:
             hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False))
         elif int(level) 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:
             hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.DISCARD, False))
         if mlist.header_filter_rules != hfr:
             mlist.Lock()
@@ -728,8 +787,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:
@@ -808,8 +868,10 @@ def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, ins
         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: Yes, tests=bogofilter', mm_cfg.HOLD, False))
@@ -818,6 +880,10 @@ def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, ins
 
         mlist.Unlock()
 
+        if ON_CREATE_CMD != '':
+            try:    os.system(ON_CREATE_CMD + ' ' + name)
+            except: pass
+
         check_options(userdesc, perms, vhost, listname.lower(), True)
         mass_subscribe(userdesc, perms, vhost, listname.lower(), members)
 
@@ -826,9 +892,6 @@ def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, ins
         mlist._UpdateRecords()
         mlist.Save()
         mlist.Unlock()
-        if ON_CREATE_CMD != '':
-            try:    os.system(ON_CREATE_CMD + ' ' + name)
-            except: pass
     except:
         try:
             mlist.Unlock()
@@ -937,6 +1000,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)
@@ -944,6 +1008,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)