Refactoring

pull/194/merge
M66B 3 years ago
parent 41b83cc82c
commit cd117c3251

@ -98,6 +98,7 @@ import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -114,6 +115,7 @@ import javax.mail.Flags;
import javax.mail.Folder; import javax.mail.Folder;
import javax.mail.FolderClosedException; import javax.mail.FolderClosedException;
import javax.mail.FolderNotFoundException; import javax.mail.FolderNotFoundException;
import javax.mail.Header;
import javax.mail.Message; import javax.mail.Message;
import javax.mail.MessageRemovedException; import javax.mail.MessageRemovedException;
import javax.mail.MessagingException; import javax.mail.MessagingException;
@ -2796,6 +2798,9 @@ class Core {
// No MX check // No MX check
List<Header> headers =
(EntityRule.needsHeaders(rules) ? helper.getAllHeaders() : null);
try { try {
db.beginTransaction(); db.beginTransaction();
@ -2814,7 +2819,7 @@ class Core {
attachment.id = db.attachment().insertAttachment(attachment); attachment.id = db.attachment().insertAttachment(attachment);
} }
runRules(context, imessage, account, folder, message, rules); runRules(context, headers, account, folder, message, rules);
reportNewMessage(context, account, folder, message); reportNewMessage(context, account, folder, message);
db.setTransactionSuccessful(); db.setTransactionSuccessful();
@ -3649,6 +3654,9 @@ class Core {
} }
} }
List<Header> headers =
(EntityRule.needsHeaders(rules) ? helper.getAllHeaders() : null);
if (message == null) { if (message == null) {
Long sent = helper.getSent(); Long sent = helper.getSent();
@ -3860,7 +3868,7 @@ class Core {
attachment.id = db.attachment().insertAttachment(attachment); attachment.id = db.attachment().insertAttachment(attachment);
} }
runRules(context, imessage, account, folder, message, rules); runRules(context, headers, account, folder, message, rules);
if (message.blocklist != null && message.blocklist) { if (message.blocklist != null && message.blocklist) {
boolean use_blocklist = prefs.getBoolean("use_blocklist", false); boolean use_blocklist = prefs.getBoolean("use_blocklist", false);
@ -4070,7 +4078,7 @@ class Core {
db.message().updateMessage(message); db.message().updateMessage(message);
if (process) if (process)
runRules(context, imessage, account, folder, message, rules); runRules(context, headers, account, folder, message, rules);
db.setTransactionSuccessful(); db.setTransactionSuccessful();
} finally { } finally {
@ -4233,7 +4241,7 @@ class Core {
} }
private static void runRules( private static void runRules(
Context context, Message imessage, Context context, List<Header> headers,
EntityAccount account, EntityFolder folder, EntityMessage message, EntityAccount account, EntityFolder folder, EntityMessage message,
List<EntityRule> rules) { List<EntityRule> rules) {
@ -4246,7 +4254,7 @@ class Core {
try { try {
boolean executed = false; boolean executed = false;
for (EntityRule rule : rules) for (EntityRule rule : rules)
if (rule.matches(context, message, imessage)) { if (rule.matches(context, message, headers)) {
rule.execute(context, message); rule.execute(context, message);
executed = true; executed = true;
if (rule.stop) if (rule.stop)

@ -51,8 +51,8 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@ -61,7 +61,6 @@ import java.util.regex.Pattern;
import javax.mail.Address; import javax.mail.Address;
import javax.mail.Header; import javax.mail.Header;
import javax.mail.Message;
import javax.mail.MessagingException; import javax.mail.MessagingException;
import javax.mail.internet.AddressException; import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
@ -125,7 +124,20 @@ public class EntityRule {
private static ExecutorService executor = Helper.getBackgroundExecutor(1, "rule"); private static ExecutorService executor = Helper.getBackgroundExecutor(1, "rule");
boolean matches(Context context, EntityMessage message, Message imessage) throws MessagingException { static boolean needsHeaders(List<EntityRule> rules) {
for (EntityRule rule : rules)
try {
JSONObject jcondition = new JSONObject(rule.condition);
if (jcondition.has("header"))
return true;
} catch (Throwable ex) {
Log.e(ex);
}
return false;
}
boolean matches(Context context, EntityMessage message, List<Header> headers) throws MessagingException {
try { try {
JSONObject jcondition = new JSONObject(condition); JSONObject jcondition = new JSONObject(condition);
@ -262,16 +274,14 @@ public class EntityRule {
return false; return false;
} else { } else {
boolean matches = false; boolean matches = false;
Enumeration<Header> headers; if (headers == null) {
if (imessage != null) if (message.headers == null)
headers = imessage.getAllHeaders();
else if (message.headers != null) {
ByteArrayInputStream bis = new ByteArrayInputStream(message.headers.getBytes());
headers = new InternetHeaders(bis).getAllHeaders();
} else
throw new IllegalArgumentException(context.getString(R.string.title_rule_no_headers)); throw new IllegalArgumentException(context.getString(R.string.title_rule_no_headers));
while (headers.hasMoreElements()) {
Header header = headers.nextElement(); ByteArrayInputStream bis = new ByteArrayInputStream(message.headers.getBytes());
headers = Collections.list(new InternetHeaders(bis).getAllHeaders());
}
for (Header header : headers) {
String formatted = header.getName() + ": " + header.getValue(); String formatted = header.getName() + ": " + header.getValue();
if (matches(context, message, value, formatted, regex)) { if (matches(context, message, value, formatted, regex)) {
matches = true; matches = true;

@ -1045,6 +1045,11 @@ public class MessageHelper {
return (header == null ? null : MimeUtility.unfold(header)); return (header == null ? null : MimeUtility.unfold(header));
} }
List<Header> getAllHeaders() throws MessagingException {
ensureHeaders();
return Collections.list(imessage.getAllHeaders());
}
String[] getReferences() throws MessagingException { String[] getReferences() throws MessagingException {
ensureHeaders(); ensureHeaders();

Loading…
Cancel
Save