mirror of
https://github.com/moparisthebest/open-keychain
synced 2025-01-11 13:38:06 -05:00
Prepare decrypt UI for input parcel
This commit is contained in:
parent
6c706f8a90
commit
cc44ff1a8b
@ -1,3 +1,20 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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<ByteBuffer,byte[]> mCryptoData = new HashMap<>();
|
||||
private HashMap<ByteBuffer, byte[]> 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<ByteBuffer,byte[]> entry : mCryptoData.entrySet()) {
|
||||
for (HashMap.Entry<ByteBuffer, byte[]> entry : mCryptoData.entrySet()) {
|
||||
dest.writeByteArray(entry.getKey().array());
|
||||
dest.writeByteArray(entry.getValue());
|
||||
}
|
||||
|
@ -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);
|
||||
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);
|
||||
}
|
||||
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);
|
||||
/*
|
||||
// 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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user