diff --git a/FlowCrypt/Functionality/Mail Provider/Message Provider/MessageService.swift b/FlowCrypt/Functionality/Mail Provider/Message Provider/MessageService.swift index fb1251f65..ec03e4489 100644 --- a/FlowCrypt/Functionality/Mail Provider/Message Provider/MessageService.swift +++ b/FlowCrypt/Functionality/Mail Provider/Message Provider/MessageService.swift @@ -22,12 +22,14 @@ struct ProcessedMessage { } enum MessageSignature: Hashable { - case good, unsigned, error(String), missingPubkey(String), bad, pending + case good, goodMixed, unsigned, error(String), missingPubkey(String), partial, bad, pending var message: String { switch self { case .good: return "message_signed".localized + case .goodMixed: + return "message_signature_good_mixed".localized case .unsigned: return "message_not_signed".localized case .error(let message): @@ -35,6 +37,8 @@ struct ProcessedMessage { case .missingPubkey(let longid): let message = "message_missing_pubkey".localizeWithArguments(longid) return "message_signature_verify_error".localizeWithArguments(message) + case .partial: + return "message_signature_partial".localized case .bad: return "message_bad_signature".localized case .pending: @@ -44,9 +48,9 @@ struct ProcessedMessage { var icon: String { switch self { - case .good: + case .good, .goodMixed: return "lock" - case .error, .missingPubkey: + case .error, .missingPubkey, .partial: return "exclamationmark.triangle" case .unsigned, .bad: return "xmark" @@ -57,9 +61,9 @@ struct ProcessedMessage { var color: UIColor { switch self { - case .good: + case .good, .goodMixed: return .main - case .error, .missingPubkey: + case .error, .missingPubkey, .partial: return .warningColor case .unsigned, .bad: return .errorColor @@ -280,6 +284,10 @@ extension MessageService { guard signature.match == true else { return .bad } + guard signature.partial != true else { return .partial } + + guard signature.mixed != true else { return .goodMixed } + return .good } } diff --git a/FlowCrypt/Resources/en.lproj/Localizable.strings b/FlowCrypt/Resources/en.lproj/Localizable.strings index 56a500887..e783ad01e 100644 --- a/FlowCrypt/Resources/en.lproj/Localizable.strings +++ b/FlowCrypt/Resources/en.lproj/Localizable.strings @@ -33,8 +33,10 @@ "message_encrypted" = "encrypted"; "message_not_encrypted" = "not encrypted"; "message_signed" = "signed"; +"message_signature_good_mixed" = "signed with mixed keys"; "message_not_signed" = "not signed"; "message_missing_pubkey" = "no public key %@"; +"message_signature_partial" = "only partially signed"; "message_signature_verify_error" = "cannot verify signature: %@"; "message_bad_signature" = "bad signature"; "message_signature_pending" = "verifying signature..."; diff --git a/appium/tests/specs/inbox/CheckAllEmailSignatureCases.spec.ts b/appium/tests/specs/inbox/CheckAllEmailSignatureCases.spec.ts index e3af10387..491425d1b 100644 --- a/appium/tests/specs/inbox/CheckAllEmailSignatureCases.spec.ts +++ b/appium/tests/specs/inbox/CheckAllEmailSignatureCases.spec.ts @@ -71,5 +71,15 @@ describe('INBOX: ', () => { await EmailScreen.checkEncryptionBadge('not encrypted'); await EmailScreen.checkSignatureBadge('bad signature'); await EmailScreen.clickBackButton(); + + await SearchScreen.clickBackButton(); + + // partially signed only message + await MailFolderScreen.clickSearchButton(); + await SearchScreen.searchAndClickEmailBySubject('Partially signed only message'); + + await EmailScreen.checkEncryptionBadge('not encrypted'); + await EmailScreen.checkSignatureBadge('only partially signed'); + await EmailScreen.clickBackButton(); }); });