From d90282b6a784f840dd21d7900675450b8d68d258 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 4 Feb 2026 07:34:39 -0300 Subject: [PATCH] Improve JSON parsing and error handling in decryption services - Add try-catch blocks around JSON parsing for decrypted bunker requests in `EventNotificationConsumer`. - Implement similar error handling for JSON parsing in `IntentUtils` to prevent crashes when processing malformed data. - Log parsing errors and fallback to `ClearTextEncryptedDataKind` when JSON conversion fails. --- .../service/EventNotificationConsumer.kt | 78 +++++++++++-------- .../nostrsigner/service/IntentUtils.kt | 43 +++++----- 2 files changed, 68 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt index a7247ab5..b02619be 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/EventNotificationConsumer.kt @@ -464,28 +464,33 @@ class EventNotificationConsumer(private val applicationContext: Context) { val result = acc.nip44Decrypt(bunkerRequest.ciphertext, bunkerRequest.pubKey) if (result.startsWith("{")) { - val event = AmberEvent.fromJson(result) - if (event.kind == SealedRumorEvent.KIND) { - val decryptedSealData = try { - acc.decrypt(event.content, acc.hexKey) - } catch (_: Exception) { - event.content - } - if (decryptedSealData.startsWith("{")) { - val sealEvent = AmberEvent.fromJson(decryptedSealData) - EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) - } else if (decryptedSealData.startsWith("[")) { - try { - val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) - EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + try { + val event = AmberEvent.fromJson(result) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = try { + acc.decrypt(event.content, acc.hexKey) } catch (_: Exception) { + event.content + } + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + try { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } catch (_: Exception) { + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) } } else { - EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + EventEncryptedDataKind(event, null, result) } - } else { - EventEncryptedDataKind(event, null, result) + } catch (e: Exception) { + Log.e("IntentUtils", "Error parsing JSON: ${e.message}") + ClearTextEncryptedDataKind(bunkerRequest.ciphertext, result) } } else if (result.startsWith("[")) { try { @@ -542,28 +547,33 @@ class EventNotificationConsumer(private val applicationContext: Context) { val result = acc.nip04Decrypt(bunkerRequest.ciphertext, bunkerRequest.pubKey) if (result.startsWith("{")) { - val event = AmberEvent.fromJson(result) - if (event.kind == SealedRumorEvent.KIND) { - val decryptedSealData = try { - acc.decrypt(event.content, acc.hexKey) - } catch (_: Exception) { - event.content - } - if (decryptedSealData.startsWith("{")) { - val sealEvent = AmberEvent.fromJson(decryptedSealData) - EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) - } else if (decryptedSealData.startsWith("[")) { - try { - val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) - EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + try { + val event = AmberEvent.fromJson(result) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = try { + acc.decrypt(event.content, acc.hexKey) } catch (_: Exception) { + event.content + } + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + try { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } catch (_: Exception) { + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) } } else { - EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + EventEncryptedDataKind(event, null, result) } - } else { - EventEncryptedDataKind(event, null, result) + } catch (e: Exception) { + Log.e("IntentUtils", "Error parsing JSON: ${e.message}") + ClearTextEncryptedDataKind(bunkerRequest.ciphertext, result) } } else if (result.startsWith("[")) { try { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt index aa7756e2..e06dc51c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt @@ -511,29 +511,34 @@ object IntentUtils { } } else { if (result.startsWith("{")) { - val event = AmberEvent.fromJson(result) - if (event.kind == SealedRumorEvent.KIND) { - val decryptedSealData = try { - account.decrypt(event.content, account.hexKey) - } catch (_: Exception) { - event.content - } - if (decryptedSealData.startsWith("{")) { - val sealEvent = AmberEvent.fromJson(decryptedSealData) - EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) - } else if (decryptedSealData.startsWith("[")) { - try { - val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) - EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) - } catch (e: Exception) { - Log.e("IntentUtils", "Error parsing TagArray: ${e.message}") + try { + val event = AmberEvent.fromJson(result) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = try { + account.decrypt(event.content, account.hexKey) + } catch (_: Exception) { + event.content + } + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + try { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } catch (e: Exception) { + Log.e("IntentUtils", "Error parsing TagArray: ${e.message}") + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) } } else { - EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + EventEncryptedDataKind(event, null, result) } - } else { - EventEncryptedDataKind(event, null, result) + } catch (e: Exception) { + Log.e("IntentUtils", "Error parsing JSON: ${e.message}") + ClearTextEncryptedDataKind(data, result) } } else if (result.startsWith("[")) { try {