diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeySecurityTokenFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeySecurityTokenFragment.java deleted file mode 100644 index b3fe73464..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeySecurityTokenFragment.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2015 Dominik Schürmann - * Copyright (C) 2015 Vincent Breitmoser - * - * 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 . - */ - -package org.sufficientlysecure.keychain.ui; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -import android.database.Cursor; -import android.os.Bundle; -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.bouncycastle.util.encoders.Hex; -import org.sufficientlysecure.keychain.R; -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.PromoteKeyringParcel; -import org.sufficientlysecure.keychain.ui.base.QueueingCryptoOperationFragment; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; - -public class ViewKeySecurityTokenFragment - extends QueueingCryptoOperationFragment - implements LoaderCallbacks { - - public static final String ARG_MASTER_KEY_ID = "master_key_id"; - public static final String ARG_FINGERPRINT = "fingerprint"; - public static final String ARG_USER_ID = "user_id"; - public static final String ARG_CARD_AID = "aid"; - public static final String ARG_CARD_VERSION = "version"; - - private byte[][] mFingerprints; - private String mUserId; - private byte[] mCardAid; - private double mCardVersion; - private long mMasterKeyId; - private long[] mSubKeyIds; - - private Button vButton; - private TextView vStatus; - - public static ViewKeySecurityTokenFragment newInstance(long masterKeyId, - byte[] fingerprints, String userId, byte[] aid, double version) { - ViewKeySecurityTokenFragment frag = new ViewKeySecurityTokenFragment(); - - Bundle args = new Bundle(); - args.putLong(ARG_MASTER_KEY_ID, masterKeyId); - args.putByteArray(ARG_FINGERPRINT, fingerprints); - args.putString(ARG_USER_ID, userId); - args.putByteArray(ARG_CARD_AID, aid); - args.putDouble(ARG_CARD_VERSION, version); - frag.setArguments(args); - - return frag; - } - - public ViewKeySecurityTokenFragment() { - super(null); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Bundle args = getArguments(); - ByteBuffer buf = ByteBuffer.wrap(args.getByteArray(ARG_FINGERPRINT)); - mFingerprints = new byte[buf.remaining()/20][]; - for (int i = 0; i < mFingerprints.length; i++) { - mFingerprints[i] = new byte[20]; - buf.get(mFingerprints[i]); - } - mUserId = args.getString(ARG_USER_ID); - mCardAid = args.getByteArray(ARG_CARD_AID); - mCardVersion = args.getDouble(ARG_CARD_VERSION); - - mMasterKeyId = args.getLong(ARG_MASTER_KEY_ID); - - getLoaderManager().initLoader(0, null, this); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.view_key_security_token, null); - - TextView vSerNo = (TextView) view.findViewById(R.id.token_serno); - TextView vUserId = (TextView) view.findViewById(R.id.token_userid); - - String serno = Hex.toHexString(mCardAid, 10, 4); - vSerNo.setText(getString(R.string.security_token_serial_no, serno)); - - if (!mUserId.isEmpty()) { - vUserId.setText(getString(R.string.security_token_key_holder, mUserId)); - } else { - vUserId.setText(getString(R.string.security_token_key_holder_not_set)); - } - - 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.token_status); - - return view; - } - - public void promoteToSecretKey() { - long[] subKeyIds = new long[mFingerprints.length]; - for (int i = 0; i < subKeyIds.length; i++) { - subKeyIds[i] = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[i]); - } - - // mMasterKeyId and mCardAid are already set - mSubKeyIds = subKeyIds; - - cryptoOperation(); - } - - 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 onCreateLoader(int id, Bundle args) { - return new CursorLoader(getActivity(), Keys.buildKeysUri(mMasterKeyId), - PROJECTION, null, null, null); - } - - @Override - public void onLoadFinished(Loader 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(R.string.security_token_status_bound); - } else { - vButton.setVisibility(View.VISIBLE); - vStatus.setText(noneBound - ? R.string.security_token_status_unbound - : R.string.security_token_status_partly); - } - - } - - static private 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 loader) { - - } - - @Override - public PromoteKeyringParcel createOperationInput() { - return PromoteKeyringParcel.createPromoteKeyringParcel(mMasterKeyId, mCardAid, mSubKeyIds); - } - - @Override - public void onQueuedOperationSuccess(PromoteKeyResult result) { - result.createNotify(getActivity()).show(); - } - -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java index 514e1231a..c60d0908e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/keyview/ViewKeyActivity.java @@ -19,7 +19,6 @@ package org.sufficientlysecure.keychain.ui.keyview; -import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -76,7 +75,6 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; -import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeyRepository.NotFoundException; import org.sufficientlysecure.keychain.provider.KeychainContract; @@ -87,7 +85,6 @@ import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; import org.sufficientlysecure.keychain.ui.BackupActivity; import org.sufficientlysecure.keychain.ui.CertifyFingerprintActivity; import org.sufficientlysecure.keychain.ui.CertifyKeyActivity; -import org.sufficientlysecure.keychain.ui.CreateKeyActivity; import org.sufficientlysecure.keychain.ui.DeleteKeyDialogActivity; import org.sufficientlysecure.keychain.ui.EncryptFilesActivity; import org.sufficientlysecure.keychain.ui.EncryptTextActivity; @@ -98,7 +95,6 @@ import org.sufficientlysecure.keychain.ui.QrCodeViewActivity; import org.sufficientlysecure.keychain.ui.SafeSlingerActivity; import org.sufficientlysecure.keychain.ui.ViewKeyAdvActivity; import org.sufficientlysecure.keychain.ui.ViewKeyKeybaseFragment; -import org.sufficientlysecure.keychain.ui.ViewKeySecurityTokenFragment; import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenActivity; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; @@ -107,7 +103,6 @@ import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; 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.ui.util.QrCodeUtils; import org.sufficientlysecure.keychain.util.ContactHelper; @@ -119,12 +114,6 @@ import org.sufficientlysecure.keychain.util.Preferences; public class ViewKeyActivity extends BaseSecurityTokenActivity implements LoaderManager.LoaderCallbacks, CryptoOperationHelper.Callback { - - public static final String EXTRA_SECURITY_TOKEN_USER_ID = "security_token_user_id"; - public static final String EXTRA_SECURITY_TOKEN_AID = "security_token_aid"; - public static final String EXTRA_SECURITY_TOKEN_VERSION = "security_token_version"; - public static final String EXTRA_SECURITY_TOKEN_FINGERPRINTS = "security_token_fingerprints"; - @Retention(RetentionPolicy.SOURCE) @IntDef({REQUEST_QR_FINGERPRINT, REQUEST_BACKUP, REQUEST_CERTIFY, REQUEST_DELETE}) private @interface RequestType { @@ -173,8 +162,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements private boolean mIsSecure = true; private boolean mIsExpired = false; - private boolean mShowSecurityTokenAfterCreation = false; - private MenuItem mRefreshItem; private boolean mIsRefreshing; private Animation mRotate, mRotateSpin; @@ -183,11 +170,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements private long mMasterKeyId; private byte[] mFingerprint; - private byte[] mSecurityTokenFingerprints; - private String mSecurityTokenUserId; - private byte[] mSecurityTokenAid; - private double mSecurityTokenVersion; - @SuppressLint("InflateParams") @Override protected void onCreate(Bundle savedInstanceState) { @@ -334,11 +316,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements .replace(R.id.view_key_keybase_fragment, keybaseFrag) .commit(); } - - // need to postpone loading of the security token fragment until after mMasterKeyId - // is available, but we mark here that this should be done - mShowSecurityTokenAfterCreation = true; - } @Override @@ -641,89 +618,10 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements } - @Override - protected void doSecurityTokenInBackground() throws IOException { - - mSecurityTokenFingerprints = mSecurityTokenHelper.getFingerprints(); - mSecurityTokenUserId = mSecurityTokenHelper.getUserId(); - mSecurityTokenAid = mSecurityTokenHelper.getAid(); - } - @Override protected void onSecurityTokenPostExecute() { - - long tokenId = KeyFormattingUtils.getKeyIdFromFingerprint(mSecurityTokenFingerprints); - - try { - - // if the security token matches a subkey in any key - CachedPublicKeyRing ring = mKeyRepository.getCachedPublicKeyRing( - KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(tokenId)); - byte[] candidateFp = ring.getFingerprint(); - - // if the master key of that key matches this one, just show the token dialog - if (Arrays.equals(candidateFp, mFingerprint)) { - showSecurityTokenFragment( - mSecurityTokenFingerprints, mSecurityTokenUserId, mSecurityTokenAid, mSecurityTokenVersion); - return; - } - - // otherwise, offer to go to that key - final long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(candidateFp); - Notify.create(this, R.string.snack_security_token_other, Notify.LENGTH_LONG, - Style.WARN, new ActionListener() { - @Override - public void onAction() { - Intent intent = new Intent( - ViewKeyActivity.this, ViewKeyActivity.class); - intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId)); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mSecurityTokenAid); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_VERSION, mSecurityTokenVersion); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mSecurityTokenUserId); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mSecurityTokenFingerprints); - startActivity(intent); - finish(); - } - }, R.string.snack_security_token_view).show(); - // and if it's not found, offer import - } catch (PgpKeyNotFoundException e) { - Notify.create(this, R.string.snack_security_token_other, Notify.LENGTH_LONG, - Style.WARN, new ActionListener() { - @Override - public void onAction() { - Intent intent = new Intent( - ViewKeyActivity.this, CreateKeyActivity.class); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mSecurityTokenAid); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_VERSION, mSecurityTokenVersion); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mSecurityTokenUserId); - intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mSecurityTokenFingerprints); - startActivity(intent); - finish(); - } - }, R.string.snack_security_token_import).show(); - } - } - - public void showSecurityTokenFragment( - final byte[] tokenFingerprints, final String tokenUserId, final byte[] tokenAid, final double tokenVersion) { - - new Handler().post(new Runnable() { - @Override - public void run() { - ViewKeySecurityTokenFragment frag = ViewKeySecurityTokenFragment.newInstance( - mMasterKeyId, tokenFingerprints, tokenUserId, tokenAid, tokenVersion); - - FragmentManager manager = getSupportFragmentManager(); - - manager.popBackStack("security_token", FragmentManager.POP_BACK_STACK_INCLUSIVE); - manager.beginTransaction() - .addToBackStack("security_token") - .replace(R.id.view_key_fragment, frag) - // if this is called while the activity wasn't resumed, just forget it happened - .commitAllowingStateLoss(); - } - }); - + super.onSecurityTokenPostExecute(); + finish(); } public void showMainFragment() { @@ -927,17 +825,6 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements // queue showing of the main fragment showMainFragment(); - // if it wasn't shown yet, display token fragment - if (mShowSecurityTokenAfterCreation && getIntent().hasExtra(EXTRA_SECURITY_TOKEN_AID)) { - mShowSecurityTokenAfterCreation = false; - Intent intent = getIntent(); - byte[] tokenFingerprints = intent.getByteArrayExtra(EXTRA_SECURITY_TOKEN_FINGERPRINTS); - String tokenUserId = intent.getStringExtra(EXTRA_SECURITY_TOKEN_USER_ID); - byte[] tokenAid = intent.getByteArrayExtra(EXTRA_SECURITY_TOKEN_AID); - double tokenVersion = intent.getDoubleExtra(EXTRA_SECURITY_TOKEN_VERSION, 2.0); - showSecurityTokenFragment(tokenFingerprints, tokenUserId, tokenAid, tokenVersion); - } - // if the refresh animation isn't playing if (!mRotate.hasStarted() && !mRotateSpin.hasStarted()) { // re-create options menu based on mIsSecret, mIsVerified diff --git a/OpenKeychain/src/main/res/layout/view_key_security_token.xml b/OpenKeychain/src/main/res/layout/view_key_security_token.xml deleted file mode 100644 index 27fa3d53c..000000000 --- a/OpenKeychain/src/main/res/layout/view_key_security_token.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -