Search in sources :

Example 31 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class MigrationTest method migratePgpMimeEncryptedMessage.

@Test
public void migratePgpMimeEncryptedMessage() throws Exception {
    SQLiteDatabase db = createV50Database();
    insertPgpMimeEncryptedMessage(db);
    db.close();
    LocalStore localStore = LocalStore.getInstance(account, RuntimeEnvironment.application);
    LocalMessage msg = localStore.getFolder("dev").getMessage("6");
    FetchProfile fp = new FetchProfile();
    fp.add(FetchProfile.Item.BODY);
    localStore.getFolder("dev").fetch(Collections.singletonList(msg), fp, null);
    Assert.assertEquals(5, msg.getId());
    Assert.assertEquals(13, msg.getHeaderNames().size());
    Assert.assertEquals("multipart/encrypted", msg.getMimeType());
    Assert.assertEquals(2, msg.getAttachmentCount());
    Multipart body = (Multipart) msg.getBody();
    Assert.assertEquals(1, msg.getHeader(MimeHeader.HEADER_CONTENT_TYPE).length);
    Assert.assertEquals("application/pgp-encrypted", MimeUtility.getHeaderParameter(msg.getHeader(MimeHeader.HEADER_CONTENT_TYPE)[0], "protocol"));
    Assert.assertEquals("UoPmpPX/dBe4BELn", MimeUtility.getHeaderParameter(msg.getHeader(MimeHeader.HEADER_CONTENT_TYPE)[0], "boundary"));
    Assert.assertEquals("UoPmpPX/dBe4BELn", body.getBoundary());
    Assert.assertEquals(2, body.getCount());
    Assert.assertEquals("application/pgp-encrypted", body.getBodyPart(0).getMimeType());
    Assert.assertEquals("application/octet-stream", body.getBodyPart(1).getMimeType());
}
Also used : FetchProfile(com.fsck.k9.mail.FetchProfile) Multipart(com.fsck.k9.mail.Multipart) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) Test(org.junit.Test)

Example 32 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class MigrationTest method migratePgpInlineClearsignedMessage.

@Test
public void migratePgpInlineClearsignedMessage() throws Exception {
    SQLiteDatabase db = createV50Database();
    insertPgpInlineClearsignedMessage(db);
    db.close();
    LocalStore localStore = LocalStore.getInstance(account, RuntimeEnvironment.application);
    LocalMessage msg = localStore.getFolder("dev").getMessage("8");
    FetchProfile fp = new FetchProfile();
    fp.add(FetchProfile.Item.BODY);
    localStore.getFolder("dev").fetch(Collections.singletonList(msg), fp, null);
    Assert.assertEquals(7, msg.getId());
    Assert.assertEquals(12, msg.getHeaderNames().size());
    Assert.assertEquals("text/plain", msg.getMimeType());
    Assert.assertEquals(0, msg.getAttachmentCount());
    Assert.assertTrue(msg.getBody() instanceof BinaryMemoryBody);
    String msgTextContent = MessageExtractor.getTextFromPart(msg);
    Assert.assertEquals(OpenPgpUtils.PARSE_RESULT_SIGNED_MESSAGE, OpenPgpUtils.parseMessage(msgTextContent));
}
Also used : FetchProfile(com.fsck.k9.mail.FetchProfile) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) Test(org.junit.Test)

Example 33 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class MessagingController method downloadLargeMessages.

