mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 01:07:10 +00:00
Add update user command (#21922)
* Add update user command * Add is_admin to current user
This commit is contained in:
parent
5e2302e469
commit
8bfbe3e085
@ -459,6 +459,7 @@ async def websocket_current_user(
|
|||||||
'id': user.id,
|
'id': user.id,
|
||||||
'name': user.name,
|
'name': user.name,
|
||||||
'is_owner': user.is_owner,
|
'is_owner': user.is_owner,
|
||||||
|
'is_admin': user.is_admin,
|
||||||
'credentials': [{'auth_provider_type': c.auth_provider_type,
|
'credentials': [{'auth_provider_type': c.auth_provider_type,
|
||||||
'auth_provider_id': c.auth_provider_id}
|
'auth_provider_id': c.auth_provider_id}
|
||||||
for c in user.credentials],
|
for c in user.credentials],
|
||||||
|
@ -36,6 +36,7 @@ async def async_setup(hass):
|
|||||||
WS_TYPE_CREATE, websocket_create,
|
WS_TYPE_CREATE, websocket_create,
|
||||||
SCHEMA_WS_CREATE
|
SCHEMA_WS_CREATE
|
||||||
)
|
)
|
||||||
|
hass.components.websocket_api.async_register_command(websocket_update)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@ -84,6 +85,40 @@ async def websocket_create(hass, connection, msg):
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
@websocket_api.require_admin
|
||||||
|
@websocket_api.async_response
|
||||||
|
@websocket_api.websocket_command({
|
||||||
|
vol.Required('type'): 'config/auth/update',
|
||||||
|
vol.Required('user_id'): str,
|
||||||
|
vol.Optional('name'): str,
|
||||||
|
vol.Optional('group_ids'): [str]
|
||||||
|
})
|
||||||
|
async def websocket_update(hass, connection, msg):
|
||||||
|
"""Update a user."""
|
||||||
|
user = await hass.auth.async_get_user(msg.pop('user_id'))
|
||||||
|
|
||||||
|
if not user:
|
||||||
|
connection.send_message(websocket_api.error_message(
|
||||||
|
msg['id'], websocket_api.const.ERR_NOT_FOUND, 'User not found'))
|
||||||
|
return
|
||||||
|
|
||||||
|
if user.system_generated:
|
||||||
|
connection.send_message(websocket_api.error_message(
|
||||||
|
msg['id'], 'cannot_modify_system_generated',
|
||||||
|
'Unable to update system generated users.'))
|
||||||
|
return
|
||||||
|
|
||||||
|
msg.pop('type')
|
||||||
|
msg_id = msg.pop('id')
|
||||||
|
|
||||||
|
await hass.auth.async_update_user(user, **msg)
|
||||||
|
|
||||||
|
connection.send_message(
|
||||||
|
websocket_api.result_message(msg_id, {
|
||||||
|
'user': _user_info(user),
|
||||||
|
}))
|
||||||
|
|
||||||
|
|
||||||
def _user_info(user):
|
def _user_info(user):
|
||||||
"""Format a user."""
|
"""Format a user."""
|
||||||
return {
|
return {
|
||||||
|
@ -112,7 +112,7 @@ async def test_list(hass, hass_ws_client, hass_admin_user):
|
|||||||
|
|
||||||
async def test_delete_requires_admin(hass, hass_ws_client,
|
async def test_delete_requires_admin(hass, hass_ws_client,
|
||||||
hass_read_only_access_token):
|
hass_read_only_access_token):
|
||||||
"""Test delete command requires an owner."""
|
"""Test delete command requires an admin."""
|
||||||
client = await hass_ws_client(hass, hass_read_only_access_token)
|
client = await hass_ws_client(hass, hass_read_only_access_token)
|
||||||
|
|
||||||
await client.send_json({
|
await client.send_json({
|
||||||
@ -205,7 +205,7 @@ async def test_create(hass, hass_ws_client, hass_access_token):
|
|||||||
|
|
||||||
async def test_create_requires_admin(hass, hass_ws_client,
|
async def test_create_requires_admin(hass, hass_ws_client,
|
||||||
hass_read_only_access_token):
|
hass_read_only_access_token):
|
||||||
"""Test create command requires an owner."""
|
"""Test create command requires an admin."""
|
||||||
client = await hass_ws_client(hass, hass_read_only_access_token)
|
client = await hass_ws_client(hass, hass_read_only_access_token)
|
||||||
|
|
||||||
await client.send_json({
|
await client.send_json({
|
||||||
@ -217,3 +217,67 @@ async def test_create_requires_admin(hass, hass_ws_client,
|
|||||||
result = await client.receive_json()
|
result = await client.receive_json()
|
||||||
assert not result['success'], result
|
assert not result['success'], result
|
||||||
assert result['error']['code'] == 'unauthorized'
|
assert result['error']['code'] == 'unauthorized'
|
||||||
|
|
||||||
|
|
||||||
|
async def test_update(hass, hass_ws_client):
|
||||||
|
"""Test update command works."""
|
||||||
|
client = await hass_ws_client(hass)
|
||||||
|
|
||||||
|
user = await hass.auth.async_create_user("Test user")
|
||||||
|
|
||||||
|
await client.send_json({
|
||||||
|
'id': 5,
|
||||||
|
'type': 'config/auth/update',
|
||||||
|
'user_id': user.id,
|
||||||
|
'name': 'Updated name',
|
||||||
|
'group_ids': ['system-read-only'],
|
||||||
|
})
|
||||||
|
|
||||||
|
result = await client.receive_json()
|
||||||
|
assert result['success'], result
|
||||||
|
data_user = result['result']['user']
|
||||||
|
|
||||||
|
assert user.name == "Updated name"
|
||||||
|
assert data_user['name'] == "Updated name"
|
||||||
|
assert len(user.groups) == 1
|
||||||
|
assert user.groups[0].id == "system-read-only"
|
||||||
|
assert data_user['group_ids'] == ["system-read-only"]
|
||||||
|
|
||||||
|
|
||||||
|
async def test_update_requires_admin(hass, hass_ws_client,
|
||||||
|
hass_read_only_access_token):
|
||||||
|
"""Test update command requires an admin."""
|
||||||
|
client = await hass_ws_client(hass, hass_read_only_access_token)
|
||||||
|
|
||||||
|
user = await hass.auth.async_create_user("Test user")
|
||||||
|
|
||||||
|
await client.send_json({
|
||||||
|
'id': 5,
|
||||||
|
'type': 'config/auth/update',
|
||||||
|
'user_id': user.id,
|
||||||
|
'name': 'Updated name',
|
||||||
|
})
|
||||||
|
|
||||||
|
result = await client.receive_json()
|
||||||
|
assert not result['success'], result
|
||||||
|
assert result['error']['code'] == 'unauthorized'
|
||||||
|
assert user.name == "Test user"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_update_system_generated(hass, hass_ws_client):
|
||||||
|
"""Test update command cannot update a system generated."""
|
||||||
|
client = await hass_ws_client(hass)
|
||||||
|
|
||||||
|
user = await hass.auth.async_create_system_user("Test user")
|
||||||
|
|
||||||
|
await client.send_json({
|
||||||
|
'id': 5,
|
||||||
|
'type': 'config/auth/update',
|
||||||
|
'user_id': user.id,
|
||||||
|
'name': 'Updated name',
|
||||||
|
})
|
||||||
|
|
||||||
|
result = await client.receive_json()
|
||||||
|
assert not result['success'], result
|
||||||
|
assert result['error']['code'] == 'cannot_modify_system_generated'
|
||||||
|
assert user.name == "Test user"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user