Skip to content

Commit dab4cd0

Browse files
committed
Modified the search the private keys backups algorithm. | #105.
1 parent d53eeb5 commit dab4cd0

File tree

8 files changed

+76
-71
lines changed

8 files changed

+76
-71
lines changed

FlowCrypt/src/main/java/com/flowcrypt/email/api/email/EmailUtil.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,14 @@
66

77
package com.flowcrypt.email.api.email;
88

9+
import com.sun.mail.imap.IMAPFolder;
10+
11+
import java.util.Arrays;
12+
import java.util.List;
913
import java.util.UUID;
1014

15+
import javax.mail.MessagingException;
16+
1117
/**
1218
* @author Denis Bondarenko
1319
* Date: 29.09.2017
@@ -16,7 +22,26 @@
1622
*/
1723

1824
public class EmailUtil {
25+
/**
26+
* Generate an unique content id.
27+
*
28+
* @return
29+
*/
1930
public static String generateContentId() {
2031
return "<" + UUID.randomUUID().toString() + "@flowcrypt" + ">";
2132
}
33+
34+
/**
35+
* Check if current folder has {@link JavaEmailConstants#FOLDER_ATTRIBUTE_NO_SELECT}. If the
36+
* folder contains it attribute we will not show this folder in the list.
37+
*
38+
* @param imapFolder The {@link IMAPFolder} object.
39+
* @return true if current folder contains attribute
40+
* {@link JavaEmailConstants#FOLDER_ATTRIBUTE_NO_SELECT}, false otherwise.
41+
* @throws MessagingException
42+
*/
43+
public static boolean isFolderHasNoSelectAttribute(IMAPFolder imapFolder) throws MessagingException {
44+
List<String> attributes = Arrays.asList(imapFolder.getAttributes());
45+
return attributes.contains(JavaEmailConstants.FOLDER_ATTRIBUTE_NO_SELECT);
46+
}
2247
}

FlowCrypt/src/main/java/com/flowcrypt/email/api/email/FoldersManager.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.flowcrypt.email.database.dao.source.imap.ImapLabelsDaoSource;
1414
import com.sun.mail.imap.IMAPFolder;
1515

