diff options
author | Dominik Schürmann <dominik@dominikschuermann.de> | 2015-07-01 16:07:03 +0200 |
---|---|---|
committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2015-07-01 16:07:03 +0200 |
commit | 64a3cc5a9f232b8e3831bc1081982625e0e313ee (patch) | |
tree | 896bcd8abb99137f60c54c01a838b236fc14786d /OpenKeychain/src/main | |
parent | 362c83abe759cc0c5ed14e177e83d3279f25e52e (diff) | |
download | open-keychain-64a3cc5a9f232b8e3831bc1081982625e0e313ee.tar.gz open-keychain-64a3cc5a9f232b8e3831bc1081982625e0e313ee.tar.bz2 open-keychain-64a3cc5a9f232b8e3831bc1081982625e0e313ee.zip |
Add missing fragments for YubiKey PINs
Diffstat (limited to 'OpenKeychain/src/main')
4 files changed, 499 insertions, 0 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java new file mode 100644 index 000000000..8744762fe --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.ui; + +import android.app.Activity; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Pair; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; + +import java.security.SecureRandom; + +public class CreateYubiKeyPinFragment extends Fragment { + + // view + CreateKeyActivity mCreateKeyActivity; + TextView mPin; + TextView mAdminPin; + View mBackButton; + View mNextButton; + + /** + * Creates new instance of this fragment + */ + public static CreateYubiKeyPinFragment newInstance() { + CreateYubiKeyPinFragment frag = new CreateYubiKeyPinFragment(); + + Bundle args = new Bundle(); + frag.setArguments(args); + + return frag; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.create_yubi_key_pin_fragment, container, false); + + mPin = (TextView) view.findViewById(R.id.create_yubi_key_pin); + mAdminPin = (TextView) view.findViewById(R.id.create_yubi_key_admin_pin); + mBackButton = view.findViewById(R.id.create_key_back_button); + mNextButton = view.findViewById(R.id.create_key_next_button); + + if (mCreateKeyActivity.mYubiKeyPin == null) { + new AsyncTask<Void, Void, Pair<String, String>>() { + @Override + protected Pair<String, String> doInBackground(Void... unused) { + SecureRandom secureRandom = new SecureRandom(); + // min = 6, we choose 6 + String pin = "" + secureRandom.nextInt(999999); + // min = 8, we choose 10, but 6 are equals the PIN + String adminPin = pin + secureRandom.nextInt(9999); + + return new Pair<>(pin, adminPin); + } + + @Override + protected void onPostExecute(Pair<String, String> pair) { + mCreateKeyActivity.mYubiKeyPin = pair.first; + mCreateKeyActivity.mYubiKeyAdminPin = pair.second; + + mPin.setText(mCreateKeyActivity.mYubiKeyPin); + mAdminPin.setText(mCreateKeyActivity.mYubiKeyAdminPin); + } + }.execute(); + } else { + mPin.setText(mCreateKeyActivity.mYubiKeyPin); + mAdminPin.setText(mCreateKeyActivity.mYubiKeyAdminPin); + } + + mBackButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + back(); + } + }); + mNextButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + nextClicked(); + } + }); + + + return view; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mCreateKeyActivity = (CreateKeyActivity) getActivity(); + } + + + private void nextClicked() { + // save state +// mCreateKeyActivity.mPassphrase = new Passphrase(mPassphraseEdit); + + CreateYubiKeyPinRepeatFragment frag = CreateYubiKeyPinRepeatFragment.newInstance(); + mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); + } + + private void back() { + mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT); + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java new file mode 100644 index 000000000..dc437577a --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinRepeatFragment.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.ui; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; + +public class CreateYubiKeyPinRepeatFragment extends Fragment { + + // view + CreateKeyActivity mCreateKeyActivity; + EditText mPin; + EditText mAdminPin; + View mBackButton; + View mNextButton; + + /** + * Creates new instance of this fragment + */ + public static CreateYubiKeyPinRepeatFragment newInstance() { + CreateYubiKeyPinRepeatFragment frag = new CreateYubiKeyPinRepeatFragment(); + + Bundle args = new Bundle(); + frag.setArguments(args); + + return frag; + } + + /** + * Checks if text of given EditText is not empty. If it is empty an error is + * set and the EditText gets the focus. + * + * @param context + * @param editText + * @return true if EditText is not empty + */ + private static boolean isEditTextNotEmpty(Context context, EditText editText) { + boolean output = true; + if (editText.getText().length() == 0) { + editText.setError(context.getString(R.string.create_key_empty)); + editText.requestFocus(); + output = false; + } else { + editText.setError(null); + } + + return output; + } + + private static boolean checkPin(Context context, EditText editText1, String pin) { + boolean output = editText1.getText().toString().equals(pin); + + if (!output) { + editText1.setError(context.getString(R.string.create_key_yubi_key_pin_not_correct)); + editText1.requestFocus(); + } else { + editText1.setError(null); + } + + return output; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.create_yubi_key_pin_repeat_fragment, container, false); + + mPin = (EditText) view.findViewById(R.id.create_yubi_key_pin_repeat); + mAdminPin = (EditText) view.findViewById(R.id.create_yubi_key_admin_pin_repeat); + mBackButton = view.findViewById(R.id.create_key_back_button); + mNextButton = view.findViewById(R.id.create_key_next_button); + + mPin.requestFocus(); + mBackButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + back(); + } + }); + mNextButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + nextClicked(); + } + }); + + return view; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mCreateKeyActivity = (CreateKeyActivity) getActivity(); + } + + private void back() { + hideKeyboard(); + mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT); + } + + private void nextClicked() { + if (isEditTextNotEmpty(getActivity(), mPin) + && checkPin(getActivity(), mPin, mCreateKeyActivity.mYubiKeyPin) + && isEditTextNotEmpty(getActivity(), mAdminPin) + && checkPin(getActivity(), mAdminPin, mCreateKeyActivity.mYubiKeyAdminPin)) { + + CreateKeyFinalFragment frag = CreateKeyFinalFragment.newInstance(); + hideKeyboard(); + mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); + } + } + + private void hideKeyboard() { + if (getActivity() == null) { + return; + } + InputMethodManager inputManager = (InputMethodManager) getActivity() + .getSystemService(Context.INPUT_METHOD_SERVICE); + + // check if no view has focus + View v = getActivity().getCurrentFocus(); + if (v == null) + return; + + inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0); + } + +} diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml new file mode 100644 index 000000000..b139a1d61 --- /dev/null +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fillViewport="true" + android:layout_above="@+id/create_key_buttons"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:orientation="vertical"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginLeft="8dp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="@string/create_key_yubi_key_pin_text" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginLeft="8dp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="@string/create_key_yubi_key_pin" /> + + <TextView + android:id="@+id/create_yubi_key_pin" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginLeft="8dp" + android:textAppearance="?android:attr/textAppearanceLarge" + tools:text="123456" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginLeft="8dp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="@string/create_key_yubi_key_admin_pin" /> + + <TextView + android:id="@+id/create_yubi_key_admin_pin" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginLeft="8dp" + android:textAppearance="?android:attr/textAppearanceLarge" + tools:text="12345678" /> + + </LinearLayout> + </ScrollView> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:background="@color/holo_gray_bright" + android:id="@+id/create_key_buttons"> + + <TextView + android:id="@+id/create_key_back_button" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/btn_back" + android:textAllCaps="true" + android:minHeight="?android:attr/listPreferredItemHeight" + android:drawableLeft="@drawable/ic_chevron_left_grey_24dp" + android:drawablePadding="8dp" + android:gravity="left|center_vertical" + android:clickable="true" + style="?android:attr/borderlessButtonStyle" /> + + <TextView + android:id="@+id/create_key_next_button" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/btn_next" + android:textAllCaps="true" + android:minHeight="?android:attr/listPreferredItemHeight" + android:drawableRight="@drawable/ic_chevron_right_grey_24dp" + android:drawablePadding="8dp" + android:gravity="right|center_vertical" + android:clickable="true" + style="?android:attr/borderlessButtonStyle" /> + </LinearLayout> +</RelativeLayout>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml new file mode 100644 index 000000000..bd32130ad --- /dev/null +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/create_key_buttons" + android:fillViewport="true"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingRight="16dp"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="8dp" + android:layout_marginTop="16dp" + android:text="@string/create_key_yubi_key_pin_repeat_text" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="8dp" + android:layout_marginTop="16dp" + android:text="@string/create_key_yubi_key_pin" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <EditText + android:id="@+id/create_yubi_key_pin_repeat" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginBottom="8dp" + android:ems="10" + android:hint="@string/create_key_yubi_key_pin_repeat" + android:inputType="numberPassword" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="8dp" + android:layout_marginTop="16dp" + android:text="@string/create_key_yubi_key_admin_pin" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <EditText + android:id="@+id/create_yubi_key_admin_pin_repeat" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginBottom="8dp" + android:ems="10" + android:hint="@string/create_key_yubi_key_admin_pin_repeat" + android:inputType="numberPassword" /> + + </LinearLayout> + </ScrollView> + + <LinearLayout + android:id="@+id/create_key_buttons" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:background="@color/holo_gray_bright" + android:orientation="horizontal"> + + <TextView + android:id="@+id/create_key_back_button" + style="?android:attr/borderlessButtonStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:clickable="true" + android:drawableLeft="@drawable/ic_chevron_left_grey_24dp" + android:drawablePadding="8dp" + android:gravity="left|center_vertical" + android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:text="@string/btn_back" + android:textAllCaps="true" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/create_key_next_button" + style="?android:attr/borderlessButtonStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:clickable="true" + android:drawablePadding="8dp" + android:drawableRight="@drawable/ic_chevron_right_grey_24dp" + android:gravity="right|center_vertical" + android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:text="@string/btn_next" + android:textAllCaps="true" + android:textAppearance="?android:attr/textAppearanceMedium" /> + </LinearLayout> +</RelativeLayout>
\ No newline at end of file |