From 96c2b95789441e23f462c99fe4e6cb4f9bf2ca87 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 3 Dec 2019 15:55:52 +0100 Subject: [PATCH] Store received public keys --- .../eu/faircode/email/DaoCertificate.java | 6 ++++- .../eu/faircode/email/FragmentMessages.java | 26 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoCertificate.java b/app/src/main/java/eu/faircode/email/DaoCertificate.java index ea88fc6bfe..a50ae424b9 100644 --- a/app/src/main/java/eu/faircode/email/DaoCertificate.java +++ b/app/src/main/java/eu/faircode/email/DaoCertificate.java @@ -34,7 +34,11 @@ public interface DaoCertificate { @Query("SELECT * FROM certificate" + " WHERE subject = :subject") - EntityCertificate getCertificate(String subject); + EntityCertificate getCertificateBySubject(String subject); + + @Query("SELECT * FROM certificate" + + " WHERE email = :email") + List getCertificateByEmail(String email); @Insert long insertCertificate(EntityCertificate certificate); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 3f570f8d4e..193d3978eb 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -52,6 +52,7 @@ import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.text.TextUtils; import android.text.format.DateUtils; +import android.util.Base64; import android.util.LongSparseArray; import android.util.Pair; import android.util.TypedValue; @@ -163,6 +164,7 @@ import java.util.Properties; import javax.mail.FolderClosedException; import javax.mail.Session; +import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import static android.app.Activity.RESULT_OK; @@ -4348,10 +4350,14 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. DB db = DB.getInstance(context); if (EntityMessage.SMIME_SIGNONLY.equals(type)) { + EntityMessage message = db.message().getMessage(id); + if (message == null) + return null; + // Get content/signature File content = null; File signature = null; - List attachments = db.attachment().getAttachments(id); + List attachments = db.attachment().getAttachments(message.id); for (EntityAttachment attachment : attachments) if (EntityAttachment.SMIME_SIGNATURE.equals(attachment.encryption)) { if (!attachment.available) @@ -4383,8 +4389,22 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. .setProvider(new BouncyCastleProvider()) .getCertificate(certHolder); try { - if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert))) - return cert.getSubjectDN().getName(); + if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert))) { + String subject = cert.getSubjectDN().getName(); + if (!TextUtils.isEmpty(subject) && + message.from != null && message.from.length == 1) { + EntityCertificate c = db.certificate().getCertificateBySubject(subject); + if (c == null) { + c = new EntityCertificate(); + c.subject = subject; + c.email = ((InternetAddress) message.from[0]).getAddress(); + c.data = Base64.encodeToString(cert.getEncoded(), Base64.NO_WRAP); + c.id = db.certificate().insertCertificate(c); + } + } + + return subject; + } } catch (CMSVerifierCertificateNotValidException ex) { Log.w(ex); }