about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNguyễn Gia Phong <cnx@loang.net>2025-06-03 12:01:31 +0900
committerNguyễn Gia Phong <cnx@loang.net>2025-06-03 12:01:31 +0900
commitddaee1e438b06ced6ec621db0e37d4c9968fe835 (patch)
treebee560957713ef86d8ee5025dfa23c781a44ec2e /src
parent49d8d80508afcdb651183eb683f3d29403540a04 (diff)
downloadscadere-ddaee1e438b06ced6ec621db0e37d4c9968fe835.tar.gz
Fix subdomain filtering
Diffstat (limited to 'src')
-rw-r--r--src/scadere/listen.py18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/scadere/listen.py b/src/scadere/listen.py
index 982f547..6dc8f3a 100644
--- a/src/scadere/listen.py
+++ b/src/scadere/listen.py
@@ -127,6 +127,20 @@ async def write_xml(writer, document):
         await writer.drain()
 
 
+def split_domain(domain):
+    """Split domain and order by ascending level."""
+    return tuple(domain.split('.')[::-1])
+
+
+def is_subdomain(subject, objects):
+    """Check if subject is a subdomain of any object."""
+    if not objects:
+        return True
+    sbj_parts = split_domain(subject)
+    return any(sbj_parts[:len(obj_parts)] == obj_parts
+               for obj_parts in map(split_domain, objects))
+
+
 async def handle(certs, base_url, reader, writer):
     """Handle HTTP request."""
     summaries = map(parse_summary, certs.read_text().splitlines())
@@ -138,7 +152,7 @@ async def handle(certs, base_url, reader, writer):
     request = await reader.readuntil(b'\r\n')
     url = request.removeprefix(b'GET ').rsplit(b' HTTP/', 1)[0].strip()
     url_parts = urlsplit(urljoin(base_url, url.decode()))
-    domains = tuple(parse_qs(url_parts.query).get('domain', ['']))
+    domains = tuple(parse_qs(url_parts.query).get('domain', []))
 
     if not request.startswith(b'GET '):
         await describe_status(writer, HTTPStatus.METHOD_NOT_ALLOWED)
@@ -155,7 +169,7 @@ async def handle(certs, base_url, reader, writer):
                   'version': __version__},
                  'Scadere'),
                 *(entry(base_url, cert) for cert in lookup.values()
-                  if cert[2].endswith(domains)))
+                  if is_subdomain(cert[2], domains)))
         await write_xml(writer, feed)
     elif url_parts.path in lookup:  # accessible Atom entry's link/ID
         await write_status(writer, HTTPStatus.OK)