Add support for detecting hostname based addresses as internal (#67407)

This commit is contained in:
Paulus Schoutsen 2022-03-01 16:56:05 -08:00 committed by GitHub
parent de2ddfe7b7
commit 65eefcacfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 17 deletions

View File

@ -25,7 +25,9 @@ class NoURLAvailableError(HomeAssistantError):
def is_internal_request(hass: HomeAssistant) -> bool:
"""Test if the current request is internal."""
try:
_get_internal_url(hass, require_current_request=True)
get_url(
hass, allow_external=False, allow_cloud=False, require_current_request=True
)
return True
except NoURLAvailableError:
return False

View File

@ -759,7 +759,10 @@ async def test_media_browse(
assert msg["result"]["children"][0]["title"] == "Roku Channel Store"
assert msg["result"]["children"][0]["media_content_type"] == MEDIA_TYPE_APP
assert msg["result"]["children"][0]["media_content_id"] == "11"
assert "/browse_media/app/11" in msg["result"]["children"][0]["thumbnail"]
assert (
msg["result"]["children"][0]["thumbnail"]
== "http://192.168.1.160:8060/query/icon/11"
)
assert msg["result"]["children"][0]["can_play"]
# test invalid media type
@ -1016,14 +1019,18 @@ async def test_tv_media_browse(
assert msg["result"]["children"][0]["media_content_type"] == MEDIA_TYPE_APP
assert msg["result"]["children"][0]["media_content_id"] == "tvinput.hdmi2"
assert (
"/browse_media/app/tvinput.hdmi2" in msg["result"]["children"][0]["thumbnail"]
msg["result"]["children"][0]["thumbnail"]
== "http://192.168.1.160:8060/query/icon/tvinput.hdmi2"
)
assert msg["result"]["children"][0]["can_play"]
assert msg["result"]["children"][3]["title"] == "Roku Channel Store"
assert msg["result"]["children"][3]["media_content_type"] == MEDIA_TYPE_APP
assert msg["result"]["children"][3]["media_content_id"] == "11"
assert "/browse_media/app/11" in msg["result"]["children"][3]["thumbnail"]
assert (
msg["result"]["children"][3]["thumbnail"]
== "http://192.168.1.160:8060/query/icon/11"
)
assert msg["result"]["children"][3]["can_play"]
# test channels

View File

@ -20,6 +20,17 @@ from homeassistant.helpers.network import (
from tests.common import mock_component
@pytest.fixture(name="mock_current_request")
def mock_current_request_mock():
"""Mock the current request."""
mock_current_request = Mock(name="mock_request")
with patch(
"homeassistant.helpers.network.http.current_request",
Mock(get=mock_current_request),
):
yield mock_current_request
async def test_get_url_internal(hass: HomeAssistant):
"""Test getting an instance URL when the user has set an internal URL."""
assert hass.config.internal_url is None
@ -611,7 +622,7 @@ async def test_get_current_request_url_with_known_host(
get_url(hass, require_current_request=True)
async def test_is_internal_request(hass: HomeAssistant):
async def test_is_internal_request(hass: HomeAssistant, mock_current_request):
"""Test if accessing an instance on its internal URL."""
# Test with internal URL: http://example.local:8123
await async_process_ha_core_config(
@ -620,18 +631,16 @@ async def test_is_internal_request(hass: HomeAssistant):
)
assert hass.config.internal_url == "http://example.local:8123"
# No request active
mock_current_request.return_value = None
assert not is_internal_request(hass)
with patch(
"homeassistant.helpers.network._get_request_host", return_value="example.local"
):
assert is_internal_request(hass)
mock_current_request.return_value = Mock(url="http://example.local:8123")
assert is_internal_request(hass)
with patch(
"homeassistant.helpers.network._get_request_host",
return_value="no_match.example.local",
):
assert not is_internal_request(hass)
mock_current_request.return_value = Mock(url="http://no_match.example.local:8123")
assert not is_internal_request(hass)
# Test with internal URL: http://192.168.0.1:8123
await async_process_ha_core_config(
@ -642,10 +651,26 @@ async def test_is_internal_request(hass: HomeAssistant):
assert hass.config.internal_url == "http://192.168.0.1:8123"
assert not is_internal_request(hass)
with patch(
"homeassistant.helpers.network._get_request_host", return_value="192.168.0.1"
mock_current_request.return_value = Mock(url="http://192.168.0.1:8123")
assert is_internal_request(hass)
# Test for matching against local IP
hass.config.api = Mock(use_ssl=False, local_ip="192.168.123.123", port=8123)
for allowed in ("127.0.0.1", "192.168.123.123"):
mock_current_request.return_value = Mock(url=f"http://{allowed}:8123")
assert is_internal_request(hass), mock_current_request.return_value.url
# Test for matching against HassOS hostname
with patch.object(
hass.components.hassio, "is_hassio", return_value=True
), patch.object(
hass.components.hassio,
"get_host_info",
return_value={"hostname": "hellohost"},
):
assert is_internal_request(hass)
for allowed in ("hellohost", "hellohost.local"):
mock_current_request.return_value = Mock(url=f"http://{allowed}:8123")
assert is_internal_request(hass), mock_current_request.return_value.url
async def test_is_hass_url(hass):