From aae2ffebd71d38917fd5f0df96ca2d1fc11c3ee1 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 19 Oct 2024 14:17:17 -0400 Subject: [PATCH] Fixes the bug of unable to decrypt mute lists. --- .../notifications/EventNotificationConsumer.kt | 3 ++- .../quartz/crypto/nip04/Nip04Test.kt | 17 +++++++++++++++++ .../vitorpamplona/quartz/crypto/nip04/Nip04.kt | 13 ++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt index 05842ca5d..8988d1664 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt @@ -154,8 +154,9 @@ class EventNotificationConsumer( acc: AccountSettings, ) { if ( - event.createdAt > TimeUtils.fifteenMinutesAgo() && // old event being re-broadcasted + event.createdAt > TimeUtils.fifteenMinutesAgo() && + // don't display if it comes from me. event.pubKey != signer.pubKey ) { // from the user Log.d(TAG, "Notifying") diff --git a/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip04/Nip04Test.kt b/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip04/Nip04Test.kt index da3f42214..1564cc46c 100644 --- a/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip04/Nip04Test.kt +++ b/quartz/src/androidTest/java/com/vitorpamplona/quartz/crypto/nip04/Nip04Test.kt @@ -93,4 +93,21 @@ class Nip04Test { assertTrue(Nip04.isNIP04("zJxfaJ32rN5Dg1ODjOlEew==?iv=EV5bUjcc4OX2Km/zPp4ndQ==")) assertTrue(Nip04.isNIP04("6f8dMstm+udOu7yipSn33orTmwQpWbtfuY95NH+eTU1kArysWJIDkYgI2D25EAGIDJsNd45jOJ2NbVOhFiL3ZP/NWsTwXokk34iyHyA/lkjzugQ1bHXoMD1fP/Ay4hB4al1NHb8HXHKZaxPrErwdRDb8qa/I6dXb/1xxyVvNQBHHvmsM5yIFaPwnCN1DZqXf2KbTA/Ekz7Hy+7R+Sy3TXLQDFpWYqykppkXc7Fs0qSuPRyxz5+anuN0dxZa9GTwTEnBrZPbthKkNRrvZMdTGJ6WumOh9aUq8OJJWy9aOgsXvs7qjN1UqcCqQqYaVnEOhCaqWNDsVtsFrVDj+SaLIBvCiomwF4C4nIgngJ5I69tx0UNI0q+ZnvOGQZ7m1PpW2NYP7Yw43HJNdeUEQAmdCPnh/PJwzLTnIxHmQU7n7SPlMdV0SFa6H8y2HHvex697GAkyE5t8c2uO24OnqIwF1tR3blIqXzTSRl0GA6QvrSj2p4UtnWjvF7xT7RiIEyTtgU/AsihTrXyXzWWZaIBJogpgw6erlZqWjCH7sZy/WoGYEiblobOAqMYxax6vRbeuGtoYksr/myX+x9rfLrYuoDRTw4woXOLmMrrj+Mf0TbAgc3SjdkqdsPU1553rlSqIEZXuFgoWmxvVQDtekgTYyS97G81TDSK9nTJT5ilku8NVq2LgtBXGwsNIw/xekcOUzJke3kpnFPutNaexR1VF3ohIuqRKYRGcd8ADJP2lfwMcaGRiplAmFoaVS1YUhQwYFNq9rMLf7YauRGV4BJg/t9srdGxf5RoKCvRo+XM/nLxxysTR9MVaEP/3lDqjwChMxs+eWfLHE5vRWV8hUEqdrWNZV29gsx5nQpzJ4PARGZVu310pQzc6JAlc2XAhhFk6RamkYJnmCSMnb/RblzIATBi2kNrCVAlaXIon188inB62rEpZGPkRIP7PUfu27S/elLQHBHeGDsxOXsBRo1gl3te+raoBHsxo6zvRnYbwdAQa5taDE63eh+fT6kFI+xYmXNAQkU8Dp0MVhEh4JQI06Ni/AKrvYpC95TXXIphZcF+/Pv/vaGkhG2X9S3uhugwWK?iv=2vWkOQQi0WynNJz/aZ4k2g==")) } + + @Test + fun isNIP04EncodeWithBug() { + assertTrue( + Nip04.isNIP04( + "QOAYBWa88ConWs2C4kSvNqAcowCtg0ZRtAl7FyLSv9VMaJH4oCiDx0h8VLBnV97HdE4lv" + + "TW7AYC1eEw8/t1dbe0qRc3XrOt7MrPAO8yqpy1/3lFB1+10kip0+KdgT8Quvv02wTP8Dqi" + + "xpr2fliAIG2ONvDn+O5V0q9aVUN9HitgL/myTyR0T42edmxWeZoMBEOKvJyO80FekSsgVL" + + "ASafA/T5z4xs8oG88pSe9wSbSsw0xNjJeh3xLRCLuEuA9KI8hQ1Ys9nEax2UlaB/IL3o77" + + "OwBL+rrdUbNHTxYifgygRhg3BaXMsXRFNJbqYeMaRaNbvHkLVAQV2jLY4P/cKHBjEcTC/f" + + "lrCc2NCYF34rOQUY5EJVnFzM8qYVw6xNupBHTS7WFx1r60cPjG19P/+yoiTZ6bPdHTU0X2" + + "t64ovF2YWUq6/iKAclMaZDhWfrKqf82e62oIff55WQw2bw8A/jtBQVCf66EtEJ2OSFxNaZ" + + "rO+A4oLkHDCnAV+6fYzwo89gPOvORcVvSvg55yGiBFUZx9EHS6kdH1SU80/Mbxe2oI=" + + "?iv=gxz9pUFJFZHuV+D+hgKEOw==-null", + ), + ) + } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip04/Nip04.kt b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip04/Nip04.kt index 7ee60712b..6c6b8e8d3 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip04/Nip04.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/crypto/nip04/Nip04.kt @@ -153,14 +153,21 @@ class Nip04( } fun isNIP04(encoded: String): Boolean { - val l = encoded.length + // cleaning up some bug from some client. + val cleanedUp = encoded.removeSuffix("-null") + + val l = cleanedUp.length if (l < 28) return false - return encoded[l - 28] == '?' && encoded[l - 27] == 'i' && encoded[l - 26] == 'v' && encoded[l - 25] == '=' + return cleanedUp[l - 28] == '?' && + cleanedUp[l - 27] == 'i' && + cleanedUp[l - 26] == 'v' && + cleanedUp[l - 25] == '=' } fun decodeFromNIP04(payload: String): EncryptedInfo? = try { - val parts = payload.split("?iv=") + // cleaning up some bug from some client. + val parts = payload.removeSuffix("-null").split("?iv=") EncryptedInfo( ciphertext = Base64.getDecoder().decode(parts[0]), nonce = Base64.getDecoder().decode(parts[1]),