| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1964,6 +1964,8 @@ def get_domain(value): | |||
| 1964 | 1964 | token, value = get_dot_atom(value) | |
| 1965 | 1965 | except errors.HeaderParseError: | |
| 1966 | 1966 | token, value = get_atom(value) | |
| 1967 | + if value and value[0] == '@': | ||
| 1968 | + raise errors.HeaderParseError('Invalid Domain') | ||
| 1967 | 1969 | if leader is not None: | |
| 1968 | 1970 | token[:0] = [leader] | |
| 1969 | 1971 | domain.append(token) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -379,7 +379,12 @@ def getaddrspec(self): | |||
| 379 | 379 | aslist.append('@') | |
| 380 | 380 | self.pos += 1 | |
| 381 | 381 | self.gotonext() | |
| 382 | - return EMPTYSTRING.join(aslist) + self.getdomain() | ||
| 382 | + domain = self.getdomain() | ||
| 383 | + if not domain: | ||
| 384 | + # Invalid domain, return an empty address instead of returning a | ||
| 385 | + # local part to denote failed parsing. | ||
| 386 | + return EMPTYSTRING | ||
| 387 | + return EMPTYSTRING.join(aslist) + domain | ||
| 383 | 388 | ||
| 384 | 389 | def getdomain(self): | |
| 385 | 390 | """Get the complete domain name from an address.""" | |
@@ -394,6 +399,10 @@ def getdomain(self): | |||
| 394 | 399 | elif self.field[self.pos] == '.': | |
| 395 | 400 | self.pos += 1 | |
| 396 | 401 | sdlist.append('.') | |
| 402 | + elif self.field[self.pos] == '@': | ||
| 403 | + # bpo-34155: Don't parse domains with two `@` like | ||
| 404 | + # `a@malicious.org@important.com`. | ||
| 405 | + return EMPTYSTRING | ||
| 397 | 406 | elif self.field[self.pos] in self.atomends: | |
| 398 | 407 | break | |
| 399 | 408 | else: | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1418,6 +1418,16 @@ def test_get_addr_spec_dot_atom(self): | |||
| 1418 | 1418 | self.assertEqual(addr_spec.domain, 'example.com') | |
| 1419 | 1419 | self.assertEqual(addr_spec.addr_spec, 'star.a.star@example.com') | |
| 1420 | 1420 | ||
| 1421 | + def test_get_addr_spec_multiple_domains(self): | ||
| 1422 | + with self.assertRaises(errors.HeaderParseError): | ||
| 1423 | + parser.get_addr_spec('star@a.star@example.com') | ||
| 1424 | + | ||
| 1425 | + with self.assertRaises(errors.HeaderParseError): | ||
| 1426 | + parser.get_addr_spec('star@a@example.com') | ||
| 1427 | + | ||
| 1428 | + with self.assertRaises(errors.HeaderParseError): | ||
| 1429 | + parser.get_addr_spec('star@172.17.0.1@example.com') | ||
| 1430 | + | ||
| 1421 | 1431 | # get_obs_route | |
| 1422 | 1432 | ||
| 1423 | 1433 | def test_get_obs_route_simple(self): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -3015,6 +3015,20 @@ def test_parseaddr_empty(self): | |||
| 3015 | 3015 | self.assertEqual(utils.parseaddr('<>'), ('', '')) | |
| 3016 | 3016 | self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '') | |
| 3017 | 3017 | ||
| 3018 | + def test_parseaddr_multiple_domains(self): | ||
| 3019 | + self.assertEqual( | ||
| 3020 | + utils.parseaddr('a@b@c'), | ||
| 3021 | + ('', '') | ||
| 3022 | + ) | ||
| 3023 | + self.assertEqual( | ||
| 3024 | + utils.parseaddr('a@b.c@c'), | ||
| 3025 | + ('', '') | ||
| 3026 | + ) | ||
| 3027 | + self.assertEqual( | ||
| 3028 | + utils.parseaddr('a@172.17.0.1@c'), | ||
| 3029 | + ('', '') | ||
| 3030 | + ) | ||
| 3031 | + | ||
| 3018 | 3032 | def test_noquote_dump(self): | |
| 3019 | 3033 | self.assertEqual( | |
| 3020 | 3034 | utils.formataddr(('A Silly Person', 'person@dom.ain')), | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1 @@ | |||
| 1 | + Fix parsing of invalid email addresses with more than one ``@`` (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email address. Patch by maxking & jpic. | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments