Use operation helper for move to card

This commit is contained in:
Dominik Schürmann 2015-07-01 14:16:54 +02:00
parent 88f8a38854
commit 79f37d3267

View file

@ -18,13 +18,11 @@
package org.sufficientlysecure.keychain.ui; package org.sufficientlysecure.keychain.ui;
import android.app.Activity; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Message; import android.support.v4.app.Fragment;
import android.os.Messenger;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -43,21 +41,17 @@ import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.ExportKeyringParcel; import org.sufficientlysecure.keychain.service.ExportKeyringParcel;
import org.sufficientlysecure.keychain.service.KeychainService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;
import org.sufficientlysecure.keychain.service.ServiceProgressHandler;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
import org.sufficientlysecure.keychain.ui.base.CryptoOperationFragment;
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.Preferences;
import java.util.Iterator; import java.util.Iterator;
public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringParcel, OperationResult> { public class CreateKeyFinalFragment extends Fragment {
public static final int REQUEST_EDIT_KEY = 0x00008007; public static final int REQUEST_EDIT_KEY = 0x00008007;
@ -73,6 +67,7 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
private CryptoOperationHelper<ExportKeyringParcel, ExportResult> mUploadOpHelper; private CryptoOperationHelper<ExportKeyringParcel, ExportResult> mUploadOpHelper;
private CryptoOperationHelper<SaveKeyringParcel, EditKeyResult> mCreateOpHelper; private CryptoOperationHelper<SaveKeyringParcel, EditKeyResult> mCreateOpHelper;
private CryptoOperationHelper<SaveKeyringParcel, EditKeyResult> mMoveToCardOpHelper;
public static CreateKeyFinalFragment newInstance() { public static CreateKeyFinalFragment newInstance() {
CreateKeyFinalFragment frag = new CreateKeyFinalFragment(); CreateKeyFinalFragment frag = new CreateKeyFinalFragment();
@ -150,6 +145,16 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mCreateOpHelper != null) {
mCreateOpHelper.handleActivityResult(requestCode, resultCode, data);
}
if (mMoveToCardOpHelper != null) {
mMoveToCardOpHelper.handleActivityResult(requestCode, resultCode, data);
}
if (mUploadOpHelper != null) {
mUploadOpHelper.handleActivityResult(requestCode, resultCode, data);
}
switch (requestCode) { switch (requestCode) {
case REQUEST_EDIT_KEY: { case REQUEST_EDIT_KEY: {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
@ -172,6 +177,7 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
if (mSaveKeyringParcel == null) { if (mSaveKeyringParcel == null) {
mSaveKeyringParcel = new SaveKeyringParcel(); mSaveKeyringParcel = new SaveKeyringParcel();
if (createKeyActivity.mUseSmartCardSettings) { if (createKeyActivity.mUseSmartCardSettings) {
mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA,
2048, null, KeyFlags.SIGN_DATA | KeyFlags.CERTIFY_OTHER, 0L)); 2048, null, KeyFlags.SIGN_DATA | KeyFlags.CERTIFY_OTHER, 0L));
@ -223,10 +229,7 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
public void onCryptoOperationSuccess(EditKeyResult result) { public void onCryptoOperationSuccess(EditKeyResult result) {
if (createKeyActivity.mUseSmartCardSettings) { if (createKeyActivity.mUseSmartCardSettings) {
// save key id in between moveToCard(result);
mSaveKeyringParcel.mMasterKeyId = result.mMasterKeyId;
// calls cryptoOperation corresponding to moveToCard
cryptoOperation(new CryptoInputParcel());
return; return;
} }
@ -264,28 +267,26 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
mCreateOpHelper.cryptoOperation(); mCreateOpHelper.cryptoOperation();
} }
// currently only used for moveToCard private void moveToCard(final EditKeyResult saveKeyResult) {
@Override
public SaveKeyringParcel createOperationInput() {
CachedPublicKeyRing key = (new ProviderHelper(getActivity())) CachedPublicKeyRing key = (new ProviderHelper(getActivity()))
.getCachedPublicKeyRing(mSaveKeyringParcel.mMasterKeyId); .getCachedPublicKeyRing(saveKeyResult.mMasterKeyId);
// overwrite mSaveKeyringParcel! final SaveKeyringParcel changeKeyringParcel;
try { try {
mSaveKeyringParcel = new SaveKeyringParcel(key.getMasterKeyId(), key.getFingerprint()); changeKeyringParcel = new SaveKeyringParcel(key.getMasterKeyId(), key.getFingerprint());
} catch (PgpKeyNotFoundException e) { } catch (PgpKeyNotFoundException e) {
Log.e(Constants.TAG, "Key that should be moved to YubiKey not found in database!"); Log.e(Constants.TAG, "Key that should be moved to YubiKey not found in database!");
return null; return;
} }
Cursor cursor = getActivity().getContentResolver().query( Cursor cursor = getActivity().getContentResolver().query(
KeychainContract.Keys.buildKeysUri(mSaveKeyringParcel.mMasterKeyId), KeychainContract.Keys.buildKeysUri(changeKeyringParcel.mMasterKeyId),
new String[]{KeychainContract.Keys.KEY_ID,}, null, null, null new String[]{KeychainContract.Keys.KEY_ID,}, null, null, null
); );
try { try {
while (cursor != null && cursor.moveToNext()) { while (cursor != null && cursor.moveToNext()) {
long subkeyId = cursor.getLong(0); long subkeyId = cursor.getLong(0);
mSaveKeyringParcel.getOrCreateSubkeyChange(subkeyId).mMoveKeyToCard = true; changeKeyringParcel.getOrCreateSubkeyChange(subkeyId).mMoveKeyToCard = true;
} }
} finally { } finally {
if (cursor != null) { if (cursor != null) {
@ -293,17 +294,33 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
} }
} }
return mSaveKeyringParcel; CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult> callback
= new CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult>() {
@Override
public SaveKeyringParcel createOperationInput() {
return changeKeyringParcel;
} }
// currently only used for moveToCard
@Override @Override
public void onCryptoOperationSuccess(OperationResult result) { public void onCryptoOperationSuccess(EditKeyResult result) {
EditKeyResult editResult = (EditKeyResult) result; handleResult(result);
}
if (editResult.mMasterKeyId != null && mUploadCheckbox.isChecked()) { @Override
public void onCryptoOperationCancelled() {
}
@Override
public void onCryptoOperationError(EditKeyResult result) {
handleResult(result);
}
public void handleResult(EditKeyResult result) {
if (result.mMasterKeyId != null && mUploadCheckbox.isChecked()) {
// result will be displayed after upload // result will be displayed after upload
uploadKey(editResult); uploadKey(result);
return; return;
} }
@ -313,7 +330,17 @@ public class CreateKeyFinalFragment extends CryptoOperationFragment<SaveKeyringP
getActivity().finish(); getActivity().finish();
} }
// TODO move into EditKeyOperation @Override
public boolean onCryptoSetProgress(String msg, int progress, int max) {
return false;
}
};
mMoveToCardOpHelper = new CryptoOperationHelper<>(this, callback, R.string.progress_modify);
mMoveToCardOpHelper.cryptoOperation();
}
private void uploadKey(final EditKeyResult saveKeyResult) { private void uploadKey(final EditKeyResult saveKeyResult) {
// set data uri as path to keyring // set data uri as path to keyring
final Uri blobUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri( final Uri blobUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(