Sfoglia il codice sorgente

Fix delete_header not deleting all header occurences

Son NK 5 anni fa
parent
commit
4c383663f4
2 ha cambiato i file con 21 aggiunte e 3 eliminazioni
  1. 5 3
      app/email_utils.py
  2. 16 0
      tests/test_email_utils.py

+ 5 - 3
app/email_utils.py

@@ -299,9 +299,11 @@ def add_or_replace_header(msg: Message, header: str, value: str):
 
 def delete_header(msg: Message, header: str):
     """a header can appear several times in message."""
-    for h in msg._headers:
-        if h[0].lower() == header.lower():
-            msg._headers.remove(h)
+    # inspired from https://stackoverflow.com/a/47903323/1428034
+    for i in reversed(range(len(msg._headers))):
+        header_name = msg._headers[i][0].lower()
+        if header_name == header.lower():
+            del msg._headers[i]
 
 
 def email_belongs_to_alias_domains(email: str) -> bool:

+ 16 - 0
tests/test_email_utils.py

@@ -1,3 +1,5 @@
+from email.message import EmailMessage
+
 from app.email_utils import (
     get_email_name,
     get_email_part,
@@ -5,6 +7,7 @@ from app.email_utils import (
     get_email_domain_part,
     email_belongs_to_alias_domains,
     can_be_used_as_personal_email,
+    delete_header,
 )
 from app.extensions import db
 from app.models import User, CustomDomain
@@ -55,3 +58,16 @@ def test_can_be_used_as_personal_email(flask_client):
     CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True)
     db.session.commit()
     assert not can_be_used_as_personal_email("hey@ab.cd")
+
+
+def test_delete_header():
+    msg = EmailMessage()
+    assert msg._headers == []
+
+    msg["H"] = "abcd"
+    msg["H"] = "xyzt"
+
+    assert msg._headers == [("H", "abcd"), ("H", "xyzt")]
+
+    delete_header(msg, "H")
+    assert msg._headers == []