aboutsummaryrefslogtreecommitdiff
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)