From 93f3a98eae1fdd8f9a3a82d415a7284548a2e4bf Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Sun, 31 May 2015 02:40:06 +0530 Subject: prevent keybase key replacing keyserver key --- .../keychain/operations/ImportExportOperation.java | 23 +++++++++++----------- .../operations/results/OperationResult.java | 1 + 2 files changed, 12 insertions(+), 12 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java index 86cfc21a3..b48de009e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java @@ -38,7 +38,6 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.Operat import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing; import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; -import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; @@ -244,25 +243,25 @@ public class ImportExportOperation extends BaseOperation { try { log.add(LogType.MSG_IMPORT_FETCH_KEYBASE, 2, entry.mKeybaseName); byte[] data = keybaseServer.get(entry.mKeybaseName).getBytes(); - key = UncachedKeyRing.decodeFromData(data); + UncachedKeyRing keybaseKey = UncachedKeyRing.decodeFromData(data); - // If there already is a key (of keybase origin), merge the two - if (key != null) { + // If there already is a key, merge the two + if (key != null && keybaseKey != null) { log.add(LogType.MSG_IMPORT_MERGE, 3); - UncachedKeyRing merged = UncachedKeyRing.decodeFromData(data); - merged = key.merge(merged, log, 4); + keybaseKey = key.merge(keybaseKey, log, 4); // If the merge didn't fail, use the new merged key - if (merged != null) { - key = merged; + if (keybaseKey != null) { + key = keybaseKey; + } else { + log.add(LogType.MSG_IMPORT_MERGE_ERROR, 4); } - } else { - log.add(LogType.MSG_IMPORT_FETCH_ERROR_DECODE, 3); - key = UncachedKeyRing.decodeFromData(data); + } else if (keybaseKey != null) { + key = keybaseKey; } } catch (Keyserver.QueryFailedException e) { // download failed, too bad. just proceed Log.e(Constants.TAG, "query failed", e); - log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_ERROR, 3); + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_ERROR, 3, e.getMessage()); } } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index 2551c1802..707cf0af1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -696,6 +696,7 @@ public abstract class OperationResult implements Parcelable { MSG_IMPORT_FETCH_KEYBASE (LogLevel.INFO, R.string.msg_import_fetch_keybase), MSG_IMPORT_KEYSERVER (LogLevel.DEBUG, R.string.msg_import_keyserver), MSG_IMPORT_MERGE (LogLevel.DEBUG, R.string.msg_import_merge), + MSG_IMPORT_MERGE_ERROR (LogLevel.ERROR, R.string.msg_import_merge_error), MSG_IMPORT_FINGERPRINT_ERROR (LogLevel.ERROR, R.string.msg_import_fingerprint_error), MSG_IMPORT_FINGERPRINT_OK (LogLevel.DEBUG, R.string.msg_import_fingerprint_ok), MSG_IMPORT_ERROR (LogLevel.ERROR, R.string.msg_import_error), -- cgit v1.2.3 From cf5fadae760ebbf8b06a908027634d76d54f52b4 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sun, 31 May 2015 04:05:15 +0200 Subject: implement sticky preferences --- .../org/sufficientlysecure/keychain/Constants.java | 3 + .../keychain/ui/EncryptFilesActivity.java | 4 +- .../keychain/ui/EncryptFilesFragment.java | 106 ++++++++++++++++++--- .../keychain/ui/EncryptTextFragment.java | 38 +++++++- .../keychain/ui/util/Notify.java | 38 +++++--- .../keychain/util/Preferences.java | 30 ++++++ 6 files changed, 187 insertions(+), 32 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index fc1cb8acc..7c2f093ee 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -84,6 +84,9 @@ public final class Constants { public static final String SEARCH_KEYBASE = "search_keybase_pref"; public static final String USE_DEFAULT_YUBIKEY_PIN = "useDefaultYubikeyPin"; public static final String USE_NUMKEYPAD_FOR_YUBIKEY_PIN = "useNumKeypadForYubikeyPin"; + public static final String ENCRYPT_FILENAMES = "encryptFilenames"; + public static final String USE_COMPRESSION = "useCompression"; + public static final String USE_ARMOR = "useArmor"; } public static final class Defaults { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java index 45700f978..4d23ba9f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java @@ -73,12 +73,10 @@ public class EncryptFilesActivity extends EncryptActivity { uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); } - boolean useArmor = extras.getBoolean(EXTRA_ASCII_ARMOR, false); - if (savedInstanceState == null) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - EncryptFilesFragment encryptFragment = EncryptFilesFragment.newInstance(uris, useArmor); + EncryptFilesFragment encryptFragment = EncryptFilesFragment.newInstance(uris); transaction.replace(R.id.encrypt_file_container, encryptFragment); transaction.commit(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index f5963dbf0..13de80eb8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -41,6 +41,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; +import com.nispok.snackbar.Snackbar; import org.spongycastle.bcpg.CompressionAlgorithmTags; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -58,9 +59,12 @@ import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener; +import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.FileHelper; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Passphrase; +import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.ShareHelper; import java.io.File; @@ -99,11 +103,10 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment uris, boolean useArmor) { + public static EncryptFilesFragment newInstance(ArrayList uris) { EncryptFilesFragment frag = new EncryptFilesFragment(); Bundle args = new Bundle(); - args.putBoolean(ARG_USE_ASCII_ARMOR, useArmor); args.putParcelableArrayList(ARG_URIS, uris); frag.setArguments(args); @@ -167,11 +170,28 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment Date: Thu, 28 May 2015 17:02:34 +0530 Subject: merged services --- .../keychain/operations/ImportExportOperation.java | 13 +- .../keychain/service/CloudImportService.java | 384 --------------------- .../keychain/service/KeychainIntentService.java | 335 +++++++++++++++--- .../keychain/service/ServiceProgressHandler.java | 23 +- .../keychain/ui/CertifyKeyFragment.java | 5 +- .../keychain/ui/ConsolidateDialogActivity.java | 6 +- .../keychain/ui/CreateKeyFinalFragment.java | 11 +- .../ui/CreateKeyYubiKeyImportFragment.java | 5 +- .../keychain/ui/DecryptFilesFragment.java | 5 +- .../keychain/ui/DecryptFragment.java | 1 + .../keychain/ui/DecryptTextFragment.java | 5 +- .../keychain/ui/EditKeyFragment.java | 6 +- .../keychain/ui/EncryptFilesFragment.java | 6 +- .../keychain/ui/EncryptTextFragment.java | 5 +- .../keychain/ui/ImportKeysActivity.java | 74 ++-- .../keychain/ui/ImportKeysProxyActivity.java | 6 +- .../keychain/ui/KeyListFragment.java | 23 +- .../keychain/ui/SafeSlingerActivity.java | 6 +- .../keychain/ui/UploadKeyActivity.java | 6 +- .../keychain/ui/ViewKeyActivity.java | 2 + .../keychain/ui/ViewKeyTrustFragment.java | 6 +- .../keychain/ui/ViewKeyYubiKeyFragment.java | 1 + .../ui/dialog/DeleteKeyDialogFragment.java | 4 +- .../keychain/ui/dialog/ProgressDialogFragment.java | 33 +- .../keychain/util/ExportHelper.java | 6 +- 25 files changed, 396 insertions(+), 581 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java index b48de009e..ff568a9f6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java @@ -156,6 +156,15 @@ public class ImportExportOperation extends BaseOperation { } + /** + * Since the introduction of multithreaded import, we expect calling functions to handle the key sync i,e + * ContactSyncAdapterService.requestSync() + * + * @param entries keys to import + * @param num number of keys to import + * @param keyServerUri contains uri of keyserver to import from, if it is an import from cloud + * @return + */ public ImportKeyResult importKeyRings(Iterator entries, int num, String keyServerUri) { updateProgress(R.string.progress_importing, 0, 100); @@ -331,7 +340,7 @@ public class ImportExportOperation extends BaseOperation { // Special: make sure new data is synced into contacts // disabling sync right now since it reduces speed while multi-threading // so, we expect calling functions to take care of it. KeychainIntentService handles this - //ContactSyncAdapterService.requestSync(); + // ContactSyncAdapterService.requestSync(); // convert to long array long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()]; @@ -375,8 +384,6 @@ public class ImportExportOperation extends BaseOperation { log.add(LogType.MSG_IMPORT_ERROR, 1); } - ContactSyncAdapterService.requestSync(); - return new ImportKeyResult(resultType, log, newKeys, updatedKeys, badKeys, secret, importedMasterKeyIdsArray); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java deleted file mode 100644 index 249586f6d..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CloudImportService.java +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright (C) 2012-2013 Dominik Schürmann - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.service; - -import android.app.Service; -import android.content.Intent; -import android.os.Bundle; -import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.operations.ImportExportOperation; -import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.pgp.Progressable; -import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.util.Log; -import org.sufficientlysecure.keychain.util.ParcelableFileCache; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * When this service is started it will initiate a multi-threaded key import and when done it will - * shut itself down. - */ -public class CloudImportService extends Service implements Progressable { - - // required as extras from intent - public static final String EXTRA_MESSENGER = "messenger"; - public static final String EXTRA_DATA = "data"; - - // required by data bundle - public static final String IMPORT_KEY_LIST = "import_key_list"; - public static final String IMPORT_KEY_SERVER = "import_key_server"; - - // indicates a request to cancel the import - public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL"; - - // tells the spawned threads whether the user has requested a cancel - private static AtomicBoolean mActionCancelled = new AtomicBoolean(false); - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - /** - * Used to accumulate the results of individual key imports - */ - private class KeyImportAccumulator { - private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog(); - private int mTotalKeys; - private int mImportedKeys = 0; - private Progressable mImportProgressable; - ArrayList mImportedMasterKeyIds = new ArrayList(); - private int mBadKeys = 0; - private int mNewKeys = 0; - private int mUpdatedKeys = 0; - private int mSecret = 0; - private int mResultType = 0; - - public KeyImportAccumulator(int totalKeys) { - mTotalKeys = totalKeys; - // ignore updates from ImportExportOperation for now - mImportProgressable = new Progressable() { - @Override - public void setProgress(String message, int current, int total) { - - } - - @Override - public void setProgress(int resourceId, int current, int total) { - - } - - @Override - public void setProgress(int current, int total) { - - } - - @Override - public void setPreventCancel() { - - } - }; - } - - public Progressable getImportProgressable() { - return mImportProgressable; - } - - public int getTotalKeys() { - return mTotalKeys; - } - - public int getImportedKeys() { - return mImportedKeys; - } - - public synchronized void accumulateKeyImport(ImportKeyResult result) { - mImportedKeys++; - mImportLog.addAll(result.getLog().toList());//accumulates log - mBadKeys += result.mBadKeys; - mNewKeys += result.mNewKeys; - mUpdatedKeys += result.mUpdatedKeys; - mSecret += result.mSecret; - - long[] masterKeyIds = result.getImportedMasterKeyIds(); - for (long masterKeyId : masterKeyIds) { - mImportedMasterKeyIds.add(masterKeyId); - } - - // if any key import has been cancelled, set result type to cancelled - // resultType is added to in getConsolidatedKayImport to account for remaining factors - mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED; - } - - /** - * returns accumulated result of all imports so far - */ - public ImportKeyResult getConsolidatedImportKeyResult() { - - // adding required information to mResultType - // special case,no keys requested for import - if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) { - mResultType = ImportKeyResult.RESULT_FAIL_NOTHING; - } else { - if (mNewKeys > 0) { - mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS; - } - if (mUpdatedKeys > 0) { - mResultType |= ImportKeyResult.RESULT_OK_UPDATED; - } - if (mBadKeys > 0) { - mResultType |= ImportKeyResult.RESULT_WITH_ERRORS; - if (mNewKeys == 0 && mUpdatedKeys == 0) { - mResultType |= ImportKeyResult.RESULT_ERROR; - } - } - if (mImportLog.containsWarnings()) { - mResultType |= ImportKeyResult.RESULT_WARNINGS; - } - } - - long masterKeyIds[] = new long[mImportedMasterKeyIds.size()]; - for (int i = 0; i < masterKeyIds.length; i++) { - masterKeyIds[i] = mImportedMasterKeyIds.get(i); - } - - return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys, - mSecret, masterKeyIds); - } - - public boolean isImportFinished() { - return mTotalKeys == mImportedKeys; - } - } - - private KeyImportAccumulator mKeyImportAccumulator; - - Messenger mMessenger; - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - - if (ACTION_CANCEL.equals(intent.getAction())) { - mActionCancelled.set(true); - return Service.START_NOT_STICKY; - } - - mActionCancelled.set(false);//we haven't been cancelled, yet - - Bundle extras = intent.getExtras(); - - mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); - - Bundle data = extras.getBundle(EXTRA_DATA); - - final String keyServer = data.getString(IMPORT_KEY_SERVER); - // keyList being null (in case key list to be reaad from cache) is checked by importKeys - final ArrayList keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); - - // Adding keys to the ThreadPoolExecutor takes time, we don't want to block the main thread - Thread baseImportThread = new Thread(new Runnable() { - - @Override - public void run() { - importKeys(keyList, keyServer); - } - }); - baseImportThread.start(); - return Service.START_NOT_STICKY; - } - - public void importKeys(ArrayList keyList, final String keyServer) { - ParcelableFileCache cache = - new ParcelableFileCache<>(this, "key_import.pcl"); - int totKeys = 0; - Iterator keyListIterator = null; - // either keyList or cache must be null, no guarantees otherwise - if (keyList == null) {//export from cache, copied from ImportExportOperation.importKeyRings - - try { - ParcelableFileCache.IteratorWithSize it = cache.readCache(); - keyListIterator = it; - totKeys = it.getSize(); - } catch (IOException e) { - - // Special treatment here, we need a lot - OperationResult.OperationLog log = new OperationResult.OperationLog(); - log.add(OperationResult.LogType.MSG_IMPORT, 0, 0); - log.add(OperationResult.LogType.MSG_IMPORT_ERROR_IO, 0, 0); - - keyImportFailed(new ImportKeyResult(ImportKeyResult.RESULT_ERROR, log)); - } - } else { - keyListIterator = keyList.iterator(); - totKeys = keyList.size(); - } - - - if (keyListIterator != null) { - mKeyImportAccumulator = new KeyImportAccumulator(totKeys); - setProgress(0, totKeys); - - final int maxThreads = 200; - ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads, - 30L, TimeUnit.SECONDS, - new SynchronousQueue()); - - while (keyListIterator.hasNext()) { - - final ParcelableKeyRing pkRing = keyListIterator.next(); - - Runnable importOperationRunnable = new Runnable() { - - @Override - public void run() { - ImportKeyResult result = null; - try { - ImportExportOperation importExportOperation = new ImportExportOperation( - CloudImportService.this, - new ProviderHelper(CloudImportService.this), - mKeyImportAccumulator.getImportProgressable(), - mActionCancelled); - - ArrayList list = new ArrayList<>(); - list.add(pkRing); - result = importExportOperation.importKeyRings(list, - keyServer); - } finally { - // in the off-chance that importKeyRings does something to crash the - // thread before it can call singleKeyRingImportCompleted, our imported - // key count will go wrong. This will cause the service to never die, - // and the progress dialog to stay displayed. The finally block was - // originally meant to ensure singleKeyRingImportCompleted was called, - // and checks for null were to be introduced, but in such a scenario, - // knowing an uncaught error exists in importKeyRings is more important. - - // if a null gets passed, something wrong is happening. We want a crash. - - singleKeyRingImportCompleted(result); - } - } - }; - - importExecutor.execute(importOperationRunnable); - } - } - } - - private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) { - // increase imported key count and accumulate log and bad, new etc. key counts from result - mKeyImportAccumulator.accumulateKeyImport(result); - - setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys()); - - if (mKeyImportAccumulator.isImportFinished()) { - ContactSyncAdapterService.requestSync(); - - sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, - mKeyImportAccumulator.getConsolidatedImportKeyResult()); - - stopSelf();//we're done here - } - } - - private void keyImportFailed(ImportKeyResult result) { - sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, result); - } - - private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status, Integer arg2, Bundle data) { - - Message msg = Message.obtain(); - assert msg != null; - msg.arg1 = status.ordinal(); - if (arg2 != null) { - msg.arg2 = arg2; - } - if (data != null) { - msg.setData(data); - } - - try { - mMessenger.send(msg); - } catch (RemoteException e) { - Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); - } catch (NullPointerException e) { - Log.w(Constants.TAG, "Messenger is null!", e); - } - } - - private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status, OperationResult data) { - Bundle bundle = new Bundle(); - bundle.putParcelable(OperationResult.EXTRA_RESULT, data); - sendMessageToHandler(status, null, bundle); - } - - private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status, Bundle data) { - sendMessageToHandler(status, null, data); - } - - private void sendMessageToHandler(ServiceProgressHandler.MessageStatus status) { - sendMessageToHandler(status, null, null); - } - - /** - * Set progress of ProgressDialog by sending message to handler on UI thread - */ - @Override - public synchronized void setProgress(String message, int progress, int max) { - Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max=" - + max); - - Bundle data = new Bundle(); - if (message != null) { - data.putString(ServiceProgressHandler.DATA_MESSAGE, message); - } - data.putInt(ServiceProgressHandler.DATA_PROGRESS, progress); - data.putInt(ServiceProgressHandler.DATA_PROGRESS_MAX, max); - - sendMessageToHandler(ServiceProgressHandler.MessageStatus.UPDATE_PROGRESS, null, data); - } - - @Override - public synchronized void setProgress(int resourceId, int progress, int max) { - setProgress(getString(resourceId), progress, max); - } - - @Override - public synchronized void setProgress(int progress, int max) { - setProgress(null, progress, max); - } - - @Override - public synchronized void setPreventCancel() { - sendMessageToHandler(ServiceProgressHandler.MessageStatus.PREVENT_CANCEL); - } -} 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 5f9c98ac5..f9b0227a2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -18,10 +18,11 @@ package org.sufficientlysecure.keychain.service; -import android.app.IntentService; +import android.app.Service; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; @@ -68,7 +69,13 @@ import org.sufficientlysecure.keychain.util.ParcelableFileCache; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import de.measite.minidns.Client; @@ -80,10 +87,9 @@ import de.measite.minidns.record.TXT; /** * This Service contains all important long lasting operations for OpenKeychain. It receives Intents with - * data from the activities or other apps, queues these intents, executes them, and stops itself - * after doing them. + * data from the activities or other apps, executes them, and stops itself after doing them. */ -public class KeychainIntentService extends IntentService implements Progressable { +public class KeychainIntentService extends Service implements Progressable { /* extras that can be given by intent */ public static final String EXTRA_MESSENGER = "messenger"; @@ -168,18 +174,29 @@ public class KeychainIntentService extends IntentService implements Progressable // this attribute can possibly merged with the one above? not sure... private AtomicBoolean mActionCanceled = new AtomicBoolean(false); - public KeychainIntentService() { - super("KeychainIntentService"); + + private KeyImportAccumulator mKeyImportAccumulator; + + private KeychainIntentService mKeychainService; + + @Override + public IBinder onBind(Intent intent) { + return null; } /** - * The IntentService calls this method from the default worker thread with the intent that - * started the service. When this method returns, IntentService stops the service, as - * appropriate. + * This is run on the main thread, we need to spawn a runnable which runs on another thread for the actual operation */ @Override - protected void onHandleIntent(Intent intent) { + public int onStartCommand(final Intent intent, int flags, int startId) { + mKeychainService = this; + + if (ACTION_CANCEL.equals(intent.getAction())) { + mActionCanceled.set(true); + return START_NOT_STICKY; + } + Runnable actionRunnable = new Runnable(){@Override public void run() { // We have not been cancelled! (yet) mActionCanceled.set(false); @@ -207,7 +224,7 @@ public class KeychainIntentService extends IntentService implements Progressable Log.logDebugBundle(data, "EXTRA_DATA"); - ProviderHelper providerHelper = new ProviderHelper(this); + ProviderHelper providerHelper = new ProviderHelper(mKeychainService); String action = intent.getAction(); @@ -221,7 +238,8 @@ public class KeychainIntentService extends IntentService implements Progressable String keyServerUri = data.getString(UPLOAD_KEY_SERVER); // Operation - CertifyOperation op = new CertifyOperation(this, providerHelper, this, mActionCanceled); + CertifyOperation op = new CertifyOperation(mKeychainService, providerHelper, mKeychainService, + mActionCanceled); CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); // Result @@ -234,9 +252,9 @@ public class KeychainIntentService extends IntentService implements Progressable // Operation ConsolidateResult result; if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { - result = new ProviderHelper(this).consolidateDatabaseStep2(this); + result = providerHelper.consolidateDatabaseStep2(mKeychainService); } else { - result = new ProviderHelper(this).consolidateDatabaseStep1(this); + result = providerHelper.consolidateDatabaseStep1(mKeychainService); } // Result @@ -254,7 +272,7 @@ public class KeychainIntentService extends IntentService implements Progressable input.setDecryptMetadataOnly(true); /* Operation */ - PgpDecryptVerify op = new PgpDecryptVerify(this, new ProviderHelper(this), this); + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); /* Result */ @@ -271,7 +289,8 @@ public class KeychainIntentService extends IntentService implements Progressable Prover prover = Prover.findProverFor(proof); if (prover == null) { - sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof.getPrettyName()); + sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof + .getPrettyName()); return; } @@ -308,14 +327,15 @@ public class KeychainIntentService extends IntentService implements Progressable byte[] messageBytes = prover.getPgpMessage().getBytes(); if (prover.rawMessageCheckRequired()) { - InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream(messageBytes)); + InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream + (messageBytes)); if (!prover.checkRawMessageBytes(messageByteStream)) { sendProofError(prover.getLog(), null); return; } } - PgpDecryptVerify op = new PgpDecryptVerify(this, new ProviderHelper(this), this); + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) .setSignedLiteralData(true) @@ -344,7 +364,8 @@ public class KeychainIntentService extends IntentService implements Progressable // these help the handler construct a useful human-readable message resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); - resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover.getPresenceLabel()); + resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover + .getPresenceLabel()); sendMessageToHandler(MessageStatus.OKAY, resultData); } catch (Exception e) { sendErrorToHandler(e); @@ -363,7 +384,7 @@ public class KeychainIntentService extends IntentService implements Progressable input.setDecryptMetadataOnly(false); /* Operation */ - PgpDecryptVerify op = new PgpDecryptVerify(this, new ProviderHelper(this), this); + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); /* Output */ @@ -378,7 +399,7 @@ public class KeychainIntentService extends IntentService implements Progressable boolean isSecret = data.getBoolean(DELETE_IS_SECRET); // Operation - DeleteOperation op = new DeleteOperation(this, new ProviderHelper(this), this); + DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService); DeleteResult result = op.execute(masterKeyIds, isSecret); // Result @@ -393,7 +414,8 @@ public class KeychainIntentService extends IntentService implements Progressable CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); // Operation - EditKeyOperation op = new EditKeyOperation(this, providerHelper, this, mActionCanceled); + EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper, + mKeychainService, mActionCanceled); OperationResult result = op.execute(saveParcel, cryptoInput); // Result @@ -410,7 +432,8 @@ public class KeychainIntentService extends IntentService implements Progressable // Operation PromoteKeyOperation op = new PromoteKeyOperation( - this, providerHelper, this, mActionCanceled); + mKeychainService, providerHelper, mKeychainService, + mActionCanceled); PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); // Result @@ -429,7 +452,8 @@ public class KeychainIntentService extends IntentService implements Progressable long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); // Operation - ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this); + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, providerHelper, mKeychainService); ExportResult result; if (outputFile != null) { result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); @@ -446,23 +470,27 @@ public class KeychainIntentService extends IntentService implements Progressable // Input String keyServer = data.getString(IMPORT_KEY_SERVER); - ArrayList list = data.getParcelableArrayList(IMPORT_KEY_LIST); - ParcelableFileCache cache = - new ParcelableFileCache<>(this, "key_import.pcl"); + ArrayList keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); - // Operation - ImportExportOperation importExportOperation = new ImportExportOperation( - this, providerHelper, this, mActionCanceled); - // Either list or cache must be null, no guarantees otherwise. - ImportKeyResult result = list != null - ? importExportOperation.importKeyRings(list, keyServer) - : importExportOperation.importKeyRings(cache, keyServer); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // either keyList or cache must be null, no guarantees otherwise + if (keyList == null) {// import from file, do serially + serialKeyImport(null, keyServer, providerHelper); + } else { + // if there is more than one key with the same fingerprint, we do a serial import to prevent + // https://github.com/open-keychain/open-keychain/issues/1221 + HashSet keyFingerprintSet = new HashSet<>(); + for (int i = 0; i < keyList.size(); i++) { + keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint); + } + if (keyFingerprintSet.size() == keyList.size()) { + // all keys have unique fingerprints + multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer); + } else { + serialKeyImport(keyList, keyServer, providerHelper); + } + } break; - } case ACTION_SIGN_ENCRYPT: { @@ -472,7 +500,7 @@ public class KeychainIntentService extends IntentService implements Progressable // Operation SignEncryptOperation op = new SignEncryptOperation( - this, new ProviderHelper(this), this, mActionCanceled); + mKeychainService, providerHelper, mKeychainService, mActionCanceled); SignEncryptResult result = op.execute(inputParcel, cryptoInput); // Result @@ -491,7 +519,8 @@ public class KeychainIntentService extends IntentService implements Progressable HkpKeyserver server = new HkpKeyserver(keyServer); CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); - ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this); + ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService, + providerHelper, mKeychainService); try { importExportOperation.uploadKeyRingToServer(server, keyring); @@ -506,6 +535,13 @@ public class KeychainIntentService extends IntentService implements Progressable break; } } + if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) { + // import keyring handles stopping service on its own + stopSelf(); + } }}; + Thread actionThread = new Thread(actionRunnable); + actionThread.start(); + return START_NOT_STICKY; } private void sendProofError(List log, String label) { @@ -529,7 +565,7 @@ public class KeychainIntentService extends IntentService implements Progressable // contextualize the exception, if necessary String message; if (e instanceof PgpGeneralMsgIdException) { - e = ((PgpGeneralMsgIdException) e).getContextualized(this); + e = ((PgpGeneralMsgIdException) e).getContextualized(mKeychainService); message = e.getMessage(); } else { message = e.getMessage(); @@ -579,6 +615,7 @@ public class KeychainIntentService extends IntentService implements Progressable /** * Set progress of ProgressDialog by sending message to handler on UI thread */ + @Override public void setProgress(String message, int progress, int max) { Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max=" + max); @@ -593,10 +630,12 @@ public class KeychainIntentService extends IntentService implements Progressable sendMessageToHandler(MessageStatus.UPDATE_PROGRESS, null, data); } + @Override public void setProgress(int resourceId, int progress, int max) { setProgress(getString(resourceId), progress, max); } + @Override public void setProgress(int progress, int max) { setProgress(null, progress, max); } @@ -606,12 +645,214 @@ public class KeychainIntentService extends IntentService implements Progressable sendMessageToHandler(MessageStatus.PREVENT_CANCEL); } - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if (ACTION_CANCEL.equals(intent.getAction())) { - mActionCanceled.set(true); - return START_NOT_STICKY; + public void serialKeyImport(ArrayList keyList, final String keyServer, + ProviderHelper providerHelper) { + Log.d(Constants.TAG, "serial key import starting"); + ParcelableFileCache cache = + new ParcelableFileCache<>(mKeychainService, "key_import.pcl"); + + // Operation + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, providerHelper, mKeychainService, + mActionCanceled); + // Either list or cache must be null, no guarantees otherwise. + ImportKeyResult result = keyList != null + ? importExportOperation.importKeyRings(keyList, keyServer) + : importExportOperation.importKeyRings(cache, keyServer); + + ContactSyncAdapterService.requestSync(); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + stopSelf(); + } + + public void multiThreadedKeyImport(Iterator keyListIterator, int totKeys, final String + keyServer) { + Log.d(Constants.TAG, "Multi-threaded key import starting"); + if (keyListIterator != null) { + mKeyImportAccumulator = new KeyImportAccumulator(totKeys, mKeychainService); + setProgress(0, totKeys); + + final int maxThreads = 200; + ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads, + 30L, TimeUnit.SECONDS, + new SynchronousQueue()); + + while (keyListIterator.hasNext()) { + + final ParcelableKeyRing pkRing = keyListIterator.next(); + + Runnable importOperationRunnable = new Runnable() { + + @Override + public void run() { + ImportKeyResult result = null; + try { + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, + new ProviderHelper(mKeychainService), + mKeyImportAccumulator.getImportProgressable(), + mActionCanceled); + + ArrayList list = new ArrayList<>(); + list.add(pkRing); + + result = importExportOperation.importKeyRings(list, + keyServer); + } finally { + // in the off-chance that importKeyRings does something to crash the + // thread before it can call singleKeyRingImportCompleted, our imported + // key count will go wrong. This will cause the service to never die, + // and the progress dialog to stay displayed. The finally block was + // originally meant to ensure singleKeyRingImportCompleted was called, + // and checks for null were to be introduced, but in such a scenario, + // knowing an uncaught error exists in importKeyRings is more important. + + // if a null gets passed, something wrong is happening. We want a crash. + + mKeyImportAccumulator.singleKeyRingImportCompleted(result); + } + } + }; + + importExecutor.execute(importOperationRunnable); + } + } + } + + /** + * Used to accumulate the results of individual key imports + */ + private class KeyImportAccumulator { + private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog(); + private int mTotalKeys; + private int mImportedKeys = 0; + private Progressable mInternalProgressable; + ArrayList mImportedMasterKeyIds = new ArrayList(); + private int mBadKeys = 0; + private int mNewKeys = 0; + private int mUpdatedKeys = 0; + private int mSecret = 0; + private int mResultType = 0; + + /** + * meant to be used with a service due to stopSelf() in singleKeyRingImportCompleted. Remove this if + * generalising. + * + * @param totalKeys total number of keys to be imported + * @param externalProgressable the external progressable to be updated every time a key is imported + */ + public KeyImportAccumulator(int totalKeys, Progressable externalProgressable) { + mTotalKeys = totalKeys; + // ignore updates from ImportExportOperation for now + mInternalProgressable = new Progressable() { + @Override + public void setProgress(String message, int current, int total) { + + } + + @Override + public void setProgress(int resourceId, int current, int total) { + + } + + @Override + public void setProgress(int current, int total) { + + } + + @Override + public void setPreventCancel() { + + } + }; + } + + private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) { + // increase imported key count and accumulate log and bad, new etc. key counts from result + mKeyImportAccumulator.accumulateKeyImport(result); + + setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys()); + + if (mKeyImportAccumulator.isImportFinished()) { + ContactSyncAdapterService.requestSync(); + + sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, + mKeyImportAccumulator.getConsolidatedImportKeyResult()); + + stopSelf();//we're done here + } + } + + public Progressable getImportProgressable() { + return mInternalProgressable; + } + + public int getTotalKeys() { + return mTotalKeys; + } + + public int getImportedKeys() { + return mImportedKeys; + } + + public synchronized void accumulateKeyImport(ImportKeyResult result) { + mImportedKeys++; + mImportLog.addAll(result.getLog().toList());//accumulates log + mBadKeys += result.mBadKeys; + mNewKeys += result.mNewKeys; + mUpdatedKeys += result.mUpdatedKeys; + mSecret += result.mSecret; + + long[] masterKeyIds = result.getImportedMasterKeyIds(); + for (long masterKeyId : masterKeyIds) { + mImportedMasterKeyIds.add(masterKeyId); + } + + // if any key import has been cancelled, set result type to cancelled + // resultType is added to in getConsolidatedKayImport to account for remaining factors + mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED; + } + + /** + * returns accumulated result of all imports so far + */ + public ImportKeyResult getConsolidatedImportKeyResult() { + + // adding required information to mResultType + // special case,no keys requested for import + if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) { + mResultType = ImportKeyResult.RESULT_FAIL_NOTHING; + } else { + if (mNewKeys > 0) { + mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS; + } + if (mUpdatedKeys > 0) { + mResultType |= ImportKeyResult.RESULT_OK_UPDATED; + } + if (mBadKeys > 0) { + mResultType |= ImportKeyResult.RESULT_WITH_ERRORS; + if (mNewKeys == 0 && mUpdatedKeys == 0) { + mResultType |= ImportKeyResult.RESULT_ERROR; + } + } + if (mImportLog.containsWarnings()) { + mResultType |= ImportKeyResult.RESULT_WARNINGS; + } + } + + long masterKeyIds[] = new long[mImportedMasterKeyIds.size()]; + for (int i = 0; i < masterKeyIds.length; i++) { + masterKeyIds[i] = mImportedMasterKeyIds.get(i); + } + + return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys, + mSecret, masterKeyIds); + } + + public boolean isImportFinished() { + return mTotalKeys == mImportedKeys; } - return super.onStartCommand(intent, flags, startId); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java index 5b19d9e42..5625408f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java @@ -33,7 +33,7 @@ import org.sufficientlysecure.keychain.util.Log; public class ServiceProgressHandler extends Handler { // possible messages sent from this service to handler on ui - public static enum MessageStatus{ + public enum MessageStatus { UNKNOWN, OKAY, EXCEPTION, @@ -42,9 +42,8 @@ public class ServiceProgressHandler extends Handler { private static final MessageStatus[] values = values(); - public static MessageStatus fromInt(int n) - { - if(n < 0 || n >= values.length) { + public static MessageStatus fromInt(int n) { + if (n < 0 || n >= values.length) { return UNKNOWN; } else { return values[n]; @@ -71,30 +70,24 @@ public class ServiceProgressHandler extends Handler { this.mActivity = activity; } - public ServiceProgressHandler(Activity activity, - ProgressDialogFragment progressDialogFragment) { + public ServiceProgressHandler(Activity activity, ProgressDialogFragment progressDialogFragment) { this.mActivity = activity; this.mProgressDialogFragment = progressDialogFragment; } - public ServiceProgressHandler(Activity activity, - String progressDialogMessage, - int progressDialogStyle, - ProgressDialogFragment.ServiceType serviceType) { - this(activity, progressDialogMessage, progressDialogStyle, false, serviceType); + public ServiceProgressHandler(Activity activity, String progressDialogMessage, int progressDialogStyle) { + this(activity, progressDialogMessage, progressDialogStyle, false); } public ServiceProgressHandler(Activity activity, String progressDialogMessage, int progressDialogStyle, - boolean cancelable, - ProgressDialogFragment.ServiceType serviceType) { + boolean cancelable) { this.mActivity = activity; this.mProgressDialogFragment = ProgressDialogFragment.newInstance( progressDialogMessage, progressDialogStyle, - cancelable, - serviceType); + cancelable); } public void showProgressDialog(FragmentActivity activity) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java index 17836aa37..3631f257a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java @@ -353,8 +353,9 @@ public class CertifyKeyFragment extends CachingCryptoOperationFragment { @@ -603,8 +601,8 @@ public class EditKeyFragment extends CryptoOperationFragment implements getActivity(), getString(R.string.progress_saving), ProgressDialog.STYLE_HORIZONTAL, - true, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + true + ) { public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index f5963dbf0..1800dd8a1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -55,7 +55,6 @@ import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.adapter.SpacesItemDecoration; import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment; import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.FileHelper; @@ -518,8 +517,9 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment selectedEntries = mListFragment.getSelectedData(); @@ -449,27 +447,7 @@ public class ImportKeysActivity extends BaseNfcActivity { } else if (ls instanceof ImportKeysListFragment.CloudLoaderState) { ImportKeysListFragment.CloudLoaderState sls = (ImportKeysListFragment.CloudLoaderState) ls; - ServiceProgressHandler serviceHandler = new ServiceProgressHandler( - this, - getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL, - true, - ProgressDialogFragment.ServiceType.CLOUD_IMPORT) { - public void handleMessage(Message message) { - // handle messages by standard KeychainIntentServiceHandler first - super.handleMessage(message); - - ImportKeysActivity.this.handleMessage(message); - } - }; - - // Send all information needed to service to query keys in other thread - Intent intent = new Intent(this, CloudImportService.class); - - // fill values for this action - Bundle data = new Bundle(); - - data.putString(CloudImportService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver); + data.putString(KeychainIntentService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver); // get selected key entries ArrayList keys = new ArrayList<>(); @@ -482,13 +460,13 @@ public class ImportKeysActivity extends BaseNfcActivity { ); } } - data.putParcelableArrayList(CloudImportService.IMPORT_KEY_LIST, keys); + data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keys); - intent.putExtra(CloudImportService.EXTRA_DATA, data); + intent.putExtra(KeychainIntentService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(CloudImportService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java index 7ed8dd0b5..634df92f2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java @@ -45,7 +45,6 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.LogTyp import org.sufficientlysecure.keychain.operations.results.SingletonResult; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; @@ -211,8 +210,9 @@ public class ImportKeysProxyActivity extends FragmentActivity { this, getString(R.string.progress_importing), ProgressDialog.STYLE_HORIZONTAL, - true, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + true + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index 1355bd3e6..2f405aa20 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -64,12 +64,10 @@ import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainDatabase; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.CloudImportService; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter; import org.sufficientlysecure.keychain.ui.util.Notify; @@ -578,8 +576,9 @@ public class KeyListFragment extends LoaderFragment getActivity(), getString(R.string.progress_updating), ProgressDialog.STYLE_HORIZONTAL, - true, - ProgressDialogFragment.ServiceType.CLOUD_IMPORT) { + true + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); @@ -603,7 +602,8 @@ public class KeyListFragment extends LoaderFragment }; // Send all information needed to service to query keys in other thread - Intent intent = new Intent(getActivity(), CloudImportService.class); + Intent intent = new Intent(getActivity(), KeychainIntentService.class); + intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); // fill values for this action Bundle data = new Bundle(); @@ -613,16 +613,16 @@ public class KeyListFragment extends LoaderFragment Preferences prefs = Preferences.getPreferences(getActivity()); Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); - data.putString(CloudImportService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); + data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); } - data.putParcelableArrayList(CloudImportService.IMPORT_KEY_LIST, keyList); + data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyList); - intent.putExtra(CloudImportService.EXTRA_DATA, data); + intent.putExtra(KeychainIntentService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(CloudImportService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(getActivity()); @@ -636,8 +636,9 @@ public class KeyListFragment extends LoaderFragment ServiceProgressHandler saveHandler = new ServiceProgressHandler( getActivity(), getString(R.string.progress_importing), - ProgressDialog.STYLE_HORIZONTAL, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + ProgressDialog.STYLE_HORIZONTAL + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java index aa3c36d11..bdebf2d75 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java @@ -41,7 +41,6 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.ui.base.BaseActivity; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ParcelableFileCache; @@ -129,8 +128,9 @@ public class SafeSlingerActivity extends BaseActivity { activity, getString(R.string.progress_importing), ProgressDialog.STYLE_HORIZONTAL, - true, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + true + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java index 5c8e6bb5d..7426cf149 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java @@ -38,7 +38,6 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.ui.base.BaseActivity; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; @@ -112,8 +111,9 @@ public class UploadKeyActivity extends BaseActivity { ServiceProgressHandler saveHandler = new ServiceProgressHandler( this, getString(R.string.progress_uploading), - ProgressDialog.STYLE_HORIZONTAL, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + ProgressDialog.STYLE_HORIZONTAL + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 9968855f7..b2f1f4bee 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -404,6 +404,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements private void startCertifyIntent(Intent intent) { // Message is received after signing is done in KeychainIntentService ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); @@ -653,6 +654,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements // Message is received after importing is done in KeychainIntentService ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java index d5870d8c5..5cb7aef06 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java @@ -51,7 +51,6 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Log; @@ -365,8 +364,9 @@ public class ViewKeyTrustFragment extends LoaderFragment implements ServiceProgressHandler handler = new ServiceProgressHandler( getActivity(), getString(R.string.progress_verifying_signature), - ProgressDialog.STYLE_HORIZONTAL, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + ProgressDialog.STYLE_HORIZONTAL + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java index b02bb0b83..125e24e09 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java @@ -129,6 +129,7 @@ public class ViewKeyYubiKeyFragment extends Fragment public void promoteToSecretKey() { ServiceProgressHandler saveHandler = new ServiceProgressHandler(getActivity()) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java index 581a96e52..960b3f970 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java @@ -139,8 +139,8 @@ public class DeleteKeyDialogFragment extends DialogFragment { getActivity(), getString(R.string.progress_deleting), ProgressDialog.STYLE_HORIZONTAL, - true, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + true + ) { @Override public void handleMessage(Message message) { super.handleMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 562517c12..6dfa77d3f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -33,25 +33,18 @@ import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; -import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.service.CloudImportService; import org.sufficientlysecure.keychain.service.KeychainIntentService; -import org.sufficientlysecure.keychain.util.Log; +/** + * meant to be used + */ public class ProgressDialogFragment extends DialogFragment { private static final String ARG_MESSAGE = "message"; private static final String ARG_STYLE = "style"; private static final String ARG_CANCELABLE = "cancelable"; private static final String ARG_SERVICE_TYPE = "service_class"; - public enum ServiceType { - KEYCHAIN_INTENT, - CLOUD_IMPORT - } - - ServiceType mServiceType; - boolean mCanCancel = false, mPreventCancel = false, mIsCancelled = false; /** @@ -59,16 +52,13 @@ public class ProgressDialogFragment extends DialogFragment { * @param message the message to be displayed initially above the progress bar * @param style the progress bar style, as defined in ProgressDialog (horizontal or spinner) * @param cancelable should we let the user cancel this operation - * @param serviceType which Service this progress dialog is meant for */ - public static ProgressDialogFragment newInstance(String message, int style, boolean cancelable, - ServiceType serviceType) { + public static ProgressDialogFragment newInstance(String message, int style, boolean cancelable) { ProgressDialogFragment frag = new ProgressDialogFragment(); Bundle args = new Bundle(); args.putString(ARG_MESSAGE, message); args.putInt(ARG_STYLE, style); args.putBoolean(ARG_CANCELABLE, cancelable); - args.putSerializable(ARG_SERVICE_TYPE, serviceType); frag.setArguments(args); @@ -121,7 +111,6 @@ public class ProgressDialogFragment extends DialogFragment { String message = getArguments().getString(ARG_MESSAGE); int style = getArguments().getInt(ARG_STYLE); mCanCancel = getArguments().getBoolean(ARG_CANCELABLE); - mServiceType = (ServiceType) getArguments().getSerializable(ARG_SERVICE_TYPE); dialog.setMessage(message); dialog.setProgressStyle(style); @@ -191,19 +180,7 @@ public class ProgressDialogFragment extends DialogFragment { // send a cancel message. note that this message will be handled by // KeychainIntentService.onStartCommand, which runs in this thread, // not the service one, and will not queue up a command. - Intent serviceIntent = null; - - switch (mServiceType) { - case CLOUD_IMPORT: - serviceIntent = new Intent(getActivity(), CloudImportService.class); - break; - case KEYCHAIN_INTENT: - serviceIntent = new Intent(getActivity(), KeychainIntentService.class); - break; - default: - //should never happen, unless we forget to include a ServiceType enum case - Log.e(Constants.TAG, "Unrecognized ServiceType at ProgressDialogFragment"); - } + Intent serviceIntent = new Intent(getActivity(), KeychainIntentService.class); serviceIntent.setAction(KeychainIntentService.ACTION_CANCEL); getActivity().startService(serviceIntent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java index 7efb7c5af..96a01a42a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java @@ -29,7 +29,6 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.ExportResult; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import java.io.File; @@ -100,8 +99,9 @@ public class ExportHelper { // Message is received after exporting is done in KeychainIntentService ServiceProgressHandler exportHandler = new ServiceProgressHandler(mActivity, mActivity.getString(R.string.progress_exporting), - ProgressDialog.STYLE_HORIZONTAL, - ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + ProgressDialog.STYLE_HORIZONTAL + ) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); -- cgit v1.2.3 From 6bc40d12ad44c4170f10054fb8ea7d2c9459da35 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Mon, 1 Jun 2015 17:43:00 +0530 Subject: renamed KeychainIntentService to KeychainService --- .../keychain/operations/BaseOperation.java | 4 +- .../keychain/operations/ImportExportOperation.java | 2 +- .../keychain/service/KeychainIntentService.java | 858 --------------------- .../keychain/service/KeychainService.java | 858 +++++++++++++++++++++ .../keychain/ui/CertifyKeyFragment.java | 23 +- .../keychain/ui/ConsolidateDialogActivity.java | 16 +- .../keychain/ui/CreateKeyFinalFragment.java | 22 +- .../ui/CreateKeyYubiKeyImportFragment.java | 16 +- .../keychain/ui/DecryptFilesFragment.java | 22 +- .../keychain/ui/DecryptFragment.java | 16 +- .../keychain/ui/DecryptTextFragment.java | 16 +- .../keychain/ui/EditKeyFragment.java | 14 +- .../keychain/ui/EncryptFilesFragment.java | 16 +- .../keychain/ui/EncryptTextFragment.java | 17 +- .../keychain/ui/ImportKeysActivity.java | 18 +- .../keychain/ui/ImportKeysProxyActivity.java | 16 +- .../keychain/ui/KeyListFragment.java | 24 +- .../keychain/ui/SafeSlingerActivity.java | 12 +- .../keychain/ui/UploadKeyActivity.java | 14 +- .../keychain/ui/ViewKeyActivity.java | 20 +- .../keychain/ui/ViewKeyTrustFragment.java | 14 +- .../keychain/ui/ViewKeyYubiKeyFragment.java | 16 +- .../ui/adapter/ImportKeysListCloudLoader.java | 2 +- .../ui/dialog/DeleteKeyDialogFragment.java | 16 +- .../keychain/ui/dialog/ProgressDialogFragment.java | 8 +- .../keychain/util/EmailKeyHelper.java | 12 +- .../keychain/util/ExportHelper.java | 20 +- .../keychain/util/KeyUpdateHelper.java | 10 +- 28 files changed, 1050 insertions(+), 1052 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java index a824e73d7..5a3321ac8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java @@ -40,7 +40,7 @@ public abstract class BaseOperation implements PassphraseCacheInterface { * of common methods for progress, cancellation and passphrase cache handling. * * An "operation" in this sense is a high level operation which is called - * by the KeychainIntentService or OpenPgpService services. Concrete + * by the KeychainService or OpenPgpService services. Concrete * subclasses of this class should implement either a single or a group of * related operations. An operation must rely solely on its input * parameters for operation specifics. It should also write a log of its @@ -49,7 +49,7 @@ public abstract class BaseOperation implements PassphraseCacheInterface { * * An operation must *not* throw exceptions of any kind, errors should be * handled as part of the OperationResult! Consequently, all handling of - * errors in KeychainIntentService and OpenPgpService should consist of + * errors in KeychainService and OpenPgpService should consist of * informational rather than operational means. * * Note that subclasses of this class should be either Android- or diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java index ff568a9f6..ffce2f39c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java @@ -339,7 +339,7 @@ public class ImportExportOperation extends BaseOperation { // Special: make sure new data is synced into contacts // disabling sync right now since it reduces speed while multi-threading - // so, we expect calling functions to take care of it. KeychainIntentService handles this + // so, we expect calling functions to take care of it. KeychainService handles this // ContactSyncAdapterService.requestSync(); // convert to long array diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java deleted file mode 100644 index f9b0227a2..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ /dev/null @@ -1,858 +0,0 @@ -/* - * Copyright (C) 2012-2014 Dominik Schürmann - * Copyright (C) 2014 Vincent Breitmoser - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sufficientlysecure.keychain.service; - -import android.app.Service; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; - -import com.textuality.keybase.lib.Proof; -import com.textuality.keybase.lib.prover.Prover; - -import org.json.JSONObject; -import org.spongycastle.openpgp.PGPUtil; -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; -import org.sufficientlysecure.keychain.keyimport.Keyserver; -import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.operations.CertifyOperation; -import org.sufficientlysecure.keychain.operations.DeleteOperation; -import org.sufficientlysecure.keychain.operations.EditKeyOperation; -import org.sufficientlysecure.keychain.operations.ImportExportOperation; -import org.sufficientlysecure.keychain.operations.PromoteKeyOperation; -import org.sufficientlysecure.keychain.operations.SignEncryptOperation; -import org.sufficientlysecure.keychain.operations.results.CertifyResult; -import org.sufficientlysecure.keychain.operations.results.ConsolidateResult; -import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; -import org.sufficientlysecure.keychain.operations.results.DeleteResult; -import org.sufficientlysecure.keychain.operations.results.ExportResult; -import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; -import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; -import org.sufficientlysecure.keychain.operations.results.SignEncryptResult; -import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.pgp.Progressable; -import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; -import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; -import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException; -import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; -import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; -import org.sufficientlysecure.keychain.util.Log; -import org.sufficientlysecure.keychain.util.ParcelableFileCache; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -import de.measite.minidns.Client; -import de.measite.minidns.DNSMessage; -import de.measite.minidns.Question; -import de.measite.minidns.Record; -import de.measite.minidns.record.Data; -import de.measite.minidns.record.TXT; - -/** - * This Service contains all important long lasting operations for OpenKeychain. It receives Intents with - * data from the activities or other apps, executes them, and stops itself after doing them. - */ -public class KeychainIntentService extends Service implements Progressable { - - /* extras that can be given by intent */ - public static final String EXTRA_MESSENGER = "messenger"; - public static final String EXTRA_DATA = "data"; - - /* possible actions */ - public static final String ACTION_SIGN_ENCRYPT = Constants.INTENT_PREFIX + "SIGN_ENCRYPT"; - - public static final String ACTION_DECRYPT_VERIFY = Constants.INTENT_PREFIX + "DECRYPT_VERIFY"; - - public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF"; - - public static final String ACTION_DECRYPT_METADATA = Constants.INTENT_PREFIX + "DECRYPT_METADATA"; - - public static final String ACTION_EDIT_KEYRING = Constants.INTENT_PREFIX + "EDIT_KEYRING"; - - public static final String ACTION_PROMOTE_KEYRING = Constants.INTENT_PREFIX + "PROMOTE_KEYRING"; - - public static final String ACTION_IMPORT_KEYRING = Constants.INTENT_PREFIX + "IMPORT_KEYRING"; - public static final String ACTION_EXPORT_KEYRING = Constants.INTENT_PREFIX + "EXPORT_KEYRING"; - - public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING"; - - public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING"; - - public static final String ACTION_DELETE = Constants.INTENT_PREFIX + "DELETE"; - - public static final String ACTION_CONSOLIDATE = Constants.INTENT_PREFIX + "CONSOLIDATE"; - - public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL"; - - /* keys for data bundle */ - - // encrypt - public static final String ENCRYPT_DECRYPT_INPUT_URI = "input_uri"; - public static final String ENCRYPT_DECRYPT_OUTPUT_URI = "output_uri"; - public static final String SIGN_ENCRYPT_PARCEL = "sign_encrypt_parcel"; - - // decrypt/verify - public static final String DECRYPT_VERIFY_PARCEL = "decrypt_verify_parcel"; - - // keybase proof - public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint"; - public static final String KEYBASE_PROOF = "keybase_proof"; - - // save keyring - public static final String EDIT_KEYRING_PARCEL = "save_parcel"; - public static final String EDIT_KEYRING_PASSPHRASE = "passphrase"; - public static final String EXTRA_CRYPTO_INPUT = "crypto_input"; - - // delete keyring(s) - public static final String DELETE_KEY_LIST = "delete_list"; - public static final String DELETE_IS_SECRET = "delete_is_secret"; - - // import key - public static final String IMPORT_KEY_LIST = "import_key_list"; - public static final String IMPORT_KEY_SERVER = "import_key_server"; - - // export key - public static final String EXPORT_FILENAME = "export_filename"; - public static final String EXPORT_URI = "export_uri"; - public static final String EXPORT_SECRET = "export_secret"; - public static final String EXPORT_ALL = "export_all"; - public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id"; - - // upload key - public static final String UPLOAD_KEY_SERVER = "upload_key_server"; - - // certify key - public static final String CERTIFY_PARCEL = "certify_parcel"; - - // promote key - public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id"; - public static final String PROMOTE_CARD_AID = "promote_card_aid"; - public static final String PROMOTE_SUBKEY_IDS = "promote_fingerprints"; - - // consolidate - public static final String CONSOLIDATE_RECOVERY = "consolidate_recovery"; - - Messenger mMessenger; - - // this attribute can possibly merged with the one above? not sure... - private AtomicBoolean mActionCanceled = new AtomicBoolean(false); - - - private KeyImportAccumulator mKeyImportAccumulator; - - private KeychainIntentService mKeychainService; - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - /** - * This is run on the main thread, we need to spawn a runnable which runs on another thread for the actual operation - */ - @Override - public int onStartCommand(final Intent intent, int flags, int startId) { - mKeychainService = this; - - if (ACTION_CANCEL.equals(intent.getAction())) { - mActionCanceled.set(true); - return START_NOT_STICKY; - } - - Runnable actionRunnable = new Runnable(){@Override public void run() { - // We have not been cancelled! (yet) - mActionCanceled.set(false); - - Bundle extras = intent.getExtras(); - if (extras == null) { - Log.e(Constants.TAG, "Extras bundle is null!"); - return; - } - - if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent - .getAction() == null))) { - Log.e(Constants.TAG, - "Extra bundle must contain a messenger, a data bundle, and an action!"); - return; - } - - Uri dataUri = intent.getData(); - - mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); - Bundle data = extras.getBundle(EXTRA_DATA); - if (data == null) { - Log.e(Constants.TAG, "data extra is null!"); - return; - } - - Log.logDebugBundle(data, "EXTRA_DATA"); - - ProviderHelper providerHelper = new ProviderHelper(mKeychainService); - - String action = intent.getAction(); - - // executeServiceMethod action from extra bundle - switch (action) { - case ACTION_CERTIFY_KEYRING: { - - // Input - CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL); - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - String keyServerUri = data.getString(UPLOAD_KEY_SERVER); - - // Operation - CertifyOperation op = new CertifyOperation(mKeychainService, providerHelper, mKeychainService, - mActionCanceled); - CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_CONSOLIDATE: { - - // Operation - ConsolidateResult result; - if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { - result = providerHelper.consolidateDatabaseStep2(mKeychainService); - } else { - result = providerHelper.consolidateDatabaseStep1(mKeychainService); - } - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_DECRYPT_METADATA: { - - /* Input */ - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); - - // this action is here for compatibility only - input.setDecryptMetadataOnly(true); - - /* Operation */ - PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); - DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); - - /* Result */ - sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); - - break; - } - case ACTION_VERIFY_KEYBASE_PROOF: { - - try { - Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF))); - setProgress(R.string.keybase_message_fetching_data, 0, 100); - - Prover prover = Prover.findProverFor(proof); - - if (prover == null) { - sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof - .getPrettyName()); - return; - } - - if (!prover.fetchProofData()) { - sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence)); - return; - } - String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT); - if (!prover.checkFingerprint(requiredFingerprint)) { - sendProofError(getString(R.string.keybase_key_mismatch)); - return; - } - - String domain = prover.dnsTxtCheckRequired(); - if (domain != null) { - DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); - if (dnsQuery == null) { - sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure)); - return; - } - Record[] records = dnsQuery.getAnswers(); - List> extents = new ArrayList>(); - for (Record r : records) { - Data d = r.getPayload(); - if (d instanceof TXT) { - extents.add(((TXT) d).getExtents()); - } - } - if (!prover.checkDnsTxt(extents)) { - sendProofError(prover.getLog(), null); - return; - } - } - - byte[] messageBytes = prover.getPgpMessage().getBytes(); - if (prover.rawMessageCheckRequired()) { - InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream - (messageBytes)); - if (!prover.checkRawMessageBytes(messageByteStream)) { - sendProofError(prover.getLog(), null); - return; - } - } - - PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); - - PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) - .setSignedLiteralData(true) - .setRequiredSignerFingerprint(requiredFingerprint); - - DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel()); - - if (!decryptVerifyResult.success()) { - OperationLog log = decryptVerifyResult.getLog(); - OperationResult.LogEntryParcel lastEntry = null; - for (OperationResult.LogEntryParcel entry : log) { - lastEntry = entry; - } - sendProofError(getString(lastEntry.mType.getMsgId())); - return; - } - - if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { - sendProofError(getString(R.string.keybase_message_payload_mismatch)); - return; - } - - Bundle resultData = new Bundle(); - resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK"); - - // these help the handler construct a useful human-readable message - resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); - resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); - resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover - .getPresenceLabel()); - sendMessageToHandler(MessageStatus.OKAY, resultData); - } catch (Exception e) { - sendErrorToHandler(e); - } - - break; - } - case ACTION_DECRYPT_VERIFY: { - - /* Input */ - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); - - // for compatibility - // TODO merge with ACTION_DECRYPT_METADATA - input.setDecryptMetadataOnly(false); - - /* Operation */ - PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); - DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); - - /* Output */ - sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); - - break; - } - case ACTION_DELETE: { - - // Input - long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); - boolean isSecret = data.getBoolean(DELETE_IS_SECRET); - - // Operation - DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService); - DeleteResult result = op.execute(masterKeyIds, isSecret); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_EDIT_KEYRING: { - - // Input - SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL); - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - - // Operation - EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper, - mKeychainService, mActionCanceled); - OperationResult result = op.execute(saveParcel, cryptoInput); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_PROMOTE_KEYRING: { - - // Input - long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID); - byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID); - long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS); - - // Operation - PromoteKeyOperation op = new PromoteKeyOperation( - mKeychainService, providerHelper, mKeychainService, - mActionCanceled); - PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_EXPORT_KEYRING: { - - // Input - boolean exportSecret = data.getBoolean(EXPORT_SECRET, false); - String outputFile = data.getString(EXPORT_FILENAME); - Uri outputUri = data.getParcelable(EXPORT_URI); - - boolean exportAll = data.getBoolean(EXPORT_ALL); - long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); - - // Operation - ImportExportOperation importExportOperation = new ImportExportOperation( - mKeychainService, providerHelper, mKeychainService); - ExportResult result; - if (outputFile != null) { - result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); - } else { - result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri); - } - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_IMPORT_KEYRING: { - - // Input - String keyServer = data.getString(IMPORT_KEY_SERVER); - ArrayList keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); - - // either keyList or cache must be null, no guarantees otherwise - if (keyList == null) {// import from file, do serially - serialKeyImport(null, keyServer, providerHelper); - } else { - // if there is more than one key with the same fingerprint, we do a serial import to prevent - // https://github.com/open-keychain/open-keychain/issues/1221 - HashSet keyFingerprintSet = new HashSet<>(); - for (int i = 0; i < keyList.size(); i++) { - keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint); - } - if (keyFingerprintSet.size() == keyList.size()) { - // all keys have unique fingerprints - multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer); - } else { - serialKeyImport(keyList, keyServer, providerHelper); - } - } - - break; - } - case ACTION_SIGN_ENCRYPT: { - - // Input - SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL); - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - - // Operation - SignEncryptOperation op = new SignEncryptOperation( - mKeychainService, providerHelper, mKeychainService, mActionCanceled); - SignEncryptResult result = op.execute(inputParcel, cryptoInput); - - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - break; - } - case ACTION_UPLOAD_KEYRING: { - try { - - /* Input */ - String keyServer = data.getString(UPLOAD_KEY_SERVER); - // and dataUri! - - /* Operation */ - HkpKeyserver server = new HkpKeyserver(keyServer); - - CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); - ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService, - providerHelper, mKeychainService); - - try { - importExportOperation.uploadKeyRingToServer(server, keyring); - } catch (Keyserver.AddKeyException e) { - throw new PgpGeneralException("Unable to export key to selected server"); - } - - sendMessageToHandler(MessageStatus.OKAY); - } catch (Exception e) { - sendErrorToHandler(e); - } - break; - } - } - if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) { - // import keyring handles stopping service on its own - stopSelf(); - } }}; - Thread actionThread = new Thread(actionRunnable); - actionThread.start(); - return START_NOT_STICKY; - } - - private void sendProofError(List log, String label) { - String msg = null; - label = (label == null) ? "" : label + ": "; - for (String m : log) { - Log.e(Constants.TAG, label + m); - msg = m; - } - sendProofError(label + msg); - } - - private void sendProofError(String msg) { - Bundle bundle = new Bundle(); - bundle.putString(ServiceProgressHandler.DATA_ERROR, msg); - sendMessageToHandler(MessageStatus.OKAY, bundle); - } - - private void sendErrorToHandler(Exception e) { - // TODO: Implement a better exception handling here - // contextualize the exception, if necessary - String message; - if (e instanceof PgpGeneralMsgIdException) { - e = ((PgpGeneralMsgIdException) e).getContextualized(mKeychainService); - message = e.getMessage(); - } else { - message = e.getMessage(); - } - Log.d(Constants.TAG, "KeychainIntentService Exception: ", e); - - Bundle data = new Bundle(); - data.putString(ServiceProgressHandler.DATA_ERROR, message); - sendMessageToHandler(MessageStatus.EXCEPTION, null, data); - } - - private void sendMessageToHandler(MessageStatus status, Integer arg2, Bundle data) { - - Message msg = Message.obtain(); - assert msg != null; - msg.arg1 = status.ordinal(); - if (arg2 != null) { - msg.arg2 = arg2; - } - if (data != null) { - msg.setData(data); - } - - try { - mMessenger.send(msg); - } catch (RemoteException e) { - Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); - } catch (NullPointerException e) { - Log.w(Constants.TAG, "Messenger is null!", e); - } - } - - private void sendMessageToHandler(MessageStatus status, OperationResult data) { - Bundle bundle = new Bundle(); - bundle.putParcelable(OperationResult.EXTRA_RESULT, data); - sendMessageToHandler(status, null, bundle); - } - - private void sendMessageToHandler(MessageStatus status, Bundle data) { - sendMessageToHandler(status, null, data); - } - - private void sendMessageToHandler(MessageStatus status) { - sendMessageToHandler(status, null, null); - } - - /** - * Set progress of ProgressDialog by sending message to handler on UI thread - */ - @Override - public void setProgress(String message, int progress, int max) { - Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max=" - + max); - - Bundle data = new Bundle(); - if (message != null) { - data.putString(ServiceProgressHandler.DATA_MESSAGE, message); - } - data.putInt(ServiceProgressHandler.DATA_PROGRESS, progress); - data.putInt(ServiceProgressHandler.DATA_PROGRESS_MAX, max); - - sendMessageToHandler(MessageStatus.UPDATE_PROGRESS, null, data); - } - - @Override - public void setProgress(int resourceId, int progress, int max) { - setProgress(getString(resourceId), progress, max); - } - - @Override - public void setProgress(int progress, int max) { - setProgress(null, progress, max); - } - - @Override - public void setPreventCancel() { - sendMessageToHandler(MessageStatus.PREVENT_CANCEL); - } - - public void serialKeyImport(ArrayList keyList, final String keyServer, - ProviderHelper providerHelper) { - Log.d(Constants.TAG, "serial key import starting"); - ParcelableFileCache cache = - new ParcelableFileCache<>(mKeychainService, "key_import.pcl"); - - // Operation - ImportExportOperation importExportOperation = new ImportExportOperation( - mKeychainService, providerHelper, mKeychainService, - mActionCanceled); - // Either list or cache must be null, no guarantees otherwise. - ImportKeyResult result = keyList != null - ? importExportOperation.importKeyRings(keyList, keyServer) - : importExportOperation.importKeyRings(cache, keyServer); - - ContactSyncAdapterService.requestSync(); - // Result - sendMessageToHandler(MessageStatus.OKAY, result); - - stopSelf(); - } - - public void multiThreadedKeyImport(Iterator keyListIterator, int totKeys, final String - keyServer) { - Log.d(Constants.TAG, "Multi-threaded key import starting"); - if (keyListIterator != null) { - mKeyImportAccumulator = new KeyImportAccumulator(totKeys, mKeychainService); - setProgress(0, totKeys); - - final int maxThreads = 200; - ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads, - 30L, TimeUnit.SECONDS, - new SynchronousQueue()); - - while (keyListIterator.hasNext()) { - - final ParcelableKeyRing pkRing = keyListIterator.next(); - - Runnable importOperationRunnable = new Runnable() { - - @Override - public void run() { - ImportKeyResult result = null; - try { - ImportExportOperation importExportOperation = new ImportExportOperation( - mKeychainService, - new ProviderHelper(mKeychainService), - mKeyImportAccumulator.getImportProgressable(), - mActionCanceled); - - ArrayList list = new ArrayList<>(); - list.add(pkRing); - - result = importExportOperation.importKeyRings(list, - keyServer); - } finally { - // in the off-chance that importKeyRings does something to crash the - // thread before it can call singleKeyRingImportCompleted, our imported - // key count will go wrong. This will cause the service to never die, - // and the progress dialog to stay displayed. The finally block was - // originally meant to ensure singleKeyRingImportCompleted was called, - // and checks for null were to be introduced, but in such a scenario, - // knowing an uncaught error exists in importKeyRings is more important. - - // if a null gets passed, something wrong is happening. We want a crash. - - mKeyImportAccumulator.singleKeyRingImportCompleted(result); - } - } - }; - - importExecutor.execute(importOperationRunnable); - } - } - } - - /** - * Used to accumulate the results of individual key imports - */ - private class KeyImportAccumulator { - private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog(); - private int mTotalKeys; - private int mImportedKeys = 0; - private Progressable mInternalProgressable; - ArrayList mImportedMasterKeyIds = new ArrayList(); - private int mBadKeys = 0; - private int mNewKeys = 0; - private int mUpdatedKeys = 0; - private int mSecret = 0; - private int mResultType = 0; - - /** - * meant to be used with a service due to stopSelf() in singleKeyRingImportCompleted. Remove this if - * generalising. - * - * @param totalKeys total number of keys to be imported - * @param externalProgressable the external progressable to be updated every time a key is imported - */ - public KeyImportAccumulator(int totalKeys, Progressable externalProgressable) { - mTotalKeys = totalKeys; - // ignore updates from ImportExportOperation for now - mInternalProgressable = new Progressable() { - @Override - public void setProgress(String message, int current, int total) { - - } - - @Override - public void setProgress(int resourceId, int current, int total) { - - } - - @Override - public void setProgress(int current, int total) { - - } - - @Override - public void setPreventCancel() { - - } - }; - } - - private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) { - // increase imported key count and accumulate log and bad, new etc. key counts from result - mKeyImportAccumulator.accumulateKeyImport(result); - - setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys()); - - if (mKeyImportAccumulator.isImportFinished()) { - ContactSyncAdapterService.requestSync(); - - sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, - mKeyImportAccumulator.getConsolidatedImportKeyResult()); - - stopSelf();//we're done here - } - } - - public Progressable getImportProgressable() { - return mInternalProgressable; - } - - public int getTotalKeys() { - return mTotalKeys; - } - - public int getImportedKeys() { - return mImportedKeys; - } - - public synchronized void accumulateKeyImport(ImportKeyResult result) { - mImportedKeys++; - mImportLog.addAll(result.getLog().toList());//accumulates log - mBadKeys += result.mBadKeys; - mNewKeys += result.mNewKeys; - mUpdatedKeys += result.mUpdatedKeys; - mSecret += result.mSecret; - - long[] masterKeyIds = result.getImportedMasterKeyIds(); - for (long masterKeyId : masterKeyIds) { - mImportedMasterKeyIds.add(masterKeyId); - } - - // if any key import has been cancelled, set result type to cancelled - // resultType is added to in getConsolidatedKayImport to account for remaining factors - mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED; - } - - /** - * returns accumulated result of all imports so far - */ - public ImportKeyResult getConsolidatedImportKeyResult() { - - // adding required information to mResultType - // special case,no keys requested for import - if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) { - mResultType = ImportKeyResult.RESULT_FAIL_NOTHING; - } else { - if (mNewKeys > 0) { - mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS; - } - if (mUpdatedKeys > 0) { - mResultType |= ImportKeyResult.RESULT_OK_UPDATED; - } - if (mBadKeys > 0) { - mResultType |= ImportKeyResult.RESULT_WITH_ERRORS; - if (mNewKeys == 0 && mUpdatedKeys == 0) { - mResultType |= ImportKeyResult.RESULT_ERROR; - } - } - if (mImportLog.containsWarnings()) { - mResultType |= ImportKeyResult.RESULT_WARNINGS; - } - } - - long masterKeyIds[] = new long[mImportedMasterKeyIds.size()]; - for (int i = 0; i < masterKeyIds.length; i++) { - masterKeyIds[i] = mImportedMasterKeyIds.get(i); - } - - return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys, - mSecret, masterKeyIds); - } - - public boolean isImportFinished() { - return mTotalKeys == mImportedKeys; - } - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java new file mode 100644 index 000000000..7ce45240a --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java @@ -0,0 +1,858 @@ +/* + * Copyright (C) 2012-2014 Dominik Schürmann + * Copyright (C) 2014 Vincent Breitmoser + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.sufficientlysecure.keychain.service; + +import android.app.Service; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; + +import com.textuality.keybase.lib.Proof; +import com.textuality.keybase.lib.prover.Prover; + +import org.json.JSONObject; +import org.spongycastle.openpgp.PGPUtil; +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; +import org.sufficientlysecure.keychain.keyimport.Keyserver; +import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; +import org.sufficientlysecure.keychain.operations.CertifyOperation; +import org.sufficientlysecure.keychain.operations.DeleteOperation; +import org.sufficientlysecure.keychain.operations.EditKeyOperation; +import org.sufficientlysecure.keychain.operations.ImportExportOperation; +import org.sufficientlysecure.keychain.operations.PromoteKeyOperation; +import org.sufficientlysecure.keychain.operations.SignEncryptOperation; +import org.sufficientlysecure.keychain.operations.results.CertifyResult; +import org.sufficientlysecure.keychain.operations.results.ConsolidateResult; +import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; +import org.sufficientlysecure.keychain.operations.results.DeleteResult; +import org.sufficientlysecure.keychain.operations.results.ExportResult; +import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; +import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; +import org.sufficientlysecure.keychain.operations.results.SignEncryptResult; +import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; +import org.sufficientlysecure.keychain.pgp.Progressable; +import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; +import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; +import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException; +import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; +import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; +import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.ParcelableFileCache; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import de.measite.minidns.Client; +import de.measite.minidns.DNSMessage; +import de.measite.minidns.Question; +import de.measite.minidns.Record; +import de.measite.minidns.record.Data; +import de.measite.minidns.record.TXT; + +/** + * This Service contains all important long lasting operations for OpenKeychain. It receives Intents with + * data from the activities or other apps, executes them, and stops itself after doing them. + */ +public class KeychainService extends Service implements Progressable { + + /* extras that can be given by intent */ + public static final String EXTRA_MESSENGER = "messenger"; + public static final String EXTRA_DATA = "data"; + + /* possible actions */ + public static final String ACTION_SIGN_ENCRYPT = Constants.INTENT_PREFIX + "SIGN_ENCRYPT"; + + public static final String ACTION_DECRYPT_VERIFY = Constants.INTENT_PREFIX + "DECRYPT_VERIFY"; + + public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF"; + + public static final String ACTION_DECRYPT_METADATA = Constants.INTENT_PREFIX + "DECRYPT_METADATA"; + + public static final String ACTION_EDIT_KEYRING = Constants.INTENT_PREFIX + "EDIT_KEYRING"; + + public static final String ACTION_PROMOTE_KEYRING = Constants.INTENT_PREFIX + "PROMOTE_KEYRING"; + + public static final String ACTION_IMPORT_KEYRING = Constants.INTENT_PREFIX + "IMPORT_KEYRING"; + public static final String ACTION_EXPORT_KEYRING = Constants.INTENT_PREFIX + "EXPORT_KEYRING"; + + public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING"; + + public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING"; + + public static final String ACTION_DELETE = Constants.INTENT_PREFIX + "DELETE"; + + public static final String ACTION_CONSOLIDATE = Constants.INTENT_PREFIX + "CONSOLIDATE"; + + public static final String ACTION_CANCEL = Constants.INTENT_PREFIX + "CANCEL"; + + /* keys for data bundle */ + + // encrypt + public static final String ENCRYPT_DECRYPT_INPUT_URI = "input_uri"; + public static final String ENCRYPT_DECRYPT_OUTPUT_URI = "output_uri"; + public static final String SIGN_ENCRYPT_PARCEL = "sign_encrypt_parcel"; + + // decrypt/verify + public static final String DECRYPT_VERIFY_PARCEL = "decrypt_verify_parcel"; + + // keybase proof + public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint"; + public static final String KEYBASE_PROOF = "keybase_proof"; + + // save keyring + public static final String EDIT_KEYRING_PARCEL = "save_parcel"; + public static final String EDIT_KEYRING_PASSPHRASE = "passphrase"; + public static final String EXTRA_CRYPTO_INPUT = "crypto_input"; + + // delete keyring(s) + public static final String DELETE_KEY_LIST = "delete_list"; + public static final String DELETE_IS_SECRET = "delete_is_secret"; + + // import key + public static final String IMPORT_KEY_LIST = "import_key_list"; + public static final String IMPORT_KEY_SERVER = "import_key_server"; + + // export key + public static final String EXPORT_FILENAME = "export_filename"; + public static final String EXPORT_URI = "export_uri"; + public static final String EXPORT_SECRET = "export_secret"; + public static final String EXPORT_ALL = "export_all"; + public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id"; + + // upload key + public static final String UPLOAD_KEY_SERVER = "upload_key_server"; + + // certify key + public static final String CERTIFY_PARCEL = "certify_parcel"; + + // promote key + public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id"; + public static final String PROMOTE_CARD_AID = "promote_card_aid"; + public static final String PROMOTE_SUBKEY_IDS = "promote_fingerprints"; + + // consolidate + public static final String CONSOLIDATE_RECOVERY = "consolidate_recovery"; + + Messenger mMessenger; + + // this attribute can possibly merged with the one above? not sure... + private AtomicBoolean mActionCanceled = new AtomicBoolean(false); + + + private KeyImportAccumulator mKeyImportAccumulator; + + private KeychainService mKeychainService; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + /** + * This is run on the main thread, we need to spawn a runnable which runs on another thread for the actual operation + */ + @Override + public int onStartCommand(final Intent intent, int flags, int startId) { + mKeychainService = this; + + if (ACTION_CANCEL.equals(intent.getAction())) { + mActionCanceled.set(true); + return START_NOT_STICKY; + } + + Runnable actionRunnable = new Runnable(){@Override public void run() { + // We have not been cancelled! (yet) + mActionCanceled.set(false); + + Bundle extras = intent.getExtras(); + if (extras == null) { + Log.e(Constants.TAG, "Extras bundle is null!"); + return; + } + + if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent + .getAction() == null))) { + Log.e(Constants.TAG, + "Extra bundle must contain a messenger, a data bundle, and an action!"); + return; + } + + Uri dataUri = intent.getData(); + + mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); + Bundle data = extras.getBundle(EXTRA_DATA); + if (data == null) { + Log.e(Constants.TAG, "data extra is null!"); + return; + } + + Log.logDebugBundle(data, "EXTRA_DATA"); + + ProviderHelper providerHelper = new ProviderHelper(mKeychainService); + + String action = intent.getAction(); + + // executeServiceMethod action from extra bundle + switch (action) { + case ACTION_CERTIFY_KEYRING: { + + // Input + CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + String keyServerUri = data.getString(UPLOAD_KEY_SERVER); + + // Operation + CertifyOperation op = new CertifyOperation(mKeychainService, providerHelper, mKeychainService, + mActionCanceled); + CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_CONSOLIDATE: { + + // Operation + ConsolidateResult result; + if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { + result = providerHelper.consolidateDatabaseStep2(mKeychainService); + } else { + result = providerHelper.consolidateDatabaseStep1(mKeychainService); + } + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_DECRYPT_METADATA: { + + /* Input */ + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); + + // this action is here for compatibility only + input.setDecryptMetadataOnly(true); + + /* Operation */ + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); + DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); + + /* Result */ + sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); + + break; + } + case ACTION_VERIFY_KEYBASE_PROOF: { + + try { + Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF))); + setProgress(R.string.keybase_message_fetching_data, 0, 100); + + Prover prover = Prover.findProverFor(proof); + + if (prover == null) { + sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof + .getPrettyName()); + return; + } + + if (!prover.fetchProofData()) { + sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence)); + return; + } + String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT); + if (!prover.checkFingerprint(requiredFingerprint)) { + sendProofError(getString(R.string.keybase_key_mismatch)); + return; + } + + String domain = prover.dnsTxtCheckRequired(); + if (domain != null) { + DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); + if (dnsQuery == null) { + sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure)); + return; + } + Record[] records = dnsQuery.getAnswers(); + List> extents = new ArrayList>(); + for (Record r : records) { + Data d = r.getPayload(); + if (d instanceof TXT) { + extents.add(((TXT) d).getExtents()); + } + } + if (!prover.checkDnsTxt(extents)) { + sendProofError(prover.getLog(), null); + return; + } + } + + byte[] messageBytes = prover.getPgpMessage().getBytes(); + if (prover.rawMessageCheckRequired()) { + InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream + (messageBytes)); + if (!prover.checkRawMessageBytes(messageByteStream)) { + sendProofError(prover.getLog(), null); + return; + } + } + + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); + + PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) + .setSignedLiteralData(true) + .setRequiredSignerFingerprint(requiredFingerprint); + + DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel()); + + if (!decryptVerifyResult.success()) { + OperationLog log = decryptVerifyResult.getLog(); + OperationResult.LogEntryParcel lastEntry = null; + for (OperationResult.LogEntryParcel entry : log) { + lastEntry = entry; + } + sendProofError(getString(lastEntry.mType.getMsgId())); + return; + } + + if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { + sendProofError(getString(R.string.keybase_message_payload_mismatch)); + return; + } + + Bundle resultData = new Bundle(); + resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK"); + + // these help the handler construct a useful human-readable message + resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); + resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); + resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover + .getPresenceLabel()); + sendMessageToHandler(MessageStatus.OKAY, resultData); + } catch (Exception e) { + sendErrorToHandler(e); + } + + break; + } + case ACTION_DECRYPT_VERIFY: { + + /* Input */ + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); + + // for compatibility + // TODO merge with ACTION_DECRYPT_METADATA + input.setDecryptMetadataOnly(false); + + /* Operation */ + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); + DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); + + /* Output */ + sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); + + break; + } + case ACTION_DELETE: { + + // Input + long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); + boolean isSecret = data.getBoolean(DELETE_IS_SECRET); + + // Operation + DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService); + DeleteResult result = op.execute(masterKeyIds, isSecret); + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_EDIT_KEYRING: { + + // Input + SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + + // Operation + EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper, + mKeychainService, mActionCanceled); + OperationResult result = op.execute(saveParcel, cryptoInput); + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_PROMOTE_KEYRING: { + + // Input + long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID); + byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID); + long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS); + + // Operation + PromoteKeyOperation op = new PromoteKeyOperation( + mKeychainService, providerHelper, mKeychainService, + mActionCanceled); + PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_EXPORT_KEYRING: { + + // Input + boolean exportSecret = data.getBoolean(EXPORT_SECRET, false); + String outputFile = data.getString(EXPORT_FILENAME); + Uri outputUri = data.getParcelable(EXPORT_URI); + + boolean exportAll = data.getBoolean(EXPORT_ALL); + long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); + + // Operation + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, providerHelper, mKeychainService); + ExportResult result; + if (outputFile != null) { + result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); + } else { + result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri); + } + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_IMPORT_KEYRING: { + + // Input + String keyServer = data.getString(IMPORT_KEY_SERVER); + ArrayList keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); + + // either keyList or cache must be null, no guarantees otherwise + if (keyList == null) {// import from file, do serially + serialKeyImport(null, keyServer, providerHelper); + } else { + // if there is more than one key with the same fingerprint, we do a serial import to prevent + // https://github.com/open-keychain/open-keychain/issues/1221 + HashSet keyFingerprintSet = new HashSet<>(); + for (int i = 0; i < keyList.size(); i++) { + keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint); + } + if (keyFingerprintSet.size() == keyList.size()) { + // all keys have unique fingerprints + multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer); + } else { + serialKeyImport(keyList, keyServer, providerHelper); + } + } + + break; + } + case ACTION_SIGN_ENCRYPT: { + + // Input + SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + + // Operation + SignEncryptOperation op = new SignEncryptOperation( + mKeychainService, providerHelper, mKeychainService, mActionCanceled); + SignEncryptResult result = op.execute(inputParcel, cryptoInput); + + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + break; + } + case ACTION_UPLOAD_KEYRING: { + try { + + /* Input */ + String keyServer = data.getString(UPLOAD_KEY_SERVER); + // and dataUri! + + /* Operation */ + HkpKeyserver server = new HkpKeyserver(keyServer); + + CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); + ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService, + providerHelper, mKeychainService); + + try { + importExportOperation.uploadKeyRingToServer(server, keyring); + } catch (Keyserver.AddKeyException e) { + throw new PgpGeneralException("Unable to export key to selected server"); + } + + sendMessageToHandler(MessageStatus.OKAY); + } catch (Exception e) { + sendErrorToHandler(e); + } + break; + } + } + if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) { + // import keyring handles stopping service on its own + stopSelf(); + } }}; + Thread actionThread = new Thread(actionRunnable); + actionThread.start(); + return START_NOT_STICKY; + } + + private void sendProofError(List log, String label) { + String msg = null; + label = (label == null) ? "" : label + ": "; + for (String m : log) { + Log.e(Constants.TAG, label + m); + msg = m; + } + sendProofError(label + msg); + } + + private void sendProofError(String msg) { + Bundle bundle = new Bundle(); + bundle.putString(ServiceProgressHandler.DATA_ERROR, msg); + sendMessageToHandler(MessageStatus.OKAY, bundle); + } + + private void sendErrorToHandler(Exception e) { + // TODO: Implement a better exception handling here + // contextualize the exception, if necessary + String message; + if (e instanceof PgpGeneralMsgIdException) { + e = ((PgpGeneralMsgIdException) e).getContextualized(mKeychainService); + message = e.getMessage(); + } else { + message = e.getMessage(); + } + Log.d(Constants.TAG, "KeychainService Exception: ", e); + + Bundle data = new Bundle(); + data.putString(ServiceProgressHandler.DATA_ERROR, message); + sendMessageToHandler(MessageStatus.EXCEPTION, null, data); + } + + private void sendMessageToHandler(MessageStatus status, Integer arg2, Bundle data) { + + Message msg = Message.obtain(); + assert msg != null; + msg.arg1 = status.ordinal(); + if (arg2 != null) { + msg.arg2 = arg2; + } + if (data != null) { + msg.setData(data); + } + + try { + mMessenger.send(msg); + } catch (RemoteException e) { + Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); + } catch (NullPointerException e) { + Log.w(Constants.TAG, "Messenger is null!", e); + } + } + + private void sendMessageToHandler(MessageStatus status, OperationResult data) { + Bundle bundle = new Bundle(); + bundle.putParcelable(OperationResult.EXTRA_RESULT, data); + sendMessageToHandler(status, null, bundle); + } + + private void sendMessageToHandler(MessageStatus status, Bundle data) { + sendMessageToHandler(status, null, data); + } + + private void sendMessageToHandler(MessageStatus status) { + sendMessageToHandler(status, null, null); + } + + /** + * Set progress of ProgressDialog by sending message to handler on UI thread + */ + @Override + public void setProgress(String message, int progress, int max) { + Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max=" + + max); + + Bundle data = new Bundle(); + if (message != null) { + data.putString(ServiceProgressHandler.DATA_MESSAGE, message); + } + data.putInt(ServiceProgressHandler.DATA_PROGRESS, progress); + data.putInt(ServiceProgressHandler.DATA_PROGRESS_MAX, max); + + sendMessageToHandler(MessageStatus.UPDATE_PROGRESS, null, data); + } + + @Override + public void setProgress(int resourceId, int progress, int max) { + setProgress(getString(resourceId), progress, max); + } + + @Override + public void setProgress(int progress, int max) { + setProgress(null, progress, max); + } + + @Override + public void setPreventCancel() { + sendMessageToHandler(MessageStatus.PREVENT_CANCEL); + } + + public void serialKeyImport(ArrayList keyList, final String keyServer, + ProviderHelper providerHelper) { + Log.d(Constants.TAG, "serial key import starting"); + ParcelableFileCache cache = + new ParcelableFileCache<>(mKeychainService, "key_import.pcl"); + + // Operation + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, providerHelper, mKeychainService, + mActionCanceled); + // Either list or cache must be null, no guarantees otherwise. + ImportKeyResult result = keyList != null + ? importExportOperation.importKeyRings(keyList, keyServer) + : importExportOperation.importKeyRings(cache, keyServer); + + ContactSyncAdapterService.requestSync(); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); + + stopSelf(); + } + + public void multiThreadedKeyImport(Iterator keyListIterator, int totKeys, final String + keyServer) { + Log.d(Constants.TAG, "Multi-threaded key import starting"); + if (keyListIterator != null) { + mKeyImportAccumulator = new KeyImportAccumulator(totKeys, mKeychainService); + setProgress(0, totKeys); + + final int maxThreads = 200; + ExecutorService importExecutor = new ThreadPoolExecutor(0, maxThreads, + 30L, TimeUnit.SECONDS, + new SynchronousQueue()); + + while (keyListIterator.hasNext()) { + + final ParcelableKeyRing pkRing = keyListIterator.next(); + + Runnable importOperationRunnable = new Runnable() { + + @Override + public void run() { + ImportKeyResult result = null; + try { + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, + new ProviderHelper(mKeychainService), + mKeyImportAccumulator.getImportProgressable(), + mActionCanceled); + + ArrayList list = new ArrayList<>(); + list.add(pkRing); + + result = importExportOperation.importKeyRings(list, + keyServer); + } finally { + // in the off-chance that importKeyRings does something to crash the + // thread before it can call singleKeyRingImportCompleted, our imported + // key count will go wrong. This will cause the service to never die, + // and the progress dialog to stay displayed. The finally block was + // originally meant to ensure singleKeyRingImportCompleted was called, + // and checks for null were to be introduced, but in such a scenario, + // knowing an uncaught error exists in importKeyRings is more important. + + // if a null gets passed, something wrong is happening. We want a crash. + + mKeyImportAccumulator.singleKeyRingImportCompleted(result); + } + } + }; + + importExecutor.execute(importOperationRunnable); + } + } + } + + /** + * Used to accumulate the results of individual key imports + */ + private class KeyImportAccumulator { + private OperationResult.OperationLog mImportLog = new OperationResult.OperationLog(); + private int mTotalKeys; + private int mImportedKeys = 0; + private Progressable mInternalProgressable; + ArrayList mImportedMasterKeyIds = new ArrayList(); + private int mBadKeys = 0; + private int mNewKeys = 0; + private int mUpdatedKeys = 0; + private int mSecret = 0; + private int mResultType = 0; + + /** + * meant to be used with a service due to stopSelf() in singleKeyRingImportCompleted. Remove this if + * generalising. + * + * @param totalKeys total number of keys to be imported + * @param externalProgressable the external progressable to be updated every time a key is imported + */ + public KeyImportAccumulator(int totalKeys, Progressable externalProgressable) { + mTotalKeys = totalKeys; + // ignore updates from ImportExportOperation for now + mInternalProgressable = new Progressable() { + @Override + public void setProgress(String message, int current, int total) { + + } + + @Override + public void setProgress(int resourceId, int current, int total) { + + } + + @Override + public void setProgress(int current, int total) { + + } + + @Override + public void setPreventCancel() { + + } + }; + } + + private synchronized void singleKeyRingImportCompleted(ImportKeyResult result) { + // increase imported key count and accumulate log and bad, new etc. key counts from result + mKeyImportAccumulator.accumulateKeyImport(result); + + setProgress(mKeyImportAccumulator.getImportedKeys(), mKeyImportAccumulator.getTotalKeys()); + + if (mKeyImportAccumulator.isImportFinished()) { + ContactSyncAdapterService.requestSync(); + + sendMessageToHandler(ServiceProgressHandler.MessageStatus.OKAY, + mKeyImportAccumulator.getConsolidatedImportKeyResult()); + + stopSelf();//we're done here + } + } + + public Progressable getImportProgressable() { + return mInternalProgressable; + } + + public int getTotalKeys() { + return mTotalKeys; + } + + public int getImportedKeys() { + return mImportedKeys; + } + + public synchronized void accumulateKeyImport(ImportKeyResult result) { + mImportedKeys++; + mImportLog.addAll(result.getLog().toList());//accumulates log + mBadKeys += result.mBadKeys; + mNewKeys += result.mNewKeys; + mUpdatedKeys += result.mUpdatedKeys; + mSecret += result.mSecret; + + long[] masterKeyIds = result.getImportedMasterKeyIds(); + for (long masterKeyId : masterKeyIds) { + mImportedMasterKeyIds.add(masterKeyId); + } + + // if any key import has been cancelled, set result type to cancelled + // resultType is added to in getConsolidatedKayImport to account for remaining factors + mResultType |= result.getResult() & ImportKeyResult.RESULT_CANCELLED; + } + + /** + * returns accumulated result of all imports so far + */ + public ImportKeyResult getConsolidatedImportKeyResult() { + + // adding required information to mResultType + // special case,no keys requested for import + if (mBadKeys == 0 && mNewKeys == 0 && mUpdatedKeys == 0) { + mResultType = ImportKeyResult.RESULT_FAIL_NOTHING; + } else { + if (mNewKeys > 0) { + mResultType |= ImportKeyResult.RESULT_OK_NEWKEYS; + } + if (mUpdatedKeys > 0) { + mResultType |= ImportKeyResult.RESULT_OK_UPDATED; + } + if (mBadKeys > 0) { + mResultType |= ImportKeyResult.RESULT_WITH_ERRORS; + if (mNewKeys == 0 && mUpdatedKeys == 0) { + mResultType |= ImportKeyResult.RESULT_ERROR; + } + } + if (mImportLog.containsWarnings()) { + mResultType |= ImportKeyResult.RESULT_WARNINGS; + } + } + + long masterKeyIds[] = new long[mImportedMasterKeyIds.size()]; + for (int i = 0; i < masterKeyIds.length; i++) { + masterKeyIds[i] = mImportedMasterKeyIds.get(i); + } + + return new ImportKeyResult(mResultType, mImportLog, mNewKeys, mUpdatedKeys, mBadKeys, + mSecret, masterKeyIds); + } + + public boolean isImportFinished() { + return mTotalKeys == mImportedKeys; + } + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java index 3631f257a..6afe2256b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java @@ -52,12 +52,11 @@ import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.CertifyActionsParcel; import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.adapter.MultiUserIdsAdapter; import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.widget.CertifyKeySpinner; import org.sufficientlysecure.keychain.util.Log; @@ -104,7 +103,7 @@ public class CertifyKeyFragment extends CachingCryptoOperationFragment checkedStates; @@ -330,25 +329,25 @@ public class CertifyKeyFragment extends CachingCryptoOperationFragment keyList = new ArrayList<>(); keyList.add(new ParcelableKeyRing(mNfcFingerprint, null, null)); - data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyList); + data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyList); { Preferences prefs = Preferences.getPreferences(getActivity()); Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); - data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); + data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); } - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java index 755d8b6a8..b2d9596fd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java @@ -37,7 +37,7 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; @@ -180,12 +180,12 @@ public class DecryptFilesFragment extends DecryptFragment { } private void startDecrypt() { - mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_VERIFY; + mCurrentCryptoOperation = KeychainService.ACTION_DECRYPT_VERIFY; cryptoOperation(new CryptoInputParcel()); } private void startDecryptFilenames() { - mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_METADATA; + mCurrentCryptoOperation = KeychainService.ACTION_DECRYPT_METADATA; cryptoOperation(new CryptoInputParcel()); } @@ -193,7 +193,7 @@ public class DecryptFilesFragment extends DecryptFragment { @SuppressLint("HandlerLeak") protected void cryptoOperation(CryptoInputParcel cryptoInput) { // Send all information needed to service to decrypt in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); + Intent intent = new Intent(getActivity(), KeychainService.class); // fill values for this action Bundle data = new Bundle(); @@ -207,12 +207,12 @@ public class DecryptFilesFragment extends DecryptFragment { PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(mInputUri, mOutputUri) .setAllowSymmetricDecryption(true); - data.putParcelable(KeychainIntentService.DECRYPT_VERIFY_PARCEL, input); - data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); + data.putParcelable(KeychainService.DECRYPT_VERIFY_PARCEL, input); + data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); - // Message is received after decrypting is done in KeychainIntentService + // Message is received after decrypting is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler( getActivity(), getString(R.string.progress_decrypting), @@ -237,11 +237,11 @@ public class DecryptFilesFragment extends DecryptFragment { if (pgpResult.success()) { switch (mCurrentCryptoOperation) { - case KeychainIntentService.ACTION_DECRYPT_METADATA: { + case KeychainService.ACTION_DECRYPT_METADATA: { askForOutputFilename(pgpResult.getDecryptMetadata().getFilename()); break; } - case KeychainIntentService.ACTION_DECRYPT_VERIFY: { + case KeychainService.ACTION_DECRYPT_VERIFY: { // display signature result in activity loadVerifyResult(pgpResult); @@ -276,7 +276,7 @@ public class DecryptFilesFragment extends DecryptFragment { // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index 0dd14a4be..3d87ce894 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -47,7 +47,7 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; @@ -130,7 +130,7 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements private void lookupUnknownKey(long unknownKeyId) { - // Message is received after importing is done in KeychainIntentService + // Message is received after importing is done in KeychainService ServiceProgressHandler serviceHandler = new ServiceProgressHandler(getActivity()) { @Override public void handleMessage(Message message) { @@ -163,7 +163,7 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements Preferences prefs = Preferences.getPreferences(getActivity()); Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); - data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); + data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); } { @@ -172,17 +172,17 @@ public abstract class DecryptFragment extends CryptoOperationFragment implements ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); - data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, selectedEntries); + data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, selectedEntries); } // Send all information needed to service to query keys in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); - intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + Intent intent = new Intent(getActivity(), KeychainService.class); + intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); getActivity().startService(intent); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java index a225bd912..b7ea90a36 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java @@ -35,7 +35,7 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.util.Notify; @@ -160,20 +160,20 @@ public class DecryptTextFragment extends DecryptFragment { @Override protected void cryptoOperation(CryptoInputParcel cryptoInput) { // Send all information needed to service to decrypt in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); + Intent intent = new Intent(getActivity(), KeychainService.class); // fill values for this action Bundle data = new Bundle(); - intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY); + intent.setAction(KeychainService.ACTION_DECRYPT_VERIFY); PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(mCiphertext.getBytes()); - data.putParcelable(KeychainIntentService.DECRYPT_VERIFY_PARCEL, input); - data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); + data.putParcelable(KeychainService.DECRYPT_VERIFY_PARCEL, input); + data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); - // Message is received after encrypting is done in KeychainIntentService + // Message is received after encrypting is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler( getActivity(), getString(R.string.progress_decrypting), @@ -222,7 +222,7 @@ public class DecryptTextFragment extends DecryptFragment { // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index dd270262b..63fb8413b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -50,7 +50,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel; @@ -641,18 +641,18 @@ public class EditKeyFragment extends CryptoOperationFragment implements }; // Send all information needed to service to import key in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); - intent.setAction(KeychainIntentService.ACTION_EDIT_KEYRING); + Intent intent = new Intent(getActivity(), KeychainService.class); + intent.setAction(KeychainService.ACTION_EDIT_KEYRING); // fill values for this action Bundle data = new Bundle(); - data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); - data.putParcelable(KeychainIntentService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + data.putParcelable(KeychainService.EXTRA_CRYPTO_INPUT, cryptoInput); + data.putParcelable(KeychainService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index 1800dd8a1..143450e32 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -49,7 +49,7 @@ import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.pgp.PgpConstants; import org.sufficientlysecure.keychain.pgp.SignEncryptParcel; import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.ui.adapter.SpacesItemDecoration; @@ -504,15 +504,15 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment(this, "key_import.pcl"); cache.writeCache(selectedEntries); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(this); @@ -447,7 +447,7 @@ public class ImportKeysActivity extends BaseNfcActivity { } else if (ls instanceof ImportKeysListFragment.CloudLoaderState) { ImportKeysListFragment.CloudLoaderState sls = (ImportKeysListFragment.CloudLoaderState) ls; - data.putString(KeychainIntentService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver); + data.putString(KeychainService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver); // get selected key entries ArrayList keys = new ArrayList<>(); @@ -460,13 +460,13 @@ public class ImportKeysActivity extends BaseNfcActivity { ); } } - data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keys); + data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keys); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java index 634df92f2..42efbf0f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java @@ -43,7 +43,7 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; import org.sufficientlysecure.keychain.operations.results.SingletonResult; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4; import org.sufficientlysecure.keychain.util.Log; @@ -205,7 +205,7 @@ public class ImportKeysProxyActivity extends FragmentActivity { private void startImportService(ArrayList keyRings) { - // Message is received after importing is done in KeychainIntentService + // Message is received after importing is done in KeychainService ServiceProgressHandler serviceHandler = new ServiceProgressHandler( this, getString(R.string.progress_importing), @@ -258,19 +258,19 @@ public class ImportKeysProxyActivity extends FragmentActivity { Preferences prefs = Preferences.getPreferences(this); Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); - data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); + data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); } - data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyRings); + data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyRings); // Send all information needed to service to query keys in other thread - Intent intent = new Intent(this, KeychainIntentService.class); - intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + Intent intent = new Intent(this, KeychainService.class); + intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index 2f405aa20..ddc527847 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -64,7 +64,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainDatabase; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment; @@ -602,8 +602,8 @@ public class KeyListFragment extends LoaderFragment }; // Send all information needed to service to query keys in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); - intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); + Intent intent = new Intent(getActivity(), KeychainService.class); + intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); // fill values for this action Bundle data = new Bundle(); @@ -613,16 +613,16 @@ public class KeyListFragment extends LoaderFragment Preferences prefs = Preferences.getPreferences(getActivity()); Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); - data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); + data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); } - data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyList); + data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keyList); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(getActivity()); @@ -632,7 +632,7 @@ public class KeyListFragment extends LoaderFragment } private void consolidate() { - // Message is received after importing is done in KeychainIntentService + // Message is received after importing is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler( getActivity(), getString(R.string.progress_importing), @@ -661,18 +661,18 @@ public class KeyListFragment extends LoaderFragment }; // Send all information needed to service to import key in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); + Intent intent = new Intent(getActivity(), KeychainService.class); - intent.setAction(KeychainIntentService.ACTION_CONSOLIDATE); + intent.setAction(KeychainService.ACTION_CONSOLIDATE); // fill values for this action Bundle data = new Bundle(); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java index bdebf2d75..273acc23d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java @@ -38,7 +38,7 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.ui.base.BaseActivity; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.ui.util.Notify; @@ -123,7 +123,7 @@ public class SafeSlingerActivity extends BaseActivity { final FragmentActivity activity = SafeSlingerActivity.this; - // Message is received after importing is done in KeychainIntentService + // Message is received after importing is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler( activity, getString(R.string.progress_importing), @@ -176,9 +176,9 @@ public class SafeSlingerActivity extends BaseActivity { Log.d(Constants.TAG, "importKeys started"); // Send all information needed to service to import key in other thread - Intent intent = new Intent(activity, KeychainIntentService.class); + Intent intent = new Intent(activity, KeychainService.class); - intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); + intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); // instead of giving the entries by Intent extra, cache them into a // file to prevent Java Binder problems on heavy imports @@ -195,11 +195,11 @@ public class SafeSlingerActivity extends BaseActivity { // fill values for this action Bundle bundle = new Bundle(); - intent.putExtra(KeychainIntentService.EXTRA_DATA, bundle); + intent.putExtra(KeychainService.EXTRA_DATA, bundle); // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(activity); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java index 7426cf149..2a195a4da 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java @@ -35,7 +35,7 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.ui.base.BaseActivity; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.util.Log; @@ -91,9 +91,9 @@ public class UploadKeyActivity extends BaseActivity { private void uploadKey() { // Send all information needed to service to upload key in other thread - Intent intent = new Intent(this, KeychainIntentService.class); + Intent intent = new Intent(this, KeychainService.class); - intent.setAction(KeychainIntentService.ACTION_UPLOAD_KEYRING); + intent.setAction(KeychainService.ACTION_UPLOAD_KEYRING); // set data uri as path to keyring Uri blobUri = KeyRings.buildUnifiedKeyRingUri(mDataUri); @@ -103,11 +103,11 @@ public class UploadKeyActivity extends BaseActivity { Bundle data = new Bundle(); String server = (String) mKeyServerSpinner.getSelectedItem(); - data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, server); + data.putString(KeychainService.UPLOAD_KEY_SERVER, server); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); - // Message is received after uploading is done in KeychainIntentService + // Message is received after uploading is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler( this, getString(R.string.progress_uploading), @@ -129,7 +129,7 @@ public class UploadKeyActivity extends BaseActivity { // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index b2f1f4bee..995b07720 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -65,7 +65,7 @@ import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.ServiceProgressHandler.MessageStatus; import org.sufficientlysecure.keychain.service.PassphraseCacheService; @@ -402,7 +402,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements } private void startCertifyIntent(Intent intent) { - // Message is received after signing is done in KeychainIntentService + // Message is received after signing is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler(this) { @Override public void handleMessage(Message message) { @@ -419,7 +419,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements }; // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); startActivityForResult(intent, 0); } @@ -652,7 +652,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements ArrayList entries = new ArrayList<>(); entries.add(keyEntry); - // Message is received after importing is done in KeychainIntentService + // Message is received after importing is done in KeychainService ServiceProgressHandler serviceHandler = new ServiceProgressHandler(this) { @Override public void handleMessage(Message message) { @@ -684,19 +684,19 @@ public class ViewKeyActivity extends BaseNfcActivity implements Preferences prefs = Preferences.getPreferences(this); Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver()); - data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); + data.putString(KeychainService.IMPORT_KEY_SERVER, cloudPrefs.keyserver); } - data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, entries); + data.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, entries); // Send all information needed to service to query keys in other thread - Intent intent = new Intent(this, KeychainIntentService.class); - intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + Intent intent = new Intent(this, KeychainService.class); + intent.setAction(KeychainService.ACTION_IMPORT_KEYRING); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog serviceHandler.showProgressDialog(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java index 5cb7aef06..1f5c540ba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java @@ -49,7 +49,7 @@ import com.textuality.keybase.lib.User; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Log; @@ -349,13 +349,13 @@ public class ViewKeyTrustFragment extends LoaderFragment implements } private void verify(final Proof proof, final String fingerprint) { - Intent intent = new Intent(getActivity(), KeychainIntentService.class); + Intent intent = new Intent(getActivity(), KeychainService.class); Bundle data = new Bundle(); - intent.setAction(KeychainIntentService.ACTION_VERIFY_KEYBASE_PROOF); + intent.setAction(KeychainService.ACTION_VERIFY_KEYBASE_PROOF); - data.putString(KeychainIntentService.KEYBASE_PROOF, proof.toString()); - data.putString(KeychainIntentService.KEYBASE_REQUIRED_FINGERPRINT, fingerprint); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + data.putString(KeychainService.KEYBASE_PROOF, proof.toString()); + data.putString(KeychainService.KEYBASE_REQUIRED_FINGERPRINT, fingerprint); + intent.putExtra(KeychainService.EXTRA_DATA, data); mProofVerifyDetail.setVisibility(View.GONE); @@ -451,7 +451,7 @@ public class ViewKeyTrustFragment extends LoaderFragment implements // Create a new Messenger for the communication back Messenger messenger = new Messenger(handler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog handler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java index 125e24e09..ab25341d3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java @@ -43,7 +43,7 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; @@ -148,25 +148,25 @@ public class ViewKeyYubiKeyFragment extends Fragment }; // Send all information needed to service to decrypt in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); + Intent intent = new Intent(getActivity(), KeychainService.class); // fill values for this action - intent.setAction(KeychainIntentService.ACTION_PROMOTE_KEYRING); + intent.setAction(KeychainService.ACTION_PROMOTE_KEYRING); Bundle data = new Bundle(); - data.putLong(KeychainIntentService.PROMOTE_MASTER_KEY_ID, mMasterKeyId); - data.putByteArray(KeychainIntentService.PROMOTE_CARD_AID, mCardAid); + data.putLong(KeychainService.PROMOTE_MASTER_KEY_ID, mMasterKeyId); + data.putByteArray(KeychainService.PROMOTE_CARD_AID, mCardAid); long[] subKeyIds = new long[mFingerprints.length]; for (int i = 0; i < subKeyIds.length; i++) { subKeyIds[i] = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[i]); } - data.putLongArray(KeychainIntentService.PROMOTE_SUBKEY_IDS, subKeyIds); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + data.putLongArray(KeychainService.PROMOTE_SUBKEY_IDS, subKeyIds); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // start service with intent getActivity().startService(intent); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java index 4781864dd..af919f3b6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java @@ -109,7 +109,7 @@ public class ImportKeysListCloudLoader ImportKeysListEntry uniqueEntry = searchResult.get(0); /* * set fingerprint explicitly after query - * to enforce a check when the key is imported by KeychainIntentService + * to enforce a check when the key is imported by KeychainService */ uniqueEntry.setFingerprintHex(fingerprint); uniqueEntry.setSelected(true); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java index 960b3f970..58dce50a7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java @@ -36,7 +36,7 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.util.Log; @@ -130,11 +130,11 @@ public class DeleteKeyDialogFragment extends DialogFragment { public void onClick(DialogInterface dialog, int which) { // Send all information needed to service to import key in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); + Intent intent = new Intent(getActivity(), KeychainService.class); - intent.setAction(KeychainIntentService.ACTION_DELETE); + intent.setAction(KeychainService.ACTION_DELETE); - // Message is received after importing is done in KeychainIntentService + // Message is received after importing is done in KeychainService ServiceProgressHandler saveHandler = new ServiceProgressHandler( getActivity(), getString(R.string.progress_deleting), @@ -159,13 +159,13 @@ public class DeleteKeyDialogFragment extends DialogFragment { // fill values for this action Bundle data = new Bundle(); - data.putLongArray(KeychainIntentService.DELETE_KEY_LIST, masterKeyIds); - data.putBoolean(KeychainIntentService.DELETE_IS_SECRET, hasSecret); - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + data.putLongArray(KeychainService.DELETE_KEY_LIST, masterKeyIds); + data.putBoolean(KeychainService.DELETE_IS_SECRET, hasSecret); + intent.putExtra(KeychainService.EXTRA_DATA, data); // Create a new Messenger for the communication back Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog saveHandler.showProgressDialog(getActivity()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 6dfa77d3f..130d22b37 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -34,7 +34,7 @@ import android.view.View.OnClickListener; import android.widget.Button; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; /** * meant to be used @@ -178,11 +178,11 @@ public class ProgressDialogFragment extends DialogFragment { negative.setTextColor(Color.GRAY); // send a cancel message. note that this message will be handled by - // KeychainIntentService.onStartCommand, which runs in this thread, + // KeychainService.onStartCommand, which runs in this thread, // not the service one, and will not queue up a command. - Intent serviceIntent = new Intent(getActivity(), KeychainIntentService.class); + Intent serviceIntent = new Intent(getActivity(), KeychainService.class); - serviceIntent.setAction(KeychainIntentService.ACTION_CANCEL); + serviceIntent.setAction(KeychainService.ACTION_CANCEL); getActivity().startService(serviceIntent); // Set the progress bar accordingly diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java index 8334b37ec..bbc08a2aa 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java @@ -26,7 +26,7 @@ import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; import org.sufficientlysecure.keychain.keyimport.Keyserver; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import java.util.ArrayList; import java.util.HashSet; @@ -79,12 +79,12 @@ public class EmailKeyHelper { } private static void importKeys(Context context, Messenger messenger, ArrayList keys) { - Intent importIntent = new Intent(context, KeychainIntentService.class); - importIntent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); + Intent importIntent = new Intent(context, KeychainService.class); + importIntent.setAction(KeychainService.ACTION_IMPORT_KEYRING); Bundle importData = new Bundle(); - importData.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keys); - importIntent.putExtra(KeychainIntentService.EXTRA_DATA, importData); - importIntent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + importData.putParcelableArrayList(KeychainService.IMPORT_KEY_LIST, keys); + importIntent.putExtra(KeychainService.EXTRA_DATA, importData); + importIntent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); context.startService(importIntent); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java index 96a01a42a..88b0289d4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java @@ -27,7 +27,7 @@ import android.support.v4.app.FragmentActivity; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.ExportResult; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import java.io.File; @@ -78,25 +78,25 @@ public class ExportHelper { Log.d(Constants.TAG, "exportKeys started"); // Send all information needed to service to export key in other thread - final Intent intent = new Intent(mActivity, KeychainIntentService.class); + final Intent intent = new Intent(mActivity, KeychainService.class); - intent.setAction(KeychainIntentService.ACTION_EXPORT_KEYRING); + intent.setAction(KeychainService.ACTION_EXPORT_KEYRING); // fill values for this action Bundle data = new Bundle(); - data.putString(KeychainIntentService.EXPORT_FILENAME, mExportFile.getAbsolutePath()); - data.putBoolean(KeychainIntentService.EXPORT_SECRET, exportSecret); + data.putString(KeychainService.EXPORT_FILENAME, mExportFile.getAbsolutePath()); + data.putBoolean(KeychainService.EXPORT_SECRET, exportSecret); if (masterKeyIds == null) { - data.putBoolean(KeychainIntentService.EXPORT_ALL, true); + data.putBoolean(KeychainService.EXPORT_ALL, true); } else { - data.putLongArray(KeychainIntentService.EXPORT_KEY_RING_MASTER_KEY_ID, masterKeyIds); + data.putLongArray(KeychainService.EXPORT_KEY_RING_MASTER_KEY_ID, masterKeyIds); } - intent.putExtra(KeychainIntentService.EXTRA_DATA, data); + intent.putExtra(KeychainService.EXTRA_DATA, data); - // Message is received after exporting is done in KeychainIntentService + // Message is received after exporting is done in KeychainService ServiceProgressHandler exportHandler = new ServiceProgressHandler(mActivity, mActivity.getString(R.string.progress_exporting), ProgressDialog.STYLE_HORIZONTAL @@ -118,7 +118,7 @@ public class ExportHelper { // Create a new Messenger for the communication back Messenger messenger = new Messenger(exportHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + intent.putExtra(KeychainService.EXTRA_MESSENGER, messenger); // show progress dialog exportHandler.showProgressDialog(mActivity); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java index 3bbd86d6a..8a614d64d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java @@ -51,15 +51,15 @@ public class KeyUpdateHelper { } // Start the service and update the keys - Intent importIntent = new Intent(mContext, KeychainIntentService.class); - importIntent.setAction(KeychainIntentService.ACTION_DOWNLOAD_AND_IMPORT_KEYS); + Intent importIntent = new Intent(mContext, KeychainService.class); + importIntent.setAction(KeychainService.ACTION_DOWNLOAD_AND_IMPORT_KEYS); Bundle importData = new Bundle(); - importData.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, + importData.putParcelableArrayList(KeychainService.DOWNLOAD_KEY_LIST, new ArrayList(keys)); - importIntent.putExtra(KeychainIntentService.EXTRA_SERVICE_INTENT, importData); + importIntent.putExtra(KeychainService.EXTRA_SERVICE_INTENT, importData); - importIntent.putExtra(KeychainIntentService.EXTRA_MESSENGER, new Messenger(mHandler)); + importIntent.putExtra(KeychainService.EXTRA_MESSENGER, new Messenger(mHandler)); mContext.startService(importIntent); } -- cgit v1.2.3 From ebba24cbd82434120f82e02c254351274a4e0efa Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Mon, 1 Jun 2015 17:44:44 +0530 Subject: corrected indentation --- .../keychain/service/KeychainService.java | 549 +++++++++++---------- 1 file changed, 278 insertions(+), 271 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java index 7ce45240a..41b4b3fba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java @@ -196,351 +196,358 @@ public class KeychainService extends Service implements Progressable { return START_NOT_STICKY; } - Runnable actionRunnable = new Runnable(){@Override public void run() { - // We have not been cancelled! (yet) - mActionCanceled.set(false); - - Bundle extras = intent.getExtras(); - if (extras == null) { - Log.e(Constants.TAG, "Extras bundle is null!"); - return; - } + Runnable actionRunnable = new Runnable() { + @Override + public void run() { + // We have not been cancelled! (yet) + mActionCanceled.set(false); + + Bundle extras = intent.getExtras(); + if (extras == null) { + Log.e(Constants.TAG, "Extras bundle is null!"); + return; + } - if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent - .getAction() == null))) { - Log.e(Constants.TAG, - "Extra bundle must contain a messenger, a data bundle, and an action!"); - return; - } + if (!(extras.containsKey(EXTRA_MESSENGER) || extras.containsKey(EXTRA_DATA) || (intent + .getAction() == null))) { + Log.e(Constants.TAG, + "Extra bundle must contain a messenger, a data bundle, and an action!"); + return; + } - Uri dataUri = intent.getData(); + Uri dataUri = intent.getData(); - mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); - Bundle data = extras.getBundle(EXTRA_DATA); - if (data == null) { - Log.e(Constants.TAG, "data extra is null!"); - return; - } + mMessenger = (Messenger) extras.get(EXTRA_MESSENGER); + Bundle data = extras.getBundle(EXTRA_DATA); + if (data == null) { + Log.e(Constants.TAG, "data extra is null!"); + return; + } - Log.logDebugBundle(data, "EXTRA_DATA"); + Log.logDebugBundle(data, "EXTRA_DATA"); - ProviderHelper providerHelper = new ProviderHelper(mKeychainService); + ProviderHelper providerHelper = new ProviderHelper(mKeychainService); - String action = intent.getAction(); + String action = intent.getAction(); - // executeServiceMethod action from extra bundle - switch (action) { - case ACTION_CERTIFY_KEYRING: { + // executeServiceMethod action from extra bundle + switch (action) { + case ACTION_CERTIFY_KEYRING: { - // Input - CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL); - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - String keyServerUri = data.getString(UPLOAD_KEY_SERVER); + // Input + CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + String keyServerUri = data.getString(UPLOAD_KEY_SERVER); - // Operation - CertifyOperation op = new CertifyOperation(mKeychainService, providerHelper, mKeychainService, - mActionCanceled); - CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); + // Operation + CertifyOperation op = new CertifyOperation(mKeychainService, providerHelper, mKeychainService, + mActionCanceled); + CertifyResult result = op.certify(parcel, cryptoInput, keyServerUri); - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_CONSOLIDATE: { - - // Operation - ConsolidateResult result; - if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { - result = providerHelper.consolidateDatabaseStep2(mKeychainService); - } else { - result = providerHelper.consolidateDatabaseStep1(mKeychainService); - } + break; + } + case ACTION_CONSOLIDATE: { + + // Operation + ConsolidateResult result; + if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) { + result = providerHelper.consolidateDatabaseStep2(mKeychainService); + } else { + result = providerHelper.consolidateDatabaseStep1(mKeychainService); + } - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_DECRYPT_METADATA: { + break; + } + case ACTION_DECRYPT_METADATA: { /* Input */ - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); - // this action is here for compatibility only - input.setDecryptMetadataOnly(true); + // this action is here for compatibility only + input.setDecryptMetadataOnly(true); /* Operation */ - PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); - DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); + DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); /* Result */ - sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); + sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); - break; - } - case ACTION_VERIFY_KEYBASE_PROOF: { + break; + } + case ACTION_VERIFY_KEYBASE_PROOF: { - try { - Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF))); - setProgress(R.string.keybase_message_fetching_data, 0, 100); + try { + Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF))); + setProgress(R.string.keybase_message_fetching_data, 0, 100); - Prover prover = Prover.findProverFor(proof); + Prover prover = Prover.findProverFor(proof); - if (prover == null) { - sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof - .getPrettyName()); - return; - } + if (prover == null) { + sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof + .getPrettyName()); + return; + } - if (!prover.fetchProofData()) { - sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence)); - return; - } - String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT); - if (!prover.checkFingerprint(requiredFingerprint)) { - sendProofError(getString(R.string.keybase_key_mismatch)); - return; - } + if (!prover.fetchProofData()) { + sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence)); + return; + } + String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT); + if (!prover.checkFingerprint(requiredFingerprint)) { + sendProofError(getString(R.string.keybase_key_mismatch)); + return; + } - String domain = prover.dnsTxtCheckRequired(); - if (domain != null) { - DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); - if (dnsQuery == null) { - sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure)); - return; - } - Record[] records = dnsQuery.getAnswers(); - List> extents = new ArrayList>(); - for (Record r : records) { - Data d = r.getPayload(); - if (d instanceof TXT) { - extents.add(((TXT) d).getExtents()); + String domain = prover.dnsTxtCheckRequired(); + if (domain != null) { + DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT)); + if (dnsQuery == null) { + sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure)); + return; + } + Record[] records = dnsQuery.getAnswers(); + List> extents = new ArrayList>(); + for (Record r : records) { + Data d = r.getPayload(); + if (d instanceof TXT) { + extents.add(((TXT) d).getExtents()); + } + } + if (!prover.checkDnsTxt(extents)) { + sendProofError(prover.getLog(), null); + return; + } } - } - if (!prover.checkDnsTxt(extents)) { - sendProofError(prover.getLog(), null); - return; - } - } - byte[] messageBytes = prover.getPgpMessage().getBytes(); - if (prover.rawMessageCheckRequired()) { - InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream - (messageBytes)); - if (!prover.checkRawMessageBytes(messageByteStream)) { - sendProofError(prover.getLog(), null); - return; - } - } + byte[] messageBytes = prover.getPgpMessage().getBytes(); + if (prover.rawMessageCheckRequired()) { + InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream + (messageBytes)); + if (!prover.checkRawMessageBytes(messageByteStream)) { + sendProofError(prover.getLog(), null); + return; + } + } - PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, + mKeychainService); - PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) - .setSignedLiteralData(true) - .setRequiredSignerFingerprint(requiredFingerprint); + PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes) + .setSignedLiteralData(true) + .setRequiredSignerFingerprint(requiredFingerprint); - DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel()); + DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel()); - if (!decryptVerifyResult.success()) { - OperationLog log = decryptVerifyResult.getLog(); - OperationResult.LogEntryParcel lastEntry = null; - for (OperationResult.LogEntryParcel entry : log) { - lastEntry = entry; - } - sendProofError(getString(lastEntry.mType.getMsgId())); - return; - } + if (!decryptVerifyResult.success()) { + OperationLog log = decryptVerifyResult.getLog(); + OperationResult.LogEntryParcel lastEntry = null; + for (OperationResult.LogEntryParcel entry : log) { + lastEntry = entry; + } + sendProofError(getString(lastEntry.mType.getMsgId())); + return; + } - if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { - sendProofError(getString(R.string.keybase_message_payload_mismatch)); - return; - } + if (!prover.validate(new String(decryptVerifyResult.getOutputBytes()))) { + sendProofError(getString(R.string.keybase_message_payload_mismatch)); + return; + } - Bundle resultData = new Bundle(); - resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK"); - - // these help the handler construct a useful human-readable message - resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); - resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); - resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover - .getPresenceLabel()); - sendMessageToHandler(MessageStatus.OKAY, resultData); - } catch (Exception e) { - sendErrorToHandler(e); - } + Bundle resultData = new Bundle(); + resultData.putString(ServiceProgressHandler.DATA_MESSAGE, "OK"); + + // these help the handler construct a useful human-readable message + resultData.putString(ServiceProgressHandler.KEYBASE_PROOF_URL, prover.getProofUrl()); + resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl()); + resultData.putString(ServiceProgressHandler.KEYBASE_PRESENCE_LABEL, prover + .getPresenceLabel()); + sendMessageToHandler(MessageStatus.OKAY, resultData); + } catch (Exception e) { + sendErrorToHandler(e); + } - break; - } - case ACTION_DECRYPT_VERIFY: { + break; + } + case ACTION_DECRYPT_VERIFY: { /* Input */ - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); - // for compatibility - // TODO merge with ACTION_DECRYPT_METADATA - input.setDecryptMetadataOnly(false); + // for compatibility + // TODO merge with ACTION_DECRYPT_METADATA + input.setDecryptMetadataOnly(false); /* Operation */ - PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); - DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); + PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); + DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); /* Output */ - sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); + sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); - break; - } - case ACTION_DELETE: { + break; + } + case ACTION_DELETE: { - // Input - long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); - boolean isSecret = data.getBoolean(DELETE_IS_SECRET); + // Input + long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST); + boolean isSecret = data.getBoolean(DELETE_IS_SECRET); - // Operation - DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService); - DeleteResult result = op.execute(masterKeyIds, isSecret); + // Operation + DeleteOperation op = new DeleteOperation(mKeychainService, providerHelper, mKeychainService); + DeleteResult result = op.execute(masterKeyIds, isSecret); - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_EDIT_KEYRING: { + break; + } + case ACTION_EDIT_KEYRING: { - // Input - SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL); - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + // Input + SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - // Operation - EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper, - mKeychainService, mActionCanceled); - OperationResult result = op.execute(saveParcel, cryptoInput); + // Operation + EditKeyOperation op = new EditKeyOperation(mKeychainService, providerHelper, + mKeychainService, mActionCanceled); + OperationResult result = op.execute(saveParcel, cryptoInput); - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_PROMOTE_KEYRING: { + break; + } + case ACTION_PROMOTE_KEYRING: { - // Input - long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID); - byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID); - long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS); + // Input + long keyRingId = data.getLong(PROMOTE_MASTER_KEY_ID); + byte[] cardAid = data.getByteArray(PROMOTE_CARD_AID); + long[] subKeyIds = data.getLongArray(PROMOTE_SUBKEY_IDS); - // Operation - PromoteKeyOperation op = new PromoteKeyOperation( - mKeychainService, providerHelper, mKeychainService, - mActionCanceled); - PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); + // Operation + PromoteKeyOperation op = new PromoteKeyOperation( + mKeychainService, providerHelper, mKeychainService, + mActionCanceled); + PromoteKeyResult result = op.execute(keyRingId, cardAid, subKeyIds); - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_EXPORT_KEYRING: { - - // Input - boolean exportSecret = data.getBoolean(EXPORT_SECRET, false); - String outputFile = data.getString(EXPORT_FILENAME); - Uri outputUri = data.getParcelable(EXPORT_URI); - - boolean exportAll = data.getBoolean(EXPORT_ALL); - long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); - - // Operation - ImportExportOperation importExportOperation = new ImportExportOperation( - mKeychainService, providerHelper, mKeychainService); - ExportResult result; - if (outputFile != null) { - result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); - } else { - result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri); - } + break; + } + case ACTION_EXPORT_KEYRING: { + + // Input + boolean exportSecret = data.getBoolean(EXPORT_SECRET, false); + String outputFile = data.getString(EXPORT_FILENAME); + Uri outputUri = data.getParcelable(EXPORT_URI); + + boolean exportAll = data.getBoolean(EXPORT_ALL); + long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID); + + // Operation + ImportExportOperation importExportOperation = new ImportExportOperation( + mKeychainService, providerHelper, mKeychainService); + ExportResult result; + if (outputFile != null) { + result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile); + } else { + result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri); + } - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_IMPORT_KEYRING: { - - // Input - String keyServer = data.getString(IMPORT_KEY_SERVER); - ArrayList keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); - - // either keyList or cache must be null, no guarantees otherwise - if (keyList == null) {// import from file, do serially - serialKeyImport(null, keyServer, providerHelper); - } else { - // if there is more than one key with the same fingerprint, we do a serial import to prevent - // https://github.com/open-keychain/open-keychain/issues/1221 - HashSet keyFingerprintSet = new HashSet<>(); - for (int i = 0; i < keyList.size(); i++) { - keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint); - } - if (keyFingerprintSet.size() == keyList.size()) { - // all keys have unique fingerprints - multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer); - } else { - serialKeyImport(keyList, keyServer, providerHelper); + break; } - } + case ACTION_IMPORT_KEYRING: { + + // Input + String keyServer = data.getString(IMPORT_KEY_SERVER); + ArrayList keyList = data.getParcelableArrayList(IMPORT_KEY_LIST); + + // either keyList or cache must be null, no guarantees otherwise + if (keyList == null) {// import from file, do serially + serialKeyImport(null, keyServer, providerHelper); + } else { + // if there is more than one key with the same fingerprint, we do a serial import to prevent + // https://github.com/open-keychain/open-keychain/issues/1221 + HashSet keyFingerprintSet = new HashSet<>(); + for (int i = 0; i < keyList.size(); i++) { + keyFingerprintSet.add(keyList.get(i).mExpectedFingerprint); + } + if (keyFingerprintSet.size() == keyList.size()) { + // all keys have unique fingerprints + multiThreadedKeyImport(keyList.iterator(), keyList.size(), keyServer); + } else { + serialKeyImport(keyList, keyServer, providerHelper); + } + } - break; - } - case ACTION_SIGN_ENCRYPT: { + break; + } + case ACTION_SIGN_ENCRYPT: { - // Input - SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL); - CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); + // Input + SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL); + CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); - // Operation - SignEncryptOperation op = new SignEncryptOperation( - mKeychainService, providerHelper, mKeychainService, mActionCanceled); - SignEncryptResult result = op.execute(inputParcel, cryptoInput); + // Operation + SignEncryptOperation op = new SignEncryptOperation( + mKeychainService, providerHelper, mKeychainService, mActionCanceled); + SignEncryptResult result = op.execute(inputParcel, cryptoInput); - // Result - sendMessageToHandler(MessageStatus.OKAY, result); + // Result + sendMessageToHandler(MessageStatus.OKAY, result); - break; - } - case ACTION_UPLOAD_KEYRING: { - try { + break; + } + case ACTION_UPLOAD_KEYRING: { + try { /* Input */ - String keyServer = data.getString(UPLOAD_KEY_SERVER); - // and dataUri! + String keyServer = data.getString(UPLOAD_KEY_SERVER); + // and dataUri! /* Operation */ - HkpKeyserver server = new HkpKeyserver(keyServer); + HkpKeyserver server = new HkpKeyserver(keyServer); - CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); - ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService, - providerHelper, mKeychainService); + CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); + ImportExportOperation importExportOperation = new ImportExportOperation(mKeychainService, + providerHelper, mKeychainService); - try { - importExportOperation.uploadKeyRingToServer(server, keyring); - } catch (Keyserver.AddKeyException e) { - throw new PgpGeneralException("Unable to export key to selected server"); - } + try { + importExportOperation.uploadKeyRingToServer(server, keyring); + } catch (Keyserver.AddKeyException e) { + throw new PgpGeneralException("Unable to export key to selected server"); + } - sendMessageToHandler(MessageStatus.OKAY); - } catch (Exception e) { - sendErrorToHandler(e); + sendMessageToHandler(MessageStatus.OKAY); + } catch (Exception e) { + sendErrorToHandler(e); + } + break; + } + } + if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) { + // import keyring handles stopping service on its own + stopSelf(); } - break; } - } - if (!intent.getAction().equals(ACTION_IMPORT_KEYRING)) { - // import keyring handles stopping service on its own - stopSelf(); - } }}; + }; + Thread actionThread = new Thread(actionRunnable); actionThread.start(); + return START_NOT_STICKY; } -- cgit v1.2.3 From e2988c2a68116d7adcc6e765cb307c451bebbe78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 1 Jun 2015 15:52:07 +0200 Subject: Fix comments in service --- .../keychain/service/KeychainService.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java index 41b4b3fba..b8cb9de27 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainService.java @@ -266,18 +266,18 @@ public class KeychainService extends Service implements Progressable { } case ACTION_DECRYPT_METADATA: { - /* Input */ + // Input CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); // this action is here for compatibility only input.setDecryptMetadataOnly(true); - /* Operation */ + // Operation PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); - /* Result */ + // Result sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); break; @@ -378,7 +378,7 @@ public class KeychainService extends Service implements Progressable { } case ACTION_DECRYPT_VERIFY: { - /* Input */ + // Input CryptoInputParcel cryptoInput = data.getParcelable(EXTRA_CRYPTO_INPUT); PgpDecryptVerifyInputParcel input = data.getParcelable(DECRYPT_VERIFY_PARCEL); @@ -386,11 +386,11 @@ public class KeychainService extends Service implements Progressable { // TODO merge with ACTION_DECRYPT_METADATA input.setDecryptMetadataOnly(false); - /* Operation */ + // Operation PgpDecryptVerify op = new PgpDecryptVerify(mKeychainService, providerHelper, mKeychainService); DecryptVerifyResult decryptVerifyResult = op.execute(input, cryptoInput); - /* Output */ + // Output sendMessageToHandler(MessageStatus.OKAY, decryptVerifyResult); break; @@ -514,11 +514,11 @@ public class KeychainService extends Service implements Progressable { case ACTION_UPLOAD_KEYRING: { try { - /* Input */ + // Input String keyServer = data.getString(UPLOAD_KEY_SERVER); // and dataUri! - /* Operation */ + // Operation HkpKeyserver server = new HkpKeyserver(keyServer); CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri); -- cgit v1.2.3 From b3ebb646663f166c6dd2c7d2cfbc47293582b33e Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 2 Jun 2015 22:19:41 +0200 Subject: hide invoke nfc button in android < 5 --- .../keychain/ui/ViewKeyAdvShareFragment.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java index 479ddae0b..42abf35eb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java @@ -140,12 +140,17 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements } }); - mKeyNfcButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mNfcHelper.invokeNfcBeam(); - } - }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mKeyNfcButton.setVisibility(View.VISIBLE); + mKeyNfcButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mNfcHelper.invokeNfcBeam(); + } + }); + } else { + mKeyNfcButton.setVisibility(View.GONE); + } mKeySafeSlingerButton.setOnClickListener(new View.OnClickListener() { @Override -- cgit v1.2.3 From bd5a5c013881c57d29d67a9d6de1618f45dbcb99 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Wed, 3 Jun 2015 01:16:06 +0200 Subject: Partially revert "switch to native DialogFragment, fix some nullpointers", but keep nullpointer fixes This reverts commit 403f74f55830dcc5eaa027ccebb888a1122992d1. Conflicts: OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java --- .../sufficientlysecure/keychain/service/ServiceProgressHandler.java | 6 ++++-- .../keychain/ui/dialog/ProgressDialogFragment.java | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java index 5625408f8..a0bb250d4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ServiceProgressHandler.java @@ -18,14 +18,16 @@ package org.sufficientlysecure.keychain.service; import android.app.Activity; -import android.app.FragmentManager; +import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.operations.results.CertifyResult; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.Log; @@ -97,7 +99,7 @@ public class ServiceProgressHandler extends Handler { // TODO: This is a hack!, see // http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult - final FragmentManager manager = activity.getFragmentManager(); + final FragmentManager manager = activity.getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 130d22b37..52a90b323 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -19,7 +19,6 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Activity; import android.app.Dialog; -import android.app.DialogFragment; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnKeyListener; @@ -27,6 +26,7 @@ import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; import android.view.ContextThemeWrapper; import android.view.KeyEvent; import android.view.View; @@ -52,6 +52,7 @@ public class ProgressDialogFragment extends DialogFragment { * @param message the message to be displayed initially above the progress bar * @param style the progress bar style, as defined in ProgressDialog (horizontal or spinner) * @param cancelable should we let the user cancel this operation + * @return */ public static ProgressDialogFragment newInstance(String message, int style, boolean cancelable) { ProgressDialogFragment frag = new ProgressDialogFragment(); -- cgit v1.2.3 From ecfbc743f312d37d0e3b9a5fae4e9db74a92d7e0 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Wed, 3 Jun 2015 01:21:06 +0200 Subject: keep prefernces individual per dialog (affects only compression) --- .../org/sufficientlysecure/keychain/Constants.java | 3 ++- .../keychain/ui/EncryptFilesFragment.java | 5 ++--- .../keychain/ui/EncryptTextFragment.java | 4 ++-- .../keychain/util/Preferences.java | 20 ++++++++++++++++---- 4 files changed, 22 insertions(+), 10 deletions(-) (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index 7c2f093ee..3aa58d024 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -85,7 +85,8 @@ public final class Constants { public static final String USE_DEFAULT_YUBIKEY_PIN = "useDefaultYubikeyPin"; public static final String USE_NUMKEYPAD_FOR_YUBIKEY_PIN = "useNumKeypadForYubikeyPin"; public static final String ENCRYPT_FILENAMES = "encryptFilenames"; - public static final String USE_COMPRESSION = "useCompression"; + public static final String FILE_USE_COMPRESSION = "useFileCompression"; + public static final String TEXT_USE_COMPRESSION = "useTextCompression"; public static final String USE_ARMOR = "useArmor"; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index 13de80eb8..99d28b234 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -41,7 +41,6 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -import com.nispok.snackbar.Snackbar; import org.spongycastle.bcpg.CompressionAlgorithmTags; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -184,7 +183,7 @@ public class EncryptFilesFragment extends CachingCryptoOperationFragment