Start reworking decrypt ui classes

This commit is contained in:
Dominik Schürmann 2015-03-27 00:55:55 +01:00
parent 13f4cc4ad3
commit b82f273284
3 changed files with 196 additions and 171 deletions

View File

@ -39,6 +39,7 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType; import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify;
@ -144,7 +145,7 @@ public class DecryptFilesFragment extends DecryptFragment {
return; return;
} }
decryptOriginalFilename(); // decryptOriginalFilename();
} }
private String removeEncryptedAppend(String name) { private String removeEncryptedAppend(String name) {
@ -174,82 +175,93 @@ public class DecryptFilesFragment extends DecryptFragment {
} }
} }
private void decryptOriginalFilename() {
Log.d(Constants.TAG, "decryptOriginalFilename");
Intent intent = new Intent(getActivity(), KeychainIntentService.class); // 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_DATA, 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);
// }
// fill values for this action private void decryptStart() {
Bundle data = new Bundle(); cryptoOperation(new CryptoInputParcel());
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_DATA, 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);
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);
} }
@Override @Override
protected void decryptStart() { protected void cryptoOperation(CryptoInputParcel cryptoInput) {
Log.d(Constants.TAG, "decryptStart"); Log.d(Constants.TAG, "decryptStart");
// Send all information needed to service to decrypt in other thread // Send all information needed to service to decrypt in other thread
@ -284,6 +296,11 @@ public class DecryptFilesFragment extends DecryptFragment {
// handle messages by standard KeychainIntentServiceHandler first // handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message); super.handleMessage(message);
// handle pending messages
if (handlePendingMessage(message)) {
return;
}
if (message.arg1 == MessageStatus.OKAY.ordinal()) { if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle // get returned data bundle
Bundle returnData = message.getData(); Bundle returnData = message.getData();
@ -291,20 +308,21 @@ public class DecryptFilesFragment extends DecryptFragment {
DecryptVerifyResult pgpResult = DecryptVerifyResult pgpResult =
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT); returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
if (pgpResult.isPending()) { // if (pgpResult.isPending()) {
if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) == // if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) ==
DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) { // DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) {
startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded()); // startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded());
} else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) == // } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) ==
DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) { // DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) {
startPassphraseDialog(Constants.key.symmetric); // startPassphraseDialog(Constants.key.symmetric);
} else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) == // } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) ==
DecryptVerifyResult.RESULT_PENDING_NFC) { // DecryptVerifyResult.RESULT_PENDING_NFC) {
startNfcDecrypt(pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey()); // startNfcDecrypt(pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey());
} else { // } else {
throw new RuntimeException("Unhandled pending result!"); // throw new RuntimeException("Unhandled pending result!");
} // }
} else if (pgpResult.success()) {
if (pgpResult.success()) {
// display signature result in activity // display signature result in activity
onResult(pgpResult); onResult(pgpResult);
@ -346,21 +364,21 @@ public class DecryptFilesFragment extends DecryptFragment {
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) { switch (requestCode) {
case REQUEST_CODE_PASSPHRASE: { // case REQUEST_CODE_PASSPHRASE: {
if (resultCode == Activity.RESULT_OK && data != null) { // if (resultCode == Activity.RESULT_OK && data != null) {
mPassphrase = data.getParcelableExtra(PassphraseDialogActivity.MESSAGE_DATA_PASSPHRASE); // mPassphrase = data.getParcelableExtra(PassphraseDialogActivity.MESSAGE_DATA_PASSPHRASE);
decryptOriginalFilename(); //// decryptOriginalFilename();
} // }
return; // return;
} // }
//
case REQUEST_CODE_NFC_DECRYPT: { // case REQUEST_CODE_NFC_DECRYPT: {
if (resultCode == Activity.RESULT_OK && data != null) { // if (resultCode == Activity.RESULT_OK && data != null) {
mNfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY); // mNfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY);
decryptOriginalFilename(); //// decryptOriginalFilename();
} // }
return; // return;
} // }
case REQUEST_CODE_INPUT: { case REQUEST_CODE_INPUT: {
if (resultCode == Activity.RESULT_OK && data != null) { if (resultCode == Activity.RESULT_OK && data != null) {
@ -383,4 +401,5 @@ public class DecryptFilesFragment extends DecryptFragment {
} }
} }
} }
} }

View File

