Coverage for app/backend/src/couchers/email/zz.py: 93%

26 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-11-02 00:34 +0000

1""" 

2Email zz ids: see which emails are useful, and help with spam classification. 

3""" 

4 

5import base64 

6import html 

7import re 

8import secrets 

9from urllib.parse import urlsplit, urlunsplit 

10 

11from couchers.config import config 

12 

13ZZ_PARAM = "zz" 

14 

15ZZ_RE = re.compile(r"[A-Za-z0-9_-]{16}") 

16 

17OPEN_PIXEL_GIF = base64.b64decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 

18 

19 

20def generate_zz() -> str: 

21 return secrets.token_urlsafe(12) 

22 

23 

24def _add_param(url: str, zz: str) -> str: 

25 parts = urlsplit(url) 

26 param = f"{ZZ_PARAM}={zz}" 

27 return urlunsplit(parts._replace(query=f"{parts.query}&{param}" if parts.query else param)) 

28 

29 

30def add_zz_to_html_links(body: str, zz: str) -> str: 

31 href_re = re.compile(r'(href=")(' + re.escape(config.BASE_URL) + r'(?:[/?#][^"]*)?)(")') 

32 return href_re.sub(lambda m: m.group(1) + html.escape(_add_param(html.unescape(m.group(2)), zz)) + m.group(3), body) 

33 

34 

35def open_pixel_url(zz: str) -> str: 

36 return f"{config.BACKEND_BASE_URL}/email/open/{zz}" 

37 

38 

39def add_open_pixel(body: str, zz: str) -> str: 

40 pixel = f'<img src="{open_pixel_url(zz)}" width="1" height="1" alt="" style="display:block;border:0;">' 

41 head, body_end, tail = body.rpartition("</body>") 

42 if not body_end: 42 ↛ 43line 42 didn't jump to line 43 because the condition on line 42 was never true

43 return body + pixel 

44 return head + pixel + body_end + tail