16-
import java.util.Arrays;
1716
import java.util.Collection;
1817
import java.util.LinkedHashMap;
1918
import java.util.LinkedList;
@@ -183,7 +182,7 @@ public void clear() {
183182
*/
184183
public void addFolder(IMAPFolder imapFolder, String folderAlias) throws MessagingException {
185184
if (imapFolder != null
186-
&& !isFolderHasNoSelectAttribute(imapFolder)
185+
&& !EmailUtil.isFolderHasNoSelectAttribute(imapFolder)
187186
&& !TextUtils.isEmpty(imapFolder.getFullName())
188187
&& !folders.containsKey(imapFolder.getFullName())) {
189188
this.folders.put(prepareFolderKey(imapFolder), generateFolder(imapFolder, folderAlias));
@@ -285,20 +284,6 @@ private String prepareFolderKey(Folder folder) {
285284
}
286285
}
287286

288-
/**
289-
* Check if current folder has {@link JavaEmailConstants#FOLDER_ATTRIBUTE_NO_SELECT}. If the
290-
* folder contains it attribute we will not show this folder in the list.
291-
*
292-
* @param imapFolder The {@link IMAPFolder} object.
293-
* @return true if current folder contains attribute
294-
* {@link JavaEmailConstants#FOLDER_ATTRIBUTE_NO_SELECT}, false otherwise.
295-
* @throws MessagingException
296-
*/
297-
private boolean isFolderHasNoSelectAttribute(IMAPFolder imapFolder) throws MessagingException {
298-
List<String> attributes = Arrays.asList(imapFolder.getAttributes());
299-
return attributes.contains(JavaEmailConstants.FOLDER_ATTRIBUTE_NO_SELECT);
300-
}
301-
302287
/**
303288
* This class contains information about all servers folders types.
304289
*/

FlowCrypt/src/main/java/com/flowcrypt/email/api/email/sync/EmailSyncManager.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,12 +269,10 @@ public void sendMessage(String ownerKey, int requestCode, OutgoingMessageInfo ou
269269
*
270270
* @param ownerKey The name of the reply to {@link android.os.Messenger}.
271271
* @param requestCode The unique request code for identify the current action.
272-
* @param searchTermString The search phrase.
273272
*/
274-
public void loadPrivateKeys(String ownerKey, int requestCode, String searchTermString) {
273+
public void loadPrivateKeys(String ownerKey, int requestCode) {
275274
try {
276-
syncTaskBlockingQueue.put(new LoadPrivateKeysFromEmailBackupSyncTask(searchTermString,
277-
ownerKey, requestCode));
275+
syncTaskBlockingQueue.put(new LoadPrivateKeysFromEmailBackupSyncTask(ownerKey, requestCode));
278276
} catch (InterruptedException e) {
279277
e.printStackTrace();
280278
}

FlowCrypt/src/main/java/com/flowcrypt/email/api/email/sync/tasks/LoadPrivateKeysFromEmailBackupSyncTask.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.os.Messenger;
1010
import android.text.TextUtils;
1111

12+
import com.flowcrypt.email.api.email.EmailUtil;
1213
import com.flowcrypt.email.api.email.JavaEmailConstants;
1314
import com.flowcrypt.email.api.email.SearchBackupsUtil;
1415
import com.flowcrypt.email.api.email.sync.SyncListener;
@@ -42,44 +43,43 @@
4243
*/
4344

4445
public class LoadPrivateKeysFromEmailBackupSyncTask extends BaseSyncTask {
45-
private String searchTermString;
46-
4746
/**
4847
* The base constructor.
4948
*
50-
* @param searchTermString The search phrase.
51-
* @param ownerKey The name of the reply to {@link Messenger}.
52-
* @param requestCode The unique request code for the reply to {@link Messenger}.
49+
* @param ownerKey The name of the reply to {@link Messenger}.
50+
* @param requestCode The unique request code for the reply to {@link Messenger}.
5351
*/
54-
public LoadPrivateKeysFromEmailBackupSyncTask(String searchTermString,
55-
String ownerKey, int requestCode) {
52+
public LoadPrivateKeysFromEmailBackupSyncTask(String ownerKey, int requestCode) {
5653
super(ownerKey, requestCode);
57-
this.searchTermString = searchTermString;
5854
}
5955

6056
@Override
6157
public void runIMAPAction(AccountDao accountDao, Store store, SyncListener syncListener) throws Exception {
6258
super.runIMAPAction(accountDao, store, syncListener);
6359

6460
if (syncListener != null) {
65-
IMAPFolder imapFolder = (IMAPFolder) store.getFolder(JavaEmailConstants.FOLDER_INBOX);
66-
imapFolder.open(Folder.READ_ONLY);
67-
61+
Folder[] folders = store.getDefaultFolder().list("*");
6862
List<String> keys = new ArrayList<>();
6963

70-
SearchTerm searchTerm = SearchBackupsUtil.generateSearchTerms(accountDao.getEmail());
71-
Message[] foundMessages = imapFolder.search(searchTerm);
64+
for (Folder folder : folders) {
65+
if (!EmailUtil.isFolderHasNoSelectAttribute((IMAPFolder) folder)) {
66+
folder.open(Folder.READ_ONLY);
67+
68+
SearchTerm searchTerm = SearchBackupsUtil.generateSearchTerms(accountDao.getEmail());
69+
Message[] foundMessages = folder.search(searchTerm);
7270

73-
for (Message message : foundMessages) {
74-
String key = getKeyFromMessageIfItExists(message);
75-
if (!TextUtils.isEmpty(key) && !keys.contains(key)) {
76-
keys.add(key);
71+
for (Message message : foundMessages) {
72+
String key = getKeyFromMessageIfItExists(message);
73+
if (!TextUtils.isEmpty(key) && !keys.contains(key)) {
74+
keys.add(key);
75+
}
76+
}
77+
78+
folder.close(false);
7779
}
7880
}
7981

8082
syncListener.onPrivateKeyFound(accountDao, keys, ownerKey, requestCode);
81-
82-
imapFolder.close(false);
8383
}
8484
}
8585

FlowCrypt/src/main/java/com/flowcrypt/email/service/EmailSyncService.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,7 @@ public void handleMessage(Message message) {
615615

616616
case MESSAGE_LOAD_PRIVATE_KEYS:
617617
if (emailSyncManager != null && action != null) {
618-
String searchTermString = (String) action.getObject();
619-
620-
emailSyncManager.loadPrivateKeys(action.getOwnerKey(), action.getRequestCode(),
621-
searchTermString);
618+
emailSyncManager.loadPrivateKeys(action.getOwnerKey(), action.getRequestCode());
622619
}
623620
break;
624621

FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/base/BaseSyncActivity.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@
2424
import com.flowcrypt.email.api.email.Folder;
2525
import com.flowcrypt.email.api.email.model.OutgoingMessageInfo;
2626
import com.flowcrypt.email.api.email.sync.SyncErrorTypes;
27-
import com.flowcrypt.email.js.Js;
2827
import com.flowcrypt.email.service.EmailSyncService;
2928

30-
import java.io.IOException;
3129
import java.lang.ref.WeakReference;
3230

3331
/**
@@ -162,22 +160,18 @@ public void requestActiveAccount(int requestCode) {
162160
* Load the user private keys.
163161
*
164162
* @param requestCode The unique request code for identify the current action.
165-
* @param accountName The account name.
166163
*/
167-
public void loadPrivateKeys(int requestCode, String accountName) {
164+
public void loadPrivateKeys(int requestCode) {
168165
if (checkBound()) return;
169166
try {
170-
String searchTermString = new Js(this, null).api_gmail_query_backups(accountName);
171-
172-
EmailSyncService.Action action = new EmailSyncService.Action(getReplyMessengerName(),
173-
requestCode, searchTermString);
167+
EmailSyncService.Action action = new EmailSyncService.Action(getReplyMessengerName(), requestCode, null);
174168

175169
Message message = Message.obtain(null, EmailSyncService.MESSAGE_LOAD_PRIVATE_KEYS,
176170
action);
177171
message.replyTo = replyMessenger;
178172

179173
syncServiceMessenger.send(message);
180-
} catch (RemoteException | IOException e) {
174+
} catch (RemoteException e) {
181175
e.printStackTrace();
182176
}
183177
}

FlowCrypt/src/main/java/com/flowcrypt/email/ui/activity/settings/BackupSettingsActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void onReplyFromSyncServiceReceived(int requestCode, int resultCode, Obje
7878
switch (requestCode) {
7979
case R.id.syns_get_active_account:
8080
account = (String) obj;
81-
loadPrivateKeys(R.id.syns_load_private_keys, account);
81+
loadPrivateKeys(R.id.syns_load_private_keys);
8282
break;
8383

8484
case R.id.syns_load_private_keys:
@@ -124,7 +124,7 @@ public void onClick(View v) {
124124
UIUtil.exchangeViewVisibility(
125125
BackupSettingsActivity.this, true,
126126
progressBar, layoutContent);
127-
loadPrivateKeys(R.id.syns_load_private_keys, account);
127+
loadPrivateKeys(R.id.syns_load_private_keys);
128128
}
129129
});
130130
break;

FlowCrypt/src/main/java/com/flowcrypt/email/ui/loader/LoadPrivateKeysFromMailAsyncTaskLoader.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
import android.support.v4.content.AsyncTaskLoader;
1212
import android.text.TextUtils;
1313

14+
import com.flowcrypt.email.api.email.EmailUtil;
1415
import com.flowcrypt.email.api.email.JavaEmailConstants;
1516
import com.flowcrypt.email.api.email.SearchBackupsUtil;
1617
import com.flowcrypt.email.api.email.gmail.GmailConstants;
1718
import com.flowcrypt.email.api.email.protocol.OpenStoreHelper;
1819
import com.flowcrypt.email.model.KeyDetails;
1920
import com.flowcrypt.email.model.results.LoaderResult;
2021
import com.google.android.gms.auth.GoogleAuthUtil;
21-
import com.sun.mail.gimap.GmailFolder;
22-
import com.sun.mail.gimap.GmailSSLStore;
22+
import com.sun.mail.imap.IMAPFolder;
2323

2424
import org.apache.commons.io.IOUtils;
2525

@@ -33,6 +33,7 @@
3333
import javax.mail.MessagingException;
3434
import javax.mail.Multipart;
3535
import javax.mail.Part;
36+
import javax.mail.Store;
3637
import javax.mail.internet.MimeBodyPart;
3738

3839
/**
@@ -69,24 +70,29 @@ public LoaderResult loadInBackground() {
6970
try {
7071
String token = GoogleAuthUtil.getToken(getContext(), account,
7172
JavaEmailConstants.OAUTH2 + GmailConstants.SCOPE_MAIL_GOOGLE_COM);
72-
GmailSSLStore gmailSSLStore = OpenStoreHelper.openAndConnectToGimapsStore(token, account.name);
73-
GmailFolder gmailFolder = (GmailFolder) gmailSSLStore.getFolder(
74-
JavaEmailConstants.FOLDER_INBOX);
75-
gmailFolder.open(Folder.READ_ONLY);
76-
77-
Message[] foundMessages = gmailFolder.search(SearchBackupsUtil.generateSearchTerms(account.name));
78-
79-
for (Message message : foundMessages) {
80-
String key = getKeyFromMessageIfItExists(message);
81-
if (!TextUtils.isEmpty(key) && privateKeyNotExistsInList(privateKeyDetailsList,
82-
key)) {
83-
privateKeyDetailsList.add(new KeyDetails(key,
84-
KeyDetails.Type.EMAIL));
73+
74+
Store store = OpenStoreHelper.openAndConnectToGimapsStore(token, account.name);
75+
Folder[] folders = store.getDefaultFolder().list("*");
76+
77+
for (Folder folder : folders) {
78+
if (!EmailUtil.isFolderHasNoSelectAttribute((IMAPFolder) folder)) {
79+
folder.open(Folder.READ_ONLY);
80+
81+
Message[] foundMessages = folder.search(SearchBackupsUtil.generateSearchTerms(account.name));
82+
83+
for (Message message : foundMessages) {
84+
String key = getKeyFromMessageIfItExists(message);
85+
if (!TextUtils.isEmpty(key) && privateKeyNotExistsInList(privateKeyDetailsList, key)) {
86+
privateKeyDetailsList.add(new KeyDetails(key,
87+
KeyDetails.Type.EMAIL));
88+
}
89+
}
90+
91+
folder.close(false);
8592
}
8693
}
8794

88-
gmailFolder.close(false);
89-
gmailSSLStore.close();
95+
store.close();
9096
return new LoaderResult(privateKeyDetailsList, null);
9197
} catch (Exception e) {
9298
e.printStackTrace();

0 commit comments

Comments
 (0)