@ -34,11 +34,11 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Passphrase;
public abstract class DecryptFragment extends Fragment { public abstract class DecryptFragment extends CryptoOperationFragment {
private static final int RESULT_CODE_LOOKUP_KEY = 0x00007006; private static final int RESULT_CODE_LOOKUP_KEY = 0x00007006;
public static final int REQUEST_CODE_PASSPHRASE = 0x00008001; // public static final int REQUEST_CODE_PASSPHRASE = 0x00008001;
public static final int REQUEST_CODE_NFC_DECRYPT = 0x00008002; // public static final int REQUEST_CODE_NFC_DECRYPT = 0x00008002;
protected long mSignatureKeyId = 0; protected long mSignatureKeyId = 0;
@ -95,24 +95,24 @@ public abstract class DecryptFragment extends Fragment {
startActivity(viewKeyIntent); startActivity(viewKeyIntent);
} }
protected void startPassphraseDialog(long subkeyId) { // protected void startPassphraseDialog(long subkeyId) {
Intent intent = new Intent(getActivity(), PassphraseDialogActivity.class); // Intent intent = new Intent(getActivity(), PassphraseDialogActivity.class);
intent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID, subkeyId); // intent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID, subkeyId);
startActivityForResult(intent, REQUEST_CODE_PASSPHRASE); // startActivityForResult(intent, REQUEST_CODE_PASSPHRASE);
} // }
//
protected void startNfcDecrypt(long subKeyId, Passphrase pin, byte[] encryptedSessionKey) { // protected void startNfcDecrypt(long subKeyId, Passphrase pin, byte[] encryptedSessionKey) {
// build PendingIntent for Yubikey NFC operations // // build PendingIntent for Yubikey NFC operations
Intent intent = new Intent(getActivity(), NfcActivity.class); // Intent intent = new Intent(getActivity(), NfcActivity.class);
intent.setAction(NfcActivity.ACTION_DECRYPT_SESSION_KEY); // intent.setAction(NfcActivity.ACTION_DECRYPT_SESSION_KEY);
intent.putExtra(NfcActivity.EXTRA_DATA, new Intent()); // not used, only relevant to OpenPgpService // intent.putExtra(NfcActivity.EXTRA_DATA, new Intent()); // not used, only relevant to OpenPgpService
intent.putExtra(NfcActivity.EXTRA_KEY_ID, subKeyId); // intent.putExtra(NfcActivity.EXTRA_KEY_ID, subKeyId);
intent.putExtra(NfcActivity.EXTRA_PIN, pin); // intent.putExtra(NfcActivity.EXTRA_PIN, pin);
//
intent.putExtra(NfcActivity.EXTRA_NFC_ENC_SESSION_KEY, encryptedSessionKey); // intent.putExtra(NfcActivity.EXTRA_NFC_ENC_SESSION_KEY, encryptedSessionKey);
//
startActivityForResult(intent, REQUEST_CODE_NFC_DECRYPT); // startActivityForResult(intent, REQUEST_CODE_NFC_DECRYPT);
} // }
/** /**
* *
@ -253,9 +253,4 @@ public abstract class DecryptFragment extends Fragment {
}); });
} }
/**
* Should be overridden by MessageFragment and FileFragment to start actual decryption
*/
protected abstract void decryptStart();
} }

View File

@ -38,6 +38,7 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType; import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
@ -147,8 +148,13 @@ public class DecryptTextFragment extends DecryptFragment {
} }
} }
private void decryptStart() {
cryptoOperation(new CryptoInputParcel());
}
@Override @Override
protected void decryptStart() { protected void cryptoOperation(CryptoInputParcel cryptoInput) {
Log.d(Constants.TAG, "decryptStart"); Log.d(Constants.TAG, "decryptStart");
// Send all information needed to service to decrypt in other thread // Send all information needed to service to decrypt in other thread
@ -177,6 +183,11 @@ public class DecryptTextFragment extends DecryptFragment {
// handle messages by standard KeychainIntentServiceHandler first // handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message); super.handleMessage(message);
// handle pending messages
if (handlePendingMessage(message)) {
return;
}
if (message.arg1 == MessageStatus.OKAY.ordinal()) { if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle // get returned data bundle
Bundle returnData = message.getData(); Bundle returnData = message.getData();
@ -184,20 +195,20 @@ public class DecryptTextFragment extends DecryptFragment {
DecryptVerifyResult pgpResult = DecryptVerifyResult pgpResult =
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT); returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
if (pgpResult.isPending()) { // if (pgpResult.isPending()) {
if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) == // if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) ==
DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) { // DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) {
startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded()); // startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded());
} else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) == // } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) ==
DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) { // DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) {
startPassphraseDialog(Constants.key.symmetric); // startPassphraseDialog(Constants.key.symmetric);
} else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) == // } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) ==
DecryptVerifyResult.RESULT_PENDING_NFC) { // DecryptVerifyResult.RESULT_PENDING_NFC) {
startNfcDecrypt(pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey()); // startNfcDecrypt(pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey());
} else { // } else {
throw new RuntimeException("Unhandled pending result!"); // throw new RuntimeException("Unhandled pending result!");
} // }
} else if (pgpResult.success()) { if (pgpResult.success()) {
byte[] decryptedMessage = returnData byte[] decryptedMessage = returnData
.getByteArray(KeychainIntentService.RESULT_DECRYPTED_BYTES); .getByteArray(KeychainIntentService.RESULT_DECRYPTED_BYTES);
@ -245,34 +256,34 @@ public class DecryptTextFragment extends DecryptFragment {
getActivity().startService(intent); getActivity().startService(intent);
} }
@Override // @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { // public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) { // switch (requestCode) {
//
case REQUEST_CODE_PASSPHRASE: { // case REQUEST_CODE_PASSPHRASE: {
if (resultCode == Activity.RESULT_OK && data != null) { // if (resultCode == Activity.RESULT_OK && data != null) {
mPassphrase = data.getParcelableExtra(PassphraseDialogActivity.MESSAGE_DATA_PASSPHRASE); // mPassphrase = data.getParcelableExtra(PassphraseDialogActivity.MESSAGE_DATA_PASSPHRASE);
decryptStart(); // decryptStart();
} else { // } else {
getActivity().finish(); // getActivity().finish();
} // }
return; // return;
} // }
//
case REQUEST_CODE_NFC_DECRYPT: { // case REQUEST_CODE_NFC_DECRYPT: {
if (resultCode == Activity.RESULT_OK && data != null) { // if (resultCode == Activity.RESULT_OK && data != null) {
mNfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY); // mNfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY);
decryptStart(); // decryptStart();
} else { // } else {
getActivity().finish(); // getActivity().finish();
} // }
return; // return;
} // }
//
default: { // default: {
super.onActivityResult(requestCode, resultCode, data); // super.onActivityResult(requestCode, resultCode, data);
} // }
} // }
} // }
} }