Ensure homekit version strings conform to spec (#35741)

HomeKit requires all version strings to be in the
format MAJOR.MINOR.REVISION
pull/35828/head
J. Nick Koston 2020-05-17 15:51:51 -05:00 committed by Franck Nijhof
parent e2f0520028
commit cc5fc2baa4
No known key found for this signature in database
GPG Key ID: D62583BA8AB11CA3
3 changed files with 21 additions and 1 deletions

View File

@ -75,6 +75,7 @@ from .const import (
from .util import ( from .util import (
convert_to_float, convert_to_float,
dismiss_setup_message, dismiss_setup_message,
format_sw_version,
show_setup_message, show_setup_message,
validate_media_player_features, validate_media_player_features,
) )
@ -253,7 +254,7 @@ class HomeAccessory(Accessory):
else: else:
model = domain.title() model = domain.title()
if ATTR_SOFTWARE_VERSION in self.config: if ATTR_SOFTWARE_VERSION in self.config:
sw_version = self.config[ATTR_SOFTWARE_VERSION] sw_version = format_sw_version(self.config[ATTR_SOFTWARE_VERSION])
else: else:
sw_version = __version__ sw_version = __version__

View File

@ -4,6 +4,7 @@ import io
import ipaddress import ipaddress
import logging import logging
import os import os
import re
import secrets import secrets
import socket import socket
@ -415,6 +416,14 @@ def get_aid_storage_fullpath_for_entry_id(hass: HomeAssistant, entry_id: str):
) )
def format_sw_version(version):
"""Extract the version string in a format homekit can consume."""
match = re.search(r"([0-9]+)(\.[0-9]+)?(\.[0-9]+)?", str(version).replace("-", "."))
if match:
return match.group(0)
return None
def migrate_filesystem_state_data_for_primary_imported_entry_id( def migrate_filesystem_state_data_for_primary_imported_entry_id(
hass: HomeAssistant, entry_id: str hass: HomeAssistant, entry_id: str
): ):

View File

@ -28,6 +28,7 @@ from homeassistant.components.homekit.util import (
density_to_air_quality, density_to_air_quality,
dismiss_setup_message, dismiss_setup_message,
find_next_available_port, find_next_available_port,
format_sw_version,
port_is_available, port_is_available,
show_setup_message, show_setup_message,
temperature_to_homekit, temperature_to_homekit,
@ -315,3 +316,12 @@ async def test_port_is_available(hass):
assert next_port assert next_port
assert await hass.async_add_executor_job(port_is_available, next_port) assert await hass.async_add_executor_job(port_is_available, next_port)
async def test_format_sw_version():
"""Test format_sw_version method."""
assert format_sw_version("soho+3.6.8+soho-release-rt120+10") == "3.6.8"
assert format_sw_version("undefined-undefined-1.6.8") == "1.6.8"
assert format_sw_version("56.0-76060") == "56.0.76060"
assert format_sw_version(3.6) == "3.6"
assert format_sw_version("unknown") is None