diff --git a/src/synology_dsm/exceptions.py b/src/synology_dsm/exceptions.py index 8996b801..8fc90cc1 100644 --- a/src/synology_dsm/exceptions.py +++ b/src/synology_dsm/exceptions.py @@ -80,54 +80,52 @@ def __init__(self, code, details=None): class SynologyDSMLoginInvalidException(SynologyDSMLoginFailedException): """Invalid password & not admin account exception.""" - def __init__(self, username): + def __init__(self, username: str, error: str) -> None: """Constructor method.""" - message = f"Invalid password or not admin account: {username}" + message = f"Invalid password or not admin account: {username}: {error}" super().__init__(400, message) class SynologyDSMLoginDisabledAccountException(SynologyDSMLoginFailedException): """Guest & disabled account exception.""" - def __init__(self, username): + def __init__(self, username: str, error: str) -> None: """Constructor method.""" - message = f"Guest or disabled account: {username}" + message = f"Guest or disabled account: {username}: {error}" super().__init__(401, message) class SynologyDSMLoginPermissionDeniedException(SynologyDSMLoginFailedException): """No access to login exception.""" - def __init__(self, username): + def __init__(self, username: str, error: str) -> None: """Constructor method.""" - message = f"Permission denied for account: {username}" + message = f"Permission denied for account: {username}: {error}" super().__init__(402, message) class SynologyDSMLogin2SARequiredException(SynologyDSMLoginFailedException): """2SA required to login exception.""" - def __init__(self, username): + def __init__(self, username: str, error: str) -> None: """Constructor method.""" - message = f"Two-step authentication required for account: {username}" + message = f"Two-step authentication required for account: {username}: {error}" super().__init__(403, message) class SynologyDSMLogin2SAFailedException(SynologyDSMLoginFailedException): """2SA code failed exception.""" - def __init__(self): + def __init__(self, username: str, error: str) -> None: """Constructor method.""" - message = "Two-step authentication failed, retry with a new pass code" + message = f"Two-step authentication failed for account: {username}, retry with a new pass code: {error}" super().__init__(404, message) class SynologyDSMLogin2SAForcedException(SynologyDSMLoginFailedException): """2SA force to setup exception.""" - def __init__(self, username): + def __init__(self, username: str, error: str) -> None: """Constructor method.""" - message = ( - f"Two-step authentication forced to be setuped for account: {username}" - ) + message = f"Two-step authentication forced to be setuped for account: {username}: {error}" super().__init__(406, message) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 2cccd6b8..f0d46763 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -58,7 +58,7 @@ def __init__( self.username = username self._password = password self._timeout = timeout - self._debugmode = debugmode + self._debugmode = True # Session self._session = session @@ -139,8 +139,8 @@ async def login(self, otp_code: str = None) -> bool: "account": self.username, "passwd": self._password, # "enable_syno_token": "yes", - "enable_device_token": "yes", - "device_name": socket.gethostname(), + #"enable_device_token": "yes", + #"device_name": socket.gethostname(), } if otp_code: @@ -150,16 +150,20 @@ async def login(self, otp_code: str = None) -> bool: # Request login result = await self.get(API_AUTH, "login", params) + error = result.get("error") # Handle errors - if result.get("error"): + if error: + # Remove this + _LOGGER.error("Attempt to login (%s/%s) params=%s failed: %s", self.username, self._password, params, error) + switcher = { - 400: SynologyDSMLoginInvalidException(self.username), - 401: SynologyDSMLoginDisabledAccountException(self.username), - 402: SynologyDSMLoginPermissionDeniedException(self.username), - 403: SynologyDSMLogin2SARequiredException(self.username), - 404: SynologyDSMLogin2SAFailedException(), - 406: SynologyDSMLogin2SAForcedException(self.username), + 400: SynologyDSMLoginInvalidException(self.username, error), + 401: SynologyDSMLoginDisabledAccountException(self.username, error), + 402: SynologyDSMLoginPermissionDeniedException(self.username, error), + 403: SynologyDSMLogin2SARequiredException(self.username, error), + 404: SynologyDSMLogin2SAFailedException(self.username, error), + 406: SynologyDSMLogin2SAForcedException(self.username, error), } raise switcher.get( result["error"]["code"], @@ -267,7 +271,7 @@ async def _request( self._session_id = None self._syno_token = None self._device_token = None - return self._request(request_method, api, method, params, False) + return await self._request(request_method, api, method, params, False) raise SynologyDSMAPIErrorException( api, response["error"]["code"], response["error"].get("errors") ) @@ -279,12 +283,9 @@ async def _execute_request(self, method: str, url: str, params: dict, **kwargs): # Execute Request try: if method == "GET": - encoded_params = "&".join( - f"{key}={quote(str(value))}" for key, value in params.items() - ) async with async_timeout.timeout(self._timeout): response = await self._session.get( - url, params=encoded_params, **kwargs + url, params=params, **kwargs ) elif method == "POST": data = {}