From 4229b94270fc320c82c3c0f1314e8b94f76b8406 Mon Sep 17 00:00:00 2001 From: Thialfihar Date: Tue, 1 Jun 2010 03:20:13 +0000 Subject: [PATCH] working encryption out of k9mail --- AndroidManifest.xml | 23 +++- src/org/thialfihar/android/apg/Apg.java | 10 +- .../android/apg/DecryptActivity.java | 1 - .../android/apg/EncryptActivity.java | 104 ++++++++++-------- 4 files changed, 90 insertions(+), 48 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2f90dc154..6e3169189 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -53,12 +53,28 @@ + android:configChanges="keyboardHidden|orientation|keyboard"> + + + + + + + + + android:configChanges="keyboardHidden|orientation|keyboard"> + + + + + + + + + + + diff --git a/src/org/thialfihar/android/apg/Apg.java b/src/org/thialfihar/android/apg/Apg.java index 671bbfb8d..f234d6e04 100644 --- a/src/org/thialfihar/android/apg/Apg.java +++ b/src/org/thialfihar/android/apg/Apg.java @@ -101,6 +101,9 @@ public class Apg { public static final String DECRYPT_FILE = "org.thialfihar.android.apg.intent.DECRYPT_FILE"; public static final String ENCRYPT_FILE = "org.thialfihar.android.apg.intent.ENCRYPT_FILE"; public static final String DECRYPT_AND_RETURN = "org.thialfihar.android.apg.intent.DECRYPT_AND_RETURN"; + public static final String ENCRYPT_AND_RETURN = "org.thialfihar.android.apg.intent.ENCRYPT_AND_RETURN"; + public static final String SELECT_PUBLIC_KEYS = "org.thialfihar.android.apg.intent.SELECT_PUBLIC_KEYS"; + public static final String SELECT_SECRET_KEY = "org.thialfihar.android.apg.intent.SELECT_SECRET_KEY"; } public static final String EXTRA_DATA = "data"; @@ -150,8 +153,8 @@ public class Apg { Pattern.DOTALL); public static Pattern PGP_SIGNED_MESSAGE = - Pattern.compile(".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*", - Pattern.DOTALL); + Pattern.compile(".*?(-----BEGIN PGP SIGNED MESSAGE-----.*?-----BEGIN PGP SIGNATURE-----.*?-----END PGP SIGNATURE-----).*", + Pattern.DOTALL); private static HashMap mPassPhraseCache = new HashMap(); @@ -1330,6 +1333,9 @@ public class Apg { String passPhrase, ProgressDialogUpdater progress, boolean assumeSymmetric) throws IOException, GeneralException, PGPException, SignatureException { + if (passPhrase == null) { + passPhrase = ""; + } Bundle returnData = new Bundle(); InputStream in = PGPUtil.getDecoderStream(inStream); PGPObjectFactory pgpF = new PGPObjectFactory(in); diff --git a/src/org/thialfihar/android/apg/DecryptActivity.java b/src/org/thialfihar/android/apg/DecryptActivity.java index 2be7de4b9..ab5ec08af 100644 --- a/src/org/thialfihar/android/apg/DecryptActivity.java +++ b/src/org/thialfihar/android/apg/DecryptActivity.java @@ -496,7 +496,6 @@ public class DecryptActivity extends BaseActivity { if (mSignedOnly) { data = Apg.verifyText(this, in, out, this); } else { - // TODO: check the pass phrase, may be null? data = Apg.decrypt(this, in, out, size, Apg.getCachedPassPhrase(getSecretKeyId()), this, mAssumeSymmetricEncryption); } diff --git a/src/org/thialfihar/android/apg/EncryptActivity.java b/src/org/thialfihar/android/apg/EncryptActivity.java index b3abc2024..9106c1c83 100644 --- a/src/org/thialfihar/android/apg/EncryptActivity.java +++ b/src/org/thialfihar/android/apg/EncryptActivity.java @@ -62,6 +62,7 @@ import android.widget.Toast; import android.widget.ViewFlipper; public class EncryptActivity extends BaseActivity { + private Intent mIntent = null; private String mSubject = null; private String mSendTo = null; @@ -265,11 +266,12 @@ public class EncryptActivity extends BaseActivity { } }); - Intent intent = getIntent(); - if (intent.getAction() != null && - (intent.getAction().equals(Apg.Intent.ENCRYPT) || - intent.getAction().equals(Apg.Intent.ENCRYPT_FILE))) { - Bundle extras = intent.getExtras(); + mIntent = getIntent(); + if (mIntent.getAction() != null && + (mIntent.getAction().equals(Apg.Intent.ENCRYPT) || + mIntent.getAction().equals(Apg.Intent.ENCRYPT_FILE) || + mIntent.getAction().equals(Apg.Intent.ENCRYPT_AND_RETURN))) { + Bundle extras = mIntent.getExtras(); if (extras == null) { extras = new Bundle(); } @@ -318,7 +320,8 @@ public class EncryptActivity extends BaseActivity { } } - if (intent.getAction().equals(Apg.Intent.ENCRYPT)) { + if (mIntent.getAction().equals(Apg.Intent.ENCRYPT) || + mIntent.getAction().equals(Apg.Intent.ENCRYPT_AND_RETURN)) { if (data != null) { mMessage.setText(data); } @@ -327,7 +330,7 @@ public class EncryptActivity extends BaseActivity { while (mSource.getCurrentView().getId() != R.id.sourceMessage) { mSource.showNext(); } - } else if (intent.getAction().equals(Apg.Intent.ENCRYPT_FILE)) { + } else if (mIntent.getAction().equals(Apg.Intent.ENCRYPT_FILE)) { mSource.setInAnimation(null); mSource.setOutAnimation(null); while (mSource.getCurrentView().getId() != R.id.sourceFile) { @@ -339,6 +342,13 @@ public class EncryptActivity extends BaseActivity { updateView(); updateSource(); updateMode(); + + if (mMessage.getText().length() > 0 && + ((mEncryptionKeyIds != null && + mEncryptionKeyIds.length > 0) || + getSecretKeyId() > 0)) { + encryptClicked(); + } } private void openFile() { @@ -729,48 +739,56 @@ public class EncryptActivity extends BaseActivity { Toast.makeText(EncryptActivity.this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT).show(); return; - } else { - String message = Strings.fromUTF8ByteArray(data.getByteArray(Apg.EXTRA_ENCRYPTED_MESSAGE)); - switch (mEncryptTarget) { - case Id.target.clipboard: { - ClipboardManager clip = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - clip.setText(message); - Toast.makeText(this, R.string.encryptionToClipboardSuccessful, - Toast.LENGTH_SHORT).show(); - break; + } + String message = Strings.fromUTF8ByteArray(data.getByteArray(Apg.EXTRA_ENCRYPTED_MESSAGE)); + switch (mEncryptTarget) { + case Id.target.clipboard: { + ClipboardManager clip = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + clip.setText(message); + Toast.makeText(this, R.string.encryptionToClipboardSuccessful, + Toast.LENGTH_SHORT).show(); + break; + } + + case Id.target.email: { + if (mIntent.getAction() != null && + mIntent.getAction().equals(Apg.Intent.ENCRYPT_AND_RETURN)) { + Intent intent = new Intent(); + intent.putExtras(data); + setResult(RESULT_OK, intent); + finish(); + return; } - case Id.target.email: { - Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); - emailIntent.setType("text/plain; charset=utf-8"); - emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, message); - if (mSubject != null) { - emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, - mSubject); - } - if (mSendTo != null) { - emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, - new String[] { mSendTo }); - } - EncryptActivity.this. - startActivity(Intent.createChooser(emailIntent, - getString(R.string.title_sendEmail))); - break; + Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); + emailIntent.setType("text/plain; charset=utf-8"); + emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, message); + if (mSubject != null) { + emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, + mSubject); } + if (mSendTo != null) { + emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, + new String[] { mSendTo }); + } + EncryptActivity.this. + startActivity(Intent.createChooser(emailIntent, + getString(R.string.title_sendEmail))); + break; + } - case Id.target.file: { - Toast.makeText(this, R.string.encryptionSuccessful, Toast.LENGTH_SHORT).show(); - if (mDeleteAfter.isChecked()) { - setDeleteFile(mInputFilename); - showDialog(Id.dialog.delete_file); - } - break; + case Id.target.file: { + Toast.makeText(this, R.string.encryptionSuccessful, Toast.LENGTH_SHORT).show(); + if (mDeleteAfter.isChecked()) { + setDeleteFile(mInputFilename); + showDialog(Id.dialog.delete_file); } + break; + } - default: { - // shouldn't happen - break; - } + default: { + // shouldn't happen + break; } } }