diff options
author | Vincent Breitmoser <valodim@mugenguild.com> | 2015-03-22 03:34:34 +0100 |
---|---|---|
committer | Vincent Breitmoser <valodim@mugenguild.com> | 2015-03-22 03:34:34 +0100 |
commit | 22063cdd6eca32e83e7937a849e70185a1faee2a (patch) | |
tree | 862509e64a4feb19dfe453f65c78e00e50e553ca | |
parent | a7c52a1c9f8bca83b2981347a0eceeec68a92790 (diff) | |
download | open-keychain-22063cdd6eca32e83e7937a849e70185a1faee2a.tar.gz open-keychain-22063cdd6eca32e83e7937a849e70185a1faee2a.tar.bz2 open-keychain-22063cdd6eca32e83e7937a849e70185a1faee2a.zip |
improve status reporting in yubikey dialogue
3 files changed, 114 insertions, 14 deletions
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 7df791fbf..f60b6f299 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java @@ -1,35 +1,48 @@ package org.sufficientlysecure.keychain.ui; +import java.nio.ByteBuffer; +import java.util.Arrays; + 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.LoaderCallbacks; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import org.spongycastle.util.encoders.Hex; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; +import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; +import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -public class ViewKeyYubikeyFragment extends Fragment { - +public class ViewKeyYubikeyFragment extends Fragment + implements LoaderCallbacks<Cursor> { public static final String ARG_FINGERPRINT = "fingerprint"; public static final String ARG_USER_ID = "user_id"; public static final String ARG_AID = "aid"; - private byte[] mFingerprints; + private byte[][] mFingerprints; private String mUserId; private byte[] mAid; + private long mMasterKeyId; + private Button vButton; + private TextView vStatus; public static ViewKeyYubikeyFragment newInstance(byte[] fingerprints, String userId, byte[] aid) { @@ -50,10 +63,19 @@ public class ViewKeyYubikeyFragment extends Fragment { super.onCreate(savedInstanceState); Bundle args = getArguments(); - mFingerprints = args.getByteArray(ARG_FINGERPRINT); + ByteBuffer buf = ByteBuffer.wrap(args.getByteArray(ARG_FINGERPRINT)); + mFingerprints = new byte[buf.remaining()/40][]; + for (int i = 0; i < mFingerprints.length; i++) { + mFingerprints[i] = new byte[20]; + buf.get(mFingerprints[i]); + } mUserId = args.getString(ARG_USER_ID); mAid = args.getByteArray(ARG_AID); + mMasterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[0]); + + getLoaderManager().initLoader(0, null, this); + } @Override @@ -64,21 +86,23 @@ public class ViewKeyYubikeyFragment extends Fragment { TextView vUserId = (TextView) view.findViewById(R.id.yubikey_userid); String serno = Hex.toHexString(mAid, 10, 4); - vSerNo.setText("Serial N° " + serno); + vSerNo.setText(getString(R.string.yubikey_serno, serno)); if (!mUserId.isEmpty()) { - vUserId.setText("Key holder: " + mUserId); + vUserId.setText(getString(R.string.yubikey_key_holder, mUserId)); } else { - vUserId.setText("Key holder: " + "<unset>"); + vUserId.setText(getString(R.string.yubikey_key_holder_unset)); } - view.findViewById(R.id.button_import).setOnClickListener(new OnClickListener() { + vButton = (Button) view.findViewById(R.id.button_bind); + vButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { promoteToSecretKey(); } }); + vStatus = (TextView) view.findViewById(R.id.yubikey_status); return view; } @@ -111,10 +135,8 @@ public class ViewKeyYubikeyFragment extends Fragment { intent.setAction(KeychainIntentService.ACTION_PROMOTE_KEYRING); - long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints); - Bundle data = new Bundle(); - data.putLong(KeychainIntentService.PROMOTE_MASTER_KEY_ID, masterKeyId); + data.putLong(KeychainIntentService.PROMOTE_MASTER_KEY_ID, mMasterKeyId); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); // Create a new Messenger for the communication back @@ -126,4 +148,73 @@ public class ViewKeyYubikeyFragment extends Fragment { } + public static final String[] PROJECTION = new String[]{ + Keys._ID, + Keys.KEY_ID, + Keys.RANK, + Keys.HAS_SECRET, + Keys.FINGERPRINT + }; + private static final int INDEX_KEY_ID = 1; + private static final int INDEX_RANK = 2; + private static final int INDEX_HAS_SECRET = 3; + private static final int INDEX_FINGERPRINT = 4; + + @Override + public Loader<Cursor> onCreateLoader(int id, Bundle args) { + return new CursorLoader(getActivity(), Keys.buildKeysUri(mMasterKeyId), + PROJECTION, null, null, null); + } + + @Override + public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + if (!data.moveToFirst()) { + // wut? + return; + } + + boolean allBound = true; + boolean noneBound = true; + + do { + SecretKeyType keyType = SecretKeyType.fromNum(data.getInt(INDEX_HAS_SECRET)); + byte[] fingerprint = data.getBlob(INDEX_FINGERPRINT); + Integer index = naiveIndexOf(mFingerprints, fingerprint); + if (index == null) { + continue; + } + if (keyType == SecretKeyType.DIVERT_TO_CARD) { + noneBound = false; + } else { + allBound = false; + } + } while (data.moveToNext()); + + if (allBound) { + vButton.setVisibility(View.GONE); + vStatus.setText("Key matches, fully bound"); + } else { + vButton.setVisibility(View.VISIBLE); + if (noneBound) { + vStatus.setText("Key matches, can be bound"); + } else { + vStatus.setText("Key matches, partly bound"); + } + } + + } + + public Integer naiveIndexOf(byte[][] haystack, byte[] needle) { + for (int i = 0; i < haystack.length; i++) { + if (Arrays.equals(needle, haystack[i])) { + return i; + } + } + return null; + } + + @Override + public void onLoaderReset(Loader<Cursor> loader) { + + } } diff --git a/OpenKeychain/src/main/res/layout/view_key_yubikey.xml b/OpenKeychain/src/main/res/layout/view_key_yubikey.xml index 7da1fc5c4..83272ef4e 100644 --- a/OpenKeychain/src/main/res/layout/view_key_yubikey.xml +++ b/OpenKeychain/src/main/res/layout/view_key_yubikey.xml @@ -21,7 +21,8 @@ card_view:cardBackgroundColor="@android:color/white" card_view:cardElevation="2dp" card_view:cardUseCompatPadding="true" - card_view:cardCornerRadius="4dp"> + card_view:cardCornerRadius="4dp" + android:animateLayoutChanges="true"> <LinearLayout android:layout_width="match_parent" @@ -37,6 +38,8 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="4dp" + android:paddingBottom="4dp" android:orientation="horizontal"> <ImageView @@ -69,6 +72,7 @@ /> <TextView + android:id="@+id/yubikey_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" @@ -80,13 +84,14 @@ </LinearLayout> <Button - android:id="@+id/button_import" + android:id="@+id/button_bind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|end" - android:text="Import" + android:text="@string/button_bind_key" android:textColor="@color/link_text_material_light" style="?android:attr/borderlessButtonStyle" + android:visibility="gone" /> </LinearLayout> diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index bcee267fd..f7a9a671e 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -1269,5 +1269,9 @@ <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="yubikey_serno">"Serial No: %s"</string> + <string name="yubikey_key_holder">"Key holder: "</string> + <string name="yubikey_key_holder_unset">"Key holder: <unset>"</string> </resources> |