1 """Offer API to configure Home Assistant auth."""
3 from __future__
import annotations
7 import voluptuous
as vol
13 WS_TYPE_LIST =
"config/auth/list"
14 SCHEMA_WS_LIST = websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend(
15 {vol.Required(
"type"): WS_TYPE_LIST}
18 WS_TYPE_DELETE =
"config/auth/delete"
19 SCHEMA_WS_DELETE = websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend(
20 {vol.Required(
"type"): WS_TYPE_DELETE, vol.Required(
"user_id"): str}
26 """Enable the Home Assistant views."""
27 websocket_api.async_register_command(
28 hass, WS_TYPE_LIST, websocket_list, SCHEMA_WS_LIST
30 websocket_api.async_register_command(
31 hass, WS_TYPE_DELETE, websocket_delete, SCHEMA_WS_DELETE
33 websocket_api.async_register_command(hass, websocket_create)
34 websocket_api.async_register_command(hass, websocket_update)
38 @websocket_api.require_admin
39 @websocket_api.async_response
45 """Return a list of users."""
46 result = [
_user_info(u)
for u
in await hass.auth.async_get_users()]
48 connection.send_message(websocket_api.result_message(msg[
"id"], result))
51 @websocket_api.require_admin
52 @websocket_api.async_response
59 if msg[
"user_id"] == connection.user.id:
60 connection.send_message(
61 websocket_api.error_message(
62 msg[
"id"],
"no_delete_self",
"Unable to delete your own account"
67 if not (user := await hass.auth.async_get_user(msg[
"user_id"])):
68 connection.send_message(
69 websocket_api.error_message(msg[
"id"],
"not_found",
"User not found")
73 await hass.auth.async_remove_user(user)
75 connection.send_message(websocket_api.result_message(msg[
"id"]))
78 @websocket_api.require_admin
79 @websocket_api.websocket_command(
{
vol.Required("type"):
"config/auth/create",
80 vol.Required(
"name"): str,
81 vol.Optional(
"group_ids"): [str],
82 vol.Optional(
"local_only"): bool,
85 @websocket_api.async_response
92 user = await hass.auth.async_create_user(
93 msg[
"name"], group_ids=msg.get(
"group_ids"), local_only=msg.get(
"local_only")
96 connection.send_message(
97 websocket_api.result_message(msg[
"id"], {
"user":
_user_info(user)})
101 @websocket_api.require_admin
102 @websocket_api.websocket_command(
{
vol.Required("type"):
"config/auth/update",
103 vol.Required(
"user_id"): str,
104 vol.Optional(
"name"): str,
105 vol.Optional(
"is_active"): bool,
106 vol.Optional(
"group_ids"): [str],
107 vol.Optional(
"local_only"): bool,
110 @websocket_api.async_response
117 if not (user := await hass.auth.async_get_user(msg.pop(
"user_id"))):
118 connection.send_message(
119 websocket_api.error_message(
120 msg[
"id"], websocket_api.ERR_NOT_FOUND,
"User not found"
125 if user.system_generated:
126 connection.send_message(
127 websocket_api.error_message(
129 "cannot_modify_system_generated",
130 "Unable to update system generated users.",
135 if user.is_owner
and msg.get(
"is_active")
is False:
136 connection.send_message(
137 websocket_api.error_message(
139 "cannot_deactivate_owner",
140 "Unable to deactivate owner.",
146 msg_id = msg.pop(
"id")
148 await hass.auth.async_update_user(user, **msg)
150 connection.send_message(
151 websocket_api.result_message(msg_id, {
"user":
_user_info(user)})
160 cred.data.get(
"username")
161 for cred
in user.credentials
162 if cred.auth_provider_type ==
"homeassistant"
169 "username": ha_username,
171 "is_owner": user.is_owner,
172 "is_active": user.is_active,
173 "local_only": user.local_only,
174 "system_generated": user.system_generated,
175 "group_ids": [group.id
for group
in user.groups],
176 "credentials": [{
"type": c.auth_provider_type}
for c
in user.credentials],
178
None websocket_list(HomeAssistant hass, websocket_api.ActiveConnection connection, dict[str, Any] msg)
None websocket_create(HomeAssistant hass, websocket_api.ActiveConnection connection, dict[str, Any] msg)
bool async_setup(HomeAssistant hass)
dict[str, Any] _user_info(User user)
None websocket_delete(HomeAssistant hass, websocket_api.ActiveConnection connection, dict[str, Any] msg)
None websocket_update(HomeAssistant hass, websocket_api.ActiveConnection connection, dict[str, Any] msg)