From e0847cafaf53eac9b364343c1f5e74554b51053d Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 12 Jan 2015 19:27:46 +0100 Subject: even more intermediate result --- .../AffirmationCreateHttpsStep1Fragment.java | 168 ++------------------- .../AffirmationCreateHttpsStep2Fragment.java | 53 +++---- 2 files changed, 32 insertions(+), 189 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep1Fragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep1Fragment.java index 30cfe9a79..818008bb0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep1Fragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep1Fragment.java @@ -17,11 +17,7 @@ package org.sufficientlysecure.keychain.ui.affirmations; -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.text.Editable; import android.text.TextWatcher; @@ -32,33 +28,16 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; -import org.openintents.openpgp.util.OpenPgpApi; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.operations.results.SignEncryptResult; +import org.sufficientlysecure.keychain.pgp.affirmation.Affirmation; import org.sufficientlysecure.keychain.pgp.affirmation.resources.GenericHttpsResource; -import org.sufficientlysecure.keychain.service.KeychainIntentService; -import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; -import org.sufficientlysecure.keychain.ui.NfcActivity; -import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity; - -import java.util.Date; public class AffirmationCreateHttpsStep1Fragment extends Fragment { - public static final int REQUEST_CODE_PASSPHRASE = 0x00008001; - public static final int REQUEST_CODE_NFC = 0x00008002; - AffirmationWizard mAffirmationWizard; - String mProofUri, mProofText; - EditText mEditUri; - // For NFC data - protected String mSigningKeyPassphrase = null; - protected Date mNfcTimestamp = null; - protected byte[] mNfcHash = null; - /** * Creates new instance of this fragment */ @@ -93,10 +72,15 @@ public class AffirmationCreateHttpsStep1Fragment extends Fragment { return; } - mProofUri = uri; - mProofText = GenericHttpsResource.generate(mAffirmationWizard.mFingerprint, null); + String proofNonce = Affirmation.generateNonce(); + String proofText = GenericHttpsResource.generateText(getActivity(), + mAffirmationWizard.mFingerprint, proofNonce); + + AffirmationCreateHttpsStep2Fragment frag = + AffirmationCreateHttpsStep2Fragment.newInstance(uri, proofNonce, proofText); + + mAffirmationWizard.loadFragment(null, frag, AffirmationWizard.FRAG_ACTION_TO_RIGHT); - generateResourceAndNext(); } }); @@ -134,142 +118,8 @@ public class AffirmationCreateHttpsStep1Fragment extends Fragment { return view; } - public void generateResourceAndNext () { - - // Send all information needed to service to edit key in other thread - Intent intent = new Intent(getActivity(), KeychainIntentService.class); - intent.setAction(KeychainIntentService.ACTION_SIGN_ENCRYPT); - intent.putExtra(KeychainIntentService.EXTRA_DATA, createEncryptBundle()); - - // Message is received after encrypting is done in KeychainIntentService - KeychainIntentServiceHandler serviceHandler = new KeychainIntentServiceHandler( - mAffirmationWizard, getString(R.string.progress_encrypting), - ProgressDialog.STYLE_HORIZONTAL) { - public void handleMessage(Message message) { - // handle messages by standard KeychainIntentServiceHandler first - super.handleMessage(message); - - if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { - SignEncryptResult pgpResult = - message.getData().getParcelable(SignEncryptResult.EXTRA_RESULT); - - if (pgpResult.isPending()) { - if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) == - SignEncryptResult.RESULT_PENDING_PASSPHRASE) { - startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded()); - } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) == - SignEncryptResult.RESULT_PENDING_NFC) { - - mNfcTimestamp = pgpResult.getNfcTimestamp(); - startNfcSign(pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo()); - } else { - throw new RuntimeException("Unhandled pending result!"); - } - return; - } - - if (pgpResult.success()) { - String proofText = new String( - message.getData().getByteArray(KeychainIntentService.RESULT_BYTES)); - - AffirmationCreateHttpsStep2Fragment frag = - AffirmationCreateHttpsStep2Fragment.newInstance(mProofUri, proofText); - - mAffirmationWizard.loadFragment(null, frag, AffirmationWizard.FRAG_ACTION_TO_RIGHT); - } else { - pgpResult.createNotify(getActivity()).show(); - } - - // no matter the result, reset parameters - mSigningKeyPassphrase = null; - mNfcHash = null; - mNfcTimestamp = null; - } - } - }; - // Create a new Messenger for the communication back - Messenger messenger = new Messenger(serviceHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); - - // show progress dialog - serviceHandler.showProgressDialog(getActivity()); - - // start service with intent - getActivity().startService(intent); - - } - - protected Bundle createEncryptBundle() { - // fill values for this action - Bundle data = new Bundle(); - - data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_BYTES); - data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_BYTES); - data.putByteArray(KeychainIntentService.ENCRYPT_MESSAGE_BYTES, mProofText.getBytes()); - - // Always use armor for messages - data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_ARMOR, true); - - data.putLong(KeychainIntentService.ENCRYPT_SIGNATURE_MASTER_ID, mAffirmationWizard.mMasterKeyId); - data.putString(KeychainIntentService.ENCRYPT_SIGNATURE_KEY_PASSPHRASE, mSigningKeyPassphrase); - data.putSerializable(KeychainIntentService.ENCRYPT_SIGNATURE_NFC_TIMESTAMP, mNfcTimestamp); - data.putByteArray(KeychainIntentService.ENCRYPT_SIGNATURE_NFC_HASH, mNfcHash); - - return data; - } - - protected void startPassphraseDialog(long subkeyId) { - Intent intent = new Intent(getActivity(), PassphraseDialogActivity.class); - intent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID, subkeyId); - startActivityForResult(intent, REQUEST_CODE_PASSPHRASE); - } - - protected void startNfcSign(long keyId, String pin, byte[] hashToSign, int hashAlgo) { - // build PendingIntent for Yubikey NFC operations - Intent intent = new Intent(getActivity(), NfcActivity.class); - intent.setAction(NfcActivity.ACTION_SIGN_HASH); - - // pass params through to activity that it can be returned again later to repeat pgp operation - intent.putExtra(NfcActivity.EXTRA_DATA, new Intent()); // not used, only relevant to OpenPgpService - intent.putExtra(NfcActivity.EXTRA_KEY_ID, keyId); - intent.putExtra(NfcActivity.EXTRA_PIN, pin); - intent.putExtra(NfcActivity.EXTRA_NFC_HASH_TO_SIGN, hashToSign); - intent.putExtra(NfcActivity.EXTRA_NFC_HASH_ALGO, hashAlgo); - - startActivityForResult(intent, REQUEST_CODE_NFC); - } - private static boolean checkUri(String uri) { return Patterns.WEB_URL.matcher(uri).matches(); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case REQUEST_CODE_PASSPHRASE: { - if (resultCode == AffirmationWizard.RESULT_OK && data != null) { - mSigningKeyPassphrase = data.getStringExtra(PassphraseDialogActivity.MESSAGE_DATA_PASSPHRASE); - generateResourceAndNext(); - return; - } - break; - } - - case REQUEST_CODE_NFC: { - if (resultCode == AffirmationWizard.RESULT_OK && data != null) { - mNfcHash = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_SIGNED_HASH); - generateResourceAndNext(); - return; - } - break; - } - - default: { - super.onActivityResult(requestCode, resultCode, data); - break; - } - } - } - - } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep2Fragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep2Fragment.java index ee7ba1a77..55a6be40c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep2Fragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/affirmations/AffirmationCreateHttpsStep2Fragment.java @@ -31,20 +31,18 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageView; +import android.widget.TextView; -import org.openintents.openpgp.OpenPgpSignatureResult; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; +import org.sufficientlysecure.keychain.operations.results.LinkedVerifyResult; import org.sufficientlysecure.keychain.pgp.affirmation.resources.GenericHttpsResource; -import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.FileHelper; import java.io.File; import java.io.FileNotFoundException; -import java.io.IOException; import java.io.PrintWriter; import java.net.URI; import java.net.URISyntaxException; @@ -53,25 +51,29 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { private static final int REQUEST_CODE_OUTPUT = 0x00007007; - public static final String URI = "uri", TEXT = "text"; + public static final String URI = "uri", NONCE = "nonce", TEXT = "text"; AffirmationWizard mAffirmationWizard; EditText mEditUri; ImageView mVerifyImage; View mVerifyProgress; + TextView mVerifyStatus; String mResourceUri; - String mProofString; + String mResourceNonce, mResourceString; /** * Creates new instance of this fragment */ - public static AffirmationCreateHttpsStep2Fragment newInstance(String uri, String proofText) { + public static AffirmationCreateHttpsStep2Fragment newInstance + (String uri, String proofNonce, String proofText) { + AffirmationCreateHttpsStep2Fragment frag = new AffirmationCreateHttpsStep2Fragment(); Bundle args = new Bundle(); args.putString(URI, uri); + args.putString(NONCE, proofNonce); args.putString(TEXT, proofText); frag.setArguments(args); @@ -83,7 +85,8 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { final View view = inflater.inflate(R.layout.affirmation_create_https_fragment_step2, container, false); mResourceUri = getArguments().getString(URI); - mProofString = getArguments().getString(TEXT); + mResourceNonce = getArguments().getString(NONCE); + mResourceString = getArguments().getString(TEXT); view.findViewById(R.id.next_button).setOnClickListener(new OnClickListener() { @Override @@ -98,6 +101,7 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { mVerifyImage = (ImageView) view.findViewById(R.id.verify_image); mVerifyProgress = view.findViewById(R.id.verify_progress); + mVerifyStatus = (TextView) view.findViewById(R.id.verify_status); view.findViewById(R.id.button_send).setOnClickListener(new OnClickListener() { @Override @@ -124,6 +128,7 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { mEditUri.setText(mResourceUri); setVerifyProgress(false, null); + mVerifyStatus.setText(R.string.linked_verify_pending); return view; } @@ -139,14 +144,17 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { mVerifyProgress.setVisibility(on ? View.VISIBLE : View.GONE); mVerifyImage.setVisibility(on ? View.GONE : View.VISIBLE); if (success == null) { + mVerifyStatus.setText(R.string.linked_verifying); mVerifyImage.setImageResource(R.drawable.status_signature_unverified_cutout); mVerifyImage.setColorFilter(getResources().getColor(R.color.tertiary_text_light), PorterDuff.Mode.SRC_IN); } else if (success) { + mVerifyStatus.setText(R.string.linked_verify_success); mVerifyImage.setImageResource(R.drawable.status_signature_verified_cutout); mVerifyImage.setColorFilter(getResources().getColor(R.color.android_green_dark), PorterDuff.Mode.SRC_IN); } else { + mVerifyStatus.setText(R.string.linked_verify_error); mVerifyImage.setImageResource(R.drawable.status_signature_unknown_cutout); mVerifyImage.setColorFilter(getResources().getColor(R.color.android_red_dark), PorterDuff.Mode.SRC_IN); @@ -159,33 +167,18 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { try { final GenericHttpsResource resource = GenericHttpsResource.createNew(new URI(mResourceUri)); - new AsyncTask() { + new AsyncTask() { @Override - protected DecryptVerifyResult doInBackground(Void... params) { - - try { - return resource.verify(getActivity(), new ProviderHelper(getActivity()), null); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; + protected LinkedVerifyResult doInBackground(Void... params) { + return resource.verify(mAffirmationWizard.mFingerprint, mResourceNonce); } @Override - protected void onPostExecute(DecryptVerifyResult result) { + protected void onPostExecute(LinkedVerifyResult result) { super.onPostExecute(result); if (result.success()) { - switch (result.getSignatureResult().getStatus()) { - case OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED: - setVerifyProgress(false, true); - break; - default: - setVerifyProgress(false, false); - // on error, show error message - result.createNotify(getActivity()).show(); - } + setVerifyProgress(false, true); } else { setVerifyProgress(false, false); // on error, show error message @@ -202,7 +195,7 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { private void proofSend() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, mProofString); + sendIntent.putExtra(Intent.EXTRA_TEXT, mResourceString); sendIntent.setType("text/plain"); startActivity(sendIntent); } @@ -229,7 +222,7 @@ public class AffirmationCreateHttpsStep2Fragment extends Fragment { try { PrintWriter out = new PrintWriter(getActivity().getContentResolver().openOutputStream(uri)); - out.print(mProofString); + out.print(mResourceString); if (out.checkError()) { Notify.showNotify(getActivity(), "Error writing file!", Style.ERROR); } -- cgit v1.2.3