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
« 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"""
5import base64
6import html
7import re
8import secrets
9from urllib.parse import urlsplit, urlunsplit
11from couchers.config import config
13ZZ_PARAM = "zz"
15ZZ_RE = re.compile(r"[A-Za-z0-9_-]{16}")
17OPEN_PIXEL_GIF = base64.b64decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")
20def generate_zz() -> str:
21 return secrets.token_urlsafe(12)
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))
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)
35def open_pixel_url(zz: str) -> str:
36 return f"{config.BACKEND_BASE_URL}/email/open/{zz}"
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