mirror of
https://github.com/unshackle-dl/unshackle.git
synced 2026-11-12 20:15:10 +00:00
fix(proxy): do not warn about requests to a configured remote CDM
This commit is contained in:
@@ -198,6 +198,8 @@ file and line, to the service maintainer.
|
|||||||
|
|
||||||
A request to your own machine or to your local network gives no warning. This includes a
|
A request to your own machine or to your local network gives no warning. This includes a
|
||||||
private IP address such as `192.168.1.50`, and a `.local`, `.lan` or `.home.arpa` host name.
|
private IP address such as `192.168.1.50`, and a `.local`, `.lan` or `.home.arpa` host name.
|
||||||
|
A request to the `host` of a remote CDM in `remote_cdm` also gives no warning. The CDM API
|
||||||
|
sees your own IP, but the service does not.
|
||||||
|
|
||||||
A `socks5://` proxy makes the DNS lookup of each host on your machine and gives no warning.
|
A `socks5://` proxy makes the DNS lookup of each host on your machine and gives no warning.
|
||||||
Use `socks5h://` to make the proxy do the DNS lookups too.
|
Use `socks5h://` to make the proxy do the DNS lookups too.
|
||||||
|
|||||||
@@ -84,6 +84,16 @@ def test_proxy_and_local_hosts_do_not_warn(caplog, host):
|
|||||||
assert leaks(caplog) == []
|
assert leaks(caplog) == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_remote_cdm_host_does_not_warn(caplog, monkeypatch):
|
||||||
|
"""A service calls its remote CDM itself, so no core frame ends the walk; the CDM API is not the service."""
|
||||||
|
from unshackle.core.config import config
|
||||||
|
|
||||||
|
monkeypatch.setattr(config, "remote_cdm", [{"name": "pr", "host": "https://cdm.example/playready"}])
|
||||||
|
with caplog.at_level(logging.WARNING):
|
||||||
|
lookup("cdm.example")
|
||||||
|
assert leaks(caplog) == []
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("host", ["8.8.8.8", "2606:4700:4700::1111", "api.example"])
|
@pytest.mark.parametrize("host", ["8.8.8.8", "2606:4700:4700::1111", "api.example"])
|
||||||
def test_public_hosts_warn(caplog, host):
|
def test_public_hosts_warn(caplog, host):
|
||||||
with caplog.at_level(logging.WARNING):
|
with caplog.at_level(logging.WARNING):
|
||||||
|
|||||||
@@ -134,6 +134,13 @@ def fallback_session() -> requests.Session:
|
|||||||
return session
|
return session
|
||||||
|
|
||||||
|
|
||||||
|
def cdm_hosts() -> set[str]:
|
||||||
|
"""The hosts of the remote CDMs in the config: a CDM API of the user, which a service calls direct."""
|
||||||
|
from unshackle.core.config import config
|
||||||
|
|
||||||
|
return {hostname(str(x.get("host") or x.get("Host") or "")) for x in config.remote_cdm}
|
||||||
|
|
||||||
|
|
||||||
def is_local(host: str) -> bool:
|
def is_local(host: str) -> bool:
|
||||||
"""True for this machine and the local network, which never see the internet IP of the user."""
|
"""True for this machine and the local network, which never see the internet IP of the user."""
|
||||||
if host in ("localhost", "localhost.", "localhost.localdomain"):
|
if host in ("localhost", "localhost.", "localhost.localdomain"):
|
||||||
@@ -177,7 +184,7 @@ def check(host: Any, frame: Optional[FrameType]) -> None:
|
|||||||
if isinstance(host, bytes):
|
if isinstance(host, bytes):
|
||||||
host = host.decode(errors="replace")
|
host = host.decode(errors="replace")
|
||||||
host = str(host or "").lower().strip("[]")
|
host = str(host or "").lower().strip("[]")
|
||||||
if not host or is_local(host) or host in proxy_hosts:
|
if not host or is_local(host) or host in proxy_hosts or host in cdm_hosts():
|
||||||
return
|
return
|
||||||
found = find_service(frame, through_core=False)
|
found = find_service(frame, through_core=False)
|
||||||
if not found:
|
if not found:
|
||||||
|
|||||||
Reference in New Issue
Block a user