aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-03-22 06:36:27 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-03-22 06:36:27 +0100
commit212bba18693ebfce2dfa62afde8b11e8f0c2da0d (patch)
treea4437175cac8741e63efd411a65270a241a1991e /OpenKeychain
parent2151411219b4e5d609d25fcbb574ccf399f54d6f (diff)
downloadopen-keychain-212bba18693ebfce2dfa62afde8b11e8f0c2da0d.tar.gz
open-keychain-212bba18693ebfce2dfa62afde8b11e8f0c2da0d.tar.bz2
open-keychain-212bba18693ebfce2dfa62afde8b11e8f0c2da0d.zip
finish ui flow for yubikey import
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java45
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java171
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java256
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java8
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubikey_import_fragment.xml (renamed from OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml)75
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml14
9 files changed, 396 insertions, 221 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
index 20dba95e9..85538a520 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
@@ -230,7 +230,7 @@ public class ImportExportOperation extends BaseOperation {
}
} catch (Keyserver.QueryFailedException e) {
Log.e(Constants.TAG, "query failed", e);
- log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_ERROR, 3);
+ log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_ERROR, 3, e.getMessage());
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
index b73d6f545..0b203614b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import org.sufficientlysecure.keychain.R;
@@ -29,9 +30,6 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.ui.util.Notify;
-import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
-import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.util.Passphrase;
import java.io.IOException;
@@ -45,6 +43,10 @@ public class CreateKeyActivity extends BaseNfcActivity {
public static final String EXTRA_ADDITIONAL_EMAILS = "additional_emails";
public static final String EXTRA_PASSPHRASE = "passphrase";
+ public static final String EXTRA_NFC_USER_ID = "nfc_user_id";
+ public static final String EXTRA_NFC_AID = "nfc_aid";
+ public static final String EXTRA_NFC_FINGERPRINTS = "nfc_fingerprints";
+
public static final String FRAGMENT_TAG = "currentFragment";
String mName;
@@ -70,14 +72,29 @@ public class CreateKeyActivity extends BaseNfcActivity {
mCurrentFragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
} else {
+
+ Intent intent = getIntent();
// Initialize members with default values for a new instance
- mName = getIntent().getStringExtra(EXTRA_NAME);
- mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
- mFirstTime = getIntent().getBooleanExtra(EXTRA_FIRST_TIME, false);
+ mName = intent.getStringExtra(EXTRA_NAME);
+ mEmail = intent.getStringExtra(EXTRA_EMAIL);
+ mFirstTime = intent.getBooleanExtra(EXTRA_FIRST_TIME, false);
+
+ if (intent.hasExtra(EXTRA_NFC_FINGERPRINTS)) {
+ byte[] nfcFingerprints = intent.getByteArrayExtra(EXTRA_NFC_FINGERPRINTS);
+ String nfcUserId = intent.getStringExtra(EXTRA_NFC_USER_ID);
+ byte[] nfcAid = intent.getByteArrayExtra(EXTRA_NFC_AID);
+
+ Fragment frag2 = CreateKeyYubiImportFragment.createInstance(
+ nfcFingerprints, nfcAid, nfcUserId);
+ loadFragment(frag2, FragAction.START);
+
+ setTitle(R.string.title_import_keys);
+ return;
+ } else {
+ CreateKeyStartFragment frag = CreateKeyStartFragment.newInstance();
+ loadFragment(frag, FragAction.START);
+ }
- // Start with first fragment of wizard
- CreateKeyStartFragment frag = CreateKeyStartFragment.newInstance();
- loadFragment(frag, FragAction.START);
}
if (mFirstTime) {
@@ -97,15 +114,14 @@ public class CreateKeyActivity extends BaseNfcActivity {
}
byte[] scannedFingerprints = nfcGetFingerprints();
+ byte[] nfcAid = nfcGetAid();
+ String userId = nfcGetUserId();
try {
long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(scannedFingerprints);
CachedPublicKeyRing ring = new ProviderHelper(this).getCachedPublicKeyRing(masterKeyId);
ring.getMasterKeyId();
- String userId = nfcGetUserId();
- byte[] nfcAid = nfcGetAid();
-
Intent intent = new Intent(this, ViewKeyActivity.class);
intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId));
intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
@@ -115,7 +131,8 @@ public class CreateKeyActivity extends BaseNfcActivity {
finish();
} catch (PgpKeyNotFoundException e) {
- Fragment frag = CreateKeyYubiFragment.createInstance(scannedFingerprints);
+ Fragment frag = CreateKeyYubiImportFragment.createInstance(
+ scannedFingerprints, nfcAid, userId);
loadFragment(frag, FragAction.TO_RIGHT);
}
@@ -167,8 +184,10 @@ public class CreateKeyActivity extends BaseNfcActivity {
break;
}
+
// do it immediately!
getSupportFragmentManager().executePendingTransactions();
+
}
interface NfcListenerFragment {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
deleted file mode 100644
index a1668d22e..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.LoaderManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
-import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.util.Preferences;
-
-public class CreateKeyYubiFragment extends Fragment {
-
- private static final String ARG_FINGERPRINT = "fingerprint";
-
- CreateKeyActivity mCreateKeyActivity;
-
- private byte[] mScannedFingerprint;
- private long mScannedMasterKeyId;
-
- private TextView mUnknownFingerprint;
-
- public static Fragment createInstance(byte[] scannedFingerprint) {
- Bundle args = new Bundle();
- args.putByteArray(ARG_FINGERPRINT, scannedFingerprint);
-
- CreateKeyYubiFragment frag = new CreateKeyYubiFragment();
- frag.setArguments(args);
-
- return frag;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- mScannedFingerprint = getArguments().getByteArray(ARG_FINGERPRINT);
- mScannedMasterKeyId = getKeyIdFromFingerprint(mScannedFingerprint);
-
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.create_yubikey_fragment, container, false);
-
- mUnknownFingerprint = (TextView) view.findViewById(R.id.create_yubikey_unknown_fp);
-
- View mBackButton = view.findViewById(R.id.create_key_back_button);
- View mNextButton = view.findViewById(R.id.create_key_next_button);
-
- mBackButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
- }
- });
- mNextButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- nextClicked();
- }
- });
-
- return view;
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- mCreateKeyActivity = (CreateKeyActivity) getActivity();
- }
-
- private void nextClicked() {
- importKey();
- }
-
- public void importKey() {
-
- // Message is received after decrypting is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity()) {
- 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();
-
- ImportKeyResult result =
- returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
-
- result.createNotify(getActivity()).show();
- }
-
- }
- };
-
- // Send all information needed to service to decrypt in other thread
- Intent intent = new Intent(getActivity(), KeychainIntentService.class);
-
- // fill values for this action
- Bundle data = new Bundle();
-
- intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING);
-
- String hexFp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
- ArrayList<ParcelableKeyRing> keyList = new ArrayList<>();
- keyList.add(new ParcelableKeyRing(hexFp, null, null));
- data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyList);
-
- {
- Preferences prefs = Preferences.getPreferences(getActivity());
- Preferences.CloudSearchPrefs cloudPrefs =
- new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
- data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
- }
-
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-
- // start service with intent
- getActivity().startService(intent);
-
- }
-
- static long getKeyIdFromFingerprint(byte[] fingerprint) {
- ByteBuffer buf = ByteBuffer.wrap(fingerprint);
- // skip first 12 bytes of the fingerprint
- buf.position(12);
- // the last eight bytes are the key id (big endian, which is default order in ByteBuffer)
- return buf.getLong();
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java
new file mode 100644
index 000000000..bb26a4ede
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiImportFragment.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.spongycastle.util.encoders.Hex;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.NfcListenerFragment;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.Preferences;
+
+
+public class CreateKeyYubiImportFragment extends Fragment implements NfcListenerFragment {
+
+ private static final String ARG_FINGERPRINT = "fingerprint";
+ public static final String ARG_AID = "aid";
+ public static final String ARG_USER_ID = "user_ids";
+
+ CreateKeyActivity mCreateKeyActivity;
+
+ private byte[] mNfcFingerprints;
+ private long mNfcMasterKeyId;
+ private byte[] mNfcAid;
+ private String mNfcUserId;
+ private String mNfcFingerprint;
+ private ImportKeysListFragment mListFragment;
+ private TextView vSerNo;
+ private TextView vUserId;
+
+ public static Fragment createInstance(byte[] scannedFingerprints, byte[] nfcAid, String userId) {
+
+ CreateKeyYubiImportFragment frag = new CreateKeyYubiImportFragment();
+
+ Bundle args = new Bundle();
+ args.putByteArray(ARG_FINGERPRINT, scannedFingerprints);
+ args.putByteArray(ARG_AID, nfcAid);
+ args.putString(ARG_USER_ID, userId);
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Bundle args = savedInstanceState != null ? savedInstanceState : getArguments();
+
+ mNfcFingerprints = args.getByteArray(ARG_FINGERPRINT);
+ mNfcAid = args.getByteArray(ARG_AID);
+ mNfcUserId = args.getString(ARG_USER_ID);
+
+ mNfcMasterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mNfcFingerprints);
+ mNfcFingerprint = KeyFormattingUtils.convertFingerprintToHex(mNfcFingerprints);
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.create_yubikey_import_fragment, container, false);
+
+ vSerNo = (TextView) view.findViewById(R.id.yubikey_serno);
+ vUserId = (TextView) view.findViewById(R.id.yubikey_userid);
+
+ {
+ View mBackButton = view.findViewById(R.id.create_key_back_button);
+ mBackButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (getFragmentManager().getBackStackEntryCount() == 0) {
+ getActivity().setResult(Activity.RESULT_CANCELED);
+ getActivity().finish();
+ } else {
+ mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
+ }
+ }
+ });
+
+ View mNextButton = view.findViewById(R.id.create_key_next_button);
+ mNextButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ importKey();
+ }
+ });
+ }
+
+ mListFragment = ImportKeysListFragment.newInstance(null, null, "0x" + mNfcFingerprint, true);
+
+ view.findViewById(R.id.button_search).setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ refreshSearch();
+ }
+ });
+
+ setData();
+
+ getFragmentManager().beginTransaction()
+ .replace(R.id.yubikey_import_fragment, mListFragment, "yubikey_import")
+ .commit();
+
+ return view;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle args) {
+ super.onSaveInstanceState(args);
+
+ args.putByteArray(ARG_FINGERPRINT, mNfcFingerprints);
+ args.putByteArray(ARG_AID, mNfcAid);
+ args.putString(ARG_USER_ID, mNfcUserId);
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mCreateKeyActivity = (CreateKeyActivity) getActivity();
+ }
+
+ public void setData() {
+ String serno = Hex.toHexString(mNfcAid, 10, 4);
+ vSerNo.setText(getString(R.string.yubikey_serno, serno));
+
+ if (!mNfcUserId.isEmpty()) {
+ vUserId.setText(getString(R.string.yubikey_key_holder, mNfcUserId));
+ } else {
+ vUserId.setText(getString(R.string.yubikey_key_holder_unset));
+ }
+ }
+
+ public void refreshSearch() {
+ mListFragment.loadNew(new ImportKeysListFragment.CloudLoaderState("0x" + mNfcFingerprint,
+ Preferences.getPreferences(getActivity()).getCloudSearchPrefs()));
+ }
+
+ public void importKey() {
+
+ // Message is received after decrypting is done in KeychainIntentService
+ KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(),
+ getString(R.string.progress_importing), ProgressDialog.STYLE_HORIZONTAL) {
+ 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();
+
+ ImportKeyResult result =
+ returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
+
+ if (!result.success()) {
+ result.createNotify(getActivity()).show();
+ return;
+ }
+
+ Intent intent = new Intent(getActivity(), ViewKeyActivity.class);
+ intent.setData(KeyRings.buildGenericKeyRingUri(mNfcMasterKeyId));
+ intent.putExtra(ViewKeyActivity.EXTRA_DISPLAY_RESULT, result);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints);
+ startActivity(intent);
+ getActivity().finish();
+
+ }
+
+ }
+ };
+
+ // Send all information needed to service to decrypt in other thread
+ Intent intent = new Intent(getActivity(), KeychainIntentService.class);
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING);
+
+ String hexFp = KeyFormattingUtils.convertFingerprintToHex(mNfcFingerprints);
+ ArrayList<ParcelableKeyRing> keyList = new ArrayList<>();
+ keyList.add(new ParcelableKeyRing(hexFp, null, null));
+ data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyList);
+
+ {
+ Preferences prefs = Preferences.getPreferences(getActivity());
+ Preferences.CloudSearchPrefs cloudPrefs =
+ new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
+ data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ }
+
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ saveHandler.showProgressDialog(getActivity());
+
+ // start service with intent
+ getActivity().startService(intent);
+
+ }
+
+ @Override
+ public void onNfcPerform() throws IOException {
+
+ mNfcFingerprints = mCreateKeyActivity.nfcGetFingerprints();
+ mNfcAid = mCreateKeyActivity.nfcGetAid();
+ mNfcUserId = mCreateKeyActivity.nfcGetUserId();
+
+ mNfcMasterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mNfcFingerprints);
+ mNfcFingerprint = KeyFormattingUtils.convertFingerprintToHex(mNfcFingerprints);
+
+ setData();
+ refreshSearch();
+
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index 6a6140892..b9fdbea5c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -53,9 +53,11 @@ import java.util.List;
public class ImportKeysListFragment extends ListFragment implements
LoaderManager.LoaderCallbacks<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
+
private static final String ARG_DATA_URI = "uri";
private static final String ARG_BYTES = "bytes";
- private static final String ARG_SERVER_QUERY = "query";
+ public static final String ARG_SERVER_QUERY = "query";
+ public static final String ARG_NON_INTERACTIVE = "non_interactive";
private Activity mActivity;
private ImportKeysAdapter mAdapter;
@@ -66,6 +68,7 @@ public class ImportKeysListFragment extends ListFragment implements
private static final int LOADER_ID_CLOUD = 1;
private LongSparseArray<ParcelableKeyRing> mCachedKeyData;
+ private boolean mNonInteractive;
public LoaderState getLoaderState() {
return mLoaderState;
@@ -118,16 +121,19 @@ public class ImportKeysListFragment extends ListFragment implements
}
- /**
- * Creates new instance of this fragment
- */
public static ImportKeysListFragment newInstance(byte[] bytes, Uri dataUri, String serverQuery) {
+ return newInstance(bytes, dataUri, serverQuery, false);
+ }
+
+ public static ImportKeysListFragment newInstance(byte[] bytes, Uri dataUri,
+ String serverQuery, boolean nonInteractive) {
ImportKeysListFragment frag = new ImportKeysListFragment();
Bundle args = new Bundle();
args.putByteArray(ARG_BYTES, bytes);
args.putParcelable(ARG_DATA_URI, dataUri);
args.putString(ARG_SERVER_QUERY, serverQuery);
+ args.putBoolean(ARG_NON_INTERACTIVE, nonInteractive);
frag.setArguments(args);
@@ -173,9 +179,11 @@ public class ImportKeysListFragment extends ListFragment implements
mAdapter = new ImportKeysAdapter(mActivity);
setListAdapter(mAdapter);
- Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
- byte[] bytes = getArguments().getByteArray(ARG_BYTES);
- String query = getArguments().getString(ARG_SERVER_QUERY);
+ Bundle args = getArguments();
+ Uri dataUri = args.containsKey(ARG_DATA_URI) ? args.<Uri>getParcelable(ARG_DATA_URI) : null;
+ byte[] bytes = args.containsKey(ARG_BYTES) ? args.getByteArray(ARG_BYTES) : null;
+ String query = args.containsKey(ARG_SERVER_QUERY) ? args.getString(ARG_SERVER_QUERY) : null;
+ mNonInteractive = args.containsKey(ARG_NON_INTERACTIVE) ? args.getBoolean(ARG_NON_INTERACTIVE) : false;
if (dataUri != null || bytes != null) {
mLoaderState = new BytesLoaderState(bytes, dataUri);
@@ -203,6 +211,10 @@ public class ImportKeysListFragment extends ListFragment implements
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
+ if (mNonInteractive) {
+ return;
+ }
+
// Select checkbox!
// Update underlying data and notify adapter of change. The adapter will
// update the view automatically.
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 159b98e0e..3d298ea6c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -98,6 +98,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements
static final int REQUEST_QR_FINGERPRINT = 1;
static final int REQUEST_DELETE = 2;
static final int REQUEST_EXPORT = 3;
+ public static final String EXTRA_DISPLAY_RESULT = "display_result";
ExportHelper mExportHelper;
ProviderHelper mProviderHelper;
@@ -268,6 +269,11 @@ public class ViewKeyActivity extends BaseNfcActivity implements
mNfcHelper = new NfcHelper(this, mProviderHelper);
mNfcHelper.initNfc(mDataUri);
+ if (savedInstanceState == null && getIntent().hasExtra(EXTRA_DISPLAY_RESULT)) {
+ OperationResult result = getIntent().getParcelableExtra(EXTRA_DISPLAY_RESULT);
+ result.createNotify(this).show();
+ }
+
startFragment(savedInstanceState, mDataUri);
if (savedInstanceState == null && getIntent().hasExtra(EXTRA_NFC_AID)) {
@@ -570,7 +576,19 @@ public class ViewKeyActivity extends BaseNfcActivity implements
return;
} catch (PgpKeyNotFoundException e) {
- Notify.create(this, "Different key stored on Yubikey!", Style.ERROR).show();
+ Notify.create(this, "Different key stored on Yubikey!", Notify.LENGTH_LONG,
+ Style.WARN, new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ ViewKeyActivity.this, CreateKeyActivity.class);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, nfcUserId);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, nfcFingerprints);
+ startActivity(intent);
+ finish();
+ }
+ }, R.string.snack_yubikey_import).show();
return;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java
index 192d85d58..1d87bef3e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java
@@ -196,11 +196,9 @@ public class ViewKeyYubikeyFragment extends Fragment
vStatus.setText(R.string.yubikey_status_bound);
} else {
vButton.setVisibility(View.VISIBLE);
- if (noneBound) {
- vStatus.setText(R.string.yubikey_status_unbound);
- } else {
- vStatus.setText(R.string.yubikey_status_partly);
- }
+ vStatus.setText(noneBound
+ ? R.string.yubikey_status_unbound
+ : R.string.yubikey_status_partly);
}
}
diff --git a/OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubikey_import_fragment.xml
index 0f5e50d42..e70188e49 100644
--- a/OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_yubikey_import_fragment.xml
@@ -3,38 +3,79 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <ScrollView
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true"
- android:layout_above="@+id/create_key_buttons">
+ android:layout_height="wrap_content"
+ android:padding="4dp"
+ android:orientation="horizontal"
+ android:id="@+id/yubikey_status_layout" >
+
+ <ImageView
+ android:layout_margin="14dp"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:scaleType="centerCrop"
+ android:src="@drawable/yubi_icon"/>
<LinearLayout
- android:layout_width="match_parent"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
android:orientation="vertical">
<TextView
+ android:id="@+id/yubikey_serno"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:text="Yubikey #"
+ />
+
+ <TextView
+ android:id="@+id/yubikey_userid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="16dp"
- android:layout_marginLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:id="@+id/create_yubikey_unknown_fp"
- android:text="(yubikey fingerprint)" />
+ android:layout_gravity="center_vertical"
+ android:text="User ID"
+ />
<TextView
+ android:id="@+id/yubikey_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="16dp"
- android:layout_marginLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="Hit next to import this key"
+ android:layout_gravity="center_vertical"
+ android:text="Unknown key, hit next to import"
/>
</LinearLayout>
- </ScrollView>
+ <ImageButton
+ android:id="@+id/button_search"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_search_grey_24dp"
+ android:layout_gravity="center_vertical"
+ android:background="?android:selectableItemBackground" />
+
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_marginTop="4dp"
+ android:layout_height="1dip"
+ android:layout_below="@id/yubikey_status_layout"
+ android:background="?android:attr/listDivider" />
+
+ <FrameLayout
+ android:id="@+id/yubikey_import_fragment"
+ android:layout_marginTop="8dp"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/yubikey_status_layout"
+ android:layout_above="@id/create_key_buttons"
+ />
<LinearLayout
android:layout_width="match_parent"
@@ -71,10 +112,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:text="@string/btn_next"
+ android:text="@string/btn_import"
android:textAllCaps="true"
android:minHeight="?android:attr/listPreferredItemHeight"
- android:drawableRight="@drawable/ic_chevron_right_grey_24dp"
+ android:drawableRight="@drawable/ic_key_plus_grey600_24dp"
android:drawablePadding="8dp"
android:gravity="right|center_vertical"
android:clickable="true"
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 6dfdb8997..27eda28a0 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -1124,7 +1124,7 @@
<string name="msg_import_fetch_error_decode">"Error decoding retrieved keyring!"</string>
<string name="msg_import_fetch_error">"Key could not be retrieved! (Network problems?)"</string>
<string name="msg_import_fetch_keybase">"Retrieving from keybase.io: %s"</string>
- <string name="msg_import_fetch_keyserver_error">"Could not retrieve key from keybase!"</string>
+ <string name="msg_import_fetch_keyserver_error">"Could not retrieve key from keyservers: %s"</string>
<string name="msg_import_fetch_keyserver">"Retrieving from keyserver: %s"</string>
<string name="msg_import_fetch_keyserver_ok">"Key retrieval successful"</string>
<string name="msg_import_keyserver">"Using keyserver %s"</string>
@@ -1267,13 +1267,15 @@
<string name="nfc_write_succesful">Successfully written on NFC tag</string>
<string name="unlocked">Unlocked</string>
<string name="nfc_settings">Settings</string>
- <string name="snack_yubikey_view">View</string>
- <string name="button_bind_key">Bind Key</string>
+ <string name="snack_yubikey_view">"View"</string>
+ <string name="snack_yubikey_import">"Import"</string>
+ <string name="button_bind_key">"Bind Key"</string>
<string name="yubikey_serno">"Serial No: %s"</string>
<string name="yubikey_key_holder">"Key holder: "</string>
<string name="yubikey_key_holder_unset">"Key holder: &lt;unset&gt;"</string>
- <string name="yubikey_status_bound">Yubikey matches, bound to key</string>
- <string name="yubikey_status_unbound">Yubikey matches, can be bound to key</string>
- <string name="yubikey_status_partly">Yubikey matches, partly bound to key</string>
+ <string name="yubikey_status_bound">"Yubikey matches, bound to key"</string>
+ <string name="yubikey_status_unbound">"Yubikey matches, can be bound to key"</string>
+ <string name="yubikey_status_partly">"Yubikey matches, partly bound to key"</string>
+ <string name="btn_import">"Import"</string>
</resources>