Skip to content

Commit e8ca973

Browse files
authored
Update key id pattern (#41)
* Update key id pattern * Validate URLs when constructing UrlKeyResolver
1 parent 6d51825 commit e8ca973

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

dnstapir/key_resolver.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,18 @@ def get_public_key_pem(self, key_id: str) -> bytes:
8888
class UrlKeyResolver(CacheKeyResolver):
8989
def __init__(self, client_database_base_url: str, key_cache: KeyCache | None = None):
9090
super().__init__(key_cache=key_cache)
91+
9192
self.client_database_base_url = client_database_base_url
9293
self._httpx_client: httpx.Client | None = None
93-
self.key_id_pattern = "%s"
94+
self.key_id_pattern = "{key_id}"
95+
96+
if urlparse(self.client_database_base_url).scheme not in ("http", "https"):
97+
raise ValueError(f"Invalid URL: {self.client_database_base_url}")
98+
99+
if self.key_id_pattern in self.client_database_base_url:
100+
test_url = self.client_database_base_url.replace(self.key_id_pattern, "test")
101+
if urlparse(test_url).scheme not in ("http", "https"):
102+
raise ValueError(f"Invalid URL pattern: {self.client_database_base_url}")
94103

95104
def get_public_key_pem(self, key_id: str) -> bytes:
96105
with tracer.start_as_current_span("get_public_key_pem_from_url"):

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "dnstapir"
3-
version = "1.2.0"
3+
version = "1.2.1"
44
description = "DNS TAPIR Python Library"
55
authors = ["Jakob Schlyter <[email protected]>"]
66
readme = "README.md"

tests/test_key_resolver.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_url_key_resolver_pattern(httpx_mock: HTTPXMock):
6666
httpx_mock.add_response(url=f"https://nodeman/api/v1/node/{key_id}/public_key", content=public_key_pem)
6767
httpx_mock.add_response(url="https://nodeman/api/v1/node/unknown/public_key", status_code=404)
6868

69-
resolver = UrlKeyResolver(client_database_base_url="https://nodeman/api/v1/node/%s/public_key")
69+
resolver = UrlKeyResolver(client_database_base_url="https://nodeman/api/v1/node/{key_id}/public_key")
7070
res = resolver.resolve_public_key(key_id)
7171
assert res == public_key
7272

@@ -77,6 +77,14 @@ def test_url_key_resolver_pattern(httpx_mock: HTTPXMock):
7777
_ = resolver.resolve_public_key("unknown")
7878

7979

80+
def test_url_bad_key_resolver_pattern():
81+
with pytest.raises(ValueError):
82+
_ = UrlKeyResolver(client_database_base_url="ftp://nodeman/api/v1/node/{key_id}/public_key")
83+
84+
with pytest.raises(ValueError):
85+
_ = UrlKeyResolver(client_database_base_url="ftp://keys")
86+
87+
8088
def test_url_key_resolver_contextlib(httpx_mock: HTTPXMock):
8189
key_id = "xyzzy"
8290
public_key = ed25519.Ed25519PrivateKey.generate().public_key()

0 commit comments

Comments
 (0)