diff --git a/FlowCrypt/src/androidTest/assets/messages/info/encrypted_msg_inline_pub_key_parse_error.json b/FlowCrypt/src/androidTest/assets/messages/info/encrypted_msg_inline_pub_key_parse_error.json new file mode 100644 index 0000000000..325a1aa22b --- /dev/null +++ b/FlowCrypt/src/androidTest/assets/messages/info/encrypted_msg_inline_pub_key_parse_error.json @@ -0,0 +1,54 @@ +{ + "encryptionType": "ENCRYPTED", + "msgBlocks": [ + { + "complete": true, + "content": " \u003c!DOCTYPE html\u003e\n \u003chtml\u003e\n \u003chead\u003e\n \u003cmeta name\u003d\"viewport\" content\u003d\"width\u003ddevice-width\"/\u003e\n \u003cstyle\u003e\n body { word-wrap: break-word; word-break: break-word; hyphens: auto; margin-left: 0px; padding-left: 0px; }\n body img { display: inline !important; height: auto !important; max-width: 95% !important; }\n body pre { white-space: pre-wrap !important; }\n body \u003e div.MsgBlock \u003e table { zoom: 75% } /* table layouts tend to overflow - eg emails from fb */\n \u003c/style\u003e\n \u003c/head\u003e\n \u003cbody\u003e\u003cdiv class\u003d\"MsgBlock GREEN\" style\u003d\"background: white;padding-left: 8px;min-height: 50px;padding-top: 4px;padding-bottom: 4px;width: 100%;border: 1px solid #f0f0f0;border-left: 8px solid #31A217;border-right: none;background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAh1BMVEXw8PD////w8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PD7MuHIAAAALXRSTlMAAAECBAcICw4QEhUZIyYqMTtGTV5kdn2Ii5mfoKOqrbG0uL6/xcnM0NTX2t1l7cN4AAAB0UlEQVR4Ae3Y3Y4SQRCG4bdHweFHRBTBH1FRFLXv//qsA8kmvbMdXhh2Q0KfknpSCQc130c67s22+e9+v/+d84fxkSPH0m/+5P9vN7vRV0vPfx7or1NB23e99KAHuoXOOc6moQsBwNN1Q9g4Wdh1uq3MA7Qn0+2ylAt7WbWpyT+Wo8roKH6v2QhZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2ghZ2gjZ2AUNOLmwgQdogEJ2dnF3UJdU3WjqO/u96aYtVd/7jqvIyu76G5se6GaY7tNNcy5d7se7eWVnDz87fMkuVuS8epF6f9NPObPY5re9y4N1/vya9Gr3se2bfvl9M0mkyZdv077p+a/3z4Meby5Br4NWiV51BaiUqfLro9I3WiR61RVcffwfXI7u5zZ20EOA82Uu8x3SlrSwXQuBSvSqK0AletUVoBK96gpIwlZy0MJWctDCVnLQwlZy0MJWctDCVnLQwlZy0MJWctDCVnLQwlZy0MJWctDCVnLQwlZy0MJWckIletUVIJJxITN6wtZd2EI+0NquyIJOnUpFVvRpcwmV6FVXgEr0qitAJXrVFaASveoKUIledQWoRK+6AlSiV13BP+/VVbky7Xq1AAAAAElFTkSuQmCC);\"\u003e\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e33333\n\u003cbr\u003e\n\u003cbr\u003e\u003c/body\u003e\u003c/html\u003e\u003c/div\u003e\u003c!-- next MsgBlock --\u003e\n\u003c/body\u003e\n \u003c/html\u003e", + "type": "plainHtml" + }, + { + "complete": false, + "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: PGPainless\n\nmDMEYIucWBYJKwYBBAHaRw8BAQdAew+8mzMWyf3+Pfy49qa60uKV6e5os7de4TdZ\nceAWUq+0F2RlbmJvbmQ3QGZsb3djcnlwdC50ZXN0iHgEExYKACAFAmCLnFgCGwMF\nFgIDAQAECwkIBwUVCgkICwIeAQIZAQAKCRDDIInNavjWzm3JAQCgFgCEyD58iEa/\nunaAldoabgO4OARgi5xYEgorBgEEAZdVAQUBAQdAB1/Mrq5JGYim4KqGTSK4OESQ\nUwPgK56q0yrkiU9WgyYDAQgHiHUEGBYKAB0FAmCLnFgCGwwFFgIDAQAECwkIBwUV\nCgkICwIeAQAKCRDDIInNavjWzjMgAQCU+R1fItqdY6lt9jXUqipmXuqVaEFPwNA8\nYJ1rIwDwVQEAyUc8162KWzA2iQB5akwLwNr/pLDDtOWwhLUkrBb3mAc\u003d\n\u003dpXF6\n-----END PGP PUBLIC KEY BLOCK-----\n", + "error": { + "errorMsg": "EOFException: null" + }, + "type": "publicKey" + } + ], + "msgEntity": { + "cc": [], + "email": "default@flowcrypt.test", + "flags": "\\RECENT \\SEEN", + "folder": "INBOX", + "from": [ + { + "address": "denbond7@flowcrypt.test" + } + ], + "fromAddress": "denbond7@flowcrypt.test", + "hasAttachments": false, + "id": 26, + "isEncrypted": true, + "isNew": false, + "isSeen": true, + "msgState": "NONE", + "receivedDate": 1633527418000, + "replyTo": "denbond7@flowcrypt.test", + "replyToAddress": [ + { + "address": "denbond7@flowcrypt.test" + } + ], + "sentDate": 1633527415000, + "subject": "Parse an inline pub key error", + "to": [ + { + "address": "default@flowcrypt.test" + } + ], + "toAddress": "default@flowcrypt.test", + "uid": 25, + "uidAsHEX": "19" + }, + "text": "33333" +} diff --git a/FlowCrypt/src/androidTest/assets/messages/mime/encrypted_msg_inline_pub_key_parse_error.txt b/FlowCrypt/src/androidTest/assets/messages/mime/encrypted_msg_inline_pub_key_parse_error.txt new file mode 100644 index 0000000000..00e394fd90 --- /dev/null +++ b/FlowCrypt/src/androidTest/assets/messages/mime/encrypted_msg_inline_pub_key_parse_error.txt @@ -0,0 +1,62 @@ +Return-Path: +Delivered-To: default@flowcrypt.test +Received: from mail.flowcrypt.test + by mail.flowcrypt.test with LMTP + id BYvqBnqmXWFvBgAAc/RpdQ + (envelope-from ) + for ; Wed, 06 Oct 2021 13:36:58 +0000 +Received: from localhost (localhost [127.0.0.1]) + by mail.flowcrypt.test (Postfix) with ESMTP id 18F13223D7 + for ; Wed, 6 Oct 2021 13:36:58 +0000 (UTC) +Date: Wed, 6 Oct 2021 16:36:55 +0300 (GMT+03:00) +From: denbond7@flowcrypt.test +To: default@flowcrypt.test +Message-ID: <160641524.1.1633527415946@flowcrypt.test> +Subject: Parse an inline pub key error +Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_0_65153003.1633527415907" + +------=_Part_0_65153003.1633527415907 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP MESSAGE----- + +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 +=D5N/ +-----END PGP MESSAGE----- +------=_Part_0_65153003.1633527415907-- diff --git a/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityPassphraseInRamTest.kt b/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityPassphraseInRamTest.kt index efd8eb2e21..77a22fbde6 100644 --- a/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityPassphraseInRamTest.kt +++ b/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityPassphraseInRamTest.kt @@ -77,7 +77,7 @@ class MessageDetailsActivityPassphraseInRamTest : BaseMessageDetailsActivityTest .perform(click()) val decryptErrorMsgBlock = incomingMsgInfo.msgBlocks?.get(1) as DecryptErrorMsgBlock - val decryptError = decryptErrorMsgBlock.error!! + val decryptError = decryptErrorMsgBlock.decryptErr!! assertEquals(PgpDecrypt.DecryptionErrorType.NEED_PASSPHRASE, decryptError.details?.type) //check error message @@ -164,7 +164,7 @@ class MessageDetailsActivityPassphraseInRamTest : BaseMessageDetailsActivityTest launchActivity(incomingMsgInfo!!.msgEntity) val decryptErrorMsgBlock = incomingMsgInfo.msgBlocks?.get(1) as DecryptErrorMsgBlock - val fingerprint = decryptErrorMsgBlock.error?.fingerprints?.first() + val fingerprint = decryptErrorMsgBlock.decryptErr?.fingerprints?.first() val fingerprintFormatted = GeneralUtil.doSectionsInText( originalString = fingerprint, groupSize = 4 ) @@ -297,7 +297,7 @@ class MessageDetailsActivityPassphraseInRamTest : BaseMessageDetailsActivityTest val decryptErrorMsgBlock = incomingMsgInfo.msgBlocks?.get(1) as DecryptErrorMsgBlock val expectedKeysCount = 2 - assertEquals(expectedKeysCount, decryptErrorMsgBlock.error?.fingerprints?.size) + assertEquals(expectedKeysCount, decryptErrorMsgBlock.decryptErr?.fingerprints?.size) val tVStatusMessageText = getQuantityString( resId = R.plurals.please_provide_passphrase_for_following_keys, diff --git a/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityTest.kt b/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityTest.kt index 491239a06b..43bc70e63e 100644 --- a/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityTest.kt +++ b/FlowCrypt/src/androidTest/java/com/flowcrypt/email/ui/activity/MessageDetailsActivityTest.kt @@ -242,7 +242,7 @@ class MessageDetailsActivityTest : BaseMessageDetailsActivityTest() { matchHeader(msgInfo) val block = msgInfo.msgBlocks?.get(1) as DecryptErrorMsgBlock - val decryptError = block.error + val decryptError = block.decryptErr val formatErrorMsg = (getResString( R.string.decrypt_error_message_badly_formatted, getResString(R.string.app_name) @@ -270,7 +270,7 @@ class MessageDetailsActivityTest : BaseMessageDetailsActivityTest() { matchHeader(msgInfo) val block = msgInfo.msgBlocks?.get(1) as DecryptErrorMsgBlock - val decryptError = block.error + val decryptError = block.decryptErr val errorMsg = getResString( R.string.could_not_decrypt_message_due_to_error, decryptError?.details?.type.toString() + ": " + getResString(R.string.decrypt_error_message_no_mdc) @@ -544,6 +544,30 @@ class MessageDetailsActivityTest : BaseMessageDetailsActivityTest() { baseCheck(msgInfo) } + @Test + fun testShowParsePubKeyError() { + val msgInfo = getMsgInfo( + "messages/info/encrypted_msg_inline_pub_key_parse_error.json", + "messages/mime/encrypted_msg_inline_pub_key_parse_error.txt" + ) ?: throw NullPointerException() + + assertThat(msgInfo, notNullValue()) + + val details = msgInfo.msgEntity + + launchActivity(details) + matchHeader(msgInfo) + + val block = msgInfo.msgBlocks?.get(1) as PublicKeyMsgBlock + val errorMsg = getResString( + R.string.msg_contains_not_valid_pub_key, requireNotNull(block.error?.errorMsg) + ) + onView(withId(R.id.textViewErrorMessage)) + .check(matches(withText(errorMsg))) + testSwitch(block.content ?: "") + matchReplyButtons(details) + } + private fun testMissingKey(incomingMsgInfo: IncomingMessageInfo?) { assertThat(incomingMsgInfo, notNullValue()) diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptErrorMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptErrorMsgBlock.kt index 428e2c0016..8132eb1979 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptErrorMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptErrorMsgBlock.kt @@ -19,7 +19,8 @@ import com.google.gson.annotations.SerializedName data class DecryptErrorMsgBlock( @Expose override val content: String?, @Expose override val complete: Boolean, - @SerializedName("decryptErr") @Expose val error: DecryptError? + @SerializedName("decryptErr") @Expose val decryptErr: DecryptError?, + @Expose override val error: MsgBlockError? = null ) : MsgBlock { @Expose @@ -28,31 +29,28 @@ data class DecryptErrorMsgBlock( constructor(source: Parcel) : this( source.readString(), 1 == source.readInt(), - source.readParcelable(DecryptError::class.java.classLoader) + source.readParcelable(DecryptError::class.java.classLoader), + source.readParcelable(MsgBlockError::class.java.classLoader), ) override fun describeContents(): Int { return 0 } - override fun writeToParcel(dest: Parcel, flags: Int) = - with(dest) { - writeParcelable(type, flags) - writeString(content) - writeInt(if (complete) 1 else 0) - writeParcelable(error, flags) + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeParcelable(type, flags) + parcel.writeString(content) + parcel.writeByte(if (complete) 1 else 0) + parcel.writeParcelable(decryptErr, flags) + parcel.writeParcelable(error, flags) + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): DecryptErrorMsgBlock { + parcel.readParcelable(MsgBlock.Type::class.java.classLoader) + return DecryptErrorMsgBlock(parcel) } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = - object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): DecryptErrorMsgBlock { - source.readParcelable(MsgBlock.Type::class.java.classLoader) - return DecryptErrorMsgBlock(source) - } - - override fun newArray(size: Int): Array = arrayOfNulls(size) - } + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptedAttMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptedAttMsgBlock.kt index ae918e4afd..d2f96f1661 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptedAttMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/DecryptedAttMsgBlock.kt @@ -25,7 +25,8 @@ data class DecryptedAttMsgBlock( @Expose override val content: String?, @Expose override val complete: Boolean, @Expose override val attMeta: AttMeta, - @SerializedName("decryptErr") @Expose val error: DecryptError? + @SerializedName("decryptErr") @Expose val decryptErr: DecryptError?, + @Expose override val error: MsgBlockError? = null ) : AttMsgBlock { var fileUri: Uri? = null @@ -37,7 +38,8 @@ data class DecryptedAttMsgBlock( source.readString(), 1 == source.readInt(), source.readParcelable(AttMeta::class.java.classLoader)!!, - source.readParcelable(DecryptError::class.java.classLoader) + source.readParcelable(DecryptError::class.java.classLoader), + source.readParcelable(MsgBlockError::class.java.classLoader) ) { fileUri = source.readParcelable(Uri::class.java.classLoader) } @@ -52,6 +54,7 @@ data class DecryptedAttMsgBlock( writeString(content) writeInt((if (complete) 1 else 0)) writeParcelable(attMeta, flags) + writeParcelable(decryptErr, flags) writeParcelable(error, flags) writeParcelable(fileUri, flags) } @@ -67,16 +70,12 @@ data class DecryptedAttMsgBlock( ) } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = - object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): DecryptedAttMsgBlock { - source.readParcelable(MsgBlock.Type::class.java.classLoader) - return DecryptedAttMsgBlock(source) - } + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): DecryptedAttMsgBlock { + parcel.readParcelable(MsgBlock.Type::class.java.classLoader) + return DecryptedAttMsgBlock(parcel) + } - override fun newArray(size: Int): Array = arrayOfNulls(size) - } + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttLinkMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttLinkMsgBlock.kt index 6a4519a547..f1d0d39ca0 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttLinkMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttLinkMsgBlock.kt @@ -12,21 +12,26 @@ import com.google.gson.annotations.Expose data class EncryptedAttLinkMsgBlock( @Expose override val attMeta: AttMeta, + @Expose override val error: MsgBlockError? = null ) : AttMsgBlock { @Expose override val content: String = "" + @Expose override val type: MsgBlock.Type = MsgBlock.Type.ENCRYPTED_ATT_LINK + @Expose override val complete: Boolean = true constructor(source: Parcel) : this( - source.readParcelable(AttMeta::class.java.classLoader)!! + source.readParcelable(AttMeta::class.java.classLoader)!!, + source.readParcelable(MsgBlockError::class.java.classLoader) ) override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeParcelable(attMeta, flags) + parcel.writeParcelable(error, flags) } override fun describeContents(): Int { @@ -34,12 +39,7 @@ data class EncryptedAttLinkMsgBlock( } companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): EncryptedAttLinkMsgBlock { - return EncryptedAttLinkMsgBlock(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun createFromParcel(parcel: Parcel) = EncryptedAttLinkMsgBlock(parcel) + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttMsgBlock.kt index 097ddb7a2a..467248e7fd 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/EncryptedAttMsgBlock.kt @@ -13,21 +13,24 @@ import com.google.gson.annotations.Expose data class EncryptedAttMsgBlock( @Expose override val content: String?, - @Expose override val attMeta: AttMeta + @Expose override val attMeta: AttMeta, + @Expose override val error: MsgBlockError? = null ) : AttMsgBlock { var fileUri: Uri? = null @Expose override val complete: Boolean = true + @Expose override val type: MsgBlock.Type = MsgBlock.Type.ENCRYPTED_ATT constructor(source: Parcel) : this( source.readString(), - source.readParcelable(AttMeta::class.java.classLoader)!! + source.readParcelable(AttMeta::class.java.classLoader)!!, + source.readParcelable(MsgBlockError::class.java.classLoader) ) { - fileUri = source.readParcelable(Uri::class.java.classLoader) + fileUri = source.readParcelable(Uri::class.java.classLoader) } override fun describeContents(): Int { @@ -39,18 +42,16 @@ data class EncryptedAttMsgBlock( writeParcelable(type, flags) writeString(content) writeParcelable(attMeta, flags) + writeParcelable(error, flags) writeParcelable(fileUri, flags) } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): EncryptedAttMsgBlock { - source.readParcelable(MsgBlock.Type::class.java.classLoader) - return EncryptedAttMsgBlock(source) - } - - override fun newArray(size: Int): Array = arrayOfNulls(size) + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): EncryptedAttMsgBlock { + parcel.readParcelable(MsgBlock.Type::class.java.classLoader) + return EncryptedAttMsgBlock(parcel) } + + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/GenericMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/GenericMsgBlock.kt index a8e734eae1..d9cf292d44 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/GenericMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/GenericMsgBlock.kt @@ -23,13 +23,15 @@ import com.google.gson.annotations.Expose data class GenericMsgBlock( @Expose override val type: MsgBlock.Type = MsgBlock.Type.UNKNOWN, @Expose override val content: String?, - @Expose override val complete: Boolean + @Expose override val complete: Boolean, + @Expose override val error: MsgBlockError? = null ) : MsgBlock { constructor(type: MsgBlock.Type, source: Parcel) : this( type, source.readString(), - 1 == source.readInt() + 1 == source.readInt(), + source.readParcelable(MsgBlockError::class.java.classLoader) ) override fun describeContents() = 0 @@ -38,17 +40,15 @@ data class GenericMsgBlock( writeParcelable(type, flags) writeString(content) writeInt(if (complete) 1 else 0) + writeParcelable(error, flags) } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): MsgBlock { - val partType = source.readParcelable(MsgBlock.Type::class.java.classLoader)!! - return MsgBlockFactory.fromParcel(partType, source) - } - - override fun newArray(size: Int): Array = arrayOfNulls(size) + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): MsgBlock { + val partType = parcel.readParcelable(MsgBlock.Type::class.java.classLoader)!! + return MsgBlockFactory.fromParcel(partType, parcel) } + + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlock.kt index f5184fdf2b..990d4e261d 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlock.kt @@ -13,6 +13,7 @@ interface MsgBlock : Parcelable { val type: Type val content: String? val complete: Boolean + val error: MsgBlockError? enum class Type : Parcelable { UNKNOWN, @@ -88,7 +89,7 @@ interface MsgBlock : Parcelable { dest.writeInt(ordinal) } - fun isContentBlockType() : Boolean = CONTENT_BLOCK_TYPES.contains(this) + fun isContentBlockType(): Boolean = CONTENT_BLOCK_TYPES.contains(this) companion object { @JvmField @@ -127,8 +128,4 @@ interface MsgBlock : Parcelable { } } } - - companion object { - const val TAG_TYPE = "type" - } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockError.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockError.kt new file mode 100644 index 0000000000..9dae17b0f5 --- /dev/null +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockError.kt @@ -0,0 +1,31 @@ +/* + * © 2016-present FlowCrypt a.s. Limitations apply. Contact human@flowcrypt.com + * Contributors: DenBond7 + */ + +package com.flowcrypt.email.api.retrofit.response.model + +import android.os.Parcel +import android.os.Parcelable +import com.google.gson.annotations.Expose + +/** + * @author Denis Bondarenko + * Date: 10/1/21 + * Time: 10:27 AM + * E-mail: DenBond7@gmail.com + */ +data class MsgBlockError( + @Expose val errorMsg: String? = null +) : Parcelable { + constructor(parcel: Parcel) : this(parcel.readString()) + + override fun writeToParcel(parcel: Parcel, flags: Int) = parcel.writeString(errorMsg) + + override fun describeContents(): Int = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): MsgBlockError = MsgBlockError(parcel) + override fun newArray(size: Int): Array = arrayOfNulls(size) + } +} diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockFactory.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockFactory.kt index d56a32857a..74d9eddc42 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockFactory.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/MsgBlockFactory.kt @@ -42,15 +42,22 @@ object MsgBlockFactory { val complete = !missingEnd return when (type) { MsgBlock.Type.PUBLIC_KEY -> { - val keyDetails = if (content != null && complete) { + if (content.isNullOrEmpty()) { + PublicKeyMsgBlock(content, complete, null, MsgBlockError("empty source")) + } else { try { - PgpKey.parseKeys(content).pgpKeyDetailsList.firstOrNull() + val keyDetails = PgpKey.parseKeys(content).pgpKeyDetailsList.firstOrNull() + PublicKeyMsgBlock(content, true, keyDetails) } catch (e: Exception) { e.printStackTrace() - null + PublicKeyMsgBlock( + content = content, + complete = false, + keyDetails = null, + error = MsgBlockError("[" + e.javaClass.simpleName + "]: " + e.message) + ) } - } else null - PublicKeyMsgBlock(content, complete, keyDetails) + } } MsgBlock.Type.DECRYPT_ERROR -> DecryptErrorMsgBlock(content, complete, null) MsgBlock.Type.SIGNED_MSG -> { @@ -68,13 +75,6 @@ object MsgBlockFactory { fun fromAttachment(type: MsgBlock.Type, attachment: MimePart): MsgBlock { val attContent = attachment.content - //todo-denbond7 need to test it - - /*val data: String? = when (attContent) { - is String -> Base64.getEncoder().encode(attachment.inputStream.readBytes()) - is InputStream -> attContent.toBase64EncodedString() - else -> null - }*/ val data = attachment.inputStream.readBytes() val attMeta = AttMeta( diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PlainAttMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PlainAttMsgBlock.kt index a6ed09204d..5a62b00e12 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PlainAttMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PlainAttMsgBlock.kt @@ -13,7 +13,8 @@ import com.google.gson.annotations.Expose data class PlainAttMsgBlock( @Expose override val content: String?, - @Expose override val attMeta: AttMeta + @Expose override val attMeta: AttMeta, + @Expose override val error: MsgBlockError? = null ) : AttMsgBlock { var fileUri: Uri? = null @@ -26,7 +27,8 @@ data class PlainAttMsgBlock( constructor(source: Parcel) : this( source.readString(), - source.readParcelable(AttMeta::class.java.classLoader)!! + source.readParcelable(AttMeta::class.java.classLoader)!!, + source.readParcelable(MsgBlockError::class.java.classLoader) ) { fileUri = source.readParcelable(Uri::class.java.classLoader) } @@ -40,18 +42,16 @@ data class PlainAttMsgBlock( writeParcelable(type, flags) writeString(content) writeParcelable(attMeta, flags) + writeParcelable(error, flags) writeParcelable(fileUri, flags) } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): PlainAttMsgBlock { - source.readParcelable(MsgBlock.Type::class.java.classLoader) - return PlainAttMsgBlock(source) - } - - override fun newArray(size: Int): Array = arrayOfNulls(size) + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): PlainAttMsgBlock { + parcel.readParcelable(MsgBlock.Type::class.java.classLoader) + return PlainAttMsgBlock(parcel) } + + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PublicKeyMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PublicKeyMsgBlock.kt index 3ba554a876..790d6f916c 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PublicKeyMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/PublicKeyMsgBlock.kt @@ -24,43 +24,40 @@ data class PublicKeyMsgBlock constructor( @Expose override val content: String?, @Expose override val complete: Boolean, @Expose val keyDetails: PgpKeyDetails?, - @Expose val parseKeyErrorMsg: String? = null, + @Expose override val error: MsgBlockError? = null ) : MsgBlock { @Expose override val type: MsgBlock.Type = MsgBlock.Type.PUBLIC_KEY var existingPgpContact: PgpContact? = null - constructor(source: Parcel) : this( - source.readString(), - 1 == source.readInt(), - source.readParcelable(PgpKeyDetails::class.java.classLoader), - source.readString(), - ) - - override fun describeContents(): Int { - return 0 + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.readByte() != 0.toByte(), + parcel.readParcelable(PgpKeyDetails::class.java.classLoader), + parcel.readParcelable(MsgBlockError::class.java.classLoader), + ) { + existingPgpContact = parcel.readParcelable(PgpContact::class.java.classLoader) } - override fun writeToParcel(dest: Parcel, flags: Int) = - with(dest) { + override fun writeToParcel(parcel: Parcel, flags: Int) = + with(parcel) { writeParcelable(type, flags) writeString(content) writeInt((if (complete) 1 else 0)) - writeParcelable(keyDetails, 0) - writeString(parseKeyErrorMsg) + writeParcelable(keyDetails, flags) + writeParcelable(error, flags) + writeParcelable(existingPgpContact, flags) } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = - object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): PublicKeyMsgBlock { - source.readParcelable(MsgBlock.Type::class.java.classLoader) - return PublicKeyMsgBlock(source) - } + override fun describeContents(): Int = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): PublicKeyMsgBlock { + parcel.readParcelable(MsgBlock.Type::class.java.classLoader) + return PublicKeyMsgBlock(parcel) + } - override fun newArray(size: Int): Array = arrayOfNulls(size) - } + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/SignedMsgBlock.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/SignedMsgBlock.kt index 29b91364f2..7cf9e71d4b 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/SignedMsgBlock.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/api/retrofit/response/model/SignedMsgBlock.kt @@ -17,7 +17,8 @@ data class SignedMsgBlock( @Expose val signedType: Type, @Expose override val content: String?, @Expose override val complete: Boolean, - @Expose val signature: String? + @Expose val signature: String?, + @Expose override val error: MsgBlockError? = null ) : MsgBlock { @Expose @@ -32,7 +33,8 @@ data class SignedMsgBlock( ?: throw IllegalArgumentException("Undefined type"), source.readString(), 1 == source.readInt(), - source.readString() + source.readString(), + source.readParcelable(MsgBlockError::class.java.classLoader) ) override fun describeContents() = 0 @@ -43,6 +45,7 @@ data class SignedMsgBlock( writeString(content) writeInt(if (complete) 1 else 0) writeString(signature) + writeParcelable(error, flags) } enum class Type : Parcelable { @@ -67,15 +70,12 @@ data class SignedMsgBlock( } } - companion object { - @JvmField - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): MsgBlock { - val partType = source.readParcelable(MsgBlock.Type::class.java.classLoader)!! - return MsgBlockFactory.fromParcel(partType, source) - } - - override fun newArray(size: Int): Array = arrayOfNulls(size) + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): MsgBlock { + val partType = parcel.readParcelable(MsgBlock.Type::class.java.classLoader)!! + return MsgBlockFactory.fromParcel(partType, parcel) } + + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/viewmodel/MsgDetailsViewModel.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/viewmodel/MsgDetailsViewModel.kt index c7708fba4e..792950b0cb 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/viewmodel/MsgDetailsViewModel.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/viewmodel/MsgDetailsViewModel.kt @@ -419,8 +419,8 @@ class MsgDetailsViewModel( } if (block is DecryptErrorMsgBlock) { - if (block.error?.details?.type == PgpDecrypt.DecryptionErrorType.NEED_PASSPHRASE) { - val fingerprints = block.error.fingerprints ?: emptyList() + if (block.decryptErr?.details?.type == PgpDecrypt.DecryptionErrorType.NEED_PASSPHRASE) { + val fingerprints = block.decryptErr.fingerprints ?: emptyList() if (fingerprints.isEmpty()) { ExceptionUtil.handleError(IllegalStateException("Fingerprints were not provided")) } else { diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/security/pgp/PgpMsg.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/security/pgp/PgpMsg.kt index b30b3a8230..42f06343f2 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/security/pgp/PgpMsg.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/security/pgp/PgpMsg.kt @@ -14,6 +14,7 @@ import com.flowcrypt.email.api.retrofit.response.model.DecryptErrorMsgBlock import com.flowcrypt.email.api.retrofit.response.model.EncryptedAttLinkMsgBlock import com.flowcrypt.email.api.retrofit.response.model.EncryptedAttMsgBlock import com.flowcrypt.email.api.retrofit.response.model.MsgBlock +import com.flowcrypt.email.api.retrofit.response.model.MsgBlockError import com.flowcrypt.email.api.retrofit.response.model.MsgBlockFactory import com.flowcrypt.email.api.retrofit.response.model.PublicKeyMsgBlock import com.flowcrypt.email.api.retrofit.response.model.SignedMsgBlock @@ -30,7 +31,6 @@ import com.flowcrypt.email.extensions.kotlin.toEscapedHtml import com.flowcrypt.email.extensions.kotlin.toInputStream import com.flowcrypt.email.extensions.kotlin.unescapeHtml import com.flowcrypt.email.extensions.org.bouncycastle.openpgp.armor -import com.flowcrypt.email.extensions.org.bouncycastle.openpgp.toPgpKeyDetails import com.flowcrypt.email.extensions.org.owasp.html.allowAttributesOnElementsExt import com.flowcrypt.email.security.KeysStorageImpl import com.flowcrypt.email.util.exception.DecryptionException @@ -798,7 +798,7 @@ object PgpMsg { val keyRings = PgpKey.parseAndNormalizeKeyRings(source) if (keyRings.isNotEmpty()) { resultBlocks.addAll(keyRings.map { - PublicKeyMsgBlock(it.armor(null), true, it.toPgpKeyDetails()) + MsgBlockFactory.fromContent(MsgBlock.Type.PUBLIC_KEY, it.armor(null)) }) } else { resultBlocks.add( @@ -806,7 +806,7 @@ object PgpMsg { content = block.content, complete = false, keyDetails = null, - parseKeyErrorMsg = "empty KeyRing" + error = MsgBlockError("empty KeyRing") ) ) } @@ -817,7 +817,7 @@ object PgpMsg { content = block.content, complete = false, keyDetails = null, - parseKeyErrorMsg = ex.javaClass.simpleName + ": " + ex.message + error = MsgBlockError(ex.javaClass.simpleName + ": " + ex.message) ) ) } @@ -946,7 +946,7 @@ object PgpMsg { DecryptErrorMsgBlock( content = msgBlock.content, complete = true, - error = (decryptionResult.exception as? DecryptionException)?.to() + decryptErr = (decryptionResult.exception as? DecryptionException)?.to() ) ) } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/MessageDetailsFragment.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/MessageDetailsFragment.kt index da1775c9b9..52bbcdbc6c 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/MessageDetailsFragment.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/fragment/MessageDetailsFragment.kt @@ -139,9 +139,9 @@ class MessageDetailsFragment : BaseFragment(), ProgressBehaviour, View.OnClickLi for (block in msgInfo?.msgBlocks ?: emptyList()) { if (block.type == MsgBlock.Type.DECRYPT_ERROR) { val decryptErrorMsgBlock = block as? DecryptErrorMsgBlock ?: continue - val decryptErrorDetails = decryptErrorMsgBlock.error?.details ?: continue + val decryptErrorDetails = decryptErrorMsgBlock.decryptErr?.details ?: continue if (decryptErrorDetails.type == PgpDecrypt.DecryptionErrorType.NEED_PASSPHRASE) { - val fingerprints = decryptErrorMsgBlock.error.fingerprints ?: continue + val fingerprints = decryptErrorMsgBlock.decryptErr.fingerprints ?: continue showNeedPassphraseDialog( fingerprints, REQUEST_CODE_SHOW_FIX_EMPTY_PASSPHRASE_DIALOG @@ -952,10 +952,10 @@ class MessageDetailsFragment : BaseFragment(), ProgressBehaviour, View.OnClickLi * @return The generated view. */ private fun genPublicKeyPart(block: PublicKeyMsgBlock, inflater: LayoutInflater): View { - if (!block.complete && block.parseKeyErrorMsg?.isNotEmpty() == true) { + if (!block.complete && block.error?.errorMsg?.isNotEmpty() == true) { return getView( clipLargeText(block.content), - getString(R.string.msg_contains_not_valid_pub_key, block.parseKeyErrorMsg), + getString(R.string.msg_contains_not_valid_pub_key, block.error.errorMsg), layoutInflater ) } @@ -1105,7 +1105,7 @@ class MessageDetailsFragment : BaseFragment(), ProgressBehaviour, View.OnClickLi block: DecryptErrorMsgBlock, layoutInflater: LayoutInflater ): View { - val decryptError = block.error ?: return View(context) + val decryptError = block.decryptErr ?: return View(context) when (decryptError.details?.type) { PgpDecrypt.DecryptionErrorType.KEY_MISMATCH -> return generateMissingPrivateKeyLayout( diff --git a/FlowCrypt/src/main/res/values/strings.xml b/FlowCrypt/src/main/res/values/strings.xml index 3ffec646df..9cf7e1112d 100644 --- a/FlowCrypt/src/main/res/values/strings.xml +++ b/FlowCrypt/src/main/res/values/strings.xml @@ -533,5 +533,5 @@ Could not extract the key details Security threat - opening this message is dangerous because it was modified in transit. Security threat!\n\nMessage is missing integrity checks (MDC). The sender should update their outdated software.\n\nDisplay the message at your own risk. - This message contained a Public Key that was not valid:\n\n%1$s + This message contained a Public Key that was not valid.\n\n%1$s diff --git a/docker-mailserver/docker-compose.yml b/docker-mailserver/docker-compose.yml index 510a7cbe2c..5c81843000 100644 --- a/docker-mailserver/docker-compose.yml +++ b/docker-mailserver/docker-compose.yml @@ -1,7 +1,7 @@ version: '2' services: mail: - image: flowcrypt/flowcrypt-email-server:0.0.8 + image: flowcrypt/flowcrypt-email-server:0.0.10 hostname: ${HOSTNAME} domainname: ${DOMAINNAME} container_name: ${CONTAINER_NAME} diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/dovecot.list.index.log b/docker-mailserver/maildata_source/flowcrypt.test/default/dovecot.list.index.log index 25a7a5308e..2f30af6e94 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/dovecot.list.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/default/dovecot.list.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Drafts/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Drafts/dbox-Mails/dovecot.index.log index dd9325f688..1cd6cca77a 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Drafts/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Drafts/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index new file mode 100644 index 0000000000..16232e11ca Binary files /dev/null and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.cache b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.cache index b184296d08..2bf317b31f 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.cache and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.cache differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.log index ed464c3698..44f1f7a6c0 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/u.24 b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/u.24 new file mode 100644 index 0000000000..683bf21f39 --- /dev/null +++ b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/u.24 @@ -0,0 +1,43 @@ +2 M1e C615c0f7e +N 00000000000004E9 +Return-Path: +Delivered-To: default@flowcrypt.test +Received: from mail.flowcrypt.test + by mail.flowcrypt.test with LMTP + id OiFBGH4PXGEbCAAAc/RpdQ + (envelope-from ) + for ; Tue, 05 Oct 2021 08:40:30 +0000 +Received: from localhost (localhost [127.0.0.1]) + by mail.flowcrypt.test (Postfix) with ESMTP id 5D31522A08 + for ; Tue, 5 Oct 2021 08:40:30 +0000 (UTC) +Date: Tue, 5 Oct 2021 11:40:26 +0300 (GMT+03:00) +From: denbond7@flowcrypt.test +To: default@flowcrypt.test +Message-ID: <229386180.1.1633423226719@flowcrypt.test> +Subject: Decryption error. NO_MDC +Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_0_243811031.1633423226707" + +------=_Part_0_243811031.1633423226707 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP MESSAGE----- +Version: PGPainless + +hF4DTxRYvSK3u1MSAQdAdLdyFeP0A84nGXE5n7Bze38EDAxdSdogi/cP6P8I3HAw +owydvIf9YVRhy89dKNF0Yy5yfshR47xWqMO15GCvsEzOcdbFPTDEMYMtSK5ATmBq +yWL2yM5zrfNaG9vvnBYatWhApgzHmvxQNbOr8Wxhv8A1kV22BR5CSZwn3AqA1xUc +6t6Blr1jw/0dkJRobWWXjv04BqyXpL4wFGnx9osoMD12VyoNfTy2zqF9p5OA7Kte +3shL2g== +=tNBK +-----END PGP MESSAGE----- + +------=_Part_0_243811031.1633423226707-- + + +R615c0f7e +V50c +G11b068187e0f5c611b08000073f46975 + diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/u.25 b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/u.25 new file mode 100644 index 0000000000..f9e22cab5f --- /dev/null +++ b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/INBOX/dbox-Mails/u.25 @@ -0,0 +1,70 @@ +2 M1e C615da67a +N 0000000000000DEB +Return-Path: +Delivered-To: default@flowcrypt.test +Received: from mail.flowcrypt.test + by mail.flowcrypt.test with LMTP + id BYvqBnqmXWFvBgAAc/RpdQ + (envelope-from ) + for ; Wed, 06 Oct 2021 13:36:58 +0000 +Received: from localhost (localhost [127.0.0.1]) + by mail.flowcrypt.test (Postfix) with ESMTP id 18F13223D7 + for ; Wed, 6 Oct 2021 13:36:58 +0000 (UTC) +Date: Wed, 6 Oct 2021 16:36:55 +0300 (GMT+03:00) +From: denbond7@flowcrypt.test +To: default@flowcrypt.test +Message-ID: <160641524.1.1633527415946@flowcrypt.test> +Subject: Parse an inline pub key error +Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_0_65153003.1633527415907" + +------=_Part_0_65153003.1633527415907 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP MESSAGE----- + +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 +=D5N/ +-----END PGP MESSAGE----- +------=_Part_0_65153003.1633527415907-- + + +R615da67a +Ve29 +Gb915fe067aa65d616f06000073f46975 + diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Junk/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Junk/dbox-Mails/dovecot.index.log index 01a963325b..744d7f1e2f 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Junk/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Junk/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Sent/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Sent/dbox-Mails/dovecot.index.log index 415811cd74..b46203ec4a 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Sent/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Sent/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.cache b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.cache index 1dcefb3964..4534e445b4 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.cache and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.cache differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.log index aa62efc12c..89fa9d2dfb 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/default/mailboxes/Trash/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index index f9c85bcb5f..063a887e8d 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index.log b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index.log index e65b3f49b7..e306307afb 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/dovecot.list.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Drafts/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Drafts/dbox-Mails/dovecot.index.log index fba7da47b8..fa3cae8ab4 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Drafts/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Drafts/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.cache b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.cache index 3edcba4dc9..57a6e8c919 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.cache and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.cache differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.log index a1687e1d55..c920bef459 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/INBOX/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Junk/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Junk/dbox-Mails/dovecot.index.log index 5086669d65..9f4b0957fd 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Junk/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Junk/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.cache b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.cache index c7acae16bd..869f8a9a01 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.cache and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.cache differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.log index f183f7bd4c..efccf21e17 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/dovecot.index.log differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/u.23 b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/u.23 new file mode 100644 index 0000000000..6f0a6eaa84 --- /dev/null +++ b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/u.23 @@ -0,0 +1,34 @@ +2 M1e C615c0f7e +N 000000000000035A +Date: Tue, 5 Oct 2021 11:40:26 +0300 (GMT+03:00) +From: denbond7@flowcrypt.test +To: default@flowcrypt.test +Message-ID: <229386180.1.1633423226719@flowcrypt.test> +Subject: Decryption error. NO_MDC +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_0_243811031.1633423226707" +User-Agent: FlowCrypt_Android_1.2.3_dev_123__2021_10_05 + +------=_Part_0_243811031.1633423226707 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP MESSAGE----- +Version: PGPainless + +hF4DTxRYvSK3u1MSAQdAdLdyFeP0A84nGXE5n7Bze38EDAxdSdogi/cP6P8I3HAw +owydvIf9YVRhy89dKNF0Yy5yfshR47xWqMO15GCvsEzOcdbFPTDEMYMtSK5ATmBq +yWL2yM5zrfNaG9vvnBYatWhApgzHmvxQNbOr8Wxhv8A1kV22BR5CSZwn3AqA1xUc +6t6Blr1jw/0dkJRobWWXjv04BqyXpL4wFGnx9osoMD12VyoNfTy2zqF9p5OA7Kte +3shL2g== +=tNBK +-----END PGP MESSAGE----- + +------=_Part_0_243811031.1633423226707-- + + +R615c0f7a +V374 +Gd014ee137e0f5c610a08000073f46975 + diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/u.24 b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/u.24 new file mode 100644 index 0000000000..48218fde8e --- /dev/null +++ b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Sent/dbox-Mails/u.24 @@ -0,0 +1,61 @@ +2 M1e C615da67a +N 0000000000000C5C +Date: Wed, 6 Oct 2021 16:36:55 +0300 (GMT+03:00) +From: denbond7@flowcrypt.test +To: default@flowcrypt.test +Message-ID: <160641524.1.1633527415946@flowcrypt.test> +Subject: Parse an inline pub key error +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_0_65153003.1633527415907" +User-Agent: FlowCrypt_Android_1.2.3_dev_123__2021_10_06 + +------=_Part_0_65153003.1633527415907 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP MESSAGE----- + +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 +=D5N/ +-----END PGP MESSAGE----- +------=_Part_0_65153003.1633527415907-- + + +R615da677 +Vc91 +G800bac047aa65d615b06000073f46975 + diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.cache b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.cache index fd98fb3346..148f422493 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.cache and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.cache differ diff --git a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.log b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.log index 4efa8365f9..13a59ba1b6 100644 Binary files a/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.log and b/docker-mailserver/maildata_source/flowcrypt.test/denbond7/mailboxes/Trash/dbox-Mails/dovecot.index.log differ