From cc44ff1a8b3b51331023ef738ccd28bece32da40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 31 Mar 2015 15:44:37 +0200 Subject: Prepare decrypt UI for input parcel --- .../keychain/service/input/CryptoInputParcel.java | 26 +++- .../keychain/ui/DecryptFilesFragment.java | 168 +++++++-------------- .../keychain/ui/DecryptTextFragment.java | 14 +- 3 files changed, 79 insertions(+), 129 deletions(-) (limited to 'OpenKeychain') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java index 21aacd1f0..3d1ccaca1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoInputParcel.java @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2015 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.input; import java.nio.ByteBuffer; @@ -11,9 +28,8 @@ import android.os.Parcelable; import org.sufficientlysecure.keychain.util.Passphrase; - -/** This is a base class for the input of crypto operations. - * +/** + * This is a base class for the input of crypto operations. */ public class CryptoInputParcel implements Parcelable { @@ -22,7 +38,7 @@ public class CryptoInputParcel implements Parcelable { // this map contains both decrypted session keys and signed hashes to be // used in the crypto operation described by this parcel. - private HashMap mCryptoData = new HashMap<>(); + private HashMap mCryptoData = new HashMap<>(); public CryptoInputParcel() { mSignatureTime = new Date(); @@ -71,7 +87,7 @@ public class CryptoInputParcel implements Parcelable { dest.writeParcelable(mPassphrase, 0); dest.writeInt(mCryptoData.size()); - for (HashMap.Entry entry : mCryptoData.entrySet()) { + for (HashMap.Entry entry : mCryptoData.entrySet()) { dest.writeByteArray(entry.getKey().array()); dest.writeByteArray(entry.getValue()); } 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 d1c005868..cd66902ba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java @@ -17,6 +17,7 @@ package org.sufficientlysecure.keychain.ui; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; @@ -32,7 +33,6 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; -import org.openintents.openpgp.util.OpenPgpApi; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; @@ -64,6 +64,8 @@ public class DecryptFilesFragment extends DecryptFragment { private Uri mInputUri = null; private Uri mOutputUri = null; + private String mCurrentCryptoOperation; + /** * Creates new instance of this fragment */ @@ -145,7 +147,7 @@ public class DecryptFilesFragment extends DecryptFragment { return; } -// decryptOriginalFilename(); + startDecryptFilenames(); } private String removeEncryptedAppend(String name) { @@ -158,121 +160,45 @@ public class DecryptFilesFragment extends DecryptFragment { } private void askForOutputFilename(String originalFilename) { - String targetName; - if (!TextUtils.isEmpty(originalFilename)) { - targetName = originalFilename; - } else { - targetName = removeEncryptedAppend(FileHelper.getFilename(getActivity(), mInputUri)); + if (TextUtils.isEmpty(originalFilename)) { + originalFilename = removeEncryptedAppend(FileHelper.getFilename(getActivity(), mInputUri)); } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { File file = new File(mInputUri.getPath()); File parentDir = file.exists() ? file.getParentFile() : Constants.Path.APP_DIR; - File targetFile = new File(parentDir, targetName); + File targetFile = new File(parentDir, originalFilename); FileHelper.saveFile(this, getString(R.string.title_decrypt_to_file), getString(R.string.specify_file_to_decrypt_to), targetFile, REQUEST_CODE_OUTPUT); } else { - FileHelper.saveDocument(this, "*/*", targetName, REQUEST_CODE_OUTPUT); + FileHelper.saveDocument(this, "*/*", originalFilename, REQUEST_CODE_OUTPUT); } } + private void startDecrypt() { + mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_VERIFY; + cryptoOperation(new CryptoInputParcel()); + } - // TODO: also needs to use cryptoOperation!!! (switch between this and normal decrypt -// private void decryptOriginalFilename() { -// Log.d(Constants.TAG, "decryptOriginalFilename"); -// -// Intent intent = new Intent(getActivity(), KeychainIntentService.class); -// -// // fill values for this action -// Bundle data = new Bundle(); -// intent.setAction(KeychainIntentService.ACTION_DECRYPT_METADATA); -// -// // data -// Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri); -// -// data.putInt(KeychainIntentService.SOURCE, IOType.URI.ordinal()); -// data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_INPUT_URI, mInputUri); -// -// data.putInt(KeychainIntentService.TARGET, IOType.URI.ordinal()); -// data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_OUTPUT_URI, mOutputUri); -// -// data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); -// data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); -// -// intent.putExtra(KeychainIntentService.EXTRA_SERVICE_INTENT, data); -// -// // Message is received after decrypting is done in KeychainIntentService -// ServiceProgressHandler saveHandler = new ServiceProgressHandler( -// getActivity(), -// getString(R.string.progress_decrypting), -// ProgressDialog.STYLE_HORIZONTAL, -// ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { -// public void handleMessage(Message message) { -// // handle messages by standard KeychainIntentServiceHandler first -// super.handleMessage(message); -// -// // handle pending messages -// if (handlePendingMessage(message)) { -// return; -// } -// -// if (message.arg1 == MessageStatus.OKAY.ordinal()) { -// // get returned data bundle -// Bundle returnData = message.getData(); -// -// DecryptVerifyResult pgpResult = -// returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT); -// -// if (pgpResult.isPending()) { -// if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) == -// DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) { -// startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded()); -// } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) == -// DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) { -// startPassphraseDialog(Constants.key.symmetric); -// } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) == -// DecryptVerifyResult.RESULT_PENDING_NFC) { -// startNfcDecrypt(pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey()); -// } else { -// throw new RuntimeException("Unhandled pending result!"); -// } -// } else if (pgpResult.success()) { -// // go on... -// askForOutputFilename(pgpResult.getDecryptMetadata().getFilename()); -// } else { -// pgpResult.createNotify(getActivity()).show(); -// } -// } -// } -// }; -// -// // Create a new Messenger for the communication back -// Messenger messenger = new Messenger(saveHandler); -// intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); -// -// // show progress dialog -// saveHandler.showProgressDialog(getActivity()); -// -// // start service with intent -// getActivity().startService(intent); -// } - - private void decryptStart() { + private void startDecryptFilenames() { + mCurrentCryptoOperation = KeychainIntentService.ACTION_DECRYPT_METADATA; cryptoOperation(new CryptoInputParcel()); } @Override + @SuppressLint("HandlerLeak") protected void cryptoOperation(CryptoInputParcel cryptoInput) { - Log.d(Constants.TAG, "decryptStart"); - // Send all information needed to service to decrypt in other thread Intent intent = new Intent(getActivity(), KeychainIntentService.class); // fill values for this action Bundle data = new Bundle(); - - intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY); + // use current operation, either decrypt metadata or decrypt payload + intent.setAction(mCurrentCryptoOperation); // data + data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); + Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri); data.putInt(KeychainIntentService.SOURCE, IOType.URI.ordinal()); @@ -281,8 +207,8 @@ public class DecryptFilesFragment extends DecryptFragment { data.putInt(KeychainIntentService.TARGET, IOType.URI.ordinal()); data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_OUTPUT_URI, mOutputUri); - data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); - data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); +// data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); +// data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); @@ -292,6 +218,7 @@ public class DecryptFilesFragment extends DecryptFragment { getString(R.string.progress_decrypting), ProgressDialog.STYLE_HORIZONTAL, ProgressDialogFragment.ServiceType.KEYCHAIN_INTENT) { + @Override public void handleMessage(Message message) { // handle messages by standard KeychainIntentServiceHandler first super.handleMessage(message); @@ -324,24 +251,37 @@ public class DecryptFilesFragment extends DecryptFragment { if (pgpResult.success()) { - // display signature result in activity - onResult(pgpResult); - - if (mDeleteAfter.isChecked()) { - // Create and show dialog to delete original file - DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri); - deleteFileDialog.show(getActivity().getSupportFragmentManager(), "deleteDialog"); - setInputUri(null); - } - - /* - // A future open after decryption feature - if () { - Intent viewFile = new Intent(Intent.ACTION_VIEW); - viewFile.setInputData(mOutputUri); - startActivity(viewFile); + switch (mCurrentCryptoOperation) { + case KeychainIntentService.ACTION_DECRYPT_METADATA: { + askForOutputFilename(pgpResult.getDecryptMetadata().getFilename()); + break; + } + case KeychainIntentService.ACTION_DECRYPT_VERIFY: { + // display signature result in activity + onResult(pgpResult); + + if (mDeleteAfter.isChecked()) { + // Create and show dialog to delete original file + DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri); + deleteFileDialog.show(getActivity().getSupportFragmentManager(), "deleteDialog"); + setInputUri(null); + } + + /* + // A future open after decryption feature + if () { + Intent viewFile = new Intent(Intent.ACTION_VIEW); + viewFile.setInputData(mOutputUri); + startActivity(viewFile); + } + */ + break; + } + default: { + Log.e(Constants.TAG, "Bug: not supported operation!"); + break; + } } - */ } else { pgpResult.createNotify(getActivity()).show(); } @@ -391,7 +331,7 @@ public class DecryptFilesFragment extends DecryptFragment { // This happens after output file was selected, so start our operation if (resultCode == Activity.RESULT_OK && data != null) { mOutputUri = data.getData(); - decryptStart(); + startDecrypt(); } return; } 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 523b24fd7..086830389 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java @@ -144,19 +144,12 @@ public class DecryptTextFragment extends DecryptFragment { String ciphertext = getArguments().getString(ARG_CIPHERTEXT); if (ciphertext != null) { mCiphertext = ciphertext; - decryptStart(); + cryptoOperation(new CryptoInputParcel()); } } - private void decryptStart() { - cryptoOperation(new CryptoInputParcel()); - } - @Override protected void cryptoOperation(CryptoInputParcel cryptoInput) { - - Log.d(Constants.TAG, "decryptStart"); - // Send all information needed to service to decrypt in other thread Intent intent = new Intent(getActivity(), KeychainIntentService.class); @@ -166,10 +159,11 @@ public class DecryptTextFragment extends DecryptFragment { intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY); // data + data.putParcelable(KeychainIntentService.EXTRA_CRYPTO_INPUT, cryptoInput); data.putInt(KeychainIntentService.TARGET, IOType.BYTES.ordinal()); data.putByteArray(KeychainIntentService.DECRYPT_CIPHERTEXT_BYTES, mCiphertext.getBytes()); - data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); - data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); +// data.putParcelable(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase); +// data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); -- cgit v1.2.3