X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=bin%2Flists.rpc.py;h=ea7e412ed59fd3cdb6e6e7c29925f5e2fe5efb58;hb=028726d48c0dae158cc947971992ce1e8e7dfb11;hp=1828e104726b6c8f86cedca0e412d887154bfac8;hpb=37f260ad0e9c68da3193ea6b425ac8e94779941e;p=platal.git diff --git a/bin/lists.rpc.py b/bin/lists.rpc.py index 1828e10..ea7e412 100755 --- a/bin/lists.rpc.py +++ b/bin/lists.rpc.py @@ -52,9 +52,10 @@ 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): +def get_config(sec, val, default=None): try: return config.get(sec, val)[1:-1] except ConfigParser.NoOptionError, e: @@ -64,14 +65,12 @@ 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') PLATAL_DOMAIN = get_config('Mail', 'domain') PLATAL_DOMAIN2 = get_config('Mail', 'domain2', '') -ML_OWNER = get_config('Lists', 'admin_owner') VHOST_SEP = get_config('Lists', 'vhost_sep', '_') ON_CREATE_CMD = get_config('Lists', 'on_create', '') @@ -94,20 +93,20 @@ class BasicAuthXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): argument a UserDesc taken from the database, containing name, email and perms """ - def _dispatch(self,method,params): + def _dispatch(self, method, params): # TODO: subclass in SimpleXMLRPCDispatcher and not here. new_params = list(params) - new_params.insert(0,self.data[2]) - new_params.insert(0,self.data[1]) - new_params.insert(0,self.data[0]) - return self.server._dispatch(method,new_params) + new_params.insert(0, self.data[2]) + new_params.insert(0, self.data[1]) + new_params.insert(0, self.data[0]) + return self.server._dispatch(method, new_params) def do_POST(self): try: _, auth = self.headers["authorization"].split() uid, md5 = base64.decodestring(auth).strip().split(':') vhost = self.path.split('/')[1].lower() - self.data = self.getUser(uid,md5,vhost) + self.data = self.getUser(uid, md5, vhost) if self.data is None: raise AuthFailed # Call super.do_POST() to do the actual work @@ -117,13 +116,13 @@ class BasicAuthXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): self.end_headers() def getUser(self, uid, md5, vhost): - res = mysql_fetchone ("""SELECT CONCAT(u.prenom, ' ',u.nom),a.alias,u.perms + res = mysql_fetchone ("""SELECT CONCAT(u.prenom, ' ', u.nom), a.alias, u.perms FROM auth_user_md5 AS u INNER JOIN aliases AS a ON ( a.id=u.user_id AND a.type='a_vie' ) - WHERE u.user_id = '%s' AND u.password = '%s' AND u.perms IN ('admin','user') + WHERE u.user_id = '%s' AND u.password = '%s' AND u.perms IN ('admin', 'user') LIMIT 1""" %( uid, md5 ) ) if res: - name,forlife,perms = res + name, forlife, perms = res if vhost != PLATAL_DOMAIN: res = mysql_fetchone ("""SELECT uid FROM groupex.membres AS m @@ -131,10 +130,10 @@ class BasicAuthXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): WHERE perms='admin' AND uid='%s' AND mail_domain='%s'""" %( uid , vhost ) ) if res: perms= 'admin' userdesc = UserDesc(forlife+'@'+PLATAL_DOMAIN, name, None, 0) - return (userdesc,perms,vhost) + return (userdesc, perms, vhost) else: return None - + ################################################################################ # # XML RPC STUFF @@ -148,7 +147,7 @@ def connectDB(): db='x4dat', user=MYSQL_USER, passwd=MYSQL_PASS, - unix_socket='/tmp/mysql.sock') + unix_socket='/var/run/mysqld/mysqld.sock') db.ping() return db.cursor() @@ -163,39 +162,36 @@ def mysql_fetchone(query): lock.release() return ret -def is_owner(userdesc,perms,mlist): - return ( perms == 'admin' and ML_OWNER in mlist.owner ) or ( userdesc.address in mlist.owner ) - -def is_admin_on(userdesc,perms,mlist): +def is_admin_on(userdesc, perms, mlist): return ( perms == 'admin' ) or ( userdesc.address in mlist.owner ) -def quote(s,is_header=False): +def quote(s, is_header=False): if is_header: - h = Utils.oneline(s,'iso-8859-1') + h = Utils.oneline(s, 'iso-8859-1') else: h = s - h = str('').join(re.split('[\x00-\x1f]+', s)) - 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: - mbox,fqdn = email.split('@') + mbox, fqdn = email.split('@') except: mbox = email fqdn = PLATAL_DOMAIN if ( fqdn == PLATAL_DOMAIN ) or ( fqdn == PLATAL_DOMAIN2 ): - res = mysql_fetchone("""SELECT CONCAT(f.alias,'@%s'), CONCAT(u.prenom,' ',u.nom) + res = mysql_fetchone("""SELECT CONCAT(f.alias, '@%s'), CONCAT(u.prenom, ' ', u.nom) FROM auth_user_md5 AS u INNER JOIN aliases AS f ON (f.id=u.user_id AND f.type='a_vie') INNER JOIN aliases AS a ON (a.id=u.user_id AND a.alias='%s' AND a.type!='homonyme') - WHERE u.perms IN ('admin','user') + WHERE u.perms IN ('admin', 'user') LIMIT 1""" %( PLATAL_DOMAIN, mbox ) ) if res: return res else: - return (None,None) - return (email,mbox) + return (None, None) + return (email.lower(), mbox) ## # see /usr/lib/mailman/bin/rmlist @@ -205,16 +201,15 @@ def remove_it(listname, filename): os.unlink(filename) elif os.path.isdir(filename): shutil.rmtree(filename) - + #------------------------------------------------------------------------------- # helpers on lists # -def get_list_info(userdesc,perms,mlist,front_page=0): +def get_list_info(userdesc, perms, mlist, front_page=0): members = mlist.getRegularMemberKeys() is_member = userdesc.address in members - is_admin = ML_OWNER in mlist.owner - is_owner = ( perms == 'admin' and is_admin ) or ( userdesc.address in mlist.owner ) + is_owner = userdesc.address in mlist.owner if mlist.advertised or is_member or is_owner or (not front_page and perms == 'admin'): is_pending = False if not is_member and (mlist.subscribe_policy > 1): @@ -238,43 +233,43 @@ def get_list_info(userdesc,perms,mlist,front_page=0): 'info' : quote(mlist.info), 'diff' : (mlist.default_member_moderation>0) + (mlist.generic_nonmember_action>0), 'ins' : mlist.subscribe_policy > 1, - 'priv' : (1-mlist.advertised)+2*is_admin, + 'priv' : 1-mlist.advertised, 'sub' : 2*is_member + is_pending, 'own' : is_owner, 'nbsub': len(members) } - return (details,members) + return (details, members) return 0 -def get_options(userdesc,perms,vhost,listname,opts): +def get_options(userdesc, perms, vhost, listname, opts): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: if not is_admin_on(userdesc, perms, mlist): return 0 options = { } - for (k,v) in mlist.__dict__.iteritems(): + for (k, v) in mlist.__dict__.iteritems(): if k in opts: if type(v) is str: options[k] = quote(v) else: options[k] = v - details = get_list_info(userdesc,perms,mlist)[0] - return (details,options) + details = get_list_info(userdesc, perms, mlist)[0] + return (details, options) except: return 0 -def set_options(userdesc,perms,vhost,listname,opts,vals): +def set_options(userdesc, perms, vhost, listname, opts, vals): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + 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() - for (k,v) in vals.iteritems(): + for (k, v) in vals.iteritems(): if k not in opts: continue if k == 'default_member_moderation': @@ -283,7 +278,7 @@ def set_options(userdesc,perms,vhost,listname,opts,vals): t = type(mlist.__dict__[k]) if t is bool: mlist.__dict__[k] = bool(v) elif t is int: mlist.__dict__[k] = int(v) - elif t is str: mlist.__dict__[k] = Utils.uncanonstr(v,'fr') + elif t is str: mlist.__dict__[k] = Utils.uncanonstr(v, 'fr') else: mlist.__dict__[k] = v mlist.Save() mlist.Unlock() @@ -296,11 +291,11 @@ def set_options(userdesc,perms,vhost,listname,opts,vals): # users procedures for [ index.php ] # -def get_lists(userdesc,perms,vhost,email=None): +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() @@ -309,24 +304,24 @@ def get_lists(userdesc,perms,vhost,email=None): if not name.startswith(prefix): continue try: - mlist = MailList.MailList(name,lock=0) + mlist = MailList.MailList(name, lock=0) except: continue try: - details = get_list_info(udesc,perms,mlist,(email is None and vhost == PLATAL_DOMAIN))[0] + details = get_list_info(udesc, perms, mlist, (email is None and vhost == PLATAL_DOMAIN))[0] result.append(details) except: continue return result -def subscribe(userdesc,perms,vhost,listname): +def subscribe(userdesc, perms, vhost, listname): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: mlist.Lock() - if ( mlist.subscribe_policy in (0,1) ) or is_owner(userdesc,perms,mlist): + if ( mlist.subscribe_policy in (0, 1) ) or userdesc.address in mlist.owner: mlist.ApprovedAddMember(userdesc) result = 2 else: @@ -341,9 +336,9 @@ def subscribe(userdesc,perms,vhost,listname): mlist.Unlock() return result -def unsubscribe(userdesc,perms,vhost,listname): +def unsubscribe(userdesc, perms, vhost, listname): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -360,16 +355,22 @@ def unsubscribe(userdesc,perms,vhost,listname): # users procedures for [ index.php ] # -def get_members(userdesc,perms,vhost,listname): +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) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: - details,members = get_list_info(userdesc,perms,mlist) + details, members = get_list_info(userdesc, perms, mlist) members.sort() - members = map(lambda member: (quote(mlist.getMemberName(member)) or '', member), members) - return (details,members,mlist.owner) + members = map(lambda member: (get_name(member), member), members) + return (details, members, mlist.owner) except: return 0 @@ -377,34 +378,51 @@ def get_members(userdesc,perms,vhost,listname): # users procedures for [ trombi.php ] # -def get_members_limit(userdesc,perms,vhost,listname,page,nb_per_page): +def get_members_limit(userdesc, perms, vhost, listname, page, nb_per_page): try: - members = get_members(userdesc,perms,vhost,listname.lower())[1] + members = get_members(userdesc, perms, vhost, listname.lower())[1] except: return 0 i = int(page) * int(nb_per_page) return (len(members), members[i:i+int(nb_per_page)]) -def get_owners(userdesc,perms,vhost,listname): +def get_owners(userdesc, perms, vhost, listname): try: - details,members,owners = get_members(userdesc,perms,vhost,listname.lower()) + details, members, owners = get_members(userdesc, perms, vhost, listname.lower()) except: return 0 - return (details,owners) + return (details, owners) #------------------------------------------------------------------------------- # owners procedures [ admin.php ] # -def mass_subscribe(userdesc,perms,vhost,listname,users): +def replace_email(userdesc, perms, vhost, listname, from_email, to_email): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + 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) + except: + return 0 + try: + if not is_admin_on(userdesc, perms, mlist): + return 0 + members = mlist.getRegularMemberKeys() added = [] mlist.Lock() @@ -421,15 +439,15 @@ def mass_subscribe(userdesc,perms,vhost,listname,users): mlist.Unlock() return added -def mass_unsubscribe(userdesc,perms,vhost,listname,users): +def mass_unsubscribe(userdesc, perms, vhost, listname, users): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + 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() map(lambda user: mlist.ApprovedDeleteMember(user), users) mlist.Save() @@ -438,9 +456,9 @@ def mass_unsubscribe(userdesc,perms,vhost,listname,users): mlist.Unlock() return users -def add_owner(userdesc,perms,vhost,listname,user): +def add_owner(userdesc, perms, vhost, listname, user): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -458,9 +476,9 @@ def add_owner(userdesc,perms,vhost,listname,user): mlist.Unlock() return True -def del_owner(userdesc,perms,vhost,listname,user): +def del_owner(userdesc, perms, vhost, listname, user): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -480,17 +498,17 @@ def del_owner(userdesc,perms,vhost,listname,user): # owners procedures [ admin.php ] # -def get_pending_ops(userdesc,perms,vhost,listname): +def get_pending_ops(userdesc, perms, vhost, listname): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + 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() - + subs = [] seen = [] dosave = False @@ -527,19 +545,18 @@ def get_pending_ops(userdesc,perms,vhost,listname): except: mlist.Unlock() return 0 - return (subs,helds) + return (subs, helds) - -def handle_request(userdesc,perms,vhost,listname,id,value,comment): +def handle_request(userdesc, perms, vhost, listname, id, value, comment): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + 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.HandleRequest(int(id),int(value),comment) + mlist.HandleRequest(int(id), int(value), comment) mlist.Save() mlist.Unlock() return 1 @@ -547,10 +564,34 @@ 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): +def get_pending_mail(userdesc, perms, vhost, listname, id, raw=0): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -562,20 +603,26 @@ def get_pending_mail(userdesc,perms,vhost,listname,id,raw=0): size = os.path.getsize(fpath) msg = readMessage(fpath) mlist.Unlock() - + if raw: - return str(msg) - results = [] - for part in typed_subpart_iterator(msg,'text','plain'): + 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_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.append (c) - results = map(lambda x: quote(x), results) + 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 @@ -589,15 +636,15 @@ owner_opts = ['accept_these_nonmembers', 'admin_notify_mchanges', 'description', 'subject_prefix', 'goodbye_msg', 'send_goodbye_msg', 'subscribe_policy', \ 'welcome_msg'] -def get_owner_options(userdesc,perms,vhost,listname): - return get_options(userdesc,perms,vhost,listname.lower(),owner_opts) +def get_owner_options(userdesc, perms, vhost, listname): + return get_options(userdesc, perms, vhost, listname.lower(), owner_opts) -def set_owner_options(userdesc,perms,vhost,listname,values): - return set_options(userdesc,perms,vhost,listname.lower(),owner_opts,values) +def set_owner_options(userdesc, perms, vhost, listname, values): + return set_options(userdesc, perms, vhost, listname.lower(), owner_opts, values) -def add_to_wl(userdesc,perms,vhost,listname,addr): +def add_to_wl(userdesc, perms, vhost, listname, addr): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -612,9 +659,9 @@ def add_to_wl(userdesc,perms,vhost,listname,addr): mlist.Unlock() return 0 -def del_from_wl(userdesc,perms,vhost,listname,addr): +def del_from_wl(userdesc, perms, vhost, listname, addr): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -629,9 +676,9 @@ def del_from_wl(userdesc,perms,vhost,listname,addr): mlist.Unlock() return 0 -def get_bogo_level(userdesc,perms,vhost,listname): +def get_bogo_level(userdesc, perms, vhost, listname): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -639,17 +686,21 @@ 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 -def set_bogo_level(userdesc,perms,vhost,listname,level): +def set_bogo_level(userdesc, perms, vhost, listname, level): try: - mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(),lock=0) + mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: return 0 try: @@ -659,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() @@ -677,15 +731,15 @@ def set_bogo_level(userdesc,perms,vhost,listname,level): admin_opts = [ 'advertised', 'archive', \ 'max_message_size', 'msg_footer', 'msg_header'] -def get_admin_options(userdesc,perms,vhost,listname): +def get_admin_options(userdesc, perms, vhost, listname): if perms != 'admin': return 0 - return get_options(userdesc,perms,vhost,listname.lower(),admin_opts) + return get_options(userdesc, perms, vhost, listname.lower(), admin_opts) -def set_admin_options(userdesc,perms,vhost,listname,values): +def set_admin_options(userdesc, perms, vhost, listname, values): if perms != 'admin': return 0 - return set_options(userdesc,perms,vhost,listname.lower(),admin_opts,values) + return set_options(userdesc, perms, vhost, listname.lower(), admin_opts, values) #------------------------------------------------------------------------------- # admin procedures [ check.php ] @@ -732,9 +786,10 @@ check_opts = { 'unsubscribe_policy' : 0, } -def check_options(userdesc,perms,vhost,listname,correct=False): +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: @@ -742,9 +797,9 @@ def check_options(userdesc,perms,vhost,listname,correct=False): if correct: mlist.Lock() options = { } - for (k,v) in check_opts.iteritems(): + for (k, v) in check_opts.iteritems(): if mlist.__dict__[k] != v: - options[k] = v,mlist.__dict__[k] + options[k] = v, mlist.__dict__[k] if correct: mlist.__dict__[k] = v if mlist.real_name.lower() != listname: options['real_name'] = listname, mlist.real_name @@ -752,8 +807,8 @@ def check_options(userdesc,perms,vhost,listname,correct=False): if correct: mlist.Save() mlist.Unlock() - details = get_list_info(userdesc,perms,mlist)[0] - return (details,options) + details = get_list_info(userdesc, perms, mlist)[0] + return (details, options) except: if correct: mlist.Unlock() return 0 @@ -762,7 +817,7 @@ def check_options(userdesc,perms,vhost,listname,correct=False): # super-admin procedures # -def get_all_lists(userdesc,perms,vhost): +def get_all_lists(userdesc, perms, vhost): prefix = vhost.lower()+VHOST_SEP names = Utils.list_names() names.sort() @@ -770,16 +825,16 @@ def get_all_lists(userdesc,perms,vhost): for name in names: if not name.startswith(prefix): continue - result.append(name.replace(prefix,'')) + result.append(name.replace(prefix, '')) return result -def create_list(userdesc,perms,vhost,listname,desc,advertise,modlevel,inslevel,owners,members): +def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, inslevel, owners, members): if perms != 'admin': return 0 name = vhost.lower()+VHOST_SEP+listname.lower(); if Utils.list_exists(name): return 0 - + owner = [] for o in owners: email = to_forlife(o)[0] @@ -792,7 +847,7 @@ def create_list(userdesc,perms,vhost,listname,desc,advertise,modlevel,inslevel,o try: oldmask = os.umask(002) pw = sha.new('foobar').hexdigest() - + try: mlist.Create(name, owner[0], pw) finally: @@ -807,15 +862,17 @@ def create_list(userdesc,perms,vhost,listname,desc,advertise,modlevel,inslevel,o mlist.generic_nonmember_action = int(modlevel) > 0 mlist.subscribe_policy = 2 * (int(inslevel) is 1) mlist.admin_notify_mchanges = (mlist.subscribe_policy or mlist.generic_nonmember_action or mlist.default_member_moderation or not mlist.advertised) - + mlist.owner = owner - + 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)) @@ -823,17 +880,18 @@ def create_list(userdesc,perms,vhost,listname,desc,advertise,modlevel,inslevel,o mlist.Unlock() - check_options(userdesc,perms,vhost,listname.lower(),True) - mass_subscribe(userdesc,perms,vhost,listname.lower(),members) + 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) # avoid the "-1 mail to moderate" bug mlist = MailList.MailList(name) mlist._UpdateRecords() mlist.Save() mlist.Unlock() - if ON_CREATE_CMD != '': - try: os.system(ON_CREATE_CMD + ' ' + name) - except: pass except: try: mlist.Unlock() @@ -842,10 +900,10 @@ def create_list(userdesc,perms,vhost,listname,desc,advertise,modlevel,inslevel,o return 0 return 1 -def delete_list(userdesc,perms,vhost,listname,del_archives=0): +def delete_list(userdesc, perms, vhost, listname, del_archives=0): lname = vhost+VHOST_SEP+listname.lower() try: - mlist = MailList.MailList(lname,lock=0) + mlist = MailList.MailList(lname, lock=0) except: return 0 try: @@ -871,19 +929,19 @@ def delete_list(userdesc,perms,vhost,listname,del_archives=0): except: return 0 -def kill(userdesc,perms,vhost,alias,del_from_promo): +def kill(userdesc, perms, vhost, alias, del_from_promo): exclude = [] if not del_from_promo: exclude.append(PLATAL_DOMAIN+VHOST_SEP+'promo'+alias[-4:]) for list in Utils.list_names(): if list in exclude: continue try: - mlist = MailList.MailList(list,lock=0) + mlist = MailList.MailList(list, lock=0) except: continue try: mlist.Lock() - mlist.ApprovedDeleteMember(alias+'@'+PLATAL_DOMAIN,None,0,0) + mlist.ApprovedDeleteMember(alias+'@'+PLATAL_DOMAIN, None, 0, 0) mlist.Save() mlist.Unlock() except: @@ -895,11 +953,11 @@ def kill(userdesc,perms,vhost,alias,del_from_promo): # server # class FastXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer): - allow_reuse_address = True + allow_reuse_address = True ################################################################################ # -# INIT +# INIT # #------------------------------------------------------------------------------- # use Mailman user and group (not root) @@ -910,8 +968,8 @@ uid = getpwnam(mm_cfg.MAILMAN_USER)[2] gid = getgrnam(mm_cfg.MAILMAN_GROUP)[2] if not os.getuid(): - os.setregid(gid,gid) - os.setreuid(uid,uid) + os.setregid(gid, gid) + os.setreuid(uid, uid) signal.signal(signal.SIGHUP, signal.SIG_IGN) @@ -942,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) @@ -949,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)