private <T extends Message> void downloadLargeMessages(final Account account, final Folder<T> remoteFolder, final LocalFolder localFolder, List<T> largeMessages, final AtomicInteger progress, final int unreadBeforeStart, final AtomicInteger newMessages, final int todo, FetchProfile fp) throws MessagingException {
    final String folder = remoteFolder.getName();
    final Date earliestDate = account.getEarliestPollDate();
    Timber.d("SYNC: Fetching large messages for folder %s", folder);
    remoteFolder.fetch(largeMessages, fp, null);
    for (T message : largeMessages) {
        if (!shouldImportMessage(account, message, earliestDate)) {
            progress.incrementAndGet();
            continue;
        }
        if (message.getBody() == null) {
            downloadSaneBody(account, remoteFolder, localFolder, message);
        } else {
            downloadPartial(remoteFolder, localFolder, message);
        }
        Timber.v("About to notify listeners that we got a new large message %s:%s:%s", account, folder, message.getUid());
        // Update the listener with what we've found
        progress.incrementAndGet();
        // TODO do we need to re-fetch this here?
        LocalMessage localMessage = localFolder.getMessage(message.getUid());
        // not marked as read.
        if (!localMessage.isSet(Flag.SEEN)) {
            newMessages.incrementAndGet();
        }
        for (MessagingListener l : getListeners()) {
            l.synchronizeMailboxProgress(account, folder, progress.get(), todo);
            if (!localMessage.isSet(Flag.SEEN)) {
                l.synchronizeMailboxNewMessage(account, folder, localMessage);
            }
        }
        // Send a notification of this message
        if (shouldNotifyForMessage(account, localFolder, message)) {
            // Notify with the localMessage so that we don't have to recalculate the content preview.
            notificationController.addNewMailNotification(account, localMessage, unreadBeforeStart);
        }
    }
    Timber.d("SYNC: Done fetching large messages for folder %s", folder);
}
Also used : LocalMessage(com.fsck.k9.mailstore.LocalMessage) Date(java.util.Date)

Example 34 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class MessagingController method moveOrCopyMessageSynchronous.

private void moveOrCopyMessageSynchronous(final Account account, final String srcFolder, final List<? extends Message> inMessages, final String destFolder, final boolean isCopy) {
    try {
        LocalStore localStore = account.getLocalStore();
        Store remoteStore = account.getRemoteStore();
        if (!isCopy && (!remoteStore.isMoveCapable() || !localStore.isMoveCapable())) {
            return;
        }
        if (isCopy && (!remoteStore.isCopyCapable() || !localStore.isCopyCapable())) {
            return;
        }
        LocalFolder localSrcFolder = localStore.getFolder(srcFolder);
        Folder localDestFolder = localStore.getFolder(destFolder);
        boolean unreadCountAffected = false;
        List<String> uids = new LinkedList<>();
        for (Message message : inMessages) {
            String uid = message.getUid();
            if (!uid.startsWith(K9.LOCAL_UID_PREFIX)) {
                uids.add(uid);
            }
            if (!unreadCountAffected && !message.isSet(Flag.SEEN)) {
                unreadCountAffected = true;
            }
        }
        List<LocalMessage> messages = localSrcFolder.getMessagesByUids(uids);
        if (messages.size() > 0) {
            Map<String, Message> origUidMap = new HashMap<>();
            for (Message message : messages) {
                origUidMap.put(message.getUid(), message);
            }
            Timber.i("moveOrCopyMessageSynchronous: source folder = %s, %d messages, destination folder = %s, " + "isCopy = %s", srcFolder, messages.size(), destFolder, isCopy);
            Map<String, String> uidMap;
            if (isCopy) {
                FetchProfile fp = new FetchProfile();
                fp.add(Item.ENVELOPE);
                fp.add(Item.BODY);
                localSrcFolder.fetch(messages, fp, null);
                uidMap = localSrcFolder.copyMessages(messages, localDestFolder);
                if (unreadCountAffected) {
                    // If this copy operation changes the unread count in the destination
                    // folder, notify the listeners.
                    int unreadMessageCount = localDestFolder.getUnreadMessageCount();
                    for (MessagingListener l : getListeners()) {
                        l.folderStatusChanged(account, destFolder, unreadMessageCount);
                    }
                }
            } else {
                uidMap = localSrcFolder.moveMessages(messages, localDestFolder);
                for (Entry<String, Message> entry : origUidMap.entrySet()) {
                    String origUid = entry.getKey();
                    Message message = entry.getValue();
                    for (MessagingListener l : getListeners()) {
                        l.messageUidChanged(account, srcFolder, origUid, message.getUid());
                    }
                }
                unsuppressMessages(account, messages);
                if (unreadCountAffected) {
                    // If this move operation changes the unread count, notify the listeners
                    // that the unread count changed in both the source and destination folder.
                    int unreadMessageCountSrc = localSrcFolder.getUnreadMessageCount();
                    int unreadMessageCountDest = localDestFolder.getUnreadMessageCount();
                    for (MessagingListener l : getListeners()) {
                        l.folderStatusChanged(account, srcFolder, unreadMessageCountSrc);
                        l.folderStatusChanged(account, destFolder, unreadMessageCountDest);
                    }
                }
            }
            List<String> origUidKeys = new ArrayList<>(origUidMap.keySet());
            queueMoveOrCopy(account, srcFolder, destFolder, isCopy, origUidKeys, uidMap);
        }
        processPendingCommands(account);
    } catch (UnavailableStorageException e) {
        Timber.i("Failed to move/copy message because storage is not available - trying again later.");
        throw new UnavailableAccountException(e);
    } catch (MessagingException me) {
        addErrorMessage(account, null, me);
        throw new RuntimeException("Error moving message", me);
    }
}
Also used : LocalMessage(com.fsck.k9.mailstore.LocalMessage) FetchProfile(com.fsck.k9.mail.FetchProfile) LocalMessage(com.fsck.k9.mailstore.LocalMessage) MimeMessage(com.fsck.k9.mail.internet.MimeMessage) Message(com.fsck.k9.mail.Message) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) MessagingException(com.fsck.k9.mail.MessagingException) UnavailableStorageException(com.fsck.k9.mailstore.UnavailableStorageException) ArrayList(java.util.ArrayList) LocalStore(com.fsck.k9.mailstore.LocalStore) Store(com.fsck.k9.mail.Store) Pop3Store(com.fsck.k9.mail.store.pop3.Pop3Store) LocalStore(com.fsck.k9.mailstore.LocalStore) Folder(com.fsck.k9.mail.Folder) LocalFolder(com.fsck.k9.mailstore.LocalFolder) LinkedList(java.util.LinkedList) SuppressLint(android.annotation.SuppressLint) LocalFolder(com.fsck.k9.mailstore.LocalFolder)

