Loading app/core/src/main/java/com/fsck/k9/preferences/SettingsImporter.java +34 −37 Original line number Diff line number Diff line Loading @@ -36,6 +36,9 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import timber.log.Timber; import static java.util.Collections.emptyMap; import static java.util.Collections.unmodifiableMap; public class SettingsImporter { Loading Loading @@ -368,7 +371,7 @@ public class SettingsImporter { } // Write incoming server settings (storeUri) ServerSettings incoming = new ImportedServerSettings(account.incoming); ServerSettings incoming = createServerSettings(account.incoming); BackendManager backendManager = DI.get(BackendManager.class); String storeUri = backendManager.createStoreUri(incoming); putString(editor, accountKeyPrefix + AccountPreferenceSerializer.STORE_URI_KEY, Base64.encode(storeUri)); Loading @@ -387,7 +390,7 @@ public class SettingsImporter { boolean outgoingPasswordNeeded = false; if (account.outgoing != null) { // Write outgoing server settings (transportUri) ServerSettings outgoing = new ImportedServerSettings(account.outgoing); ServerSettings outgoing = createServerSettings(account.outgoing); String transportUri = backendManager.createTransportUri(outgoing); putString(editor, accountKeyPrefix + AccountPreferenceSerializer.TRANSPORT_URI_KEY, Base64.encode(transportUri)); Loading Loading @@ -1053,21 +1056,16 @@ public class SettingsImporter { return name; } private static class ImportedServerSettings extends ServerSettings { private final ImportedServer importedServer; public ImportedServerSettings(ImportedServer server) { super(ServerTypeConverter.toServerSettingsType(server.type), server.host, convertPort(server.port), convertConnectionSecurity(server.connectionSecurity), server.authenticationType, server.username, server.password, server.clientCertificateAlias); importedServer = server; } private static ServerSettings createServerSettings(ImportedServer importedServer) { String type = ServerTypeConverter.toServerSettingsType(importedServer.type); int port = convertPort(importedServer.port); ConnectionSecurity connectionSecurity = convertConnectionSecurity(importedServer.connectionSecurity); Map<String, String> extra = importedServer.extras != null ? unmodifiableMap(importedServer.extras.settings) : emptyMap(); @Override public Map<String, String> getExtra() { return (importedServer.extras != null) ? Collections.unmodifiableMap(importedServer.extras.settings) : null; return new ServerSettings(type, importedServer.host, port, connectionSecurity, importedServer.authenticationType, importedServer.username, importedServer.password, importedServer.clientCertificateAlias, extra); } private static int convertPort(String port) { Loading Loading @@ -1095,7 +1093,6 @@ public class SettingsImporter { return ConnectionSecurity.SSL_TLS_REQUIRED; } } } @VisibleForTesting static class Imported { Loading app/k9mail-jmap/src/main/java/com/fsck/k9/backends/JmapBackendFactory.kt +13 −3 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ class JmapBackendFactory( val serverSettings = decodeStoreUri(account.storeUri) val jmapConfig = JmapConfig( username = serverSettings.username, password = serverSettings.password, password = serverSettings.password!!, baseUrl = serverSettings.host, accountId = serverSettings.extra["accountId"]!! ) Loading @@ -34,7 +34,7 @@ class JmapBackendFactory( override fun decodeStoreUri(storeUri: String): ServerSettings { val uri = Uri.parse(storeUri) val username = uri.getQueryParameter("username") val username = uri.getQueryParameter("username")!! val password = uri.getQueryParameter("password") val baseUrl = uri.getQueryParameter("baseUrl") val accountId = uri.getQueryParameter("accountId") Loading @@ -43,7 +43,17 @@ class JmapBackendFactory( "accountId" to accountId ) return ServerSettings("jmap", baseUrl, 433, ConnectionSecurity.SSL_TLS_REQUIRED, AuthType.PLAIN, username, password, null, extra) return ServerSettings( type = "jmap", host = baseUrl, port = 433, connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED, authenticationType = AuthType.PLAIN, username = username, password = password, clientCertificateAlias = null, extra = extra ) } override fun createStoreUri(serverSettings: ServerSettings): String { Loading app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java +25 −26 Original line number Diff line number Diff line Loading @@ -47,13 +47,15 @@ import com.fsck.k9.ui.R; import com.fsck.k9.view.ClientCertificateSpinner; import com.fsck.k9.view.ClientCertificateSpinner.OnClientCertificateChangedListener; import java.util.HashMap; import java.util.Map; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; import timber.log.Timber; import static java.util.Collections.emptyMap; public class AccountSetupIncoming extends K9Activity implements OnClickListener { private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; Loading Loading @@ -217,11 +219,12 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener } else if (settings.type.equals(Protocols.IMAP)) { serverLayoutView.setHint(getString(R.string.account_setup_incoming_imap_server_label)); ImapStoreSettings imapSettings = (ImapStoreSettings) settings; boolean autoDetectNamespace = ImapStoreSettings.getAutoDetectNamespace(settings); String pathPrefix = ImapStoreSettings.getPathPrefix(settings); mImapAutoDetectNamespaceView.setChecked(imapSettings.autoDetectNamespace); if (imapSettings.pathPrefix != null) { mImapPathPrefixView.setText(imapSettings.pathPrefix); mImapAutoDetectNamespaceView.setChecked(autoDetectNamespace); if (pathPrefix != null) { mImapPathPrefixView.setText(pathPrefix); } findViewById(R.id.webdav_advanced_header).setVisibility(View.GONE); Loading @@ -246,18 +249,19 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener findViewById(R.id.compression_label).setVisibility(View.GONE); mSubscribedFoldersOnly.setVisibility(View.GONE); WebDavStoreSettings webDavSettings = (WebDavStoreSettings) settings; if (webDavSettings.path != null) { mWebdavPathPrefixView.setText(webDavSettings.path); String path = WebDavStoreSettings.getPath(settings); if (path != null) { mWebdavPathPrefixView.setText(path); } if (webDavSettings.authPath != null) { mWebdavAuthPathView.setText(webDavSettings.authPath); String authPath = WebDavStoreSettings.getAuthPath(settings); if (authPath != null) { mWebdavAuthPathView.setText(authPath); } if (webDavSettings.mailboxPath != null) { mWebdavMailboxPathView.setText(webDavSettings.mailboxPath); String mailboxPath = WebDavStoreSettings.getMailboxPath(settings); if (mailboxPath != null) { mWebdavMailboxPathView.setText(mailboxPath); } } else { throw new Exception("Unknown account type: " + mAccount.getStoreUri()); Loading Loading @@ -568,21 +572,16 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener String host = mServerView.getText().toString(); int port = Integer.parseInt(mPortView.getText().toString()); Map<String, String> extra = null; Map<String, String> extra = emptyMap(); if (mStoreType.equals(Protocols.IMAP)) { extra = new HashMap<>(); extra.put(ImapStoreSettings.AUTODETECT_NAMESPACE_KEY, Boolean.toString(mImapAutoDetectNamespaceView.isChecked())); extra.put(ImapStoreSettings.PATH_PREFIX_KEY, mImapPathPrefixView.getText().toString()); boolean autoDetectNamespace = mImapAutoDetectNamespaceView.isChecked(); String pathPrefix = mImapPathPrefixView.getText().toString(); extra = ImapStoreSettings.createExtra(autoDetectNamespace, pathPrefix); } else if (mStoreType.equals(Protocols.WEBDAV)) { extra = new HashMap<>(); extra.put(WebDavStoreSettings.PATH_KEY, mWebdavPathPrefixView.getText().toString()); extra.put(WebDavStoreSettings.AUTH_PATH_KEY, mWebdavAuthPathView.getText().toString()); extra.put(WebDavStoreSettings.MAILBOX_PATH_KEY, mWebdavMailboxPathView.getText().toString()); String path = mWebdavPathPrefixView.getText().toString(); String authPath = mWebdavAuthPathView.getText().toString(); String mailboxPath = mWebdavMailboxPathView.getText().toString(); extra = WebDavStoreSettings.createExtra(null, path, authPath, mailboxPath); } DI.get(LocalKeyStoreManager.class).deleteCertificate(mAccount, host, port, MailServerDirection.INCOMING); Loading app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java +2 −1 Original line number Diff line number Diff line Loading @@ -489,7 +489,8 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener, String newHost = mServerView.getText().toString(); int newPort = Integer.parseInt(mPortView.getText().toString()); ServerSettings server = new ServerSettings(Protocols.SMTP, newHost, newPort, securityType, authType, username, password, clientCertificateAlias); ServerSettings server = new ServerSettings(Protocols.SMTP, newHost, newPort, securityType, authType, username, password, clientCertificateAlias); uri = backendManager.createTransportUri(server); DI.get(LocalKeyStoreManager.class).deleteCertificate(mAccount, newHost, newPort, MailServerDirection.OUTGOING); mAccount.setTransportUri(uri); Loading backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapStoreUriCreator.java +2 −4 Original line number Diff line number Diff line Loading @@ -52,10 +52,8 @@ public class ImapStoreUriCreator { Map<String, String> extra = server.getExtra(); String path; if (extra != null) { boolean autoDetectNamespace = Boolean.TRUE.toString().equals( extra.get(ImapStoreSettings.AUTODETECT_NAMESPACE_KEY)); String pathPrefix = (autoDetectNamespace) ? null : extra.get(ImapStoreSettings.PATH_PREFIX_KEY); boolean autoDetectNamespace = ImapStoreSettings.getAutoDetectNamespace(server); String pathPrefix = (autoDetectNamespace) ? null : ImapStoreSettings.getPathPrefix(server); path = "/" + (autoDetectNamespace ? "1" : "0") + "|" + ((pathPrefix == null) ? "" : pathPrefix); } else { Loading Loading
app/core/src/main/java/com/fsck/k9/preferences/SettingsImporter.java +34 −37 Original line number Diff line number Diff line Loading @@ -36,6 +36,9 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import timber.log.Timber; import static java.util.Collections.emptyMap; import static java.util.Collections.unmodifiableMap; public class SettingsImporter { Loading Loading @@ -368,7 +371,7 @@ public class SettingsImporter { } // Write incoming server settings (storeUri) ServerSettings incoming = new ImportedServerSettings(account.incoming); ServerSettings incoming = createServerSettings(account.incoming); BackendManager backendManager = DI.get(BackendManager.class); String storeUri = backendManager.createStoreUri(incoming); putString(editor, accountKeyPrefix + AccountPreferenceSerializer.STORE_URI_KEY, Base64.encode(storeUri)); Loading @@ -387,7 +390,7 @@ public class SettingsImporter { boolean outgoingPasswordNeeded = false; if (account.outgoing != null) { // Write outgoing server settings (transportUri) ServerSettings outgoing = new ImportedServerSettings(account.outgoing); ServerSettings outgoing = createServerSettings(account.outgoing); String transportUri = backendManager.createTransportUri(outgoing); putString(editor, accountKeyPrefix + AccountPreferenceSerializer.TRANSPORT_URI_KEY, Base64.encode(transportUri)); Loading Loading @@ -1053,21 +1056,16 @@ public class SettingsImporter { return name; } private static class ImportedServerSettings extends ServerSettings { private final ImportedServer importedServer; public ImportedServerSettings(ImportedServer server) { super(ServerTypeConverter.toServerSettingsType(server.type), server.host, convertPort(server.port), convertConnectionSecurity(server.connectionSecurity), server.authenticationType, server.username, server.password, server.clientCertificateAlias); importedServer = server; } private static ServerSettings createServerSettings(ImportedServer importedServer) { String type = ServerTypeConverter.toServerSettingsType(importedServer.type); int port = convertPort(importedServer.port); ConnectionSecurity connectionSecurity = convertConnectionSecurity(importedServer.connectionSecurity); Map<String, String> extra = importedServer.extras != null ? unmodifiableMap(importedServer.extras.settings) : emptyMap(); @Override public Map<String, String> getExtra() { return (importedServer.extras != null) ? Collections.unmodifiableMap(importedServer.extras.settings) : null; return new ServerSettings(type, importedServer.host, port, connectionSecurity, importedServer.authenticationType, importedServer.username, importedServer.password, importedServer.clientCertificateAlias, extra); } private static int convertPort(String port) { Loading Loading @@ -1095,7 +1093,6 @@ public class SettingsImporter { return ConnectionSecurity.SSL_TLS_REQUIRED; } } } @VisibleForTesting static class Imported { Loading
app/k9mail-jmap/src/main/java/com/fsck/k9/backends/JmapBackendFactory.kt +13 −3 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ class JmapBackendFactory( val serverSettings = decodeStoreUri(account.storeUri) val jmapConfig = JmapConfig( username = serverSettings.username, password = serverSettings.password, password = serverSettings.password!!, baseUrl = serverSettings.host, accountId = serverSettings.extra["accountId"]!! ) Loading @@ -34,7 +34,7 @@ class JmapBackendFactory( override fun decodeStoreUri(storeUri: String): ServerSettings { val uri = Uri.parse(storeUri) val username = uri.getQueryParameter("username") val username = uri.getQueryParameter("username")!! val password = uri.getQueryParameter("password") val baseUrl = uri.getQueryParameter("baseUrl") val accountId = uri.getQueryParameter("accountId") Loading @@ -43,7 +43,17 @@ class JmapBackendFactory( "accountId" to accountId ) return ServerSettings("jmap", baseUrl, 433, ConnectionSecurity.SSL_TLS_REQUIRED, AuthType.PLAIN, username, password, null, extra) return ServerSettings( type = "jmap", host = baseUrl, port = 433, connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED, authenticationType = AuthType.PLAIN, username = username, password = password, clientCertificateAlias = null, extra = extra ) } override fun createStoreUri(serverSettings: ServerSettings): String { Loading
app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java +25 −26 Original line number Diff line number Diff line Loading @@ -47,13 +47,15 @@ import com.fsck.k9.ui.R; import com.fsck.k9.view.ClientCertificateSpinner; import com.fsck.k9.view.ClientCertificateSpinner.OnClientCertificateChangedListener; import java.util.HashMap; import java.util.Map; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; import timber.log.Timber; import static java.util.Collections.emptyMap; public class AccountSetupIncoming extends K9Activity implements OnClickListener { private static final String EXTRA_ACCOUNT = "account"; private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; Loading Loading @@ -217,11 +219,12 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener } else if (settings.type.equals(Protocols.IMAP)) { serverLayoutView.setHint(getString(R.string.account_setup_incoming_imap_server_label)); ImapStoreSettings imapSettings = (ImapStoreSettings) settings; boolean autoDetectNamespace = ImapStoreSettings.getAutoDetectNamespace(settings); String pathPrefix = ImapStoreSettings.getPathPrefix(settings); mImapAutoDetectNamespaceView.setChecked(imapSettings.autoDetectNamespace); if (imapSettings.pathPrefix != null) { mImapPathPrefixView.setText(imapSettings.pathPrefix); mImapAutoDetectNamespaceView.setChecked(autoDetectNamespace); if (pathPrefix != null) { mImapPathPrefixView.setText(pathPrefix); } findViewById(R.id.webdav_advanced_header).setVisibility(View.GONE); Loading @@ -246,18 +249,19 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener findViewById(R.id.compression_label).setVisibility(View.GONE); mSubscribedFoldersOnly.setVisibility(View.GONE); WebDavStoreSettings webDavSettings = (WebDavStoreSettings) settings; if (webDavSettings.path != null) { mWebdavPathPrefixView.setText(webDavSettings.path); String path = WebDavStoreSettings.getPath(settings); if (path != null) { mWebdavPathPrefixView.setText(path); } if (webDavSettings.authPath != null) { mWebdavAuthPathView.setText(webDavSettings.authPath); String authPath = WebDavStoreSettings.getAuthPath(settings); if (authPath != null) { mWebdavAuthPathView.setText(authPath); } if (webDavSettings.mailboxPath != null) { mWebdavMailboxPathView.setText(webDavSettings.mailboxPath); String mailboxPath = WebDavStoreSettings.getMailboxPath(settings); if (mailboxPath != null) { mWebdavMailboxPathView.setText(mailboxPath); } } else { throw new Exception("Unknown account type: " + mAccount.getStoreUri()); Loading Loading @@ -568,21 +572,16 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener String host = mServerView.getText().toString(); int port = Integer.parseInt(mPortView.getText().toString()); Map<String, String> extra = null; Map<String, String> extra = emptyMap(); if (mStoreType.equals(Protocols.IMAP)) { extra = new HashMap<>(); extra.put(ImapStoreSettings.AUTODETECT_NAMESPACE_KEY, Boolean.toString(mImapAutoDetectNamespaceView.isChecked())); extra.put(ImapStoreSettings.PATH_PREFIX_KEY, mImapPathPrefixView.getText().toString()); boolean autoDetectNamespace = mImapAutoDetectNamespaceView.isChecked(); String pathPrefix = mImapPathPrefixView.getText().toString(); extra = ImapStoreSettings.createExtra(autoDetectNamespace, pathPrefix); } else if (mStoreType.equals(Protocols.WEBDAV)) { extra = new HashMap<>(); extra.put(WebDavStoreSettings.PATH_KEY, mWebdavPathPrefixView.getText().toString()); extra.put(WebDavStoreSettings.AUTH_PATH_KEY, mWebdavAuthPathView.getText().toString()); extra.put(WebDavStoreSettings.MAILBOX_PATH_KEY, mWebdavMailboxPathView.getText().toString()); String path = mWebdavPathPrefixView.getText().toString(); String authPath = mWebdavAuthPathView.getText().toString(); String mailboxPath = mWebdavMailboxPathView.getText().toString(); extra = WebDavStoreSettings.createExtra(null, path, authPath, mailboxPath); } DI.get(LocalKeyStoreManager.class).deleteCertificate(mAccount, host, port, MailServerDirection.INCOMING); Loading
app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java +2 −1 Original line number Diff line number Diff line Loading @@ -489,7 +489,8 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener, String newHost = mServerView.getText().toString(); int newPort = Integer.parseInt(mPortView.getText().toString()); ServerSettings server = new ServerSettings(Protocols.SMTP, newHost, newPort, securityType, authType, username, password, clientCertificateAlias); ServerSettings server = new ServerSettings(Protocols.SMTP, newHost, newPort, securityType, authType, username, password, clientCertificateAlias); uri = backendManager.createTransportUri(server); DI.get(LocalKeyStoreManager.class).deleteCertificate(mAccount, newHost, newPort, MailServerDirection.OUTGOING); mAccount.setTransportUri(uri); Loading
backend/imap/src/main/java/com/fsck/k9/backend/imap/ImapStoreUriCreator.java +2 −4 Original line number Diff line number Diff line Loading @@ -52,10 +52,8 @@ public class ImapStoreUriCreator { Map<String, String> extra = server.getExtra(); String path; if (extra != null) { boolean autoDetectNamespace = Boolean.TRUE.toString().equals( extra.get(ImapStoreSettings.AUTODETECT_NAMESPACE_KEY)); String pathPrefix = (autoDetectNamespace) ? null : extra.get(ImapStoreSettings.PATH_PREFIX_KEY); boolean autoDetectNamespace = ImapStoreSettings.getAutoDetectNamespace(server); String pathPrefix = (autoDetectNamespace) ? null : ImapStoreSettings.getPathPrefix(server); path = "/" + (autoDetectNamespace ? "1" : "0") + "|" + ((pathPrefix == null) ? "" : pathPrefix); } else { Loading