Skip to content

Commit ff5d410

Browse files
Don't lost opening bracket in get_domain_literal
+ fix tests and news entry
1 parent 848a218 commit ff5d410

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

Lib/email/_header_value_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1594,9 +1594,9 @@ def get_domain_literal(value):
15941594
raise errors.HeaderParseError("expected '[' at start of domain-literal "
15951595
"but found '{}'".format(value))
15961596
value = value[1:]
1597+
domain_literal.append(ValueTerminal('[', 'domain-literal-start'))
15971598
if _check_for_early_dl_end(value, domain_literal):
15981599
return domain_literal, value
1599-
domain_literal.append(ValueTerminal('[', 'domain-literal-start'))
16001600
if value[0] in WSP:
16011601
token, value = get_fws(value)
16021602
domain_literal.append(token)

Lib/test/test_email/test__header_value_parser.py

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2492,23 +2492,35 @@ def test_get_address_quoted_strings_in_atom_list(self):
24922492
self.assertEqual(address.all_mailboxes[0].addr_spec, '"example example"@example.com')
24932493

24942494
def test_get_address_with_invalid_domain(self):
2495-
address = parser.get_address("<T@[")
2496-
self.assertEqual(len(address), 2)
2497-
self.assertEqual(address[0].token_type, 'address')
2498-
self.assertEqual(address[0].all_mailboxes[0].local_part, 'T')
2499-
self.assertEqual(address[0].all_mailboxes[0].domain, ']')
2500-
self.assertEqual(address[0].all_mailboxes[0].addr_spec, 'T@]')
2501-
self.assertEqual(str(address[0].all_defects[0]), "missing trailing '>' on angle-addr")
2502-
self.assertEqual(str(address[0].all_defects[1]), "end of input inside domain-literal")
2503-
2504-
address = parser.get_address("!an??:=m==fr2@[C")
2505-
self.assertEqual(len(address), 2)
2506-
self.assertEqual(address[0].token_type, 'address')
2507-
self.assertEqual(address[0].all_mailboxes[0].local_part, '=m==fr2')
2508-
self.assertEqual(address[0].all_mailboxes[0].domain, '[C]')
2509-
self.assertEqual(address[0].all_mailboxes[0].addr_spec, '=m==fr2@[C]')
2510-
self.assertEqual(str(address[0].all_defects[0]), "end of header in group")
2511-
self.assertEqual(str(address[0].all_defects[1]), "end of input inside domain-literal")
2495+
address = self._test_get_x(parser.get_address,
2496+
'<T@[',
2497+
'<T@[]>',
2498+
'<T@[]>',
2499+
[errors.InvalidHeaderDefect, # missing trailing '>' on angle-addr
2500+
errors.InvalidHeaderDefect, # end of input inside domain-literal
2501+
],
2502+
'')
2503+
self.assertEqual(address.token_type, 'address')
2504+
self.assertEqual(len(address.mailboxes), 0)
2505+
self.assertEqual(len(address.all_mailboxes), 1)
2506+
self.assertEqual(address.all_mailboxes[0].domain, '[]')
2507+
self.assertEqual(address.all_mailboxes[0].local_part, 'T')
2508+
self.assertEqual(address[0].token_type, 'invalid-mailbox')
2509+
2510+
address = self._test_get_x(parser.get_address,
2511+
'!an??:=m==fr2@[C',
2512+
'!an??:=m==fr2@[C];',
2513+
'!an??:=m==fr2@[C];',
2514+
[errors.InvalidHeaderDefect, # end of header in group
2515+
errors.InvalidHeaderDefect, # end of input inside domain-literal
2516+
],
2517+
'')
2518+
self.assertEqual(address.token_type, 'address')
2519+
self.assertEqual(len(address.mailboxes), 0)
2520+
self.assertEqual(len(address.all_mailboxes), 1)
2521+
self.assertEqual(address.all_mailboxes[0].domain, '[C]')
2522+
self.assertEqual(address.all_mailboxes[0].local_part, '=m==fr2')
2523+
self.assertEqual(address[0].token_type, 'group')
25122524

25132525
# get_address_list
25142526

@@ -2784,7 +2796,14 @@ def test_parse_valid_message_id(self):
27842796
self.assertEqual(message_id.token_type, 'message-id')
27852797

27862798
def test_parse_message_id_with_invalid_domain(self):
2787-
message_id = parser.parse_message_id("<T@[")
2799+
message_id = self._test_parse_x(
2800+
parser.parse_message_id,
2801+
"<T@[",
2802+
"<T@[]>",
2803+
"<T@[]>",
2804+
[errors.ObsoleteHeaderDefect] + [errors.InvalidHeaderDefect] * 2,
2805+
[],
2806+
)
27882807
self.assertEqual(message_id.token_type, 'message-id')
27892808
self.assertEqual(str(message_id.all_defects[-1]),
27902809
"end of input inside domain-literal")
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
:mod:`email`: Fix parsing of emails message ID with invalid domain.
1+
:mod:`email`: Fix parsing of email message ID with invalid domain.

0 commit comments

Comments
 (0)