Example 35 with FetchProfile

use of com.fsck.k9.mail.FetchProfile in project k-9 by k9mail.

the class MessagingController method loadSearchResultsSynchronous.

private void loadSearchResultsSynchronous(List<Message> messages, LocalFolder localFolder, Folder remoteFolder, MessagingListener listener) throws MessagingException {
    final FetchProfile header = new FetchProfile();
    header.add(FetchProfile.Item.FLAGS);
    header.add(FetchProfile.Item.ENVELOPE);
    final FetchProfile structure = new FetchProfile();
    structure.add(FetchProfile.Item.STRUCTURE);
    int i = 0;
    for (Message message : messages) {
        i++;
        LocalMessage localMsg = localFolder.getMessage(message.getUid());
        if (localMsg == null) {
            remoteFolder.fetch(Collections.singletonList(message), header, null);
            //fun fact: ImapFolder.fetch can't handle getting STRUCTURE at same time as headers
            remoteFolder.fetch(Collections.singletonList(message), structure, null);
            localFolder.appendMessages(Collections.singletonList(message));
            localMsg = localFolder.getMessage(message.getUid());
        }
    }
}
Also used : LocalMessage(com.fsck.k9.mailstore.LocalMessage) FetchProfile(com.fsck.k9.mail.FetchProfile) LocalMessage(com.fsck.k9.mailstore.LocalMessage) MimeMessage(com.fsck.k9.mail.internet.MimeMessage) Message(com.fsck.k9.mail.Message) SuppressLint(android.annotation.SuppressLint)

Aggregations

FetchProfile (com.fsck.k9.mail.FetchProfile)49 Test (org.junit.Test)27 LocalMessage (com.fsck.k9.mailstore.LocalMessage)15 MessagingException (com.fsck.k9.mail.MessagingException)12 ArrayList (java.util.ArrayList)10 LocalFolder (com.fsck.k9.mailstore.LocalFolder)9 LocalStore (com.fsck.k9.mailstore.LocalStore)9 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)8 Date (java.util.Date)8 Message (com.fsck.k9.mail.Message)7 SuppressLint (android.annotation.SuppressLint)6 MimeMessage (com.fsck.k9.mail.internet.MimeMessage)6 AuthenticationFailedException (com.fsck.k9.mail.AuthenticationFailedException)5 Multipart (com.fsck.k9.mail.Multipart)5 ByteArrayInputStream (java.io.ByteArrayInputStream)5 IOException (java.io.IOException)5 WebDavMessage (com.fsck.k9.mail.store.webdav.WebDavMessage)4 LinkedList (java.util.LinkedList)4 HttpResponse (org.apache.http.HttpResponse)4 StatusLine (org.apache.http.StatusLine)4