Skip to content

Commit 6566538

Browse files
committed
Fix admin GUI form handling for Mailman.Utils.FieldStorage.
GUIBase.handleForm used cgidata[key].value as with legacy cgi.FieldStorage; Utils.FieldStorage returns plain strings from __getitem__/getvalue. Use getfirst/getlist, Checkbox via getlist, and filename/file for multipart uploads instead.
1 parent f6ad1ee commit 6566538

1 file changed

Lines changed: 29 additions & 5 deletions

File tree

Mailman/Gui/GUIBase.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from builtins import str
2121
from builtins import object
22+
import os
2223
import re
2324

2425
from Mailman import mm_cfg
@@ -158,14 +159,37 @@ def handleForm(self, mlist, category, subcat, cgidata, doc):
158159
#
159160
# The property may be uploadable...
160161
uploadprop = property + '_upload'
161-
if uploadprop in cgidata and cgidata[uploadprop].value:
162-
val = cgidata[uploadprop].value
162+
fname = getattr(cgidata, 'filename', None)
163+
if callable(fname) and fname(uploadprop):
164+
fobj = cgidata.file(uploadprop)
165+
if fobj is not None:
166+
try:
167+
raw = fobj.read()
168+
finally:
169+
try:
170+
fobj.close()
171+
except EnvironmentError:
172+
pass
173+
try:
174+
os.unlink(fobj.name)
175+
except OSError:
176+
pass
177+
enc = getattr(cgidata, 'encoding', None) or 'utf-8'
178+
if isinstance(raw, bytes):
179+
val = raw.decode(enc, getattr(cgidata, 'errors', None)
180+
or 'replace')
181+
else:
182+
val = raw
183+
else:
184+
continue
185+
elif uploadprop in cgidata and cgidata.getfirst(uploadprop):
186+
val = cgidata.getfirst(uploadprop)
163187
elif property not in cgidata:
164188
continue
165-
elif isinstance(cgidata[property], list):
166-
val = [x.value for x in cgidata[property]]
189+
elif wtype == mm_cfg.Checkbox:
190+
val = cgidata.getlist(property)
167191
else:
168-
val = cgidata[property].value
192+
val = cgidata.getfirst(property)
169193
# Coerce the value to the expected type, raising exceptions if the
170194
# value is invalid.
171195
try:

0 commit comments

Comments
 (0)