1 """Provides an HTTP API for mobile_app."""
3 from __future__
import annotations
5 from contextlib
import suppress
6 from http
import HTTPStatus
9 from aiohttp.web
import Request, Response
10 from nacl.secret
import SecretBox
11 import voluptuous
as vol
30 ATTR_SUPPORTS_ENCRYPTION,
38 from .util
import async_create_cloud_hook
42 """A view that accepts registration requests."""
44 url =
"/api/mobile_app/registrations"
45 name =
"api:mobile_app:register"
47 @RequestDataValidator(
vol.Schema(
{
vol.Optional(ATTR_APP_DATA, default={}): SCHEMA_APP_DATA,
48 vol.Required(ATTR_APP_ID): cv.string,
49 vol.Required(ATTR_APP_NAME): cv.string,
50 vol.Required(ATTR_APP_VERSION): cv.string,
51 vol.Required(ATTR_DEVICE_NAME): cv.string,
52 vol.Required(ATTR_MANUFACTURER): cv.string,
53 vol.Required(ATTR_MODEL): cv.string,
54 vol.Optional(ATTR_DEVICE_ID): cv.string,
55 vol.Required(ATTR_OS_NAME): cv.string,
56 vol.Optional(ATTR_OS_VERSION): cv.string,
57 vol.Required(ATTR_SUPPORTS_ENCRYPTION, default=
False): cv.boolean,
60 extra=vol.REMOVE_EXTRA,
63 async
def post(self, request: Request, data: dict) -> Response:
64 """Handle the POST request for registration."""
65 hass = request.app[KEY_HASS]
67 webhook_id = secrets.token_hex()
69 if cloud.async_active_subscription(hass):
71 hass, webhook_id,
None
74 data[CONF_WEBHOOK_ID] = webhook_id
76 if data[ATTR_SUPPORTS_ENCRYPTION]:
77 data[CONF_SECRET] = secrets.token_hex(SecretBox.KEY_SIZE)
79 data[CONF_USER_ID] = request[
"hass_user"].id
82 if not slugify(data[ATTR_DEVICE_NAME], separator=
""):
83 data[ATTR_DEVICE_NAME] = data[ATTR_DEVICE_ID]
85 await hass.async_create_task(
86 hass.config_entries.flow.async_init(
87 DOMAIN, data=data, context={
"source":
"registration"}
92 if cloud.async_active_subscription(hass):
94 remote_ui_url = cloud.async_remote_ui_url(hass)
98 CONF_CLOUDHOOK_URL: data.get(CONF_CLOUDHOOK_URL),
99 CONF_REMOTE_UI_URL: remote_ui_url,
100 CONF_SECRET: data.get(CONF_SECRET),
101 CONF_WEBHOOK_ID: data[CONF_WEBHOOK_ID],
103 status_code=HTTPStatus.CREATED,
105
Response post(self, Request request, dict data)
str async_create_cloud_hook(HomeAssistant hass, str webhook_id, ConfigEntry|None entry)