From 160362d2bfa6254748b84027db958005a16c92f2 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Wed, 27 Jan 2016 23:54:38 +0530 Subject: prevent rare KeyserverSyncAdapterService crash --- .../keychain/KeychainApplication.java | 19 +++++++++++++++---- .../keychain/service/KeyserverSyncAdapterService.java | 17 +++++++++++------ 2 files changed, 26 insertions(+), 10 deletions(-) (limited to 'OpenKeychain') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 57fce633e..381af0af8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -27,6 +27,7 @@ import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Environment; +import android.support.annotation.Nullable; import android.widget.Toast; import org.spongycastle.jce.provider.BouncyCastleProvider; @@ -93,7 +94,7 @@ public class KeychainApplication extends Application { FormattingUtils.getColorFromAttr(getApplicationContext(), R.attr.colorPrimary)); // Add OpenKeychain account to Android to link contacts with keys and keyserver sync - createAccountIfNecessary(); + createAccountIfNecessary(this); // if first time, enable keyserver and contact sync if (Preferences.getPreferences(this).isFirstTime()) { @@ -116,20 +117,30 @@ public class KeychainApplication extends Application { } } - private void createAccountIfNecessary() { + /** + * @return the OpenKeychain contact/sync account if it exists or was successfully created, null + * otherwise + */ + public static @Nullable Account createAccountIfNecessary(Context context) { try { - AccountManager manager = AccountManager.get(this); + AccountManager manager = AccountManager.get(context); Account[] accounts = manager.getAccountsByType(Constants.ACCOUNT_TYPE); Account account = new Account(Constants.ACCOUNT_NAME, Constants.ACCOUNT_TYPE); if (accounts.length == 0) { if (!manager.addAccountExplicitly(account, null, null)) { Log.d(Constants.TAG, "account already exists, the account is null, or another error occured"); + return null; + } else { + return account; } + } else { + return accounts[0]; } } catch (SecurityException e) { Log.e(Constants.TAG, "SecurityException when adding the account", e); - Toast.makeText(this, R.string.reinstall_openkeychain, Toast.LENGTH_LONG).show(); + Toast.makeText(context, R.string.reinstall_openkeychain, Toast.LENGTH_LONG).show(); + return null; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java index bacf56302..1c59782fc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java @@ -1,7 +1,6 @@ package org.sufficientlysecure.keychain.service; import android.accounts.Account; -import android.accounts.AccountManager; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; @@ -28,6 +27,7 @@ import android.os.SystemClock; import android.support.v4.app.NotificationCompat; import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.KeychainApplication; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; import org.sufficientlysecure.keychain.operations.ImportOperation; @@ -510,8 +510,12 @@ public class KeyserverSyncAdapterService extends Service { } public static void enableKeyserverSync(Context context) { - AccountManager manager = AccountManager.get(context); - Account account = manager.getAccountsByType(Constants.ACCOUNT_TYPE)[0]; + Account account = KeychainApplication.createAccountIfNecessary(context); + + if (account == null) { + // account failed to be created for some reason, nothing we can do here + return; + } ContentResolver.setIsSyncable(account, Constants.PROVIDER_AUTHORITY, 1); ContentResolver.setSyncAutomatically(account, Constants.PROVIDER_AUTHORITY, true); @@ -524,10 +528,11 @@ public class KeyserverSyncAdapterService extends Service { } private boolean isSyncEnabled() { - AccountManager manager = AccountManager.get(this); - Account account = manager.getAccountsByType(Constants.ACCOUNT_TYPE)[0]; + Account account = KeychainApplication.createAccountIfNecessary(this); - return ContentResolver.getSyncAutomatically(account, Constants.PROVIDER_AUTHORITY); + // if account is null, it could not be created for some reason, so sync cannot exist + return account != null + && ContentResolver.getSyncAutomatically(account, Constants.PROVIDER_AUTHORITY); } private void startServiceWithUpdateAll() { -- cgit v1.2.3