From f7f8bb841cc520d756981eb1aa3f9411d41f817c Mon Sep 17 00:00:00 2001 From: Hafiz Date: Thu, 3 Jul 2025 15:12:06 -0500 Subject: [PATCH 1/4] Removes redundant authentication check Removes a redundant check for "There is no account that uses those credentials" as it's already covered by other checks, simplifying the logic for handling invalid credentials and preventing unnecessary code execution. --- .../android/habitica/data/implementation/ApiClientImpl.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index cc1de1710..3fcd43ce7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -178,8 +178,7 @@ class ApiClientImpl( || errField.equals("invalidCredentials", ignoreCase = true) || msgField.contains("invalidCredentials", ignoreCase = true) || msgField.contains("Missing authentication headers", ignoreCase = true) - || msgField.contains("There is no account that uses those credentials", ignoreCase = true) - + if (shouldLogout) { HabiticaBaseApplication.logout(context) } From d1f7012540ae3fb828052466a038b6784ba6c116 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Thu, 3 Jul 2025 16:05:06 -0500 Subject: [PATCH 2/4] Improve handling of invalid login credentials. Adds a check for "There is no account that uses those credentials" to the list of error messages that trigger a logout. --- .../android/habitica/data/implementation/ApiClientImpl.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 3fcd43ce7..cc1de1710 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -178,7 +178,8 @@ class ApiClientImpl( || errField.equals("invalidCredentials", ignoreCase = true) || msgField.contains("invalidCredentials", ignoreCase = true) || msgField.contains("Missing authentication headers", ignoreCase = true) - + || msgField.contains("There is no account that uses those credentials", ignoreCase = true) + if (shouldLogout) { HabiticaBaseApplication.logout(context) } From 1411d49107989888c3c622b4120761b8064acdf5 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Sun, 13 Jul 2025 14:03:27 -0500 Subject: [PATCH 3/4] add language-agnostic invalid_credentials error handling --- .../data/implementation/ApiClientImpl.kt | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index cc1de1710..ebae405fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -161,24 +161,16 @@ class ApiClientImpl( val path = response.request.url.encodedPath if (!path.contains("/user/auth/update-password") && !path.contains("group-plans")) { - val bodyStr = try { - response.peekBody(1024).string() - } catch (_: Exception) { - "" - } + val bodyStr = runCatching { response.peekBody(1024).string() }.getOrDefault("") - val (errField, msgField) = try { - val obj = JSONObject(bodyStr) - obj.optString("error", "") to obj.optString("message", "") - } catch (_: Exception) { - "" to "" - } - - val shouldLogout = errField.equals("missingAuthHeaders", ignoreCase = true) - || errField.equals("invalidCredentials", ignoreCase = true) - || msgField.contains("invalidCredentials", ignoreCase = true) - || msgField.contains("Missing authentication headers", ignoreCase = true) - || msgField.contains("There is no account that uses those credentials", ignoreCase = true) + val (errField, _) = runCatching { + JSONObject(bodyStr).let { + it.optString("error", "") to it.optString("message", "") + } + }.getOrDefault("" to "") + + // logout if language agnostic "invalid_credentials" error is returned + val shouldLogout = errField.equals("invalid_credentials", ignoreCase = true) if (shouldLogout) { HabiticaBaseApplication.logout(context) From 5eaea9054d18514d4190596ded8d352c1ae6d184 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Tue, 15 Jul 2025 15:20:13 -0500 Subject: [PATCH 4/4] Don't display "Missing auth headers" dialog during force logout --- .../android/habitica/data/implementation/ApiClientImpl.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index ebae405fb..32b058a30 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -303,6 +303,10 @@ class ApiClientImpl( return } + if (res.displayMessage.isNotEmpty() && res.displayMessage.contains("Missing authentication headers", ignoreCase = true)) { + return + } + if (status in 400..499) { if (res.displayMessage.isNotEmpty()) { showConnectionProblemDialog("", res.displayMessage, isUserInputCall)