Add support for detecting hostname based addresses as internal (#67407)
This commit is contained in:
parent
de2ddfe7b7
commit
65eefcacfc
3 changed files with 51 additions and 17 deletions
|
@ -25,7 +25,9 @@ class NoURLAvailableError(HomeAssistantError):
|
||||||
def is_internal_request(hass: HomeAssistant) -> bool:
|
def is_internal_request(hass: HomeAssistant) -> bool:
|
||||||
"""Test if the current request is internal."""
|
"""Test if the current request is internal."""
|
||||||
try:
|
try:
|
||||||
_get_internal_url(hass, require_current_request=True)
|
get_url(
|
||||||
|
hass, allow_external=False, allow_cloud=False, require_current_request=True
|
||||||
|
)
|
||||||
return True
|
return True
|
||||||
except NoURLAvailableError:
|
except NoURLAvailableError:
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -759,7 +759,10 @@ async def test_media_browse(
|
||||||
assert msg["result"]["children"][0]["title"] == "Roku Channel Store"
|
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_type"] == MEDIA_TYPE_APP
|
||||||
assert msg["result"]["children"][0]["media_content_id"] == "11"
|
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"]
|
assert msg["result"]["children"][0]["can_play"]
|
||||||
|
|
||||||
# test invalid media type
|
# 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_type"] == MEDIA_TYPE_APP
|
||||||
assert msg["result"]["children"][0]["media_content_id"] == "tvinput.hdmi2"
|
assert msg["result"]["children"][0]["media_content_id"] == "tvinput.hdmi2"
|
||||||
assert (
|
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"][0]["can_play"]
|
||||||
|
|
||||||
assert msg["result"]["children"][3]["title"] == "Roku Channel Store"
|
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_type"] == MEDIA_TYPE_APP
|
||||||
assert msg["result"]["children"][3]["media_content_id"] == "11"
|
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"]
|
assert msg["result"]["children"][3]["can_play"]
|
||||||
|
|
||||||
# test channels
|
# test channels
|
||||||
|
|
|
@ -20,6 +20,17 @@ from homeassistant.helpers.network import (
|
||||||
from tests.common import mock_component
|
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):
|
async def test_get_url_internal(hass: HomeAssistant):
|
||||||
"""Test getting an instance URL when the user has set an internal URL."""
|
"""Test getting an instance URL when the user has set an internal URL."""
|
||||||
assert hass.config.internal_url is None
|
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)
|
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 if accessing an instance on its internal URL."""
|
||||||
# Test with internal URL: http://example.local:8123
|
# Test with internal URL: http://example.local:8123
|
||||||
await async_process_ha_core_config(
|
await async_process_ha_core_config(
|
||||||
|
@ -620,17 +631,15 @@ async def test_is_internal_request(hass: HomeAssistant):
|
||||||
)
|
)
|
||||||
|
|
||||||
assert hass.config.internal_url == "http://example.local:8123"
|
assert hass.config.internal_url == "http://example.local:8123"
|
||||||
|
|
||||||
|
# No request active
|
||||||
|
mock_current_request.return_value = None
|
||||||
assert not is_internal_request(hass)
|
assert not is_internal_request(hass)
|
||||||
|
|
||||||
with patch(
|
mock_current_request.return_value = Mock(url="http://example.local:8123")
|
||||||
"homeassistant.helpers.network._get_request_host", return_value="example.local"
|
|
||||||
):
|
|
||||||
assert is_internal_request(hass)
|
assert is_internal_request(hass)
|
||||||
|
|
||||||
with patch(
|
mock_current_request.return_value = Mock(url="http://no_match.example.local:8123")
|
||||||
"homeassistant.helpers.network._get_request_host",
|
|
||||||
return_value="no_match.example.local",
|
|
||||||
):
|
|
||||||
assert not is_internal_request(hass)
|
assert not is_internal_request(hass)
|
||||||
|
|
||||||
# Test with internal URL: http://192.168.0.1:8123
|
# Test with internal URL: http://192.168.0.1:8123
|
||||||
|
@ -642,11 +651,27 @@ async def test_is_internal_request(hass: HomeAssistant):
|
||||||
assert hass.config.internal_url == "http://192.168.0.1:8123"
|
assert hass.config.internal_url == "http://192.168.0.1:8123"
|
||||||
assert not is_internal_request(hass)
|
assert not is_internal_request(hass)
|
||||||
|
|
||||||
with patch(
|
mock_current_request.return_value = Mock(url="http://192.168.0.1:8123")
|
||||||
"homeassistant.helpers.network._get_request_host", return_value="192.168.0.1"
|
|
||||||
):
|
|
||||||
assert is_internal_request(hass)
|
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"},
|
||||||
|
):
|
||||||
|
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):
|
async def test_is_hass_url(hass):
|
||||||
"""Test is_hass_url."""
|
"""Test is_hass_url."""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue