Skip to content

Commit 414e4ac

Browse files
Only emit a warning if validate=False.
1 parent 15b39c5 commit 414e4ac

2 files changed

Lines changed: 28 additions & 5 deletions

File tree

Lib/base64.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,27 @@ def b64decode(s, altchars=None, validate=False):
7878
https://docs.python.org/3.11/library/binascii.html#binascii.a2b_base64
7979
"""
8080
s = _bytes_from_decode_data(s)
81+
badchar = None
8182
if altchars is not None:
8283
altchars = _bytes_from_decode_data(altchars)
8384
if len(altchars) != 2:
8485
raise ValueError(f'invalid altchars: {altchars!r}')
85-
s = s.translate(bytes.maketrans(b'+/' + altchars, altchars + b'+/'))
86-
return binascii.a2b_base64(s, strict_mode=validate)
86+
if validate:
87+
s = s.translate(bytes.maketrans(b'+/' + altchars, altchars + b'+/'))
88+
else:
89+
for b in set(b'+/') - set(altchars):
90+
if b in s:
91+
badchar = b
92+
break
93+
s = s.translate(bytes.maketrans(altchars, b'+/'))
94+
result = binascii.a2b_base64(s, strict_mode=validate)
95+
if badchar is not None:
96+
import warnings
97+
warnings.warn(f'invalid character {chr(badchar)!a} in base64 data '
98+
f'with altchars={altchars!r} will be discarded in '
99+
f'future Python versions',
100+
FutureWarning, stacklevel=2)
101+
return result
87102

88103

89104
def standard_b64encode(s):

Lib/test/test_base64.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,13 +301,21 @@ def test_b64decode_invalid_chars(self):
301301
with self.assertRaises(binascii.Error):
302302
base64.b64decode(bstr.decode('ascii'), validate=True)
303303

304-
# Normal alphabet characters are discarded when alternative given
305-
self.assertEqual(base64.b64decode(b'++//', altchars=b'-_'), b'')
306-
self.assertEqual(base64.urlsafe_b64decode(b'++//'), b'')
304+
# Normal alphabet characters will be discarded when alternative given
305+
with self.assertWarns(FutureWarning):
306+
self.assertEqual(base64.b64decode(b'++++', altchars=b'-_'),
307+
b'\xfb\xef\xbe')
308+
with self.assertWarns(FutureWarning):
309+
self.assertEqual(base64.b64decode(b'////', altchars=b'-_'),
310+
b'\xff\xff\xff')
311+
self.assertEqual(base64.urlsafe_b64decode(b'++++'), b'')
312+
self.assertEqual(base64.urlsafe_b64decode(b'////'), b'')
307313
with self.assertRaises(binascii.Error):
308314
base64.b64decode(b'++++', altchars=b'-_', validate=True)
309315
with self.assertRaises(binascii.Error):
310316
base64.b64decode(b'////', altchars=b'-_', validate=True)
317+
with self.assertRaises(binascii.Error):
318+
base64.b64decode(b'+/!', altchars=b'-_')
311319

312320
def _altchars_strategy():
313321
"""Generate 'altchars' for base64 encoding."""

0 commit comments

Comments
 (0)