Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 901befc8 authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé Committed by GitHub
Browse files

Merge pull request #9772 from rafaeltonholo/fix/9567/duplicated-imap-prefix

fix: correctly handles the server ID when an IMAP prefix is present, ensuring the prefix is not duplicated
parents dc3a253f 2fa17352
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -6,15 +6,25 @@ import com.fsck.k9.backend.api.updateFolders
import com.fsck.k9.mail.FolderType
import com.fsck.k9.mail.store.imap.FolderListItem
import com.fsck.k9.mail.store.imap.ImapStore
import net.thunderbird.core.logging.Logger
import net.thunderbird.core.logging.legacy.Log
import net.thunderbird.feature.mail.folder.api.FolderPathDelimiter

private const val TAG = "CommandRefreshFolderList"

internal class CommandRefreshFolderList(
    private val backendStorage: BackendStorage,
    private val imapStore: ImapStore,
    private val logger: Logger = Log,
) {

    private val LegacyFolderListItem.normalizedServerId: String
        get() = imapStore.combinedPrefix?.let {
            serverId.removePrefix(prefix = it)
        } ?: serverId

    fun refreshFolderList(): FolderPathDelimiter? {
        // TODO: Start using the proper server ID.
        //  For now we still use the old server ID format (decoded, with prefix removed).
        logger.verbose(TAG) { "refreshFolderList() called" }
        val folders = imapStore.getFolders()
        val folderPathDelimiter = folders.firstOrNull { it.folderPathDelimiter != null }?.folderPathDelimiter
        val foldersOnServer = folders.toLegacyFolderList()
@@ -23,16 +33,19 @@ internal class CommandRefreshFolderList(
        backendStorage.updateFolders {
            val foldersToCreate = mutableListOf<FolderInfo>()
            for (folder in foldersOnServer) {
                if (folder.serverId !in oldFolderServerIds) {
                    foldersToCreate.add(FolderInfo(folder.serverId, folder.name, folder.type))
                if (folder.normalizedServerId !in oldFolderServerIds) {
                    foldersToCreate.add(FolderInfo(folder.normalizedServerId, folder.name, folder.type))
                } else {
                    changeFolder(folder.serverId, folder.name, folder.type)
                    changeFolder(folder.normalizedServerId, folder.name, folder.type)
                }
            }

            logger.verbose(TAG) { "refreshFolderList: foldersToCreate = $foldersToCreate" }
            createFolders(foldersToCreate)

            val newFolderServerIds = foldersOnServer.map { it.serverId }
            val newFolderServerIds = foldersOnServer.map { it.normalizedServerId }
            val removedFolderServerIds = oldFolderServerIds - newFolderServerIds
            logger.verbose(TAG) { "refreshFolderList: folders to remove = $removedFolderServerIds" }
            deleteFolders(removedFolderServerIds)
        }
        return folderPathDelimiter
+7 −0
Original line number Diff line number Diff line
@@ -8,6 +8,9 @@ import com.fsck.k9.mail.store.imap.ImapStore
class TestImapStore : ImapStore {
    private val folders = mutableMapOf<String, ImapFolder>()

    override val combinedPrefix: String?
        get() = throw UnsupportedOperationException("not implemented")

    fun addFolder(serverId: String): TestImapFolder {
        require(!folders.containsKey(serverId)) { "Folder '$serverId' already exists" }

@@ -44,4 +47,8 @@ class TestImapStore : ImapStore {
    override fun closeAllConnections() {
        throw UnsupportedOperationException("not implemented")
    }

    override fun fetchImapPrefix() {
        throw UnsupportedOperationException("not implemented")
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -122,6 +122,9 @@ class ImapRemoteFolderCreatorTest {
private class FakeImapStore(
    private val folder: TestImapFolder,
) : ImapStore {
    override val combinedPrefix: String?
        get() = throw NotImplementedError("combinedPrefix not implemented")

    override fun checkSettings() {
        throw NotImplementedError("checkSettings not implemented")
    }
@@ -135,4 +138,8 @@ private class FakeImapStore(
    override fun closeAllConnections() {
        throw NotImplementedError("closeAllConnections not implemented")
    }

    override fun fetchImapPrefix() {
        throw NotImplementedError("fetchImapPrefix not implemented")
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -8,6 +8,10 @@ dependencies {
    implementation(projects.core.logging.api)

    implementation(projects.legacy.core)
    // Required for MigrationTo107
    implementation(projects.mail.common)
    implementation(projects.mail.protocols.imap)

    implementation(libs.androidx.core.ktx)
    implementation(libs.mime4j.core)
    implementation(libs.commons.io)
+1 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ import net.thunderbird.core.logging.legacy.Log;


class StoreSchemaDefinition implements SchemaDefinition {
    static final int DB_VERSION = 89;
    static final int DB_VERSION = 90;

    private final MigrationsHelper migrationsHelper;

Loading