[geary/wip/791275-mailsploit-mitigation: 7/8] Tidy up MailboxAddress{es} source and API a bit.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/791275-mailsploit-mitigation: 7/8] Tidy up MailboxAddress{es} source and API a bit.
- Date: Wed, 31 Jan 2018 06:12:18 +0000 (UTC)
commit 40b460dca3dc07c2813d32ada7adde731c2ee32d
Author: Michael James Gratton <mike vee net>
Date: Wed Jan 31 15:52:32 2018 +1030
Tidy up MailboxAddress{es} source and API a bit.
src/engine/rfc822/rfc822-mailbox-address.vala | 31 +------
src/engine/rfc822/rfc822-mailbox-addresses.vala | 104 ++++++++++++++++-------
src/engine/rfc822/rfc822-message.vala | 20 +++--
test/engine/rfc822-mailbox-address-test.vala | 2 +-
4 files changed, 90 insertions(+), 67 deletions(-)
---
diff --git a/src/engine/rfc822/rfc822-mailbox-address.vala b/src/engine/rfc822/rfc822-mailbox-address.vala
index 87733f7..218753d 100644
--- a/src/engine/rfc822/rfc822-mailbox-address.vala
+++ b/src/engine/rfc822/rfc822-mailbox-address.vala
@@ -16,8 +16,10 @@
*
* See [[https://tools.ietf.org/html/rfc5322#section-3.4]]
*/
-public class Geary.RFC822.MailboxAddress : Geary.MessageData.SearchableMessageData,
- Gee.Hashable<MailboxAddress>, BaseObject {
+public class Geary.RFC822.MailboxAddress :
+ Geary.MessageData.SearchableMessageData,
+ Gee.Hashable<MailboxAddress>,
+ BaseObject {
/** Determines if a string contains a valid RFC822 mailbox address. */
public static bool is_valid_address(string address) {
@@ -76,9 +78,6 @@ public class Geary.RFC822.MailboxAddress : Geary.MessageData.SearchableMessageDa
}
- internal delegate string ListToStringDelegate(MailboxAddress address);
-
-
/**
* The optional human-readable part of the mailbox address.
*
@@ -414,26 +413,4 @@ public class Geary.RFC822.MailboxAddress : Geary.MessageData.SearchableMessageDa
return to_rfc822_string();
}
- internal static string list_to_string(Gee.List<MailboxAddress> addrs,
- string empty, ListToStringDelegate to_s) {
- switch (addrs.size) {
- case 0:
- return empty;
-
- case 1:
- return to_s(addrs[0]);
-
- default:
- StringBuilder builder = new StringBuilder();
- foreach (MailboxAddress addr in addrs) {
- if (!String.is_empty(builder.str))
- builder.append(", ");
-
- builder.append(to_s(addr));
- }
-
- return builder.str;
- }
- }
}
-
diff --git a/src/engine/rfc822/rfc822-mailbox-addresses.vala b/src/engine/rfc822/rfc822-mailbox-addresses.vala
index a90c747..9d06baf 100644
--- a/src/engine/rfc822/rfc822-mailbox-addresses.vala
+++ b/src/engine/rfc822/rfc822-mailbox-addresses.vala
@@ -1,4 +1,5 @@
-/* Copyright 2016 Software Freedom Conservancy Inc.
+/*
+ * Copyright 2016 Software Freedom Conservancy Inc.
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
@@ -12,21 +13,62 @@
*
* See [[https://tools.ietf.org/html/rfc5322#section-3.4]]
*/
-public class Geary.RFC822.MailboxAddresses : Geary.MessageData.AbstractMessageData,
- Geary.MessageData.SearchableMessageData, Geary.RFC822.MessageData, Gee.Hashable<MailboxAddresses> {
-
- public int size { get { return addrs.size; } }
-
+public class Geary.RFC822.MailboxAddresses :
+ Geary.MessageData.AbstractMessageData,
+ Geary.MessageData.SearchableMessageData,
+ Geary.RFC822.MessageData, Gee.Hashable<MailboxAddresses> {
+
+
+ /**
+ * Converts a list of mailbox addresses to a string.
+ *
+ * The delegate //to_s// is used for converting addresses in the
+ * given list. If the list is empty, the given empty string is
+ * returned.
+ */
+ private static string list_to_string(Gee.List<MailboxAddress> addrs,
+ string empty,
+ ListToStringDelegate to_s) {
+ switch (addrs.size) {
+ case 0:
+ return empty;
+
+ case 1:
+ return to_s(addrs[0]);
+
+ default:
+ StringBuilder builder = new StringBuilder();
+ foreach (MailboxAddress addr in addrs) {
+ if (!String.is_empty(builder.str))
+ builder.append(", ");
+
+ builder.append(to_s(addr));
+ }
+
+ return builder.str;
+ }
+ }
+
+
+ /** Signature for "to_string" implementation for {@link list_to_string}. */
+ private delegate string ListToStringDelegate(MailboxAddress address);
+
+ /** Returns the number of addresses in this list. */
+ public int size {
+ get { return this.addrs.size; }
+ }
+
private Gee.List<MailboxAddress> addrs = new Gee.ArrayList<MailboxAddress>();
-
+
+
public MailboxAddresses(Gee.Collection<MailboxAddress> addrs) {
this.addrs.add_all(addrs);
}
-
+
public MailboxAddresses.single(MailboxAddress addr) {
- addrs.add(addr);
+ this.addrs.add(addr);
}
-
+
public MailboxAddresses.from_rfc822_string(string rfc822) {
InternetAddressList addrlist = InternetAddressList.parse_string(rfc822);
if (addrlist == null)
@@ -57,41 +99,41 @@ public class Geary.RFC822.MailboxAddresses : Geary.MessageData.AbstractMessageDa
}
}
}
-
+
public new MailboxAddress? get(int index) {
return addrs.get(index);
}
-
+
public Gee.Iterator<MailboxAddress> iterator() {
return addrs.iterator();
}
-
+
public Gee.List<MailboxAddress> get_all() {
return addrs.read_only_view;
}
-
+
public bool contains_normalized(string address) {
if (addrs.size < 1)
return false;
-
+
string normalized_address = address.normalize().casefold();
-
+
foreach (MailboxAddress mailbox_address in addrs) {
if (mailbox_address.address.normalize().casefold() == normalized_address)
return true;
}
-
+
return false;
}
-
+
public bool contains(string address) {
if (addrs.size < 1)
return false;
-
+
foreach (MailboxAddress a in addrs)
if (a.address == address)
return true;
-
+
return false;
}
@@ -112,7 +154,7 @@ public class Geary.RFC822.MailboxAddresses : Geary.MessageData.AbstractMessageDa
* @see MailboxAddress.to_rfc822_string
*/
public string to_rfc822_string() {
- return MailboxAddress.list_to_string(addrs, ", ", (a) => a.to_rfc822_string());
+ return list_to_string(addrs, ", ", (a) => a.to_rfc822_string());
}
public uint hash() {
@@ -120,28 +162,28 @@ public class Geary.RFC822.MailboxAddresses : Geary.MessageData.AbstractMessageDa
Gee.TreeSet<string> sorted_addresses = traverse<RFC822.MailboxAddress>(addrs)
.map<string>(m => m.address)
.to_tree_set(String.stri_cmp);
-
+
// xor all strings in sorted order
uint xor = 0;
foreach (string address in sorted_addresses)
xor ^= address.hash();
-
+
return xor;
}
-
+
public bool equal_to(MailboxAddresses other) {
if (this == other)
return true;
-
+
if (addrs.size != other.addrs.size)
return false;
-
+
Gee.HashSet<RFC822.MailboxAddress> first = new Gee.HashSet<RFC822.MailboxAddress>();
first.add_all(addrs);
-
+
Gee.HashSet<RFC822.MailboxAddress> second = new Gee.HashSet<RFC822.MailboxAddress>();
second.add_all(other.addrs);
-
+
return Collection.are_sets_equal<RFC822.MailboxAddress>(first, second);
}
@@ -149,11 +191,11 @@ public class Geary.RFC822.MailboxAddresses : Geary.MessageData.AbstractMessageDa
* See Geary.MessageData.SearchableMessageData.
*/
public string to_searchable_string() {
- return MailboxAddress.list_to_string(addrs, " ", (a) => a.to_searchable_string());
+ return list_to_string(addrs, " ", (a) => a.to_searchable_string());
}
public override string to_string() {
- return MailboxAddress.list_to_string(addrs, "(no addresses)", (a) => a.to_string());
+ return list_to_string(addrs, "(no addresses)", (a) => a.to_string());
}
-}
+}
diff --git a/src/engine/rfc822/rfc822-message.vala b/src/engine/rfc822/rfc822-message.vala
index 97ef351..d11f612 100644
--- a/src/engine/rfc822/rfc822-message.vala
+++ b/src/engine/rfc822/rfc822-message.vala
@@ -1,4 +1,6 @@
-/* Copyright 2016 Software Freedom Conservancy Inc.
+/*
+ * Copyright 2016 Software Freedom Conservancy Inc.
+ * Copyright 2018 Michael Gratton <mike vee net>
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
@@ -716,19 +718,21 @@ public class Geary.RFC822.Message : BaseObject {
return body;
}
-
+
/**
* Return the full list of recipients (to, cc, and bcc) as a searchable
* string. Note that values that come out of this function are persisted.
*/
public string? get_searchable_recipients() {
- Gee.List<RFC822.MailboxAddress>? recipients = get_recipients();
- if (recipients == null)
- return null;
-
- return RFC822.MailboxAddress.list_to_string(recipients, "", (a) => a.to_searchable_string());
+ string searchable = null;
+ Gee.List<RFC822.MailboxAddress>? recipient_list = get_recipients();
+ if (recipient_list != null) {
+ MailboxAddresses recipients = new MailboxAddresses(recipient_list);
+ searchable = recipients.to_searchable_string();
+ }
+ return searchable;
}
-
+
public Memory.Buffer get_content_by_mime_id(string mime_id) throws RFC822Error {
GMime.Part? part = find_mime_part_by_mime_id(message.get_mime_part(), mime_id);
if (part == null)
diff --git a/test/engine/rfc822-mailbox-address-test.vala b/test/engine/rfc822-mailbox-address-test.vala
index f30480b..964d977 100644
--- a/test/engine/rfc822-mailbox-address-test.vala
+++ b/test/engine/rfc822-mailbox-address-test.vala
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Michael Gratton <mike vee net>
+ * Copyright 2016-2018 Michael Gratton <mike vee net>
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]