Fix redirection when changing user type to a not registered user (Closes #824)
[platal.git] / bin / lists.rpc.py
index 671b365..67abde0 100755 (executable)
@@ -172,7 +172,7 @@ def quote(s, is_header=False):
     else:
         h = s
     h = str('').join(re.split('[\x00-\x08\x0B-\x1f]+', h))
-    return Utils.uquote(h.replace('&', '&amp;').replace('>', '&gt;').replace('<', '&lt;')) 
+    return Utils.uquote(h.replace('&', '&amp;').replace('>', '&gt;').replace('<', '&lt;'))
 
 def to_forlife(email):
     try:
@@ -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
@@ -522,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()
@@ -541,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)
@@ -559,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:
@@ -658,10 +694,10 @@ def get_bogo_level(userdesc, perms, vhost, listname):
         if mlist.header_filter_rules == []:
             return 0
         try:
-            action = mlist.header_filter_rules[1][1]
+            action = mlist.header_filter_rules[2][1]
             return 2
         except:
-            action = mlist.header_filter_rules[0][1]
+            action = mlist.header_filter_rules[1][1]
             if action == mm_cfg.HOLD:
                 return 1
             if action == mm_cfg.DISCARD:
@@ -679,11 +715,14 @@ def set_bogo_level(userdesc, perms, vhost, listname, level):
             return 0
         hfr = []
         if int(level) is 1:
+            hfr.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False))
             hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False))
         elif int(level) is 2:
+            hfr.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False))
             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: Unsure, tests=bogofilter', mm_cfg.HOLD, False))
             hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.DISCARD, False))
         if mlist.header_filter_rules != hfr:
             mlist.Lock()
@@ -839,7 +878,7 @@ 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
@@ -979,6 +1018,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)