X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=bin%2Flists.rpc.py;h=5ce3c683472b3baf3e1f46244d8c980af423c8df;hb=525a3f50f3146e76bc702971e99876229d5671d8;hp=dd959f3023a8f3a5b13a01534071a7510ad07055;hpb=61d4544b33e21303040441856c19ee294b2c0ef6;p=platal.git diff --git a/bin/lists.rpc.py b/bin/lists.rpc.py index dd959f3..5ce3c68 100755 --- a/bin/lists.rpc.py +++ b/bin/lists.rpc.py @@ -105,9 +105,10 @@ class BasicAuthXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): except: raise Exception('method "%s" is not supported' % method) + def is_rpc_path_valid(self): + return True def _dispatch(self, method, params): - new_params = list(params) return list_call_dispatcher(self._get_function(method), self.data[0], self.data[1], self.data[2], *params) def do_POST(self): @@ -125,23 +126,26 @@ class BasicAuthXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): self.end_headers() def getUser(self, uid, md5, vhost): - res = mysql_fetchone ("""SELECT a.full_name, aa.alias, IF (a.is_admin, 'admin', NULL) + res = mysql_fetchone ("""SELECT a.full_name, IF(aa.alias IS NULL, a.email, CONCAT(aa.alias, '@%s')), + IF (a.is_admin, 'admin', + IF(FIND_IN_SET('lists', at.perms) OR FIND_IN_SET('lists', a.user_perms), 'lists', NULL)) FROM accounts AS a - INNER JOIN aliases AS aa ON (a.uid = aa.uid AND aa.type = 'a_vie') + INNER JOIN account_types AS at ON (at.type = a.type) + LEFT JOIN aliases AS aa ON (a.uid = aa.uid AND aa.type = 'a_vie') WHERE a.uid = '%s' AND a.password = '%s' AND a.state = 'active' LIMIT 1""" \ - % (uid, md5)) + % (PLATAL_DOMAIN, uid, md5)) if res: name, forlife, perms = res if vhost != PLATAL_DOMAIN: - res = mysql_fetchone ("""SELECT m.uid + res = mysql_fetchone ("""SELECT m.uid, IF(m.perms = 'admin', 'admin', 'lists') FROM group_members AS m INNER JOIN groups AS g ON (m.asso_id = g.id) - WHERE perms = 'admin' AND uid = '%s' AND mail_domain = '%s'""" \ + WHERE uid = '%s' AND mail_domain = '%s'""" \ % (uid, vhost)) if res: - perms= 'admin' - userdesc = UserDesc(forlife+'@'+PLATAL_DOMAIN, name, None, 0) + _, perms = res + userdesc = UserDesc(forlife, name, None, 0) return (userdesc, perms, vhost) else: return None @@ -195,7 +199,7 @@ def to_forlife(email): if ( fqdn == PLATAL_DOMAIN ) or ( fqdn == PLATAL_DOMAIN2 ): res = mysql_fetchone("""SELECT CONCAT(f.alias, '@%s'), a.full_name FROM accounts AS a - INNER JOIN aliases AS f ON (f.uid = a.uid AND f.type = 'a_vie') + INNER JOIN aliases AS f ON (f.uid = a.uid AND f.type = 'a_vie') INNER JOIN aliases AS aa ON (aa.uid = a.uid AND aa.alias = '%s' AND a.type != 'homonyme') WHERE a.state = 'active' @@ -286,7 +290,7 @@ def get_list_info(userdesc, perms, mlist, front_page=0): members = mlist.getRegularMemberKeys() is_member = userdesc.address in members is_owner = userdesc.address in mlist.owner - if mlist.advertised or is_member or is_owner or (not front_page and perms == 'admin'): + if (mlist.advertised and perms in ('lists', 'admin')) 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): is_pending = list_call_locked(is_subscription_pending, userdesc, perms, mlist, False) @@ -808,6 +812,7 @@ def check_options(userdesc, perms, vhost, listname, correct=False): def get_all_lists(userdesc, perms, vhost): """ Get all the list for the given vhost + @root """ prefix = vhost.lower()+VHOST_SEP names = Utils.list_names() @@ -819,6 +824,52 @@ def get_all_lists(userdesc, perms, vhost): result.append(name.replace(prefix, '')) return result +def get_all_user_lists(userdesc, perms, vhost, email): + """ Get all the lists for the given user + @root + """ + names = Utils.list_names() + names.sort() + result = [] + for name in names: + try: + mlist = MailList.MailList(name, lock=0) + ismember = email in mlist.getRegularMemberKeys() + isowner = email in mlist.owner + if not ismember and not isowner: + continue + host = mlist.internal_name().split(VHOST_SEP)[0].lower() + result.append({ 'list': mlist.real_name, + 'addr': mlist.real_name.lower() + '@' + host, + 'host': host, + 'own' : isowner, + 'sub' : ismember + }) + except Exception, e: + continue + return result + +def change_user_email(userdesc, perms, vhost, from_email, to_email): + """ Change the email of a user + @root + """ + from_email = from_email.lower() + to_email = to_email.lower() + for list in Utils.list_names(): + try: + mlist = MailList.MailList(list, lock=0) + except: + continue + try: + mlist.Lock() + mlist.ApprovedChangeMemberAddress(from_email, to_email, 0) + mlist.Save() + mlist.Unlock() + except: + mlist.Unlock() + return 1 + + def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, inslevel, owners, members): """ Create a new list. @root @@ -881,8 +932,11 @@ def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, ins # avoid the "-1 mail to moderate" bug mlist = MailList.MailList(name) - mlist._UpdateRecords() - mlist.Save() + try: + mlist._UpdateRecords() + mlist.Save() + finally: + mlist.Unlock() return 1 def delete_list(userdesc, perms, mlist, del_archives=0): @@ -1007,6 +1061,8 @@ server.register_function(set_admin_options) server.register_function(check_options) # create + del server.register_function(get_all_lists) +server.register_function(get_all_user_lists) +server.register_function(change_user_email) server.register_function(create_list) server.register_function(delete_list) # utilisateurs.php