From 84450e105c98938aedea7a36d5ca0ee8368e0af3 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 14 Mar 2019 19:52:37 +0000 Subject: [PATCH] Revised identity matching, check for self --- FAQ.md | 12 +-- app/src/main/java/eu/faircode/email/Core.java | 101 ++++++++++-------- 2 files changed, 61 insertions(+), 52 deletions(-) diff --git a/FAQ.md b/FAQ.md index 8f086f127a..fedc3dd72e 100644 --- a/FAQ.md +++ b/FAQ.md @@ -670,14 +670,14 @@ Note that this is independent of receiving messages. Identities are matched on e-mail address in this order: -1. *To* header address -1. *To* header address without extra (see [this FAQ](#user-content-faq33)) -1. *From* header address -1. *From* header address without extra 1. *Delivered-To* header address +1. *To* header address +1. *Cc* header address +1. *From* header address -Matched identities can be used to color code messages. The identity color takes precedence over the account color. -Setting colors is a pro feature. +Matched identities can be used to color code messages. +The identity color takes precedence over the account color. +Setting identity colors is a pro feature.
diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index ca9e2e8a02..853444b331 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1115,42 +1115,36 @@ class Core { } if (message == null) { - // Build list of addresses - Address[] recipients = helper.getTo(); - Address[] senders = helper.getFrom(); - if (recipients == null) - recipients = new Address[0]; - if (senders == null) - senders = new Address[0]; - Address[] all = Arrays.copyOf(recipients, recipients.length + senders.length); - System.arraycopy(senders, 0, all, recipients.length, senders.length); - - List emails = new ArrayList<>(); - for (Address address : all) { - String to = ((InternetAddress) address).getAddress(); - if (!TextUtils.isEmpty(to)) { - to = to.toLowerCase(); - emails.add(to); - String canonical = Helper.canonicalAddress(to); - if (!to.equals(canonical)) - emails.add(canonical); - } - } + Address[] froms = helper.getFrom(); + Address[] tos = helper.getTo(); + Address[] ccs = helper.getCc(); String delivered = helper.getDeliveredTo(); - if (!TextUtils.isEmpty(delivered)) { - delivered = delivered.toLowerCase(); - emails.add(delivered); - String canonical = Helper.canonicalAddress(delivered); - if (!delivered.equals(canonical)) - emails.add(canonical); - } - // Search for identity + // Build ordered list of addresses + List
addresses = new ArrayList<>(); + if (delivered != null) + addresses.add(new InternetAddress(delivered)); + if (tos != null) + addresses.addAll(Arrays.asList(tos)); + if (ccs != null) + addresses.addAll(Arrays.asList(ccs)); + if (froms != null) + addresses.addAll(Arrays.asList(froms)); + + // Search for matching identity EntityIdentity identity = null; - for (String email : emails) { - identity = db.identity().getIdentity(folder.account, email); - if (identity != null) - break; + for (Address address : addresses) { + String email = ((InternetAddress) address).getAddress(); + if (!TextUtils.isEmpty(email)) { + identity = db.identity().getIdentity(folder.account, email); + if (identity == null) { + String canonical = Helper.canonicalAddress(email); + if (!canonical.equals(email)) + identity = db.identity().getIdentity(folder.account, canonical); + } + if (identity != null) + break; + } } message = new EntityMessage(); @@ -1165,11 +1159,11 @@ class Core { message.references = TextUtils.join(" ", helper.getReferences()); message.inreplyto = helper.getInReplyTo(); - message.deliveredto = helper.getDeliveredTo(); + message.deliveredto = delivered; message.thread = helper.getThreadId(uid); - message.from = helper.getFrom(); - message.to = helper.getTo(); - message.cc = helper.getCc(); + message.from = froms; + message.to = tos; + message.cc = ccs; message.bcc = helper.getBcc(); message.reply = helper.getReply(); message.subject = helper.getSubject(); @@ -1194,15 +1188,13 @@ class Core { Uri lookupUri = ContactInfo.getLookupUri(context, message.from); message.avatar = (lookupUri == null ? null : lookupUri.toString()); - // Check sender - Address sender = helper.getSender(); - if (sender != null && senders.length > 0) { - String[] f = ((InternetAddress) senders[0]).getAddress().split("@"); + Address sender = helper.getSender(); // header + if (sender != null) { String[] s = ((InternetAddress) sender).getAddress().split("@"); - if (f.length > 1 && s.length > 1) { - if (!f[1].equals(s[1])) - message.warning = context.getString(R.string.title_via, s[1]); - } + String[] f = (froms == null || froms.length == 0 ? null + : (((InternetAddress) froms[0]).getAddress()).split("@")); + if (s.length > 1 && (f == null || (f.length > 1 && !s[1].equals(f[1])))) + message.warning = context.getString(R.string.title_via, s[1]); } message.id = db.message().insertMessage(message); @@ -1222,7 +1214,23 @@ class Core { if (!folder.isOutgoing() && !EntityFolder.ARCHIVE.equals(folder.type)) { Address[] replies = (message.reply != null ? message.reply : message.from); - if (replies != null) + if (replies != null) { + // Check if from self + boolean me = true; + for (Address reply : replies) { + String email = ((InternetAddress) reply).getAddress(); + String canonical = Helper.canonicalAddress(email); + if (!TextUtils.isEmpty(email) && + db.identity().getIdentity(folder.account, email.toLowerCase()) == null && + (canonical.equals(email) || + db.identity().getIdentity(folder.account, canonical) == null)) { + me = false; + break; + } + } + if (me) + replies = message.to; + for (Address reply : replies) { String email = ((InternetAddress) reply).getAddress(); String name = ((InternetAddress) reply).getPersonal(); @@ -1246,6 +1254,7 @@ class Core { Log.i("Updated sender contact=" + contact); } } + } } } else { boolean update = false;