From bf0104af2e25ddfe747a960a626e38ae8d203593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Sun, 21 Sep 2014 21:50:56 +0200 Subject: Feature to change key configuration in create key --- .../keychain/pgp/CanonicalizedPublicKeyRing.java | 1 - .../keychain/service/SaveKeyringParcel.java | 2 +- .../keychain/ui/CreateKeyFinalFragment.java | 61 +++++++++--- .../keychain/ui/EditKeyActivity.java | 18 +++- .../keychain/ui/EditKeyFragment.java | 109 +++++++++++++++------ .../keychain/ui/LogDisplayFragment.java | 2 + .../keychain/ui/adapter/SubkeysAddedAdapter.java | 9 ++ .../main/res/layout/create_key_final_fragment.xml | 48 +++++++++ OpenKeychain/src/main/res/values/strings.xml | 7 +- 9 files changed, 206 insertions(+), 51 deletions(-) (limited to 'OpenKeychain/src') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java index 2c27c5c37..77c967c65 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java @@ -18,7 +18,6 @@ package org.sufficientlysecure.keychain.pgp; -import org.spongycastle.bcpg.ArmoredOutputStream; import org.spongycastle.openpgp.PGPObjectFactory; import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKeyRing; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java index 4e06fc9f3..c4be467e4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java @@ -217,7 +217,7 @@ public class SaveKeyringParcel implements Parcelable { out += "mChangeSubKeys: " + mChangeSubKeys + "\n"; out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n"; out += "mRevokeUserIds: " + mRevokeUserIds + "\n"; - out += "mRevokeSubKeys: " + mRevokeSubKeys; + out += "mRevokeSubKeys: " + mRevokeSubKeys + "\n"; out += "mStripSubKeys: " + mStripSubKeys; return out; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java index 38c8eb464..a2775de7e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java @@ -47,6 +47,8 @@ import org.sufficientlysecure.keychain.util.Log; public class CreateKeyFinalFragment extends Fragment { + public static final int REQUEST_EDIT_KEY = 0x00008007; + CreateKeyActivity mCreateKeyActivity; TextView mNameEdit; @@ -54,6 +56,8 @@ public class CreateKeyFinalFragment extends Fragment { CheckBox mUploadCheckbox; View mBackButton; View mCreateButton; + TextView mEditText; + View mEditButton; public static final String ARG_NAME = "name"; public static final String ARG_EMAIL = "email"; @@ -63,6 +67,8 @@ public class CreateKeyFinalFragment extends Fragment { String mEmail; String mPassphrase; + SaveKeyringParcel mSaveKeyringParcel; + /** * Creates new instance of this fragment */ @@ -88,6 +94,8 @@ public class CreateKeyFinalFragment extends Fragment { mUploadCheckbox = (CheckBox) view.findViewById(R.id.create_key_upload); mBackButton = view.findViewById(R.id.create_key_back_button); mCreateButton = view.findViewById(R.id.create_key_create_button); + mEditText = (TextView) view.findViewById(R.id.create_key_edit_text); + mEditButton = view.findViewById(R.id.create_key_edit_button); // get args mName = getArguments().getString(ARG_NAME); @@ -112,14 +120,53 @@ public class CreateKeyFinalFragment extends Fragment { } }); + mEditButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent edit = new Intent(getActivity(), EditKeyActivity.class); + edit.putExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL, mSaveKeyringParcel); + startActivityForResult(edit, REQUEST_EDIT_KEY); + } + }); + return view; } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case REQUEST_EDIT_KEY: { + if (resultCode == Activity.RESULT_OK) { + mSaveKeyringParcel = data.getParcelableExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL); + mEditText.setText(R.string.create_key_custom); + } + break; + } + + default: + super.onActivityResult(requestCode, resultCode, data); + } + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mCreateKeyActivity = (CreateKeyActivity) getActivity(); + + if (mSaveKeyringParcel == null) { + mSaveKeyringParcel = new SaveKeyringParcel(); + mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd( + Algorithm.RSA, 4096, null, KeyFlags.CERTIFY_OTHER, 0L)); + mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd( + Algorithm.RSA, 4096, null, KeyFlags.SIGN_DATA, 0L)); + mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd( + Algorithm.RSA, 4096, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L)); + String userId = KeyRing.createUserId(mName, mEmail, null); + mSaveKeyringParcel.mAddUserIds.add(userId); + mSaveKeyringParcel.mChangePrimaryUserId = userId; + mSaveKeyringParcel.mNewPassphrase = mPassphrase; + } } private void createKey() { @@ -163,20 +210,8 @@ public class CreateKeyFinalFragment extends Fragment { // fill values for this action Bundle data = new Bundle(); - SaveKeyringParcel parcel = new SaveKeyringParcel(); - parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd( - Algorithm.RSA, 4096, null, KeyFlags.CERTIFY_OTHER, 0L)); - parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd( - Algorithm.RSA, 4096, null, KeyFlags.SIGN_DATA, 0L)); - parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd( - Algorithm.RSA, 4096, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L)); - String userId = KeyRing.createUserId(mName, mEmail, null); - parcel.mAddUserIds.add(userId); - parcel.mChangePrimaryUserId = userId; - parcel.mNewPassphrase = mPassphrase; - // get selected key entries - data.putParcelable(KeychainIntentService.EDIT_KEYRING_PARCEL, parcel); + data.putParcelable(KeychainIntentService.EDIT_KEYRING_PARCEL, mSaveKeyringParcel); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index 6ddaec17f..98049d89b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -23,10 +23,13 @@ import android.support.v7.app.ActionBarActivity; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.util.Log; public class EditKeyActivity extends ActionBarActivity { + public static final String EXTRA_SAVE_KEYRING_PARCEL = "save_keyring_parcel"; + private EditKeyFragment mEditKeyFragment; @Override @@ -36,16 +39,17 @@ public class EditKeyActivity extends ActionBarActivity { setContentView(R.layout.edit_key_activity); Uri dataUri = getIntent().getData(); - if (dataUri == null) { - Log.e(Constants.TAG, "Data missing. Should be Uri of key!"); + SaveKeyringParcel saveKeyringParcel = getIntent().getParcelableExtra(EXTRA_SAVE_KEYRING_PARCEL); + if (dataUri == null && saveKeyringParcel == null) { + Log.e(Constants.TAG, "Either a key Uri or EXTRA_SAVE_KEYRING_PARCEL is required!"); finish(); return; } - loadFragment(savedInstanceState, dataUri); + loadFragment(savedInstanceState, dataUri, saveKeyringParcel); } - private void loadFragment(Bundle savedInstanceState, Uri dataUri) { + private void loadFragment(Bundle savedInstanceState, Uri dataUri, SaveKeyringParcel saveKeyringParcel) { // However, if we're being restored from a previous state, // then we don't need to do anything and should return or else // we could end up with overlapping fragments. @@ -54,7 +58,11 @@ public class EditKeyActivity extends ActionBarActivity { } // Create an instance of the fragment - mEditKeyFragment = EditKeyFragment.newInstance(dataUri); + if (dataUri != null) { + mEditKeyFragment = EditKeyFragment.newInstance(dataUri); + } else { + mEditKeyFragment = EditKeyFragment.newInstance(saveKeyringParcel); + } // Add the fragment to the 'fragment_container' FrameLayout // NOTE: We use commitAllowingStateLoss() to prevent weird crashes! diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index 641e6e17e..e20d5e888 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -17,6 +17,7 @@ package org.sufficientlysecure.keychain.ui; +import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.database.Cursor; @@ -71,6 +72,7 @@ public class EditKeyFragment extends LoaderFragment implements LoaderManager.LoaderCallbacks { public static final String ARG_DATA_URI = "uri"; + public static final String ARG_SAVE_KEYRING_PARCEL = "save_keyring_parcel"; private ListView mUserIdsList; private ListView mSubkeysList; @@ -112,6 +114,17 @@ public class EditKeyFragment extends LoaderFragment implements return frag; } + public static EditKeyFragment newInstance(SaveKeyringParcel saveKeyringParcel) { + EditKeyFragment frag = new EditKeyFragment(); + + Bundle args = new Bundle(); + args.putParcelable(ARG_SAVE_KEYRING_PARCEL, saveKeyringParcel); + + frag.setArguments(args); + + return frag; + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) { View root = super.onCreateView(inflater, superContainer, savedInstanceState); @@ -138,29 +151,54 @@ public class EditKeyFragment extends LoaderFragment implements new OnClickListener() { @Override public void onClick(View v) { - // Save - save(mCurrentPassphrase); + // if we are working on an Uri, save directly + if (mDataUri == null) { + returnKeyringParcel(); + } else { + saveInDatabase(mCurrentPassphrase); + } } }, R.string.menu_key_edit_cancel, R.drawable.ic_action_cancel, new OnClickListener() { @Override public void onClick(View v) { - // Cancel + // cancel + getActivity().setResult(Activity.RESULT_CANCELED); getActivity().finish(); } } ); Uri dataUri = getArguments().getParcelable(ARG_DATA_URI); - if (dataUri == null) { - Log.e(Constants.TAG, "Data missing. Should be Uri of key!"); + SaveKeyringParcel saveKeyringParcel = getArguments().getParcelable(ARG_SAVE_KEYRING_PARCEL); + if (dataUri == null && saveKeyringParcel == null) { + Log.e(Constants.TAG, "Either a key Uri or ARG_SAVE_KEYRING_PARCEL is required!"); getActivity().finish(); return; } - loadData(dataUri); + initView(); + if (dataUri != null) { + loadData(dataUri); + } else { + loadSaveKeyringParcel(saveKeyringParcel); + } } + private void loadSaveKeyringParcel(SaveKeyringParcel saveKeyringParcel) { + mSaveKeyringParcel = saveKeyringParcel; + mPrimaryUserId = saveKeyringParcel.mChangePrimaryUserId; + mCurrentPassphrase = saveKeyringParcel.mNewPassphrase; + + mUserIdsAddedAdapter = new UserIdsAddedAdapter(getActivity(), mSaveKeyringParcel.mAddUserIds); + mUserIdsAddedList.setAdapter(mUserIdsAddedAdapter); + + mSubkeysAddedAdapter = new SubkeysAddedAdapter(getActivity(), mSaveKeyringParcel.mAddSubKeys); + mSubkeysAddedList.setAdapter(mSubkeysAddedAdapter); + + // show directly + setContentShown(true); + } private void loadData(Uri dataUri) { mDataUri = dataUri; @@ -228,6 +266,21 @@ public class EditKeyFragment extends LoaderFragment implements getLoaderManager().initLoader(LOADER_ID_SUBKEYS, null, EditKeyFragment.this); } + mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, mSaveKeyringParcel); + mUserIdsList.setAdapter(mUserIdsAdapter); + + // TODO: SaveParcel from savedInstance?! + mUserIdsAddedAdapter = new UserIdsAddedAdapter(getActivity(), mSaveKeyringParcel.mAddUserIds); + mUserIdsAddedList.setAdapter(mUserIdsAddedAdapter); + + mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0, mSaveKeyringParcel); + mSubkeysList.setAdapter(mSubkeysAdapter); + + mSubkeysAddedAdapter = new SubkeysAddedAdapter(getActivity(), mSaveKeyringParcel.mAddSubKeys); + mSubkeysAddedList.setAdapter(mSubkeysAddedAdapter); + } + + private void initView() { mChangePassphrase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -249,33 +302,19 @@ public class EditKeyFragment extends LoaderFragment implements } }); - mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, mSaveKeyringParcel); - mUserIdsList.setAdapter(mUserIdsAdapter); - - mUserIdsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + mSubkeysList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - editUserId(position); + editSubkey(position); } }); - // TODO: SaveParcel from savedInstance?! - mUserIdsAddedAdapter = new UserIdsAddedAdapter(getActivity(), mSaveKeyringParcel.mAddUserIds); - mUserIdsAddedList.setAdapter(mUserIdsAddedAdapter); - - mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0, mSaveKeyringParcel); - mSubkeysList.setAdapter(mSubkeysAdapter); - - mSubkeysList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + mUserIdsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - editSubkey(position); + editUserId(position); } }); - - mSubkeysAddedAdapter = new SubkeysAddedAdapter(getActivity(), mSaveKeyringParcel.mAddSubKeys); - mSubkeysAddedList.setAdapter(mSubkeysAddedAdapter); - } public Loader onCreateLoader(int id, Bundle args) { @@ -505,8 +544,12 @@ public class EditKeyFragment extends LoaderFragment implements } private void addSubkey() { - boolean willBeMasterKey = mSubkeysAdapter.getCount() == 0 - && mSubkeysAddedAdapter.getCount() == 0; + boolean willBeMasterKey; + if (mSubkeysAdapter != null) { + willBeMasterKey = mSubkeysAdapter.getCount() == 0 && mSubkeysAddedAdapter.getCount() == 0; + } else { + willBeMasterKey = mSubkeysAddedAdapter.getCount() == 0; + } AddSubkeyDialogFragment addSubkeyDialogFragment = AddSubkeyDialogFragment.newInstance(willBeMasterKey); @@ -522,7 +565,14 @@ public class EditKeyFragment extends LoaderFragment implements addSubkeyDialogFragment.show(getActivity().getSupportFragmentManager(), "addSubkeyDialog"); } - private void save(String passphrase) { + private void returnKeyringParcel() { + Intent returnIntent = new Intent(); + returnIntent.putExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL, mSaveKeyringParcel); + getActivity().setResult(Activity.RESULT_OK, returnIntent); + getActivity().finish(); + } + + private void saveInDatabase(String passphrase) { Log.d(Constants.TAG, "mSaveKeyringParcel:\n" + mSaveKeyringParcel.toString()); KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler( @@ -582,10 +632,11 @@ public class EditKeyFragment extends LoaderFragment implements // start service with intent getActivity().startService(intent); - } - /** Closes this activity, returning a result parcel with a single error log entry. */ + /** + * Closes this activity, returning a result parcel with a single error log entry. + */ void finishWithError(LogType reason) { // Prepare an intent with an EXTRA_RESULT diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index c90befb75..f363520e8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -89,6 +89,8 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener } }); + getListView().setFastScrollEnabled(true); + } public void decreaseLogLevel() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java index a98471122..6d4613aee 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui.adapter; import android.app.Activity; import android.content.Context; +import android.graphics.Typeface; import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; @@ -105,6 +106,14 @@ public class SubkeysAddedAdapter extends ArrayAdapter + + + + + + + + + + + + "Revoke Subkey" "Strip Subkey" - "new" + "new subkey" "Please select at least one flag!" @@ -503,9 +503,12 @@ "This field is required" "Passphrases do not match" "You entered the following identity:" - "Creating a key may take a while, have a cup of coffee in the meantime…\n(3 subkeys, RSA, 4096 bit)" + "Creating a key may take a while, have a cup of coffee in the meantime…" + "(3 subkeys, RSA, 4096 bit)" + "(custom key configuration)" "Enter your full name, email address, and choose a passhrase." "Full Name, e.g. Max Mustermann" + "Change key configuration" "This key has been revoked!" -- cgit v1.2.3