Warn for old Google SDK version (#72403)

This commit is contained in:
Paulus Schoutsen 2022-05-24 01:26:25 -07:00 committed by GitHub
parent f0b9aa7894
commit 3cd398a5bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 100 additions and 1 deletions

View File

@ -10,6 +10,7 @@ import logging
import pprint
from aiohttp.web import json_response
from awesomeversion import AwesomeVersion
from homeassistant.components import webhook
from homeassistant.const import (
@ -43,6 +44,8 @@ from .error import SmartHomeError
SYNC_DELAY = 15
_LOGGER = logging.getLogger(__name__)
LOCAL_SDK_VERSION_HEADER = "HA-Cloud-Version"
LOCAL_SDK_MIN_VERSION = AwesomeVersion("2.1.5")
@callback
@ -86,6 +89,7 @@ class AbstractConfig(ABC):
self._google_sync_unsub = {}
self._local_sdk_active = False
self._local_last_active: datetime | None = None
self._local_sdk_version_warn = False
async def async_initialize(self):
"""Perform async initialization of config."""
@ -327,6 +331,18 @@ class AbstractConfig(ABC):
from . import smart_home
self._local_last_active = utcnow()
# Check version local SDK.
version = request.headers.get("HA-Cloud-Version")
if not self._local_sdk_version_warn and (
not version or AwesomeVersion(version) < LOCAL_SDK_MIN_VERSION
):
_LOGGER.warning(
"Local SDK version is too old (%s), check documentation on how to update to the latest version",
version,
)
self._local_sdk_version_warn = True
payload = await request.json()
if _LOGGER.isEnabledFor(logging.DEBUG):
@ -577,8 +593,9 @@ class GoogleEntity:
device["customData"] = {
"webhookId": self.config.get_local_webhook_id(agent_user_id),
"httpPort": self.hass.http.server_port,
"httpSSL": self.hass.config.api.use_ssl,
"uuid": instance_uuid,
# Below can be removed in HA 2022.9
"httpSSL": self.hass.config.api.use_ssl,
"baseUrl": get_url(self.hass, prefer_external=True),
"proxyDeviceId": agent_user_id,
}

View File

@ -345,3 +345,85 @@ def test_request_data():
config, "test_user", SOURCE_CLOUD, "test_request_id", None
)
assert data.is_local_request is False
async def test_config_local_sdk_allow_min_version(hass, hass_client, caplog):
"""Test the local SDK."""
version = str(helpers.LOCAL_SDK_MIN_VERSION)
assert await async_setup_component(hass, "webhook", {})
config = MockConfig(
hass=hass,
agent_user_ids={
"mock-user-id": {
STORE_GOOGLE_LOCAL_WEBHOOK_ID: "mock-webhook-id",
},
},
)
client = await hass_client()
assert config._local_sdk_version_warn is False
config.async_enable_local_sdk()
await client.post(
"/api/webhook/mock-webhook-id",
headers={helpers.LOCAL_SDK_VERSION_HEADER: version},
json={
"inputs": [
{
"context": {"locale_country": "US", "locale_language": "en"},
"intent": "action.devices.SYNC",
}
],
"requestId": "mock-req-id",
},
)
assert config._local_sdk_version_warn is False
assert (
f"Local SDK version is too old ({version}), check documentation on how "
"to update to the latest version"
) not in caplog.text
@pytest.mark.parametrize("version", (None, "2.1.4"))
async def test_config_local_sdk_warn_version(hass, hass_client, caplog, version):
"""Test the local SDK."""
assert await async_setup_component(hass, "webhook", {})
config = MockConfig(
hass=hass,
agent_user_ids={
"mock-user-id": {
STORE_GOOGLE_LOCAL_WEBHOOK_ID: "mock-webhook-id",
},
},
)
client = await hass_client()
assert config._local_sdk_version_warn is False
config.async_enable_local_sdk()
headers = {}
if version:
headers[helpers.LOCAL_SDK_VERSION_HEADER] = version
await client.post(
"/api/webhook/mock-webhook-id",
headers=headers,
json={
"inputs": [
{
"context": {"locale_country": "US", "locale_language": "en"},
"intent": "action.devices.SYNC",
}
],
"requestId": "mock-req-id",
},
)
assert config._local_sdk_version_warn is True
assert (
f"Local SDK version is too old ({version}), check documentation on how "
"to update to the latest version"
) in caplog.text