From ca97512a3ae79ec9ef1da21a745207244db13f9b Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 20 Feb 2019 13:41:26 +0000 Subject: [PATCH] Better search bug workaround --- .../eu/faircode/email/ViewModelBrowse.java | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ViewModelBrowse.java b/app/src/main/java/eu/faircode/email/ViewModelBrowse.java index f62305c1f7..f45bfc235d 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelBrowse.java +++ b/app/src/main/java/eu/faircode/email/ViewModelBrowse.java @@ -174,6 +174,7 @@ public class ViewModelBrowse extends ViewModel { @Override public Object doCommand(IMAPProtocol protocol) { try { + boolean keywords = (folder.keywords.length > 0); if (protocol.supportsUtf8()) { // SEARCH OR OR FROM "x" TO "x" OR SUBJECT "x" BODY "x" ALL // SEARCH OR OR OR FROM "x" TO "x" OR SUBJECT "x" BODY "x" (KEYWORD x) ALL @@ -193,7 +194,7 @@ public class ViewModelBrowse extends ViewModel { arg.writeBytes(state.search.getBytes()); arg.writeAtom("BODY"); arg.writeBytes(state.search.getBytes()); - if (folder.keywords.length > 0) { + if (keywords) { arg.writeAtom("KEYWORD"); arg.writeBytes(state.search.getBytes()); } @@ -224,32 +225,45 @@ public class ViewModelBrowse extends ViewModel { return imessages; } else { // No UTF-8 support - String search = Normalizer - .normalize(state.search, Normalizer.Form.NFD) - .replaceAll("[^\\p{ASCII}]", ""); - Log.i("Boundary ASCII search=" + search); - SearchTerm term = new OrTerm( - new OrTerm( - new FromStringTerm(search), - new RecipientStringTerm(Message.RecipientType.TO, search) - ), - new OrTerm( - new SubjectTerm(search), - new BodyTerm(search) - ) - ); + try { + Log.i("Boundary default search=" + state.search); + return state.ifolder.search(getSearchTerm(state.search, keywords)); + } catch (MessagingException ex) { + Log.w(ex); - if (folder.keywords.length > 0) - term = new OrTerm(term, new FlagTerm( - new Flags(Helper.sanitizeKeyword(search)), true)); - - return state.ifolder.search(term); + // Workaround: + // javax.mail.MessagingException: AE5 BAD Error in IMAP command SEARCH: 8bit data in atom; + // nested exception is: + // com.sun.mail.iap.BadCommandException: AE5 BAD Error in IMAP command SEARCH: 8bit data in atom + String search = Normalizer + .normalize(state.search, Normalizer.Form.NFD) + .replaceAll("[^\\p{ASCII}]", ""); + Log.i("Boundary ASCII search=" + search); + return state.ifolder.search(getSearchTerm(search, keywords)); + } } } catch (MessagingException ex) { Log.e(ex); return ex; } } + + private SearchTerm getSearchTerm(String search, boolean keywords) { + SearchTerm term = new OrTerm( + new OrTerm( + new FromStringTerm(search), + new RecipientStringTerm(Message.RecipientType.TO, search) + ), + new OrTerm( + new SubjectTerm(search), + new BodyTerm(search) + ) + ); + if (keywords) + term = new OrTerm(term, + new FlagTerm(new Flags(Helper.sanitizeKeyword(search)), true)); + return term; + } }); if (result instanceof MessagingException)