@@ -56,6 +56,31 @@ def D_(s):
5656AUTH_CONTEXTS = (mm_cfg .AuthListAdmin , mm_cfg .AuthSiteAdmin )
5757
5858
59+ def _field_upload_text (cgidata , fieldname ):
60+ """Decode multipart file upload text, or fall back to getfirst (FieldStorage)."""
61+ fn = getattr (cgidata , 'filename' , None )
62+ if callable (fn ) and fn (fieldname ):
63+ fobj = cgidata .file (fieldname )
64+ if fobj is None :
65+ return cgidata .getfirst (fieldname , '' ) or ''
66+ try :
67+ raw = fobj .read ()
68+ finally :
69+ try :
70+ fobj .close ()
71+ except EnvironmentError :
72+ pass
73+ try :
74+ os .unlink (fobj .name )
75+ except OSError :
76+ pass
77+ enc = getattr (cgidata , 'encoding' , None ) or 'utf-8'
78+ if isinstance (raw , bytes ):
79+ return raw .decode (enc , getattr (cgidata , 'errors' , None ) or 'replace' )
80+ return raw or ''
81+ return cgidata .getfirst (fieldname , '' ) or ''
82+
83+
5984
6085def main ():
6186 # Try to find out which list is being administered
@@ -1459,10 +1484,7 @@ def safeint(formvar, defaultval=None):
14591484 # mass subscription, removal processing for members category
14601485 subscribers = ''
14611486 subscribers += str (cgidata .getfirst ('subscribees' , '' ))
1462- sub_uploads = cgidata .getfirst ('subscribees_upload' , '' )
1463- if isinstance (sub_uploads , bytes ):
1464- sub_uploads = sub_uploads .decode ()
1465- subscribers += sub_uploads
1487+ subscribers += _field_upload_text (cgidata , 'subscribees_upload' )
14661488 if subscribers :
14671489 entries = [_f for _f in [n .strip () for n in subscribers .splitlines ()] if _f ]
14681490 send_welcome_msg = safeint ('send_welcome_msg_to_this_batch' ,
@@ -1540,13 +1562,8 @@ def safeint(formvar, defaultval=None):
15401562 # Unsubscriptions
15411563 removals = ''
15421564 if 'unsubscribees' in cgidata :
1543- removals += cgidata ['unsubscribees' ].value
1544- if 'unsubscribees_upload' in cgidata and \
1545- cgidata ['unsubscribees_upload' ].value :
1546- unsub_upload = cgidata ['unsubscribees_upload' ].value
1547- if isinstance (unsub_upload , bytes ):
1548- unsub_upload = unsub_upload .decode ()
1549- removals += unsub_upload
1565+ removals += cgidata .getfirst ('unsubscribees' , '' ) or ''
1566+ removals += _field_upload_text (cgidata , 'unsubscribees_upload' )
15501567 if removals :
15511568 names = [_f for _f in [n .strip () for n in removals .splitlines ()] if _f ]
15521569 send_unsub_notifications = safeint (
@@ -1651,10 +1668,7 @@ def safeint(formvar, defaultval=None):
16511668 # sync operation
16521669 memberlist = ''
16531670 memberlist += cgidata .getvalue ('memberlist' , '' )
1654- upload = cgidata .getvalue ('memberlist_upload' , '' )
1655- if isinstance (upload , bytes ):
1656- upload = upload .decode ()
1657- memberlist += upload
1671+ memberlist += _field_upload_text (cgidata , 'memberlist_upload' )
16581672 if memberlist :
16591673 # Browsers will convert special characters in the text box to HTML
16601674 # entities. We need to fix those.
@@ -1745,13 +1759,7 @@ def clean_input(x):
17451759 mlist .setMemberOption (member , mm_cfg .Moderate , val )
17461760 # do the user options for members category
17471761 if 'setmemberopts_btn' in cgidata and 'user' in cgidata :
1748- user = cgidata ['user' ]
1749- if type (user ) is list :
1750- users = []
1751- for ui in range (len (user )):
1752- users .append (urllib .parse .unquote (user [ui ].value ))
1753- else :
1754- users = [urllib .parse .unquote (user .value )]
1762+ users = [urllib .parse .unquote (u ) for u in cgidata .getlist ('user' )]
17551763 errors = []
17561764 removes = []
17571765 for user in users :
0 commit comments