From 492d2491df0b8df61b5ff15b7240810176469924 Mon Sep 17 00:00:00 2001 From: Loukious Date: Wed, 9 Sep 2026 21:12:27 +0100 Subject: [PATCH] Parse current OnlineHashCrack API response format The OHC upload API no longer returns a success boolean + message; it responds with accepted/skipped/rejected count objects (e.g. {\accepted\:{\count\:1,...},\skipped\:0,\rejected\:0}). parseUploadResult() matched none of that, so a successful upload was reported to the user as a failure with an empty message. Recognize the new format (accepted>0 = success, skipped>0 = already sent, otherwise rejected reason) while keeping the legacy success-flag path for older responses. --- .../stryker/handshakes/HandshakesAdapter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/java/com/zalexdev/stryker/handshakes/HandshakesAdapter.java b/app/src/main/java/com/zalexdev/stryker/handshakes/HandshakesAdapter.java index 9390b0e7..7cd81cc3 100644 --- a/app/src/main/java/com/zalexdev/stryker/handshakes/HandshakesAdapter.java +++ b/app/src/main/java/com/zalexdev/stryker/handshakes/HandshakesAdapter.java @@ -281,6 +281,25 @@ private static UploadResult parseUploadResult(ArrayList lines) { boolean already = message.toLowerCase(java.util.Locale.ROOT).contains("already"); return new UploadResult(already ? UploadOutcome.ALREADY : UploadOutcome.SUCCESS, message); } + // Current OnlineHashCrack API responds with accepted/skipped/rejected counts + // instead of a success flag: {"accepted":{"count":1,...},"skipped":{...},"rejected":{...}} + org.json.JSONObject accepted = json.optJSONObject("accepted"); + org.json.JSONObject skipped = json.optJSONObject("skipped"); + org.json.JSONObject rejected = json.optJSONObject("rejected"); + if (accepted != null || skipped != null || rejected != null) { + int acc = accepted != null ? accepted.optInt("count", 0) : 0; + int skp = skipped != null ? skipped.optInt("count", 0) : 0; + int rej = rejected != null ? rejected.optInt("count", 0) : 0; + if (acc > 0) { + return new UploadResult(UploadOutcome.SUCCESS, message); + } + if (skp > 0) { + String reason = skipped != null ? skipped.optString("reason", "") : ""; + return new UploadResult(UploadOutcome.ALREADY, reason); + } + String reason = rejected != null ? rejected.optString("reason", "") : ""; + return new UploadResult(UploadOutcome.FAILED, reason); + } return new UploadResult(UploadOutcome.FAILED, message); } catch (org.json.JSONException ignored) { }