From 8d85fe7e9eb8cd715325697f1b631300d7957344 Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 3 Dec 2013 13:28:48 +0100 Subject: [PATCH] Remove LocalKeyStore's dependency on K9.app --- src/com/fsck/k9/Account.java | 17 +++++++----- src/com/fsck/k9/Preferences.java | 2 +- .../setup/AccountSetupCheckSettings.java | 2 +- .../activity/setup/AccountSetupIncoming.java | 2 +- .../activity/setup/AccountSetupOutgoing.java | 2 +- .../fsck/k9/net/ssl/TrustManagerFactory.java | 4 ++- src/com/fsck/k9/security/LocalKeyStore.java | 27 ++++++++++++------- .../k9/net/ssl/TrustManagerFactoryTest.java | 6 ++--- 8 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/com/fsck/k9/Account.java b/src/com/fsck/k9/Account.java index 5ff84aa3e..4f16dfeba 100644 --- a/src/com/fsck/k9/Account.java +++ b/src/com/fsck/k9/Account.java @@ -1873,15 +1873,16 @@ public class Account implements BaseAccount { /** * Add a new certificate for the incoming or outgoing server to the local key store. */ - public void addCertificate(CheckDirection direction, X509Certificate certificate) - throws CertificateException { + public void addCertificate(Context context, CheckDirection direction, + X509Certificate certificate) throws CertificateException { Uri uri; if (direction.equals(CheckDirection.INCOMING)) { uri = Uri.parse(getStoreUri()); } else { uri = Uri.parse(getTransportUri()); } - LocalKeyStore.getInstance().addCertificate(uri.getHost(), uri.getPort(), certificate); + LocalKeyStore localKeyStore = LocalKeyStore.getInstance(context); + localKeyStore.addCertificate(uri.getHost(), uri.getPort(), certificate); } /** @@ -1889,7 +1890,8 @@ public class Account implements BaseAccount { * new host/port, then try and delete any (possibly non-existent) certificate stored for the * old host/port. */ - public void deleteCertificate(String newHost, int newPort, CheckDirection direction) { + public void deleteCertificate(Context context, String newHost, int newPort, + CheckDirection direction) { Uri uri; if (direction.equals(CheckDirection.INCOMING)) { uri = Uri.parse(getStoreUri()); @@ -1899,7 +1901,8 @@ public class Account implements BaseAccount { String oldHost = uri.getHost(); int oldPort = uri.getPort(); if (!newHost.equals(oldHost) || newPort != oldPort) { - LocalKeyStore.getInstance().deleteCertificate(oldHost, oldPort); + LocalKeyStore localKeyStore = LocalKeyStore.getInstance(context); + localKeyStore.deleteCertificate(oldHost, oldPort); } } @@ -1907,8 +1910,8 @@ public class Account implements BaseAccount { * Examine the settings for the account and attempt to delete (possibly non-existent) * certificates for the incoming and outgoing servers. */ - public void deleteCertificates() { - LocalKeyStore localKeyStore = LocalKeyStore.getInstance(); + public void deleteCertificates(Context context) { + LocalKeyStore localKeyStore = LocalKeyStore.getInstance(context); Uri uri = Uri.parse(getStoreUri()); localKeyStore.deleteCertificate(uri.getHost(), uri.getPort()); diff --git a/src/com/fsck/k9/Preferences.java b/src/com/fsck/k9/Preferences.java index 187e2a402..604dce62d 100644 --- a/src/com/fsck/k9/Preferences.java +++ b/src/com/fsck/k9/Preferences.java @@ -128,7 +128,7 @@ public class Preferences { Store.removeAccount(account); - account.deleteCertificates(); + account.deleteCertificates(mContext); account.delete(this); if (newAccount == account) { diff --git a/src/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java b/src/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java index ea2d1c166..06d13a27e 100644 --- a/src/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java +++ b/src/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java @@ -363,7 +363,7 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { try { - mAccount.addCertificate(mDirection, chain[0]); + mAccount.addCertificate(getApplicationContext(), mDirection, chain[0]); } catch (CertificateException e) { showErrorDialog( R.string.account_setup_failed_dlg_certificate_message_fmt, diff --git a/src/com/fsck/k9/activity/setup/AccountSetupIncoming.java b/src/com/fsck/k9/activity/setup/AccountSetupIncoming.java index e58fc8846..5dab22924 100644 --- a/src/com/fsck/k9/activity/setup/AccountSetupIncoming.java +++ b/src/com/fsck/k9/activity/setup/AccountSetupIncoming.java @@ -428,7 +428,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener mWebdavMailboxPathView.getText().toString()); } - mAccount.deleteCertificate(host, port, CheckDirection.INCOMING); + mAccount.deleteCertificate(this, host, port, CheckDirection.INCOMING); ServerSettings settings = new ServerSettings(mStoreType, host, port, connectionSecurity, authType, username, password, extra); diff --git a/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java b/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java index 6d1af8bc0..b40cc9514 100644 --- a/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java +++ b/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java @@ -312,7 +312,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener, String newHost = mServerView.getText().toString(); int newPort = Integer.parseInt(mPortView.getText().toString()); uri = new URI(smtpSchemes[securityType], userInfo, newHost, newPort, null, null, null); - mAccount.deleteCertificate(newHost, newPort, CheckDirection.OUTGOING); + mAccount.deleteCertificate(this, newHost, newPort, CheckDirection.OUTGOING); mAccount.setTransportUri(uri.toString()); AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING); } catch (UnsupportedEncodingException enc) { diff --git a/src/com/fsck/k9/net/ssl/TrustManagerFactory.java b/src/com/fsck/k9/net/ssl/TrustManagerFactory.java index a7f4d9902..9041b2617 100644 --- a/src/com/fsck/k9/net/ssl/TrustManagerFactory.java +++ b/src/com/fsck/k9/net/ssl/TrustManagerFactory.java @@ -2,6 +2,8 @@ package com.fsck.k9.net.ssl; import android.util.Log; + +import com.fsck.k9.K9; import com.fsck.k9.helper.DomainNameChecker; import com.fsck.k9.mail.CertificateChainException; import com.fsck.k9.security.LocalKeyStore; @@ -100,7 +102,7 @@ public final class TrustManagerFactory { static { try { - keyStore = LocalKeyStore.getInstance(); + keyStore = LocalKeyStore.getInstance(K9.app); javax.net.ssl.TrustManagerFactory tmf = javax.net.ssl.TrustManagerFactory.getInstance("X509"); tmf.init((KeyStore) null); diff --git a/src/com/fsck/k9/security/LocalKeyStore.java b/src/com/fsck/k9/security/LocalKeyStore.java index 612a8621b..c7321e891 100644 --- a/src/com/fsck/k9/security/LocalKeyStore.java +++ b/src/com/fsck/k9/security/LocalKeyStore.java @@ -20,15 +20,25 @@ import com.fsck.k9.K9; public class LocalKeyStore { private static final int KEY_STORE_FILE_VERSION = 1; - private static final LocalKeyStore sInstance = new LocalKeyStore(); - private File mKeyStoreFile; - private KeyStore mKeyStore; - public static LocalKeyStore getInstance() { + private static LocalKeyStore sInstance; + + + public static LocalKeyStore getInstance(Context context) { + if (sInstance == null) { + sInstance = new LocalKeyStore(context); + } return sInstance; } - private LocalKeyStore() { + + private final Context mContext; + private File mKeyStoreFile; + private KeyStore mKeyStore; + + + private LocalKeyStore(Context context) { + mContext = context.getApplicationContext(); upgradeKeyStoreFile(); setKeyStoreFile(null); } @@ -157,12 +167,11 @@ public class LocalKeyStore { } private String getKeyStoreFilePath(int version) { + File dir = mContext.getDir("KeyStore", Context.MODE_PRIVATE); if (version < 1) { - return K9.app.getDir("KeyStore", Context.MODE_PRIVATE) - + File.separator + "KeyStore.bks"; + return dir + File.separator + "KeyStore.bks"; } else { - return K9.app.getDir("KeyStore", Context.MODE_PRIVATE) - + File.separator + "KeyStore_v" + version + ".bks"; + return dir + File.separator + "KeyStore_v" + version + ".bks"; } } } diff --git a/tests/src/com/fsck/k9/net/ssl/TrustManagerFactoryTest.java b/tests/src/com/fsck/k9/net/ssl/TrustManagerFactoryTest.java index d2c3c11be..8b12fb9c4 100644 --- a/tests/src/com/fsck/k9/net/ssl/TrustManagerFactoryTest.java +++ b/tests/src/com/fsck/k9/net/ssl/TrustManagerFactoryTest.java @@ -2,7 +2,6 @@ package com.fsck.k9.net.ssl; import javax.net.ssl.X509TrustManager; -import com.fsck.k9.net.ssl.TrustManagerFactory; import com.fsck.k9.security.LocalKeyStore; import java.io.ByteArrayInputStream; @@ -208,9 +207,8 @@ public class TrustManagerFactoryTest extends AndroidTestCase { @Override public void setUp() throws Exception { - mKeyStoreFile = File.createTempFile("localKeyStore", null, getContext() - .getCacheDir()); - mKeyStore = LocalKeyStore.getInstance(); + mKeyStoreFile = File.createTempFile("localKeyStore", null, getContext().getCacheDir()); + mKeyStore = LocalKeyStore.getInstance(getContext()); mKeyStore.setKeyStoreFile(mKeyStoreFile); }