From b0368bee8cdc79b3402a962efc182aaa7106656e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:10:36 -1000 Subject: [PATCH 1/7] Add additional detail to login errors --- src/synology_dsm/exceptions.py | 26 ++++++++++++-------------- src/synology_dsm/synology_dsm.py | 15 ++++++++------- 2 files changed, 20 insertions(+), 21 deletions(-) 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 2b68514c..b75d7cf0 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -150,16 +150,17 @@ 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: 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"], From f2a693bb08cb65952554b0e269712fe2a7bd8c19 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:17:09 -1000 Subject: [PATCH 2/7] log --- src/synology_dsm/synology_dsm.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 429ebbf6..64309c47 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -154,6 +154,9 @@ async def login(self, otp_code: str = None) -> bool: # Handle errors if error: + # Remove this + _LOGGER.error("Attempt to login (%s/%s) failed: %s", self.username, self._password, error) + switcher = { 400: SynologyDSMLoginInvalidException(self.username, error), 401: SynologyDSMLoginDisabledAccountException(self.username, error), From a45fd64bf700290a4d993c6bf62a2ddfb3df1ca1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:20:07 -1000 Subject: [PATCH 3/7] log --- src/synology_dsm/synology_dsm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 64309c47..2fab5ed1 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -155,7 +155,7 @@ async def login(self, otp_code: str = None) -> bool: # Handle errors if error: # Remove this - _LOGGER.error("Attempt to login (%s/%s) failed: %s", self.username, self._password, error) + _LOGGER.error("Attempt to login (%s/%s) params=%s failed: %s", self.username, self._password, params, error) switcher = { 400: SynologyDSMLoginInvalidException(self.username, error), From cbe24091e01180efad6a8c625f779fb7dd3a412d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:24:34 -1000 Subject: [PATCH 4/7] log --- src/synology_dsm/synology_dsm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 2fab5ed1..b8348d52 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -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: From 255102375b3b74222765bbb27e0c7fdb06453f46 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:27:55 -1000 Subject: [PATCH 5/7] Fix a missing await --- src/synology_dsm/synology_dsm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 2cccd6b8..f8bb050c 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -267,7 +267,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") ) From 90133eedd6a10b58ff786c7343a2bca25e02e11e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:30:56 -1000 Subject: [PATCH 6/7] debug --- src/synology_dsm/synology_dsm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 746c4ec0..01ec7b8c 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 From 907f9e8e3ce8b480a44fb2b384e14ff8385fa500 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 15 Jan 2023 09:38:56 -1000 Subject: [PATCH 7/7] probably fixed --- src/synology_dsm/synology_dsm.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/synology_dsm/synology_dsm.py b/src/synology_dsm/synology_dsm.py index 01ec7b8c..f0d46763 100644 --- a/src/synology_dsm/synology_dsm.py +++ b/src/synology_dsm/synology_dsm.py @@ -283,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 = {}