From be58f2ff4caa1cf016dbfadb1f167e7ec8f3121a Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 13 Apr 2018 17:32:21 +0200 Subject: [PATCH] Add autocrypt key transfer api method --- OpenKeychain/src/main/AndroidManifest.xml | 4 + .../remote/ApiPendingIntentFactory.java | 9 ++ .../keychain/remote/OpenPgpService.java | 34 ++++++ .../ui/RemoteDisplayTransferCodeActivity.java | 114 ++++++++++++++++++ .../res/layout/api_display_transfer_code.xml | 52 ++++++++ extern/openpgp-api-lib | 2 +- 6 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteDisplayTransferCodeActivity.java create mode 100644 OpenKeychain/src/main/res/layout/api_display_transfer_code.xml diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index 6b7677a14..51ce60576 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -929,6 +929,10 @@ android:configChanges="keyboardHidden|keyboard" android:label="@string/title_backup" /> + + . + */ + +package org.sufficientlysecure.keychain.remote.ui; + + +import java.nio.CharBuffer; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger; +import org.sufficientlysecure.keychain.ui.widget.PrefixedEditText; +import org.sufficientlysecure.keychain.util.Numeric9x4PassphraseUtil; +import org.sufficientlysecure.keychain.util.Passphrase; + + +public class RemoteDisplayTransferCodeActivity extends FragmentActivity { + public static final String EXTRA_TRANSFER_CODE = "transfer_code"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState == null) { + DisplayTransferCodeDialogFragment frag = new DisplayTransferCodeDialogFragment(); + frag.setArguments(getIntent().getExtras()); + frag.show(getSupportFragmentManager(), "displayTransferCode"); + } + } + + public static class DisplayTransferCodeDialogFragment extends DialogFragment { + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity activity = getActivity(); + + Passphrase transferCode = getArguments().getParcelable(EXTRA_TRANSFER_CODE); + + ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity); + CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(theme); + + @SuppressLint("InflateParams") + View view = LayoutInflater.from(theme).inflate(R.layout.api_display_transfer_code, null, false); + alert.setView(view); + alert.setPositiveButton(R.string.button_got_it, (dialog, which) -> dismiss()); + + TextView[] transferCodeTextViews = new TextView[9]; + transferCodeTextViews[0] = view.findViewById(R.id.transfer_code_block_1); + transferCodeTextViews[1] = view.findViewById(R.id.transfer_code_block_2); + transferCodeTextViews[2] = view.findViewById(R.id.transfer_code_block_3); + transferCodeTextViews[3] = view.findViewById(R.id.transfer_code_block_4); + transferCodeTextViews[4] = view.findViewById(R.id.transfer_code_block_5); + transferCodeTextViews[5] = view.findViewById(R.id.transfer_code_block_6); + transferCodeTextViews[6] = view.findViewById(R.id.transfer_code_block_7); + transferCodeTextViews[7] = view.findViewById(R.id.transfer_code_block_8); + transferCodeTextViews[8] = view.findViewById(R.id.transfer_code_block_9); + + setTransferCode(transferCodeTextViews, transferCode); + + return alert.create(); + } + + private void setTransferCode(TextView[] view, Passphrase transferCode) { + CharBuffer transferCodeChars = CharBuffer.wrap(transferCode.getCharArray()).asReadOnlyBuffer(); + if (!Numeric9x4PassphraseUtil.isNumeric9x4Passphrase(transferCodeChars)) { + throw new IllegalStateException("Illegal passphrase format!"); + } + + PrefixedEditText prefixedEditText = (PrefixedEditText) view[0]; + prefixedEditText.setHint("34"); + prefixedEditText.setPrefix(transferCodeChars.subSequence(0, 2)); + prefixedEditText.setText(transferCodeChars.subSequence(2, 4)); + + for (int i = 1; i < 9; i++) { + view[i].setText(transferCodeChars.subSequence(i*5, i*5+4)); + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + + getActivity().finish(); + } + } + +} diff --git a/OpenKeychain/src/main/res/layout/api_display_transfer_code.xml b/OpenKeychain/src/main/res/layout/api_display_transfer_code.xml new file mode 100644 index 000000000..adb970240 --- /dev/null +++ b/OpenKeychain/src/main/res/layout/api_display_transfer_code.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib index bfb355c5b..3631265b3 160000 --- a/extern/openpgp-api-lib +++ b/extern/openpgp-api-lib @@ -1 +1 @@ -Subproject commit bfb355c5bfa57245f50efd747a4f297eda57254a +Subproject commit 3631265b348a02ea3c79f4f38f6c031a82298ed5