diff --git a/custom_components/zammad/__init__.py b/custom_components/zammad/__init__.py index bc4c8a2..0182eb0 100644 --- a/custom_components/zammad/__init__.py +++ b/custom_components/zammad/__init__.py @@ -9,15 +9,18 @@ import asyncio import logging -from urllib.error import HTTPError +import json +from requests.exceptions import HTTPError from zammad_py import ZammadAPI from .const import ( DOMAIN, PLATFORMS, STARTUP_MESSAGE, + HUMAN_ERR_MSG_FIELD, ) from .coordinator import ZammadUpdateCoordinator +from .utils import get_url_from_options _LOGGER: logging.Logger = logging.getLogger(__package__) @@ -28,7 +31,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): hass.data.setdefault(DOMAIN, {}) _LOGGER.info(STARTUP_MESSAGE) - url = entry.data.get(CONF_URL) + url = get_url_from_options(entry.data.get(CONF_URL)) username = entry.data.get(CONF_USERNAME) password = entry.data.get(CONF_PASSWORD) @@ -36,7 +39,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): client = ZammadAPI(url=url, username=username, password=password) await hass.async_add_executor_job(client.user.me) except HTTPError as exc: - raise ConfigEntryAuthFailed("Credentials expired!") from exception + error_json = json.loads(exc.args[0]) + raise ConfigEntryAuthFailed(error_json[HUMAN_ERR_MSG_FIELD]) except ClientConnectorError as exception: raise ConfigEntryNotReady from exception diff --git a/custom_components/zammad/config_flow.py b/custom_components/zammad/config_flow.py index 51691ca..ae1003c 100644 --- a/custom_components/zammad/config_flow.py +++ b/custom_components/zammad/config_flow.py @@ -5,10 +5,11 @@ import logging from typing import Any, Mapping, Optional import voluptuous as vol -from urllib.error import HTTPError +from requests.exceptions import HTTPError from zammad_py import ZammadAPI from .const import DOMAIN +from .utils import get_url_from_options _LOGGER = logging.getLogger(__name__) @@ -36,8 +37,12 @@ async def _check_creds_input( self, user_input: Mapping[str, Any] ) -> Optional[dict[str, str]]: """Check to see if provided creds are accepted by Zammad""" + if not user_input[CONF_URL].startswith("http"): + _LOGGER.error(f"Invalid url missing protocol: {user_input[CONF_URL]}") + return {"base": "invalid_url_protocol"} + try: - url = user_input[CONF_URL] + url = get_url_from_options(user_input[CONF_URL]) username = user_input[CONF_USERNAME] password = user_input[CONF_PASSWORD] diff --git a/custom_components/zammad/const.py b/custom_components/zammad/const.py index 5ce9fb9..fca36b8 100644 --- a/custom_components/zammad/const.py +++ b/custom_components/zammad/const.py @@ -9,3 +9,7 @@ STARTUP_MESSAGE = f"Starting setup for {DOMAIN}" INITIAL_USER_ID = -1 + +API_URL_PATH = "/api/v1" + +HUMAN_ERR_MSG_FIELD = "error_human" diff --git a/custom_components/zammad/strings.json b/custom_components/zammad/strings.json index cde09b6..85aae6e 100644 --- a/custom_components/zammad/strings.json +++ b/custom_components/zammad/strings.json @@ -5,7 +5,7 @@ "title": "Configure Zammad", "description": "Enter your Zammad credentials", "data": { - "url": "URL (include /api/v1)", + "url": "URL", "username": "Email", "password": "Password" } @@ -14,14 +14,15 @@ "title": "Configure Zammad", "description": "Enter your Zammad credentials", "data": { - "url": "URL (include /api/v1)", + "url": "URL", "username": "Email/Username", "password": "Password" } } }, "error": { - "invalid_auth": "Auth Failed" + "invalid_auth": "Auth Failed", + "invalid_url_protocol": "URL must include http/https" }, "abort": { "already_configured": "Already Configured Account", diff --git a/custom_components/zammad/translations/en.json b/custom_components/zammad/translations/en.json index cde09b6..85aae6e 100644 --- a/custom_components/zammad/translations/en.json +++ b/custom_components/zammad/translations/en.json @@ -5,7 +5,7 @@ "title": "Configure Zammad", "description": "Enter your Zammad credentials", "data": { - "url": "URL (include /api/v1)", + "url": "URL", "username": "Email", "password": "Password" } @@ -14,14 +14,15 @@ "title": "Configure Zammad", "description": "Enter your Zammad credentials", "data": { - "url": "URL (include /api/v1)", + "url": "URL", "username": "Email/Username", "password": "Password" } } }, "error": { - "invalid_auth": "Auth Failed" + "invalid_auth": "Auth Failed", + "invalid_url_protocol": "URL must include http/https" }, "abort": { "already_configured": "Already Configured Account", diff --git a/custom_components/zammad/utils.py b/custom_components/zammad/utils.py new file mode 100644 index 0000000..1897336 --- /dev/null +++ b/custom_components/zammad/utils.py @@ -0,0 +1,8 @@ +from .const import API_URL_PATH + + +def get_url_from_options(url: str) -> str: + if url.endswith(API_URL_PATH): + return url + else: + return url + API_URL_PATH