1 """Implement the auth feature from Hass.io for Add-ons."""
3 from http
import HTTPStatus
4 from ipaddress
import ip_address
8 from aiohttp
import web
9 from aiohttp.web_exceptions
import HTTPNotFound, HTTPUnauthorized
10 import voluptuous
as vol
19 from .const
import ATTR_ADDON, ATTR_PASSWORD, ATTR_USERNAME
21 _LOGGER = logging.getLogger(__name__)
30 hass.http.register_view(hassio_auth)
31 hass.http.register_view(hassio_password_reset)
35 """Hass.io view to handle auth requests."""
37 def __init__(self, hass: HomeAssistant, user: User) ->
None:
38 """Initialize WebView."""
43 """Check if this call is from Supervisor."""
45 hassio_ip = os.environ[
"SUPERVISOR"].split(
":")[0]
46 assert request.transport
47 if ip_address(request.transport.get_extra_info(
"peername")[0]) != ip_address(
50 _LOGGER.error(
"Invalid auth request from %s", request.remote)
51 raise HTTPUnauthorized
54 if request[KEY_HASS_USER].id != self.
useruser.id:
55 _LOGGER.error(
"Invalid auth request from %s", request[KEY_HASS_USER].name)
56 raise HTTPUnauthorized
60 """Hass.io view to handle auth requests."""
62 name =
"api:hassio:auth"
63 url =
"/api/hassio_auth"
65 @RequestDataValidator(
vol.Schema(
{
vol.Required(ATTR_USERNAME): cv.string,
66 vol.Required(ATTR_PASSWORD): cv.string,
67 vol.Required(ATTR_ADDON): cv.string,
69 extra=vol.ALLOW_EXTRA,
72 async
def post(self, request: web.Request, data: dict[str, str]) -> web.Response:
73 """Handle auth requests."""
75 provider = auth_ha.async_get_provider(request.app[KEY_HASS])
78 await provider.async_validate_login(
79 data[ATTR_USERNAME], data[ATTR_PASSWORD]
81 except auth_ha.InvalidAuth:
82 raise HTTPNotFound
from None
84 return web.Response(status=HTTPStatus.OK)
88 """Hass.io view to handle password reset requests."""
90 name =
"api:hassio:auth:password:reset"
91 url =
"/api/hassio_auth/password_reset"
93 @RequestDataValidator(
vol.Schema(
{
vol.Required(ATTR_USERNAME): cv.string,
94 vol.Required(ATTR_PASSWORD): cv.string,
96 extra=vol.ALLOW_EXTRA,
99 async
def post(self, request: web.Request, data: dict[str, str]) -> web.Response:
100 """Handle password reset requests."""
102 provider = auth_ha.async_get_provider(request.app[KEY_HASS])
105 await provider.async_change_password(
106 data[ATTR_USERNAME], data[ATTR_PASSWORD]
108 except auth_ha.InvalidUser
as err:
109 raise HTTPNotFound
from err
111 return web.Response(status=HTTPStatus.OK)
112
web.Response post(self, web.Request request, dict[str, str] data)
None __init__(self, HomeAssistant hass, User user)
None _check_access(self, web.Request request)
web.Response post(self, web.Request request, dict[str, str] data)
None async_setup_auth_view(HomeAssistant hass, User user)