#* Foundation, Inc., *
#* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
#***************************************************************************
-# $Id: mailman-rpc.py,v 1.55 2004-10-10 21:18:04 x2000habouzit Exp $
+# $Id: mailman-rpc.py,v 1.56 2004-10-11 17:04:32 x2000habouzit Exp $
#***************************************************************************
import base64, MySQLdb, os, getopt, sys, MySQLdb.converters, sha
def is_admin_on(userdesc,perms,mlist):
return ( perms == 'admin' ) or ( userdesc.address in mlist.owner )
+
+def quote(s):
+ return Utils.uquote(s.replace('&','&').replace('>','>').replace('<','<'))
+
+#-------------------------------------------------------------------------------
+# helpers on lists
+#
+
def get_list_info((userdesc,perms),mlist,front_page=0):
members = mlist.getRegularMemberKeys()
is_member = userdesc.address in members
chunks = mlist.internal_name().split('-')
is_pending = False
if front_page and not is_member and (mlist.subscribe_policy > 1):
- mlist.Lock()
- for id in mlist.GetSubscriptionIds():
- if userdesc.address == mlist.GetRecord(id)[1]:
- is_pending = 1
- break
- mlist.Unlock()
+ try:
+ mlist.Lock()
+ for id in mlist.GetSubscriptionIds():
+ if userdesc.address == mlist.GetRecord(id)[1]:
+ is_pending = 1
+ break
+ mlist.Unlock()
+ except:
+ mlist.Unlock()
+ return 0
details = {
'list' : mlist.real_name,
def set_options((userdesc,perms),vhost,listname,opts,vals):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
+ mlist.Lock()
for (k,v) in vals.iteritems():
if k not in opts:
continue
mlist.Unlock()
return 0
-def quote(s):
- return Utils.uquote(s.replace('&','&').replace('>','>').replace('<','<'))
-
#-------------------------------------------------------------------------------
# users procedures for [ index.php ]
#
def subscribe((userdesc,perms),vhost,listname):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
+ mlist.Lock()
if ( mlist.subscribe_policy in (0,1) ) or is_owner(userdesc,perms,mlist):
- result = 2
mlist.ApprovedAddMember(userdesc)
+ result = 2
else:
result = 1
try:
def unsubscribe((userdesc,perms),vhost,listname):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
+ mlist.Lock()
mlist.ApprovedDeleteMember(userdesc.address)
mlist.Save()
mlist.Unlock()
def subscribe_nl((userdesc,perms)):
try:
- mlist = MailList.MailList(mm_cfg.MAIN_NEWSLETTER)
+ mlist = MailList.MailList(mm_cfg.MAIN_NEWSLETTER,lock=0)
except:
return 0
try:
- mlist.ApprovedAddMember(userdesc)
+ mlist.Lock()
+ mlist.ApprovedAddMember(userdesc,0,0)
mlist.Save()
mlist.Unlock()
return 1
def unsubscribe_nl((userdesc,perms)):
try:
- mlist = MailList.MailList(mm_cfg.MAIN_NEWSLETTER)
+ mlist = MailList.MailList(mm_cfg.MAIN_NEWSLETTER,lock=0)
except:
return 0
try:
- mlist.ApprovedDeleteMember(userdesc.address)
+ mlist.Lock()
+ mlist.ApprovedDeleteMember(userdesc.address,0,0)
mlist.Save()
mlist.Unlock()
return 1
def mass_subscribe((userdesc,perms),vhost,listname,users):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
members = mlist.getRegularMemberKeys()
added = []
+ mlist.Lock()
for user in users:
mysql.execute ("""SELECT CONCAT(u.prenom,' ',u.nom), f.alias
FROM auth_user_md5 AS u
def mass_unsubscribe((userdesc,perms),vhost,listname,users):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
-
+
+ mlist.Lock()
map(lambda user: mlist.ApprovedDeleteMember(user+'@polytechnique.org'), users)
mlist.Save()
except:
def add_owner((userdesc,perms),vhost,listname,user):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if int(mysql.rowcount) is 1:
forlife = mysql.fetchone()[0]
if forlife+'@polytechnique.org' not in mlist.owner:
+ mlist.Lock()
mlist.owner.append(forlife+'@polytechnique.org')
mlist.Save()
except:
def del_owner((userdesc,perms),vhost,listname,user):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
return 0
if len(mlist.owner) < 2:
return 0
+ mlist.Lock()
mlist.owner.remove(user+'@polytechnique.org')
mlist.Save()
except:
def get_pending_ops((userdesc,perms),vhost,listname):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
+
+ mlist.Lock()
+
subs = []
seen = []
dosave = False
dosave = True
continue
seen.append(addr)
- subs.append({
- 'id' : id,
- 'name' : fullname,
- 'addr' : addr
- })
+ subs.append({'id': id, 'name': fullname, 'addr': addr })
helds = []
for id in mlist.GetHeldMessageIds():
'subj' : quote(subject),
'stamp' : ptime
})
- if dosave: mlist.save()
+ if dosave: mlist.Save()
+ mlist.Unlock()
except:
mlist.Unlock()
return 0
- mlist.Unlock()
return (subs,helds)
def handle_request((userdesc,perms),vhost,listname,id,value,comment):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,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.Save()
mlist.Unlock()
def get_pending_mail((userdesc,perms),vhost,listname,id,raw=0):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
+ mlist.Lock()
ptime, sender, subject, reason, filename, msgdata = mlist.GetRecord(int(id))
fpath = os.path.join(mm_cfg.DATA_DIR, filename)
size = os.path.getsize(fpath)
def add_to_wl((userdesc,perms),vhost,listname,addr):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
+ mlist.Lock()
mlist.accept_these_nonmembers.append(addr)
mlist.Save()
mlist.Unlock()
def del_from_wl((userdesc,perms),vhost,listname,addr):
try:
- mlist = MailList.MailList(vhost+'-'+listname)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if not is_admin_on(userdesc, perms, mlist):
return 0
+ mlist.Lock()
mlist.accept_these_nonmembers.remove(addr)
mlist.Save()
mlist.Unlock()
def check_options((userdesc,perms),vhost,listname,correct=False):
try:
- mlist = MailList.MailList(vhost+'-'+listname,lock=correct)
+ mlist = MailList.MailList(vhost+'-'+listname,lock=0)
except:
return 0
try:
if perms != 'admin': return 0
+ if correct:
+ mlist.Lock()
options = { }
for (k,v) in check_opts.iteritems():
if mlist.__dict__[k] != v:
mlist.Save()
mlist.Unlock()
except:
- raise
+ try:
+ mlist.Unlock()
+ except:
+ pass
return 0
return 1
-
-
#-------------------------------------------------------------------------------
# server