From 7c67f7a7154cc4da2c53aeb338d9bff2cbc3985a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 9 Sep 2014 09:26:03 +0200 Subject: [PATCH] Consolidate on database upgrade --- .../keychain/KeychainApplication.java | 2 +- .../keychain/provider/KeychainDatabase.java | 22 +++++++++++++++++-- .../keychain/provider/ProviderHelper.java | 18 +++++++-------- .../service/KeychainIntentService.java | 6 ++--- .../ui/ConsolidateDialogActivity.java | 10 +++++---- .../keychain/ui/ImportKeysActivity.java | 8 +++---- ...ortCache.java => ParcelableFileCache.java} | 13 ++++++++--- 7 files changed, 52 insertions(+), 27 deletions(-) rename OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/{FileImportCache.java => ParcelableFileCache.java} (93%) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index b435b886d..67b172200 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -104,8 +104,8 @@ public class KeychainApplication extends Application { */ public void checkConsolidateRecovery() { if (Preferences.getPreferences(this).getCachedConsolidate()) { - // do something which calls ProviderHelper.consolidateDatabaseStep2 with a progressable Intent consolidateIntent = new Intent(this, ConsolidateDialogActivity.class); + consolidateIntent.putExtra(ConsolidateDialogActivity.EXTRA_CONSOLIDATE_RECOVERY, true); consolidateIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(consolidateIntent); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java index 0bb43d47f..4d62f67a9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.provider; import android.content.Context; +import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; @@ -33,6 +34,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingsColumns; import org.sufficientlysecure.keychain.provider.KeychainContract.KeysColumns; import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns; +import org.sufficientlysecure.keychain.ui.ConsolidateDialogActivity; import org.sufficientlysecure.keychain.util.Log; import java.io.File; @@ -52,8 +54,9 @@ import java.io.IOException; */ public class KeychainDatabase extends SQLiteOpenHelper { private static final String DATABASE_NAME = "openkeychain.db"; - private static final int DATABASE_VERSION = 3; + private static final int DATABASE_VERSION = 4; static Boolean apgHack = false; + private Context mContext; public interface Tables { String KEY_RINGS_PUBLIC = "keyrings_public"; @@ -164,6 +167,7 @@ public class KeychainDatabase extends SQLiteOpenHelper { KeychainDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); + mContext = context; // make sure this is only done once, on the first instance! boolean iAmIt = false; @@ -203,21 +207,35 @@ public class KeychainDatabase extends SQLiteOpenHelper { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - // add has_secret for all who are upgrading from a beta version + Log.d(Constants.TAG, "Upgrading db from " + oldVersion + " to " + newVersion); + switch (oldVersion) { case 1: + // add has_secret for all who are upgrading from a beta version try { db.execSQL("ALTER TABLE keys ADD COLUMN has_secret BOOLEAN"); } catch(Exception e){ // never mind, the column probably already existed } + // fall through case 2: + // ECC support try { db.execSQL("ALTER TABLE keys ADD COLUMN " + KeysColumns.KEY_CURVE_OID + " TEXT"); } catch(Exception e){ // never mind, the column probably already existed } + // fall through + case 3: + // better s2k detection, we need consolidate + // fall through } + + // always do consolidate after upgrade + Intent consolidateIntent = new Intent(mContext.getApplicationContext(), ConsolidateDialogActivity.class); + consolidateIntent.putExtra(ConsolidateDialogActivity.EXTRA_CONSOLIDATE_RECOVERY, false); + consolidateIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.getApplicationContext().startActivity(consolidateIntent); } /** This method tries to import data from a provided database. diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java index 186a0fc88..af7bdb139 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java @@ -59,7 +59,7 @@ import org.sufficientlysecure.keychain.service.OperationResultParcel.LogType; import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog; import org.sufficientlysecure.keychain.service.OperationResults.ConsolidateResult; import org.sufficientlysecure.keychain.service.OperationResults.SaveKeyringResult; -import org.sufficientlysecure.keychain.util.FileImportCache; +import org.sufficientlysecure.keychain.util.ParcelableFileCache; import org.sufficientlysecure.keychain.util.IterableIterator; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ProgressFixedScaler; @@ -889,8 +889,8 @@ public class ProviderHelper { Preferences.getPreferences(mContext).setCachedConsolidateNumSecrets(cursor.getCount()); - FileImportCache cache = - new FileImportCache(mContext, "consolidate_secret.pcl"); + ParcelableFileCache cache = + new ParcelableFileCache(mContext, "consolidate_secret.pcl"); cache.writeCache(new Iterator() { ParcelableKeyRing ring; @@ -951,8 +951,8 @@ public class ProviderHelper { Preferences.getPreferences(mContext).setCachedConsolidateNumPublics(cursor.getCount()); - FileImportCache cache = - new FileImportCache(mContext, "consolidate_public.pcl"); + ParcelableFileCache cache = + new ParcelableFileCache(mContext, "consolidate_public.pcl"); cache.writeCache(new Iterator() { ParcelableKeyRing ring; @@ -1041,10 +1041,10 @@ public class ProviderHelper { log(LogLevel.DEBUG, LogType.MSG_CON_DB_CLEAR); mContentResolver.delete(KeyRings.buildUnifiedKeyRingsUri(), null, null); - FileImportCache cacheSecret = - new FileImportCache(mContext, "consolidate_secret.pcl"); - FileImportCache cachePublic = - new FileImportCache(mContext, "consolidate_public.pcl"); + ParcelableFileCache cacheSecret = + new ParcelableFileCache(mContext, "consolidate_secret.pcl"); + ParcelableFileCache cachePublic = + new ParcelableFileCache(mContext, "consolidate_public.pcl"); // 3. Re-Import secret keyrings from cache if (numSecrets > 0) try { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index b9746aee5..08f51d692 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -61,7 +61,7 @@ import org.sufficientlysecure.keychain.service.OperationResults.ConsolidateResul import org.sufficientlysecure.keychain.service.OperationResults.EditKeyResult; import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult; import org.sufficientlysecure.keychain.service.OperationResults.SaveKeyringResult; -import org.sufficientlysecure.keychain.util.FileImportCache; +import org.sufficientlysecure.keychain.util.ParcelableFileCache; import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ProgressScaler; @@ -512,8 +512,8 @@ public class KeychainIntentService extends IntentService implements Progressable entries = data.getParcelableArrayList(IMPORT_KEY_LIST); } else { // get entries from cached file - FileImportCache cache = - new FileImportCache(this, "key_import.pcl"); + ParcelableFileCache cache = + new ParcelableFileCache(this, "key_import.pcl"); entries = cache.readCacheIntoList(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java index edc05e28d..0d8905c5b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java @@ -34,17 +34,20 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; */ public class ConsolidateDialogActivity extends FragmentActivity { + public static final String EXTRA_CONSOLIDATE_RECOVERY = "consolidate_recovery"; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // this activity itself has no content view (see manifest) - consolidateRecovery(); + boolean recovery = getIntent().getBooleanExtra(EXTRA_CONSOLIDATE_RECOVERY, false); + consolidateRecovery(recovery); } - private void consolidateRecovery() { + private void consolidateRecovery(boolean recovery) { // Message is received after importing is done in KeychainIntentService KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler( this, @@ -81,7 +84,7 @@ public class ConsolidateDialogActivity extends FragmentActivity { // fill values for this action Bundle data = new Bundle(); - data.putBoolean(KeychainIntentService.CONSOLIDATE_RECOVERY, true); + data.putBoolean(KeychainIntentService.CONSOLIDATE_RECOVERY, recovery); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); // Create a new Messenger for the communication back @@ -93,7 +96,6 @@ public class ConsolidateDialogActivity extends FragmentActivity { // start service with intent startService(intent); - } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index f74e4fdd6..3e949cfae 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -19,8 +19,6 @@ package org.sufficientlysecure.keychain.ui; import android.annotation.TargetApi; import android.app.ProgressDialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.net.Uri; import android.nfc.NdefMessage; @@ -52,7 +50,7 @@ import org.sufficientlysecure.keychain.service.OperationResultParcel; import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult; import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter; import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout; -import org.sufficientlysecure.keychain.util.FileImportCache; +import org.sufficientlysecure.keychain.util.ParcelableFileCache; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Notify; @@ -505,8 +503,8 @@ public class ImportKeysActivity extends ActionBarActivity { // to prevent Java Binder problems on heavy imports // read FileImportCache for more info. try { - FileImportCache cache = - new FileImportCache(this, "key_import.pcl"); + ParcelableFileCache cache = + new ParcelableFileCache(this, "key_import.pcl"); cache.writeCache(selectedEntries); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileImportCache.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java similarity index 93% rename from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileImportCache.java rename to OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java index 09275fc95..111bf0124 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileImportCache.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java @@ -29,6 +29,7 @@ import java.io.DataOutputStream; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -42,13 +43,13 @@ import java.util.List; * To overcome this problem, we cache large Parcelables into a file in our private cache directory * instead of sending them through IPC. */ -public class FileImportCache { +public class ParcelableFileCache { private Context mContext; private final String mFilename; - public FileImportCache(Context context, String filename) { + public ParcelableFileCache(Context context, String filename) { mContext = context; mFilename = filename; } @@ -104,7 +105,13 @@ public class FileImportCache { } final File tempFile = new File(cacheDir, mFilename); - final DataInputStream ois = new DataInputStream(new FileInputStream(tempFile)); + final DataInputStream ois; + try { + ois = new DataInputStream(new FileInputStream(tempFile)); + } catch (FileNotFoundException e) { + Log.e(Constants.TAG, "parcel import file not existing", e); + throw new IOException(e); + } return new Iterator() {