Files
homeassistant-core/homeassistant/scripts/auth.py
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

109 lines
3.4 KiB
Python
Raw Normal View History

2018-05-10 14:09:22 -04:00
"""Script to manage users for the Home Assistant auth provider."""
2018-05-10 14:09:22 -04:00
import argparse
import asyncio
2018-07-13 15:31:20 +02:00
import logging
2018-05-10 14:09:22 -04:00
import os
2020-07-06 15:58:53 -07:00
from homeassistant import runner
2018-07-13 15:31:20 +02:00
from homeassistant.auth import auth_manager_from_config
from homeassistant.auth.providers import homeassistant as hass_auth
2018-05-10 14:09:22 -04:00
from homeassistant.config import get_default_config_dir
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
2018-05-10 14:09:22 -04:00
2019-07-24 23:18:40 +03:00
# mypy: allow-untyped-calls, allow-untyped-defs
2019-07-31 12:25:30 -07:00
2018-05-10 14:09:22 -04:00
def run(args):
"""Handle Home Assistant auth provider script."""
parser = argparse.ArgumentParser(description="Manage Home Assistant users")
2018-05-10 14:09:22 -04:00
parser.add_argument("--script", choices=["auth"])
parser.add_argument(
"-c",
"--config",
default=get_default_config_dir(),
help="Directory that contains the Home Assistant configuration",
)
subparsers = parser.add_subparsers(dest="func")
subparsers.required = True
2018-05-10 14:09:22 -04:00
parser_list = subparsers.add_parser("list")
parser_list.set_defaults(func=list_users)
parser_add = subparsers.add_parser("add")
parser_add.add_argument("username", type=str)
parser_add.add_argument("password", type=str)
parser_add.set_defaults(func=add_user)
parser_validate_login = subparsers.add_parser("validate")
parser_validate_login.add_argument("username", type=str)
parser_validate_login.add_argument("password", type=str)
parser_validate_login.set_defaults(func=validate_login)
parser_change_pw = subparsers.add_parser("change_password")
parser_change_pw.add_argument("username", type=str)
parser_change_pw.add_argument("new_password", type=str)
parser_change_pw.set_defaults(func=change_password)
2020-07-06 15:58:53 -07:00
asyncio.set_event_loop_policy(runner.HassEventLoopPolicy(False))
asyncio.run(run_command(parser.parse_args(args)))
2018-07-13 15:31:20 +02:00
2020-07-06 15:58:53 -07:00
async def run_command(args):
2018-07-13 15:31:20 +02:00
"""Run the command."""
hass = HomeAssistant(os.path.join(os.getcwd(), args.config))
await asyncio.gather(dr.async_load(hass), er.async_load(hass))
2018-07-13 15:31:20 +02:00
hass.auth = await auth_manager_from_config(hass, [{"type": "homeassistant"}], [])
provider = hass.auth.auth_providers[0]
await provider.async_initialize()
await args.func(hass, provider, args)
2018-05-10 14:09:22 -04:00
2020-07-06 15:58:53 -07:00
# Triggers save on used storage helpers with delay (core auth)
logging.getLogger("homeassistant.core").setLevel(logging.WARNING)
await hass.async_stop()
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
async def list_users(hass, provider, args):
2018-05-10 14:09:22 -04:00
"""List the users."""
count = 0
2018-07-13 15:31:20 +02:00
for user in provider.data.users:
2018-05-10 14:09:22 -04:00
count += 1
print(user["username"])
print()
print("Total users:", count)
2018-07-13 15:31:20 +02:00
async def add_user(hass, provider, args):
2018-05-10 14:09:22 -04:00
"""Create a user."""
2018-07-13 15:31:20 +02:00
try:
provider.data.add_auth(args.username, args.password)
except hass_auth.InvalidUser:
print("Username already exists!")
return
# Save username/password
await provider.data.async_save()
print("Auth created")
2018-05-10 14:09:22 -04:00
2018-07-13 15:31:20 +02:00
async def validate_login(hass, provider, args):
2018-05-10 14:09:22 -04:00
"""Validate a login."""
try:
2018-07-13 15:31:20 +02:00
provider.data.validate_login(args.username, args.password)
2018-05-10 14:09:22 -04:00
print("Auth valid")
except hass_auth.InvalidAuth:
print("Auth invalid")
2018-07-13 15:31:20 +02:00
async def change_password(hass, provider, args):
2018-05-10 14:09:22 -04:00
"""Change password."""
try:
2018-07-13 15:31:20 +02:00
provider.data.change_password(args.username, args.new_password)
await provider.data.async_save()
2018-05-10 14:09:22 -04:00
print("Password changed")
except hass_auth.InvalidUser:
print("User not found")