@@ -154,7 +154,7 @@ export class MessageRenderer {
154154 private static async renderPgpSignatureCheckResult (
155155 renderModule : RenderInterface ,
156156 verifyRes : VerifyRes | undefined ,
157- wasSignerEmailSupplied : boolean ,
157+ senderEmail : string | undefined ,
158158 retryVerification ?: ( ) => Promise < VerifyRes | undefined >
159159 ) {
160160 if ( verifyRes ?. error ) {
@@ -188,25 +188,39 @@ export class MessageRenderer {
188188 retryVerificationAgain = retryVerification ;
189189 }
190190 }
191- await MessageRenderer . renderPgpSignatureCheckResult ( renderModule , verifyRes , wasSignerEmailSupplied , retryVerificationAgain ) ;
191+ await MessageRenderer . renderPgpSignatureCheckResult ( renderModule , verifyRes , senderEmail , retryVerificationAgain ) ;
192192 return ;
193- } else if ( ! wasSignerEmailSupplied ) {
193+ } else if ( ! senderEmail ) {
194194 // todo: unit-test this case?
195195 renderModule . renderSignatureStatus ( 'could not verify signature: missing pubkey, missing sender info' ) ;
196196 } else {
197- MessageRenderer . renderMissingPubkeyOrBadSignature ( renderModule , verifyRes ) ;
197+ await MessageRenderer . renderMissingPubkeyOrBadSignature ( renderModule , verifyRes , senderEmail ) ;
198198 }
199199 }
200200
201- private static renderMissingPubkeyOrBadSignature ( renderModule : RenderInterfaceBase , verifyRes : VerifyRes ) : void {
201+ private static async renderMissingPubkeyOrBadSignature ( renderModule : RenderInterfaceBase , verifyRes : VerifyRes , senderEmail : string ) : Promise < void > {
202202 // eslint-disable-next-line no-null/no-null
203203 if ( verifyRes . match === null || ! Value . arr . hasIntersection ( verifyRes . signerLongids , verifyRes . suppliedLongids ) ) {
204- MessageRenderer . renderMissingPubkey ( renderModule , verifyRes . signerLongids [ 0 ] ) ;
204+ const signerLongid = verifyRes . signerLongids [ 0 ] ;
205+ const signerEmails = await ContactStore . getEmailsByLongid ( undefined , signerLongid ) ;
206+ if ( signerEmails . includes ( senderEmail ) ) {
207+ // signer key is associated with the sender — not a mismatch, but pubkey wasn't supplied for verification
208+ MessageRenderer . renderMissingPubkey ( renderModule , signerLongid ) ;
209+ } else if ( signerEmails . length > 0 ) {
210+ MessageRenderer . renderSignerSenderMismatch ( renderModule , senderEmail , signerEmails [ 0 ] ) ;
211+ } else {
212+ MessageRenderer . renderMissingPubkey ( renderModule , signerLongid ) ;
213+ }
205214 } else {
206215 MessageRenderer . renderBadSignature ( renderModule ) ;
207216 }
208217 }
209218
219+ private static renderSignerSenderMismatch ( renderModule : RenderInterfaceBase , senderEmail : string , signerEmail : string ) {
220+ renderModule . renderSignatureStatus ( `could not verify signature: signed by ${ signerEmail } but message is from ${ senderEmail } ` ) ;
221+ renderModule . setFrameColor ( 'red' ) ;
222+ }
223+
210224 private static renderMissingPubkey ( renderModule : RenderInterfaceBase , signerLongid : string ) {
211225 renderModule . renderSignatureStatus ( `could not verify signature: missing pubkey ${ signerLongid } ` ) ;
212226 }
@@ -615,7 +629,7 @@ export class MessageRenderer {
615629 }
616630 decryptedContent = this . clipMessageIfLimitExceeds ( decryptedContent ) ;
617631 renderModule . separateQuotedContentAndRenderText ( decryptedContent , isHtml , isChecksumInvalid ) ;
618- await MessageRenderer . renderPgpSignatureCheckResult ( renderModule , sigResult , Boolean ( signerEmail ) , retryVerification ) ;
632+ await MessageRenderer . renderPgpSignatureCheckResult ( renderModule , sigResult , signerEmail , retryVerification ) ;
619633 if ( renderableAttachments . length ) {
620634 renderModule . renderInnerAttachments ( renderableAttachments , isEncrypted ) ;
621635 }
0 commit comments