mirror of https://github.com/home-assistant/core
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
"""KNX Keyring handler."""
|
|
|
|
import logging
|
|
from pathlib import Path
|
|
import shutil
|
|
from typing import Final
|
|
|
|
from xknx.exceptions.exception import InvalidSecureConfiguration
|
|
from xknx.secure.keyring import Keyring, sync_load_keyring
|
|
|
|
from homeassistant.components.file_upload import process_uploaded_file
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.storage import STORAGE_DIR
|
|
|
|
from ..const import DOMAIN
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
DEFAULT_KNX_KEYRING_FILENAME: Final = "keyring.knxkeys"
|
|
|
|
|
|
async def save_uploaded_knxkeys_file(
|
|
hass: HomeAssistant, uploaded_file_id: str, password: str
|
|
) -> Keyring:
|
|
"""Validate the uploaded file and move it to the storage directory.
|
|
|
|
Return a Keyring object.
|
|
Raises InvalidSecureConfiguration if the file or password is invalid.
|
|
"""
|
|
|
|
def _process_upload() -> Keyring:
|
|
with process_uploaded_file(hass, uploaded_file_id) as file_path:
|
|
try:
|
|
keyring = sync_load_keyring(
|
|
path=file_path,
|
|
password=password,
|
|
)
|
|
except InvalidSecureConfiguration as err:
|
|
_LOGGER.debug(err)
|
|
raise
|
|
dest_path = Path(hass.config.path(STORAGE_DIR, DOMAIN))
|
|
dest_path.mkdir(exist_ok=True)
|
|
dest_file = dest_path / DEFAULT_KNX_KEYRING_FILENAME
|
|
shutil.move(file_path, dest_file)
|
|
return keyring
|
|
|
|
return await hass.async_add_executor_job(_process_upload)
|