diff --git a/supervisor/api/__init__.py b/supervisor/api/__init__.py index 58cc3c390..b79934f63 100644 --- a/supervisor/api/__init__.py +++ b/supervisor/api/__init__.py @@ -348,6 +348,7 @@ class RestAPI(CoreSysAttributes): web.post( "/addons/{addon}/options/validate", api_addons.options_validate ), + web.get("/addons/{addon}/options/config", api_addons.options_config), web.post("/addons/{addon}/rebuild", api_addons.rebuild), web.get("/addons/{addon}/logs", api_addons.logs), web.get("/addons/{addon}/icon", api_addons.icon), diff --git a/supervisor/api/addons.py b/supervisor/api/addons.py index 360aa0af9..456ce6f75 100644 --- a/supervisor/api/addons.py +++ b/supervisor/api/addons.py @@ -102,7 +102,7 @@ from ..const import ( ) from ..coresys import CoreSysAttributes from ..docker.stats import DockerStats -from ..exceptions import APIError +from ..exceptions import APIError, APIForbidden from ..validate import docker_ports from .utils import api_process, api_process_raw, api_validate @@ -343,6 +343,19 @@ class APIAddons(CoreSysAttributes): return data + @api_process + async def options_config(self, request: web.Request) -> None: + """Validate user options for add-on.""" + slug: str = request.match_info.get("addon") + if slug != "self": + raise APIForbidden("This can be only read by the Add-on itself!") + + addon = self._extract_addon_installed(request) + try: + return addon.schema(addon.options) + except vol.Invalid: + raise APIError("Invalid configuration data for the add-on") from None + @api_process async def security(self, request: web.Request) -> None: """Store security options for add-on.""" @@ -472,14 +485,6 @@ class APIAddons(CoreSysAttributes): await asyncio.shield(addon.write_stdin(data)) -def _pretty_devices(addon: AnyAddon) -> List[str]: - """Return a simplified device list.""" - dev_list = addon.devices - if not dev_list: - return [] - return [row.split(":")[0] for row in dev_list] - - def _pretty_services(addon: AnyAddon) -> List[str]: """Return a simplified services role list.""" return [f"{name}:{access}" for name, access in addon.services_role.items()] diff --git a/supervisor/api/security.py b/supervisor/api/security.py index 65a84bc65..2677c5abf 100644 --- a/supervisor/api/security.py +++ b/supervisor/api/security.py @@ -51,6 +51,7 @@ OBSERVER_CHECK = re.compile( ADDONS_API_BYPASS = re.compile( r"^(?:" r"|/addons/self/(?!security|update)[^/]+" + r"|/addons/self/options/config" r"|/info" r"|/hardware/trigger" r"|/services.*"