diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java index 5ef20bfbb..538e591df 100644 --- a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java @@ -22,36 +22,36 @@ import java.util.Arrays; public class ApgData implements Serializable { private static final long serialVersionUID = 6314045536270848410L; - protected long mEncryptionKeyIds[] = null; - protected long mSignatureKeyId = 0; - protected String mSignatureUserId = null; + protected long mPublicKeyIds[] = null; + protected long mSecretKeyId = 0; + protected String mSecretKeyUserId = null; protected boolean mSignatureSuccess = false; protected boolean mSignatureUnknown = false; protected String mDecryptedData = null; protected String mEncryptedData = null; - public void setSignatureKeyId(long keyId) { - mSignatureKeyId = keyId; + public void setSecretKeyId(long keyId) { + mSecretKeyId = keyId; } - public long getSignatureKeyId() { - return mSignatureKeyId; + public long getSecretKeyId() { + return mSecretKeyId; } - public void setEncryptionKeys(long keyIds[]) { - mEncryptionKeyIds = keyIds; + public void setPublicKeys(long keyIds[]) { + mPublicKeyIds = keyIds; } - public long[] getEncryptionKeys() { - return mEncryptionKeyIds; + public long[] getPublicKeys() { + return mPublicKeyIds; } - public boolean hasSignatureKey() { - return mSignatureKeyId != 0; + public boolean hasSecretKey() { + return mSecretKeyId != 0; } - public boolean hasEncryptionKeys() { - return (mEncryptionKeyIds != null) && (mEncryptionKeyIds.length > 0); + public boolean hasPublicKeys() { + return (mPublicKeyIds != null) && (mPublicKeyIds.length > 0); } public String getEncryptedData() { @@ -70,12 +70,12 @@ public class ApgData implements Serializable { mDecryptedData = data; } - public void setSignatureUserId(String userId) { - mSignatureUserId = userId; + public void setSecretKeyUserId(String userId) { + mSecretKeyUserId = userId; } - public String getSignatureUserId() { - return mSignatureUserId; + public String getSecretKeyUserId() { + return mSecretKeyUserId; } public boolean getSignatureSuccess() { @@ -96,11 +96,11 @@ public class ApgData implements Serializable { @Override public String toString() { - String output = "mEncryptionKeyIds: " + Arrays.toString(mEncryptionKeyIds) - + "\nmSignatureKeyId: " + mSignatureKeyId + "\nmSignatureUserId: " - + mSignatureUserId + "\nmSignatureSuccess: " + mSignatureSuccess - + "\nmSignatureUnknown: " + mSignatureUnknown + "\nmDecryptedData: " - + mDecryptedData + "\nmEncryptedData: " + mEncryptedData; + String output = "mPublicKeyIds: " + Arrays.toString(mPublicKeyIds) + "\nmSecretKeyId: " + + mSecretKeyId + "\nmSecretKeyUserId: " + mSecretKeyUserId + + "\nmSignatureSuccess: " + mSignatureSuccess + "\nmSignatureUnknown: " + + mSignatureUnknown + "\nmDecryptedData: " + mDecryptedData + "\nmEncryptedData: " + + mEncryptedData; return output; } diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java index 09a544f26..cbd438f2f 100644 --- a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java @@ -27,12 +27,32 @@ public class ApgIntentHelper { public static final String APG_INTENT_PREFIX = "org.thialfihar.android.apg.intent."; // Intents - public static final String ACTION_DECRYPT = APG_INTENT_PREFIX + "DECRYPT"; + /** + * Encrypt + */ + // without permission public static final String ACTION_ENCRYPT = APG_INTENT_PREFIX + "ENCRYPT"; - public static final String ACTION_DECRYPT_FILE = APG_INTENT_PREFIX + "DECRYPT_FILE"; public static final String ACTION_ENCRYPT_FILE = APG_INTENT_PREFIX + "ENCRYPT_FILE"; - public static final String ACTION_DECRYPT_AND_RETURN = APG_INTENT_PREFIX + "DECRYPT_AND_RETURN"; + + // with permission public static final String ACTION_ENCRYPT_AND_RETURN = APG_INTENT_PREFIX + "ENCRYPT_AND_RETURN"; + public static final String ACTION_GENERATE_SIGNATURE_AND_RETURN = APG_INTENT_PREFIX + + "GENERATE_SIGNATURE_AND_RETURN"; + public static final String ACTION_ENCRYPT_STREAM_AND_RETURN = APG_INTENT_PREFIX + + "ENCRYPT_STREAM_AND_RETURN"; + + /** + * Decrypt + */ + // without permission + public static final String ACTION_DECRYPT = APG_INTENT_PREFIX + "DECRYPT"; + public static final String ACTION_DECRYPT_FILE = APG_INTENT_PREFIX + "DECRYPT_FILE"; + + // with permission + public static final String ACTION_DECRYPT_AND_RETURN = APG_INTENT_PREFIX + "DECRYPT_AND_RETURN"; + public static final String ACTION_DECRYPT_STREAM_AND_RETURN = APG_INTENT_PREFIX + + "DECRYPT_STREAM_AND_RETURN"; + public static final String ACTION_SELECT_PUBLIC_KEYS = APG_INTENT_PREFIX + "SELECT_PUBLIC_KEYS"; public static final String ACTION_SELECT_SECRET_KEY = APG_INTENT_PREFIX + "SELECT_SECRET_KEY"; public static final String ACTION_CREATE_KEY = APG_INTENT_PREFIX + "CREATE_KEY"; @@ -60,15 +80,19 @@ public class ApgIntentHelper { public static final String RESULT_EXTRA_MASTER_KEY_IDS = "masterKeyIds"; public static final String RESULT_EXTRA_USER_IDS = "userIds"; + + // result from EditKey + public static final String RESULT_EXTRA_MASTER_KEY_ID = "masterKeyId"; + public static final String RESULT_EXTRA_USER_ID = "userId"; public static final String INTENT_VERSION = "1"; - public static final int DECRYPT_MESSAGE = 0x21070001; - public static final int ENCRYPT_MESSAGE = 0x21070002; - public static final int SELECT_PUBLIC_KEYS = 0x21070003; - public static final int SELECT_SECRET_KEY = 0x21070004; - public static final int CREATE_KEY = 0x21070005; - public static final int EDIT_KEY = 0x21070006; + public static final int DECRYPT_MESSAGE = 0x00007121; + public static final int ENCRYPT_MESSAGE = 0x00007122; + public static final int SELECT_PUBLIC_KEYS = 0x00007123; + public static final int SELECT_SECRET_KEY = 0x00007124; + public static final int CREATE_KEY = 0x00007125; + public static final int EDIT_KEY = 0x00007126; private Activity activity; @@ -221,44 +245,53 @@ public class ApgIntentHelper { public boolean onActivityResult(int requestCode, int resultCode, Intent data, ApgData apgData) { switch (requestCode) { + case CREATE_KEY: + if (resultCode != Activity.RESULT_OK || data == null) { + // user canceled! + break; + } + apgData.setSecretKeyId(data.getLongExtra(RESULT_EXTRA_MASTER_KEY_ID, 0)); + apgData.setSecretKeyUserId(data.getStringExtra(RESULT_EXTRA_USER_ID)); + + break; case SELECT_SECRET_KEY: if (resultCode != Activity.RESULT_OK || data == null) { // user canceled! break; } - apgData.setSignatureKeyId(data.getLongExtra(EXTRA_KEY_ID, 0)); - apgData.setSignatureUserId(data.getStringExtra(EXTRA_USER_ID)); - break; + apgData.setSecretKeyId(data.getLongExtra(EXTRA_KEY_ID, 0)); + apgData.setSecretKeyUserId(data.getStringExtra(EXTRA_USER_ID)); + break; case SELECT_PUBLIC_KEYS: if (resultCode != Activity.RESULT_OK || data == null) { - apgData.setEncryptionKeys(null); + apgData.setPublicKeys(null); break; } - apgData.setEncryptionKeys(data.getLongArrayExtra(RESULT_EXTRA_MASTER_KEY_IDS)); - break; + apgData.setPublicKeys(data.getLongArrayExtra(RESULT_EXTRA_MASTER_KEY_IDS)); + break; case ENCRYPT_MESSAGE: if (resultCode != Activity.RESULT_OK || data == null) { - apgData.setEncryptionKeys(null); + apgData.setPublicKeys(null); break; } apgData.setEncryptedData(data.getStringExtra(EXTRA_ENCRYPTED_MESSAGE)); - break; + break; case DECRYPT_MESSAGE: if (resultCode != Activity.RESULT_OK || data == null) { break; } - apgData.setSignatureUserId(data.getStringExtra(EXTRA_SIGNATURE_USER_ID)); - apgData.setSignatureKeyId(data.getLongExtra(EXTRA_SIGNATURE_KEY_ID, 0)); + apgData.setSecretKeyUserId(data.getStringExtra(EXTRA_SIGNATURE_USER_ID)); + apgData.setSecretKeyId(data.getLongExtra(EXTRA_SIGNATURE_KEY_ID, 0)); apgData.setSignatureSuccess(data.getBooleanExtra(EXTRA_SIGNATURE_SUCCESS, false)); apgData.setSignatureUnknown(data.getBooleanExtra(EXTRA_SIGNATURE_UNKNOWN, false)); apgData.setDecryptedData(data.getStringExtra(EXTRA_DECRYPTED_MESSAGE)); - break; + break; default: return false; } @@ -273,8 +306,8 @@ public class ApgIntentHelper { * The emails that should be used for preselection. * @return true when activity was found and executed successfully */ - public boolean selectEncryptionKeys(String emails) { - return selectEncryptionKeys(emails, null); + public boolean selectPublicKeys(String emails) { + return selectPublicKeys(emails, null); } /** @@ -286,19 +319,17 @@ public class ApgIntentHelper { * ApgData with encryption keys and signature keys preselected * @return true when activity was found and executed successfully */ - public boolean selectEncryptionKeys(String emails, ApgData apgData) { + public boolean selectPublicKeys(String emails, ApgData apgData) { Intent intent = new Intent(ACTION_SELECT_PUBLIC_KEYS); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); long[] initialKeyIds = null; - if (apgData == null || !apgData.hasEncryptionKeys()) { - + if (apgData == null || !apgData.hasPublicKeys()) { ApgContentProviderHelper cPHelper = new ApgContentProviderHelper(activity); initialKeyIds = cPHelper.getPublicKeyIdsFromEmail(emails); - } else { - initialKeyIds = apgData.getEncryptionKeys(); + initialKeyIds = apgData.getPublicKeys(); } intent.putExtra(EXTRA_SELECTION, initialKeyIds); diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/Util.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgUtil.java similarity index 73% rename from APG-API-Lib/src/org/thialfihar/android/apg/integration/Util.java rename to APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgUtil.java index 01c6bb699..a8a01f913 100644 --- a/APG-API-Lib/src/org/thialfihar/android/apg/integration/Util.java +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgUtil.java @@ -23,7 +23,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.widget.Toast; -public class Util { +public class ApgUtil { /** * Check whether APG is installed and at a high enough version. @@ -48,4 +48,25 @@ public class Util { return false; } + + /** + * Splits userId string into naming part and email part + * + * @param userId + * @return array with naming (0) and email (1) + */ + public static String[] splitUserId(String userId) { + String[] output = new String[2]; + + String chunks[] = userId.split(" <", 2); + userId = chunks[0]; + if (chunks.length > 1) { + output[1] = "<" + chunks[1]; + output[1] = output[1].replaceAll("<", ""); + output[1] = output[1].replaceAll(">", ""); + } + output[0] = userId; + + return output; + } } diff --git a/APG/AndroidManifest.xml b/APG/AndroidManifest.xml index 1361d3318..ea5dcb1f8 100644 --- a/APG/AndroidManifest.xml +++ b/APG/AndroidManifest.xml @@ -77,7 +77,7 @@ android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" - android:theme="@style/Theme.Sherlock.Light.ForceOverflow" > + android:theme="@style/Theme.Sherlock.Light" > - - - - - - - - - - - - - - - - - - - - diff --git a/APG/android-libs/ActionBarSherlock/src/android/support/v4/app/_ActionBarSherlockTrojanHorse.java b/APG/android-libs/ActionBarSherlock/src/android/support/v4/app/_ActionBarSherlockTrojanHorse.java deleted file mode 100644 index 3e3db62b7..000000000 --- a/APG/android-libs/ActionBarSherlock/src/android/support/v4/app/_ActionBarSherlockTrojanHorse.java +++ /dev/null @@ -1,144 +0,0 @@ -package android.support.v4.app; - -import android.util.Log; -import android.view.View; -import android.view.Window; -import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; -import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; -import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; - -import java.util.ArrayList; - -/** I'm in ur package. Stealing ur variables. */ -public abstract class _ActionBarSherlockTrojanHorse extends FragmentActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener { - private static final boolean DEBUG = false; - private static final String TAG = "_ActionBarSherlockTrojanHorse"; - - /** Fragment interface for menu creation callback. */ - public interface OnCreateOptionsMenuListener { - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater); - } - /** Fragment interface for menu preparation callback. */ - public interface OnPrepareOptionsMenuListener { - public void onPrepareOptionsMenu(Menu menu); - } - /** Fragment interface for menu item selection callback. */ - public interface OnOptionsItemSelectedListener { - public boolean onOptionsItemSelected(MenuItem item); - } - - private ArrayList mCreatedMenus; - - - /////////////////////////////////////////////////////////////////////////// - // Sherlock menu handling - /////////////////////////////////////////////////////////////////////////// - - @Override - public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean result = onCreateOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] activity create result: " + result); - - MenuInflater inflater = getSupportMenuInflater(); - boolean show = false; - ArrayList newMenus = null; - if (mFragments.mActive != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnCreateOptionsMenuListener) { - show = true; - ((OnCreateOptionsMenuListener)f).onCreateOptionsMenu(menu, inflater); - if (newMenus == null) { - newMenus = new ArrayList(); - } - newMenus.add(f); - } - } - } - - if (mCreatedMenus != null) { - for (int i = 0; i < mCreatedMenus.size(); i++) { - Fragment f = mCreatedMenus.get(i); - if (newMenus == null || !newMenus.contains(f)) { - f.onDestroyOptionsMenu(); - } - } - } - - mCreatedMenus = newMenus; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); - result |= show; - - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); - return result; - } - return false; - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - boolean result = onPrepareOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onPreparePanel] activity prepare result: " + result); - - boolean show = false; - if (mFragments.mActive != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnPrepareOptionsMenuListener) { - show = true; - ((OnPrepareOptionsMenuListener)f).onPrepareOptionsMenu(menu); - } - } - } - - if (DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); - result |= show; - - result &= menu.hasVisibleItems(); - if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); - return result; - } - return false; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); - - if (featureId == Window.FEATURE_OPTIONS_PANEL) { - if (onOptionsItemSelected(item)) { - return true; - } - - if (mFragments.mActive != null) { - for (int i = 0; i < mFragments.mAdded.size(); i++) { - Fragment f = mFragments.mAdded.get(i); - if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnOptionsItemSelectedListener) { - if (((OnOptionsItemSelectedListener)f).onOptionsItemSelected(item)) { - return true; - } - } - } - } - } - return false; - } - - public abstract boolean onCreateOptionsMenu(Menu menu); - - public abstract boolean onPrepareOptionsMenu(Menu menu); - - public abstract boolean onOptionsItemSelected(MenuItem item); - - public abstract MenuInflater getSupportMenuInflater(); -} diff --git a/APG/android-libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemMule.java b/APG/android-libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemMule.java deleted file mode 100644 index 5a8099832..000000000 --- a/APG/android-libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuItemMule.java +++ /dev/null @@ -1,234 +0,0 @@ -package com.actionbarsherlock.internal.view.menu; - -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.view.ActionProvider; -import android.view.MenuItem; -import android.view.SubMenu; -import android.view.View; -import android.view.ContextMenu.ContextMenuInfo; - -/** Used to carry an instance of our version of MenuItem through a native channel. */ -public class MenuItemMule implements MenuItem { - private static final String ERROR = "Cannot interact with object designed for temporary " - + "instance passing. Make sure you using both SherlockFragmentActivity and " - + "SherlockFragment."; - - - private final com.actionbarsherlock.view.MenuItem mItem; - - public MenuItemMule(com.actionbarsherlock.view.MenuItem item) { - mItem = item; - } - - public com.actionbarsherlock.view.MenuItem unwrap() { - return mItem; - } - - - @Override - public boolean collapseActionView() { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean expandActionView() { - throw new IllegalStateException(ERROR); - } - - @Override - public ActionProvider getActionProvider() { - throw new IllegalStateException(ERROR); - } - - @Override - public View getActionView() { - throw new IllegalStateException(ERROR); - } - - @Override - public char getAlphabeticShortcut() { - throw new IllegalStateException(ERROR); - } - - @Override - public int getGroupId() { - throw new IllegalStateException(ERROR); - } - - @Override - public Drawable getIcon() { - throw new IllegalStateException(ERROR); - } - - @Override - public Intent getIntent() { - throw new IllegalStateException(ERROR); - } - - @Override - public int getItemId() { - throw new IllegalStateException(ERROR); - } - - @Override - public ContextMenuInfo getMenuInfo() { - throw new IllegalStateException(ERROR); - } - - @Override - public char getNumericShortcut() { - throw new IllegalStateException(ERROR); - } - - @Override - public int getOrder() { - throw new IllegalStateException(ERROR); - } - - @Override - public SubMenu getSubMenu() { - throw new IllegalStateException(ERROR); - } - - @Override - public CharSequence getTitle() { - throw new IllegalStateException(ERROR); - } - - @Override - public CharSequence getTitleCondensed() { - return mItem.getTitleCondensed(); - //throw new IllegalStateException(ERROR); - } - - @Override - public boolean hasSubMenu() { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean isActionViewExpanded() { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean isCheckable() { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean isChecked() { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean isEnabled() { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean isVisible() { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setActionProvider(ActionProvider arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setActionView(View arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setActionView(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setAlphabeticShortcut(char arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setCheckable(boolean arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setChecked(boolean arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setEnabled(boolean arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setIcon(Drawable arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setIcon(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setIntent(Intent arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setNumericShortcut(char arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setOnActionExpandListener(OnActionExpandListener arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setShortcut(char arg0, char arg1) { - throw new IllegalStateException(ERROR); - } - - @Override - public void setShowAsAction(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setShowAsActionFlags(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setTitle(CharSequence arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setTitle(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setTitleCondensed(CharSequence arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem setVisible(boolean arg0) { - throw new IllegalStateException(ERROR); - } -} diff --git a/APG/android-libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuMule.java b/APG/android-libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuMule.java deleted file mode 100644 index b2385b904..000000000 --- a/APG/android-libs/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuMule.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.actionbarsherlock.internal.view.menu; - -import android.content.ComponentName; -import android.content.Intent; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.SubMenu; - -/** Used to carry an instance of our version of Menu through a native channel. */ -public class MenuMule implements Menu { - private static final String ERROR = "Cannot interact with object designed for temporary " - + "instance passing. Make sure you using both SherlockFragmentActivity and " - + "SherlockFragment."; - - - private final com.actionbarsherlock.view.Menu mMenu; - public boolean mDispatchShow = false; - - public MenuMule(com.actionbarsherlock.view.Menu menu) { - mMenu = menu; - } - - public com.actionbarsherlock.view.Menu unwrap() { - return mMenu; - } - - - @Override - public MenuItem add(CharSequence arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem add(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem add(int arg0, int arg1, int arg2, CharSequence arg3) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem add(int arg0, int arg1, int arg2, int arg3) { - throw new IllegalStateException(ERROR); - } - - @Override - public int addIntentOptions(int arg0, int arg1, int arg2, - ComponentName arg3, Intent[] arg4, Intent arg5, int arg6, - MenuItem[] arg7) { - throw new IllegalStateException(ERROR); - } - - @Override - public SubMenu addSubMenu(CharSequence arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public SubMenu addSubMenu(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public SubMenu addSubMenu(int arg0, int arg1, int arg2, CharSequence arg3) { - throw new IllegalStateException(ERROR); - } - - @Override - public SubMenu addSubMenu(int arg0, int arg1, int arg2, int arg3) { - throw new IllegalStateException(ERROR); - } - - @Override - public void clear() { - throw new IllegalStateException(ERROR); - } - - @Override - public void close() { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem findItem(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public MenuItem getItem(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean hasVisibleItems() { - return mMenu.hasVisibleItems(); - //throw new IllegalStateException(ERROR); - } - - @Override - public boolean isShortcutKey(int arg0, KeyEvent arg1) { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean performIdentifierAction(int arg0, int arg1) { - throw new IllegalStateException(ERROR); - } - - @Override - public boolean performShortcut(int arg0, KeyEvent arg1, int arg2) { - throw new IllegalStateException(ERROR); - } - - @Override - public void removeGroup(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public void removeItem(int arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public void setGroupCheckable(int arg0, boolean arg1, boolean arg2) { - throw new IllegalStateException(ERROR); - } - - @Override - public void setGroupEnabled(int arg0, boolean arg1) { - throw new IllegalStateException(ERROR); - } - - @Override - public void setGroupVisible(int arg0, boolean arg1) { - throw new IllegalStateException(ERROR); - } - - @Override - public void setQwertyMode(boolean arg0) { - throw new IllegalStateException(ERROR); - } - - @Override - public int size() { - throw new IllegalStateException(ERROR); - } -} diff --git a/APG/res/values/strings.xml b/APG/res/values/strings.xml index 1360660c7..08e285299 100644 --- a/APG/res/values/strings.xml +++ b/APG/res/values/strings.xml @@ -22,8 +22,8 @@ Mail Inbox Manage Public Keys Manage Secret Keys - Select Recipients - Select Signature + Select Public Key + Select Secret Key Encrypt Decrypt Passphrase @@ -324,8 +324,8 @@ - Manage Keys - My Keys + Manage Public Keys + My Secret Keys Encrypt Decrypt Help diff --git a/APG/src/org/thialfihar/android/apg/service/ApgIntentService.java b/APG/src/org/thialfihar/android/apg/service/ApgIntentService.java index b50cb1789..e738b4193 100644 --- a/APG/src/org/thialfihar/android/apg/service/ApgIntentService.java +++ b/APG/src/org/thialfihar/android/apg/service/ApgIntentService.java @@ -98,37 +98,37 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd public static final int TARGET_STREAM = 3; // encrypt - public static final String SECRET_KEY_ID = "secretKeyId"; - public static final String USE_ASCII_AMOR = "useAsciiAmor"; - public static final String ENCRYPTION_KEYS_IDS = "encryptionKeysIds"; - public static final String COMPRESSION_ID = "compressionId"; - public static final String GENERATE_SIGNATURE = "generateSignature"; - public static final String SIGN_ONLY = "signOnly"; - public static final String MESSAGE_BYTES = "messageBytes"; - public static final String INPUT_FILE = "inputFile"; - public static final String OUTPUT_FILE = "outputFile"; - public static final String PROVIDER_URI = "providerUri"; + public static final String ENCRYPT_SECRET_KEY_ID = "secretKeyId"; + public static final String ENCRYPT_USE_ASCII_AMOR = "useAsciiAmor"; + public static final String ENCRYPT_ENCRYPTION_KEYS_IDS = "encryptionKeysIds"; + public static final String ENCRYPT_COMPRESSION_ID = "compressionId"; + public static final String ENCRYPT_GENERATE_SIGNATURE = "generateSignature"; + public static final String ENCRYPT_SIGN_ONLY = "signOnly"; + public static final String ENCRYPT_MESSAGE_BYTES = "messageBytes"; + public static final String ENCRYPT_INPUT_FILE = "inputFile"; + public static final String ENCRYPT_OUTPUT_FILE = "outputFile"; + public static final String ENCRYPT_PROVIDER_URI = "providerUri"; // decrypt/verify - public static final String SIGNED_ONLY = "signedOnly"; - public static final String RETURN_BYTES = "returnBinary"; - public static final String CIPHERTEXT_BYTES = "ciphertextBytes"; - public static final String ASSUME_SYMMETRIC = "assumeSymmetric"; - public static final String LOOKUP_UNKNOWN_KEY = "lookupUnknownKey"; + public static final String DECRYPT_SIGNED_ONLY = "signedOnly"; + public static final String DECRYPT_RETURN_BYTES = "returnBinary"; + public static final String DECRYPT_CIPHERTEXT_BYTES = "ciphertextBytes"; + public static final String DECRYPT_ASSUME_SYMMETRIC = "assumeSymmetric"; + public static final String DECRYPT_LOOKUP_UNKNOWN_KEY = "lookupUnknownKey"; - // edit keys - public static final String NEW_PASSPHRASE = "newPassphrase"; - public static final String CURRENT_PASSPHRASE = "currentPassphrase"; - public static final String USER_IDS = "userIds"; - public static final String KEYS = "keys"; - public static final String KEYS_USAGES = "keysUsages"; - public static final String MASTER_KEY_ID = "masterKeyId"; + // save keyring + public static final String SAVE_KEYRING_NEW_PASSPHRASE = "newPassphrase"; + public static final String SAVE_KEYRING_CURRENT_PASSPHRASE = "currentPassphrase"; + public static final String SAVE_KEYRING_USER_IDS = "userIds"; + public static final String SAVE_KEYRING_KEYS = "keys"; + public static final String SAVE_KEYRING_KEYS_USAGES = "keysUsages"; + public static final String SAVE_KEYRING_MASTER_KEY_ID = "masterKeyId"; // generate key - public static final String ALGORITHM = "algorithm"; - public static final String KEY_SIZE = "keySize"; - public static final String SYMMETRIC_PASSPHRASE = "passphrase"; - public static final String MASTER_KEY = "masterKey"; + public static final String GENERATE_KEY_ALGORITHM = "algorithm"; + public static final String GENERATE_KEY_KEY_SIZE = "keySize"; + public static final String GENERATE_KEY_SYMMETRIC_PASSPHRASE = "passphrase"; + public static final String GENERATE_KEY_MASTER_KEY = "masterKey"; // delete file securely public static final String DELETE_FILE = "deleteFile"; @@ -238,14 +238,14 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd /* Input */ int target = data.getInt(TARGET); - long secretKeyId = data.getLong(SECRET_KEY_ID); - String encryptionPassphrase = data.getString(SYMMETRIC_PASSPHRASE); + long secretKeyId = data.getLong(ENCRYPT_SECRET_KEY_ID); + String encryptionPassphrase = data.getString(GENERATE_KEY_SYMMETRIC_PASSPHRASE); - boolean useAsciiArmor = data.getBoolean(USE_ASCII_AMOR); - long encryptionKeyIds[] = data.getLongArray(ENCRYPTION_KEYS_IDS); - int compressionId = data.getInt(COMPRESSION_ID); - boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); - boolean signOnly = data.getBoolean(SIGN_ONLY); + boolean useAsciiArmor = data.getBoolean(ENCRYPT_USE_ASCII_AMOR); + long encryptionKeyIds[] = data.getLongArray(ENCRYPT_ENCRYPTION_KEYS_IDS); + int compressionId = data.getInt(ENCRYPT_COMPRESSION_ID); + boolean generateSignature = data.getBoolean(ENCRYPT_GENERATE_SIGNATURE); + boolean signOnly = data.getBoolean(ENCRYPT_SIGN_ONLY); InputStream inStream = null; long inLength = -1; @@ -254,7 +254,7 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd String streamFilename = null; switch (target) { case TARGET_BYTES: /* encrypting bytes directly */ - byte[] bytes = data.getByteArray(MESSAGE_BYTES); + byte[] bytes = data.getByteArray(ENCRYPT_MESSAGE_BYTES); inStream = new ByteArrayInputStream(bytes); inLength = bytes.length; @@ -264,8 +264,8 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd break; case TARGET_FILE: /* encrypting file */ - String inputFile = data.getString(INPUT_FILE); - String outputFile = data.getString(OUTPUT_FILE); + String inputFile = data.getString(ENCRYPT_INPUT_FILE); + String outputFile = data.getString(ENCRYPT_OUTPUT_FILE); // check if storage is ready if (!FileHelper.isStorageMounted(inputFile) @@ -284,7 +284,7 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd break; case TARGET_STREAM: /* Encrypting stream from content uri */ - Uri providerUri = (Uri) data.getParcelable(PROVIDER_URI); + Uri providerUri = (Uri) data.getParcelable(ENCRYPT_PROVIDER_URI); // InputStream InputStream in = getContentResolver().openInputStream(providerUri); @@ -390,13 +390,13 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd /* Input */ int target = data.getInt(TARGET); - long secretKeyId = data.getLong(SECRET_KEY_ID); - byte[] bytes = data.getByteArray(CIPHERTEXT_BYTES); - boolean signedOnly = data.getBoolean(SIGNED_ONLY); - boolean returnBytes = data.getBoolean(RETURN_BYTES); - boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC); + long secretKeyId = data.getLong(ENCRYPT_SECRET_KEY_ID); + byte[] bytes = data.getByteArray(DECRYPT_CIPHERTEXT_BYTES); + boolean signedOnly = data.getBoolean(DECRYPT_SIGNED_ONLY); + boolean returnBytes = data.getBoolean(DECRYPT_RETURN_BYTES); + boolean assumeSymmetricEncryption = data.getBoolean(DECRYPT_ASSUME_SYMMETRIC); - boolean lookupUnknownKey = data.getBoolean(LOOKUP_UNKNOWN_KEY); + boolean lookupUnknownKey = data.getBoolean(DECRYPT_LOOKUP_UNKNOWN_KEY); InputStream inStream = null; long inLength = -1; @@ -414,8 +414,8 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd break; case TARGET_FILE: /* decrypting file */ - String inputFile = data.getString(INPUT_FILE); - String outputFile = data.getString(OUTPUT_FILE); + String inputFile = data.getString(ENCRYPT_INPUT_FILE); + String outputFile = data.getString(ENCRYPT_OUTPUT_FILE); // check if storage is ready if (!FileHelper.isStorageMounted(inputFile) @@ -437,7 +437,7 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd break; case TARGET_STREAM: /* decrypting stream from content uri */ - Uri providerUri = (Uri) data.getParcelable(PROVIDER_URI); + Uri providerUri = (Uri) data.getParcelable(ENCRYPT_PROVIDER_URI); // InputStream InputStream in = getContentResolver().openInputStream(providerUri); @@ -521,16 +521,16 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd try { /* Input */ - String oldPassPhrase = data.getString(CURRENT_PASSPHRASE); - String newPassPhrase = data.getString(NEW_PASSPHRASE); + String oldPassPhrase = data.getString(SAVE_KEYRING_CURRENT_PASSPHRASE); + String newPassPhrase = data.getString(SAVE_KEYRING_NEW_PASSPHRASE); if (newPassPhrase == null) { newPassPhrase = oldPassPhrase; } - ArrayList userIds = data.getStringArrayList(USER_IDS); + ArrayList userIds = data.getStringArrayList(SAVE_KEYRING_USER_IDS); ArrayList keys = PGPConversionHelper.BytesToPGPSecretKeyList(data - .getByteArray(KEYS)); - ArrayList keysUsages = data.getIntegerArrayList(KEYS_USAGES); - long masterKeyId = data.getLong(MASTER_KEY_ID); + .getByteArray(SAVE_KEYRING_KEYS)); + ArrayList keysUsages = data.getIntegerArrayList(SAVE_KEYRING_KEYS_USAGES); + long masterKeyId = data.getLong(SAVE_KEYRING_MASTER_KEY_ID); /* Operation */ PGPMain.buildSecretKey(this, userIds, keys, keysUsages, masterKeyId, oldPassPhrase, @@ -549,13 +549,13 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd try { /* Input */ - int algorithm = data.getInt(ALGORITHM); - String passphrase = data.getString(SYMMETRIC_PASSPHRASE); - int keysize = data.getInt(KEY_SIZE); + int algorithm = data.getInt(GENERATE_KEY_ALGORITHM); + String passphrase = data.getString(GENERATE_KEY_SYMMETRIC_PASSPHRASE); + int keysize = data.getInt(GENERATE_KEY_KEY_SIZE); PGPSecretKey masterKey = null; - if (data.containsKey(MASTER_KEY)) { + if (data.containsKey(GENERATE_KEY_MASTER_KEY)) { masterKey = PGPConversionHelper.BytesToPGPSecretKey(data - .getByteArray(MASTER_KEY)); + .getByteArray(GENERATE_KEY_MASTER_KEY)); } /* Operation */ @@ -580,7 +580,7 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd // generate one RSA 2048 key for signing and one subkey for encrypting! try { /* Input */ - String passphrase = data.getString(SYMMETRIC_PASSPHRASE); + String passphrase = data.getString(GENERATE_KEY_SYMMETRIC_PASSPHRASE); /* Operation */ PGPSecretKeyRing masterKeyRing = PGPMain.createKey(this, Id.choice.algorithm.rsa, @@ -739,7 +739,8 @@ public class ApgIntentService extends IntentService implements ProgressDialogUpd /* Operation */ HkpKeyServer server = new HkpKeyServer(keyServer); - PGPPublicKeyRing keyring = ProviderHelper.getPGPPublicKeyRingByRowId(this, keyRingRowId); + PGPPublicKeyRing keyring = ProviderHelper.getPGPPublicKeyRingByRowId(this, + keyRingRowId); if (keyring != null) { boolean uploaded = PGPMain.uploadKeyRingToServer(server, (PGPPublicKeyRing) keyring); diff --git a/APG/src/org/thialfihar/android/apg/service/ApgService.java b/APG/src/org/thialfihar/android/apg/service/ApgService.java index 9e618b545..a94887ba4 100644 --- a/APG/src/org/thialfihar/android/apg/service/ApgService.java +++ b/APG/src/org/thialfihar/android/apg/service/ApgService.java @@ -76,27 +76,27 @@ public class ApgService extends Service { } } - void encryptAndSignImplementation(byte[] inputBytes, String inputUri, boolean useAsciiArmor, - int compression, long[] encryptionKeyIds, String encryptionPassphrase, - int symmetricEncryptionAlgorithm, long signatureKeyId, int signatureHashAlgorithm, - boolean signatureForceV3, String signaturePassphrase, IApgEncryptDecryptHandler handler) - throws RemoteException { + private void encryptAndSignImplementation(byte[] inputBytes, String inputUri, + boolean useAsciiArmor, int compression, long[] encryptionKeyIds, + String encryptionPassphrase, int symmetricEncryptionAlgorithm, long signatureKeyId, + int signatureHashAlgorithm, boolean signatureForceV3, String signaturePassphrase, + IApgEncryptSignHandler handler) throws RemoteException { try { // TODO use inputUri - -// InputStream inStream = null; -// if (isBlob) { -// ContentResolver cr = getContentResolver(); -// try { -// inStream = cr.openInputStream(Uri.parse(pArgs.getString(arg.BLOB.name()))); -// } catch (Exception e) { -// Log.e(TAG, "... exception on opening blob", e); -// } -// } else { -// inStream = new ByteArrayInputStream(pArgs.getString(arg.MESSAGE.name()).getBytes()); -// } -// InputData in = new InputData(inStream, 0); // XXX Size second param? + + // InputStream inStream = null; + // if (isBlob) { + // ContentResolver cr = getContentResolver(); + // try { + // inStream = cr.openInputStream(Uri.parse(pArgs.getString(arg.BLOB.name()))); + // } catch (Exception e) { + // Log.e(TAG, "... exception on opening blob", e); + // } + // } else { + // inStream = new ByteArrayInputStream(pArgs.getString(arg.MESSAGE.name()).getBytes()); + // } + // InputData in = new InputData(inStream, 0); // XXX Size second param? // build InputData and write into OutputStream InputStream inputStream = new ByteArrayInputStream(inputBytes); @@ -110,20 +110,20 @@ public class ApgService extends Service { signatureKeyId, signatureHashAlgorithm, signatureForceV3, signaturePassphrase); output.close(); - -// if (isBlob) { -// ContentResolver cr = getContentResolver(); -// try { -// OutputStream outStream = cr.openOutputStream(Uri.parse(pArgs.getString(arg.BLOB -// .name()))); -// writeToOutputStream(new ByteArrayInputStream(out.toString().getBytes()), outStream); -// outStream.close(); -// } catch (Exception e) { -// Log.e(TAG, "... exception on writing blob", e); -// } -// } else { -// pReturn.putString(ret.RESULT.name(), out.toString()); -// } + + // if (isBlob) { + // ContentResolver cr = getContentResolver(); + // try { + // OutputStream outStream = cr.openOutputStream(Uri.parse(pArgs.getString(arg.BLOB + // .name()))); + // writeToOutputStream(new ByteArrayInputStream(out.toString().getBytes()), outStream); + // outStream.close(); + // } catch (Exception e) { + // Log.e(TAG, "... exception on writing blob", e); + // } + // } else { + // pReturn.putString(ret.RESULT.name(), out.toString()); + // } byte[] outputBytes = ((ByteArrayOutputStream) output).toByteArray(); @@ -140,8 +140,8 @@ public class ApgService extends Service { } } - public void decryptAndVerifyImplementation(byte[] inputBytes, String inputUri, - String passphrase, boolean assumeSymmetric, IApgEncryptDecryptHandler handler) + private void decryptAndVerifyImplementation(byte[] inputBytes, String inputUri, + String passphrase, boolean assumeSymmetric, IApgDecryptVerifyHandler handler) throws RemoteException { try { @@ -232,7 +232,7 @@ public class ApgService extends Service { @Override public void encryptAsymmetric(byte[] inputBytes, String inputUri, boolean useAsciiArmor, int compression, long[] encryptionKeyIds, int symmetricEncryptionAlgorithm, - IApgEncryptDecryptHandler handler) throws RemoteException { + IApgEncryptSignHandler handler) throws RemoteException { encryptAndSignImplementation(inputBytes, inputUri, useAsciiArmor, compression, encryptionKeyIds, null, symmetricEncryptionAlgorithm, Id.key.none, 0, false, @@ -242,7 +242,7 @@ public class ApgService extends Service { @Override public void encryptSymmetric(byte[] inputBytes, String inputUri, boolean useAsciiArmor, int compression, String encryptionPassphrase, int symmetricEncryptionAlgorithm, - IApgEncryptDecryptHandler handler) throws RemoteException { + IApgEncryptSignHandler handler) throws RemoteException { encryptAndSignImplementation(inputBytes, inputUri, useAsciiArmor, compression, null, encryptionPassphrase, symmetricEncryptionAlgorithm, Id.key.none, 0, false, @@ -253,8 +253,8 @@ public class ApgService extends Service { public void encryptAndSignAsymmetric(byte[] inputBytes, String inputUri, boolean useAsciiArmor, int compression, long[] encryptionKeyIds, int symmetricEncryptionAlgorithm, long signatureKeyId, int signatureHashAlgorithm, - boolean signatureForceV3, String signaturePassphrase, - IApgEncryptDecryptHandler handler) throws RemoteException { + boolean signatureForceV3, String signaturePassphrase, IApgEncryptSignHandler handler) + throws RemoteException { encryptAndSignImplementation(inputBytes, inputUri, useAsciiArmor, compression, encryptionKeyIds, null, symmetricEncryptionAlgorithm, signatureKeyId, @@ -265,8 +265,8 @@ public class ApgService extends Service { public void encryptAndSignSymmetric(byte[] inputBytes, String inputUri, boolean useAsciiArmor, int compression, String encryptionPassphrase, int symmetricEncryptionAlgorithm, long signatureKeyId, int signatureHashAlgorithm, - boolean signatureForceV3, String signaturePassphrase, - IApgEncryptDecryptHandler handler) throws RemoteException { + boolean signatureForceV3, String signaturePassphrase, IApgEncryptSignHandler handler) + throws RemoteException { encryptAndSignImplementation(inputBytes, inputUri, useAsciiArmor, compression, null, encryptionPassphrase, symmetricEncryptionAlgorithm, signatureKeyId, @@ -275,14 +275,14 @@ public class ApgService extends Service { @Override public void decryptAndVerifyAsymmetric(byte[] inputBytes, String inputUri, - String keyPassphrase, IApgEncryptDecryptHandler handler) throws RemoteException { + String keyPassphrase, IApgDecryptVerifyHandler handler) throws RemoteException { decryptAndVerifyImplementation(inputBytes, inputUri, keyPassphrase, false, handler); } @Override public void decryptAndVerifySymmetric(byte[] inputBytes, String inputUri, - String encryptionPassphrase, IApgEncryptDecryptHandler handler) + String encryptionPassphrase, IApgDecryptVerifyHandler handler) throws RemoteException { decryptAndVerifyImplementation(inputBytes, inputUri, encryptionPassphrase, true, diff --git a/APG/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl b/APG/src/org/thialfihar/android/apg/service/IApgDecryptVerifyHandler.aidl similarity index 82% rename from APG/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl rename to APG/src/org/thialfihar/android/apg/service/IApgDecryptVerifyHandler.aidl index 318e5f344..ad74340bf 100644 --- a/APG/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl +++ b/APG/src/org/thialfihar/android/apg/service/IApgDecryptVerifyHandler.aidl @@ -16,17 +16,15 @@ package org.thialfihar.android.apg.service; -interface IApgEncryptDecryptHandler { - /** - * Either output or streamUri is given. One of them is null - * - */ - oneway void onSuccessEncrypt(in byte[] outputBytes, in String outputUri); +interface IApgDecryptVerifyHandler { oneway void onSuccessDecrypt(in byte[] outputBytes, in String outputUri, in boolean signature, in long signatureKeyId, in String signatureUserId, in boolean signatureSuccess, in boolean signatureUnknown); + oneway void onSuccessVerify(in boolean signature, in long signatureKeyId, + in String signatureUserId, in boolean signatureSuccess, in boolean signatureUnknown); + oneway void onException(in int exceptionNumber, in String message); } \ No newline at end of file diff --git a/APG/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl b/APG/src/org/thialfihar/android/apg/service/IApgEncryptSignHandler.aidl similarity index 80% rename from APG/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl rename to APG/src/org/thialfihar/android/apg/service/IApgEncryptSignHandler.aidl index cc854e540..ea3e2ae86 100644 --- a/APG/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl +++ b/APG/src/org/thialfihar/android/apg/service/IApgEncryptSignHandler.aidl @@ -16,11 +16,14 @@ package org.thialfihar.android.apg.service; -interface IApgSignVerifyHandler { - oneway void onSuccessSign(in byte[] outputBytes, in String outputUri); +interface IApgEncryptSignHandler { + /** + * Either output or streamUri is given. One of them is null + * + */ + oneway void onSuccessEncrypt(in byte[] outputBytes, in String outputUri); - oneway void onSuccessVerify(in boolean signature, in long signatureKeyId, - in String signatureUserId, in boolean signatureSuccess, in boolean signatureUnknown); + oneway void onSuccessSign(in byte[] outputBytes, in String outputUri); oneway void onException(in int exceptionNumber, in String message); diff --git a/APG/src/org/thialfihar/android/apg/service/IApgService.aidl b/APG/src/org/thialfihar/android/apg/service/IApgService.aidl index 7753d1e3d..98c08c62b 100644 --- a/APG/src/org/thialfihar/android/apg/service/IApgService.aidl +++ b/APG/src/org/thialfihar/android/apg/service/IApgService.aidl @@ -16,8 +16,8 @@ package org.thialfihar.android.apg.service; -import org.thialfihar.android.apg.service.IApgEncryptDecryptHandler; -import org.thialfihar.android.apg.service.IApgSignVerifyHandler; +import org.thialfihar.android.apg.service.IApgEncryptSignHandler; +import org.thialfihar.android.apg.service.IApgDecryptVerifyHandler; import org.thialfihar.android.apg.service.IApgHelperHandler; /** @@ -50,7 +50,7 @@ interface IApgService { */ oneway void encryptAsymmetric(in byte[] inputBytes, in String inputUri, in boolean useAsciiArmor, in int compression, in long[] encryptionKeyIds, in int symmetricEncryptionAlgorithm, - in IApgEncryptDecryptHandler handler); + in IApgEncryptSignHandler handler); /** * Same as encryptAsymmetric but using a passphrase for symmetric encryption @@ -60,7 +60,7 @@ interface IApgService { */ oneway void encryptSymmetric(in byte[] inputBytes, in String inputUri, in boolean useAsciiArmor, in int compression, in String encryptionPassphrase, in int symmetricEncryptionAlgorithm, - in IApgEncryptDecryptHandler handler); + in IApgEncryptSignHandler handler); /** * Encrypt and sign @@ -97,7 +97,7 @@ interface IApgService { in boolean useAsciiArmor, in int compression, in long[] encryptionKeyIds, in int symmetricEncryptionAlgorithm, in long signatureKeyId, in int signatureHashAlgorithm, in boolean signatureForceV3, in String signaturePassphrase, - in IApgEncryptDecryptHandler handler); + in IApgEncryptSignHandler handler); /** * Same as encryptAndSignAsymmetric but using a passphrase for symmetric encryption @@ -109,7 +109,7 @@ interface IApgService { in boolean useAsciiArmor, in int compression, in String encryptionPassphrase, in int symmetricEncryptionAlgorithm, in long signatureKeyId, in int signatureHashAlgorithm, in boolean signatureForceV3, in String signaturePassphrase, - in IApgEncryptDecryptHandler handler); + in IApgEncryptSignHandler handler); /** * Decrypts and verifies given input bytes. If no signature is present this method @@ -125,7 +125,7 @@ interface IApgService { * Handler where to return results to after successful encryption */ oneway void decryptAndVerifyAsymmetric(in byte[] inputBytes, in String inputUri, - in String keyPassphrase, in IApgEncryptDecryptHandler handler); + in String keyPassphrase, in IApgDecryptVerifyHandler handler); /** * Same as decryptAndVerifyAsymmetric but for symmetric decryption. @@ -134,7 +134,7 @@ interface IApgService { * Passphrase to decrypt */ oneway void decryptAndVerifySymmetric(in byte[] inputBytes, in String inputUri, - in String encryptionPassphrase, in IApgEncryptDecryptHandler handler); + in String encryptionPassphrase, in IApgDecryptVerifyHandler handler); /** * diff --git a/APG/src/org/thialfihar/android/apg/ui/DecryptActivity.java b/APG/src/org/thialfihar/android/apg/ui/DecryptActivity.java index 21e75f7ea..3c4911420 100644 --- a/APG/src/org/thialfihar/android/apg/ui/DecryptActivity.java +++ b/APG/src/org/thialfihar/android/apg/ui/DecryptActivity.java @@ -68,16 +68,18 @@ import java.util.regex.Matcher; public class DecryptActivity extends SherlockFragmentActivity { - // possible intent actions for this activity + /* Intents */ + // without permission public static final String ACTION_DECRYPT = Constants.INTENT_PREFIX + "DECRYPT"; + public static final String ACTION_DECRYPT_FILE = Constants.INTENT_PREFIX + "DECRYPT_FILE"; + + // with permission public static final String ACTION_DECRYPT_AND_RETURN = Constants.INTENT_PREFIX + "DECRYPT_AND_RETURN"; - - public static final String ACTION_DECRYPT_FILE = Constants.INTENT_PREFIX + "DECRYPT_FILE"; public static final String ACTION_DECRYPT_STREAM_AND_RETURN = Constants.INTENT_PREFIX + "DECRYPT_STREAM_AND_RETURN"; - // possible extra keys + /* EXTRA keys for input */ public static final String EXTRA_TEXT = "text"; public static final String EXTRA_DATA = "data"; public static final String EXTRA_REPLY_TO = "replyTo"; @@ -755,32 +757,32 @@ public class DecryptActivity extends SherlockFragmentActivity { if (mContentUri != null) { data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_STREAM); - data.putParcelable(ApgIntentService.PROVIDER_URI, mContentUri); + data.putParcelable(ApgIntentService.ENCRYPT_PROVIDER_URI, mContentUri); } else if (mDecryptTarget == Id.target.file) { data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_FILE); Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename=" + mOutputFilename); - data.putString(ApgIntentService.INPUT_FILE, mInputFilename); - data.putString(ApgIntentService.OUTPUT_FILE, mOutputFilename); + data.putString(ApgIntentService.ENCRYPT_INPUT_FILE, mInputFilename); + data.putString(ApgIntentService.ENCRYPT_OUTPUT_FILE, mOutputFilename); } else { data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_BYTES); if (mDataBytes != null) { - data.putByteArray(ApgIntentService.CIPHERTEXT_BYTES, mDataBytes); + data.putByteArray(ApgIntentService.DECRYPT_CIPHERTEXT_BYTES, mDataBytes); } else { String message = mMessage.getText().toString(); - data.putByteArray(ApgIntentService.CIPHERTEXT_BYTES, message.getBytes()); + data.putByteArray(ApgIntentService.DECRYPT_CIPHERTEXT_BYTES, message.getBytes()); } } - data.putLong(ApgIntentService.SECRET_KEY_ID, mSecretKeyId); + data.putLong(ApgIntentService.ENCRYPT_SECRET_KEY_ID, mSecretKeyId); - data.putBoolean(ApgIntentService.SIGNED_ONLY, mSignedOnly); - data.putBoolean(ApgIntentService.LOOKUP_UNKNOWN_KEY, mLookupUnknownKey); - data.putBoolean(ApgIntentService.RETURN_BYTES, mReturnBinary); - data.putBoolean(ApgIntentService.ASSUME_SYMMETRIC, mAssumeSymmetricEncryption); + data.putBoolean(ApgIntentService.DECRYPT_SIGNED_ONLY, mSignedOnly); + data.putBoolean(ApgIntentService.DECRYPT_LOOKUP_UNKNOWN_KEY, mLookupUnknownKey); + data.putBoolean(ApgIntentService.DECRYPT_RETURN_BYTES, mReturnBinary); + data.putBoolean(ApgIntentService.DECRYPT_ASSUME_SYMMETRIC, mAssumeSymmetricEncryption); intent.putExtra(ApgIntentService.EXTRA_DATA, data); diff --git a/APG/src/org/thialfihar/android/apg/ui/EditKeyActivity.java b/APG/src/org/thialfihar/android/apg/ui/EditKeyActivity.java index 0e480a3ae..d4859cc86 100644 --- a/APG/src/org/thialfihar/android/apg/ui/EditKeyActivity.java +++ b/APG/src/org/thialfihar/android/apg/ui/EditKeyActivity.java @@ -25,6 +25,7 @@ import org.thialfihar.android.apg.helper.OtherHelper; import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.helper.PGPMain; import org.thialfihar.android.apg.helper.PGPConversionHelper; +import org.thialfihar.android.apg.helper.PGPMain.ApgGeneralException; import org.thialfihar.android.apg.provider.ProviderHelper; import org.thialfihar.android.apg.service.ApgIntentServiceHandler; import org.thialfihar.android.apg.service.ApgIntentService; @@ -75,6 +76,10 @@ public class EditKeyActivity extends SherlockFragmentActivity { public static final String EXTRA_GENERATE_DEFAULT_KEYS = "generateDefaultKeys"; public static final String EXTRA_KEY_ID = "keyId"; + // results when saving key + public static final String RESULT_EXTRA_MASTER_KEY_ID = "masterKeyId"; + public static final String RESULT_EXTRA_USER_ID = "userId"; + private ActionBar mActionBar; private PGPSecretKeyRing mKeyRing = null; @@ -121,7 +126,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { return true; case Id.menu.option.cancel: - finish(); + cancelClicked(); return true; default: @@ -236,7 +241,8 @@ public class EditKeyActivity extends SherlockFragmentActivity { // fill values for this action Bundle data = new Bundle(); - data.putString(ApgIntentService.SYMMETRIC_PASSPHRASE, mCurrentPassPhrase); + data.putString(ApgIntentService.GENERATE_KEY_SYMMETRIC_PASSPHRASE, + mCurrentPassPhrase); serviceIntent.putExtra(ApgIntentService.EXTRA_DATA, data); @@ -424,14 +430,16 @@ public class EditKeyActivity extends SherlockFragmentActivity { // fill values for this action Bundle data = new Bundle(); - data.putString(ApgIntentService.CURRENT_PASSPHRASE, mCurrentPassPhrase); - data.putString(ApgIntentService.NEW_PASSPHRASE, mNewPassPhrase); - data.putStringArrayList(ApgIntentService.USER_IDS, getUserIds(mUserIdsView)); + data.putString(ApgIntentService.SAVE_KEYRING_CURRENT_PASSPHRASE, mCurrentPassPhrase); + data.putString(ApgIntentService.SAVE_KEYRING_NEW_PASSPHRASE, mNewPassPhrase); + data.putStringArrayList(ApgIntentService.SAVE_KEYRING_USER_IDS, + getUserIds(mUserIdsView)); ArrayList keys = getKeys(mKeysView); - data.putByteArray(ApgIntentService.KEYS, + data.putByteArray(ApgIntentService.SAVE_KEYRING_KEYS, PGPConversionHelper.PGPSecretKeyArrayListToBytes(keys)); - data.putIntegerArrayList(ApgIntentService.KEYS_USAGES, getKeysUsages(mKeysView)); - data.putLong(ApgIntentService.MASTER_KEY_ID, getMasterKeyId()); + data.putIntegerArrayList(ApgIntentService.SAVE_KEYRING_KEYS_USAGES, + getKeysUsages(mKeysView)); + data.putLong(ApgIntentService.SAVE_KEYRING_MASTER_KEY_ID, getMasterKeyId()); intent.putExtra(ApgIntentService.EXTRA_DATA, data); @@ -443,6 +451,16 @@ public class EditKeyActivity extends SherlockFragmentActivity { super.handleMessage(message); if (message.arg1 == ApgIntentServiceHandler.MESSAGE_OKAY) { + Intent data = new Intent(); + data.putExtra(RESULT_EXTRA_MASTER_KEY_ID, getMasterKeyId()); + ArrayList userIds = null; + try { + userIds = getUserIds(mUserIdsView); + } catch (ApgGeneralException e) { + Log.e(Constants.TAG, "exception while getting user ids", e); + } + data.putExtra(RESULT_EXTRA_USER_ID, userIds.get(0)); + setResult(RESULT_OK, data); finish(); } }; @@ -462,6 +480,11 @@ public class EditKeyActivity extends SherlockFragmentActivity { } } + private void cancelClicked() { + setResult(RESULT_CANCELED); + finish(); + } + /** * Returns user ids from the SectionView * diff --git a/APG/src/org/thialfihar/android/apg/ui/EncryptActivity.java b/APG/src/org/thialfihar/android/apg/ui/EncryptActivity.java index 6ff97a796..3014892a3 100644 --- a/APG/src/org/thialfihar/android/apg/ui/EncryptActivity.java +++ b/APG/src/org/thialfihar/android/apg/ui/EncryptActivity.java @@ -70,18 +70,20 @@ import java.util.Vector; public class EncryptActivity extends SherlockFragmentActivity { - // possible intent actions for this activity + /* Intents */ + // without permission public static final String ACTION_ENCRYPT = Constants.INTENT_PREFIX + "ENCRYPT"; + public static final String ACTION_ENCRYPT_FILE = Constants.INTENT_PREFIX + "ENCRYPT_FILE"; + + // with permission public static final String ACTION_ENCRYPT_AND_RETURN = Constants.INTENT_PREFIX + "ENCRYPT_AND_RETURN"; public static final String ACTION_GENERATE_SIGNATURE_AND_RETURN = Constants.INTENT_PREFIX - + "GENERATE_SIGNATURE"; - - public static final String ACTION_ENCRYPT_FILE = Constants.INTENT_PREFIX + "ENCRYPT_FILE"; + + "GENERATE_SIGNATURE_AND_RETURN"; public static final String ACTION_ENCRYPT_STREAM_AND_RETURN = Constants.INTENT_PREFIX + "ENCRYPT_STREAM_AND_RETURN"; - // possible extra keys + /* EXTRA keys for input */ public static final String EXTRA_TEXT = "text"; public static final String EXTRA_DATA = "data"; public static final String EXTRA_ASCII_ARMOUR = "asciiArmour"; @@ -339,7 +341,7 @@ public class EncryptActivity extends SherlockFragmentActivity { } else if (ACTION_ENCRYPT_STREAM_AND_RETURN.equals(action)) { // TODO: Set mStreamAndReturnUri that is used later to encrypt a stream! - mStreamAndReturnUri = null; + mStreamAndReturnUri = uri; } } @@ -684,7 +686,7 @@ public class EncryptActivity extends SherlockFragmentActivity { passPhrase = null; } - data.putString(ApgIntentService.SYMMETRIC_PASSPHRASE, passPhrase); + data.putString(ApgIntentService.GENERATE_KEY_SYMMETRIC_PASSPHRASE, passPhrase); } else { encryptionKeyIds = mEncryptionKeyIds; signOnly = (mEncryptionKeyIds == null || mEncryptionKeyIds.length == 0); @@ -696,7 +698,7 @@ public class EncryptActivity extends SherlockFragmentActivity { if (mStreamAndReturnUri != null) { // mIntentDataUri is only defined when ACTION_ENCRYPT_STREAM_AND_RETURN is used data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_STREAM); - data.putParcelable(ApgIntentService.PROVIDER_URI, mStreamAndReturnUri); + data.putParcelable(ApgIntentService.ENCRYPT_PROVIDER_URI, mStreamAndReturnUri); } else if (mEncryptTarget == Id.target.file) { useAsciiArmor = mAsciiArmour.isChecked(); @@ -707,8 +709,8 @@ public class EncryptActivity extends SherlockFragmentActivity { Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename=" + mOutputFilename); - data.putString(ApgIntentService.INPUT_FILE, mInputFilename); - data.putString(ApgIntentService.OUTPUT_FILE, mOutputFilename); + data.putString(ApgIntentService.ENCRYPT_INPUT_FILE, mInputFilename); + data.putString(ApgIntentService.ENCRYPT_OUTPUT_FILE, mOutputFilename); } else { useAsciiArmor = true; @@ -717,13 +719,13 @@ public class EncryptActivity extends SherlockFragmentActivity { data.putInt(ApgIntentService.TARGET, ApgIntentService.TARGET_BYTES); if (mData != null) { - data.putByteArray(ApgIntentService.MESSAGE_BYTES, mData); + data.putByteArray(ApgIntentService.ENCRYPT_MESSAGE_BYTES, mData); } else { String message = mMessage.getText().toString(); if (signOnly && !mEncryptImmediately) { fixBadCharactersForGmail(message); } - data.putByteArray(ApgIntentService.MESSAGE_BYTES, message.getBytes()); + data.putByteArray(ApgIntentService.ENCRYPT_MESSAGE_BYTES, message.getBytes()); } } @@ -731,12 +733,12 @@ public class EncryptActivity extends SherlockFragmentActivity { useAsciiArmor = mAsciiArmorDemand; } - data.putLong(ApgIntentService.SECRET_KEY_ID, mSecretKeyId); - data.putBoolean(ApgIntentService.USE_ASCII_AMOR, useAsciiArmor); - data.putLongArray(ApgIntentService.ENCRYPTION_KEYS_IDS, encryptionKeyIds); - data.putInt(ApgIntentService.COMPRESSION_ID, compressionId); - data.putBoolean(ApgIntentService.GENERATE_SIGNATURE, mGenerateSignature); - data.putBoolean(ApgIntentService.SIGN_ONLY, signOnly); + data.putLong(ApgIntentService.ENCRYPT_SECRET_KEY_ID, mSecretKeyId); + data.putBoolean(ApgIntentService.ENCRYPT_USE_ASCII_AMOR, useAsciiArmor); + data.putLongArray(ApgIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS, encryptionKeyIds); + data.putInt(ApgIntentService.ENCRYPT_COMPRESSION_ID, compressionId); + data.putBoolean(ApgIntentService.ENCRYPT_GENERATE_SIGNATURE, mGenerateSignature); + data.putBoolean(ApgIntentService.ENCRYPT_SIGN_ONLY, signOnly); intent.putExtra(ApgIntentService.EXTRA_DATA, data); diff --git a/APG/src/org/thialfihar/android/apg/ui/KeyListActivity.java b/APG/src/org/thialfihar/android/apg/ui/KeyListActivity.java index b36300769..2dc09d545 100644 --- a/APG/src/org/thialfihar/android/apg/ui/KeyListActivity.java +++ b/APG/src/org/thialfihar/android/apg/ui/KeyListActivity.java @@ -281,7 +281,7 @@ public class KeyListActivity extends SherlockFragmentActivity { @Override public void handleMessage(Message message) { if (message.what == DeleteKeyDialogFragment.MESSAGE_OKAY) { - // refreshList(); + // no further actions needed } } }; @@ -368,8 +368,6 @@ public class KeyListActivity extends SherlockFragmentActivity { .newInstance(mImportFilename); deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog"); } - // refreshList(); - } }; }; diff --git a/APG/src/org/thialfihar/android/apg/ui/widget/SectionView.java b/APG/src/org/thialfihar/android/apg/ui/widget/SectionView.java index 45fbbaba1..c7e8087cb 100644 --- a/APG/src/org/thialfihar/android/apg/ui/widget/SectionView.java +++ b/APG/src/org/thialfihar/android/apg/ui/widget/SectionView.java @@ -262,14 +262,14 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor passPhrase = PassphraseCacheService .getCachedPassphrase(mActivity, masterKey.getKeyID()); - data.putByteArray(ApgIntentService.MASTER_KEY, + data.putByteArray(ApgIntentService.GENERATE_KEY_MASTER_KEY, PGPConversionHelper.PGPSecretKeyToBytes(masterKey)); } else { passPhrase = ""; } - data.putString(ApgIntentService.SYMMETRIC_PASSPHRASE, passPhrase); - data.putInt(ApgIntentService.ALGORITHM, mNewKeyAlgorithmChoice.getId()); - data.putInt(ApgIntentService.KEY_SIZE, mNewKeySize); + data.putString(ApgIntentService.GENERATE_KEY_SYMMETRIC_PASSPHRASE, passPhrase); + data.putInt(ApgIntentService.GENERATE_KEY_ALGORITHM, mNewKeyAlgorithmChoice.getId()); + data.putInt(ApgIntentService.GENERATE_KEY_KEY_SIZE, mNewKeySize); intent.putExtra(ApgIntentService.EXTRA_DATA, data);