diff --git a/app/build.gradle b/app/build.gradle index 6676d8f7..1d441238 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,6 +59,8 @@ dependencies { compile "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion" compile "com.jakewharton.timber:timber:$rootProject.ext.timberVersion" + compile 'com.nulab-inc:zxcvbn:1.2.3' + testCompile "junit:junit:$rootProject.ext.junitVersion" testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion" testCompile "com.squareup.okhttp3:mockwebserver:$rootProject.ext.okHttpVersion" diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java index 1f1310cf..f5aa5664 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java @@ -21,7 +21,9 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; +import android.text.Editable; import android.text.InputType; +import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -37,6 +39,8 @@ import com.m2049r.xmrwallet.widget.Toolbar; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.util.Helper; +import com.nulabinc.zxcvbn.Strength; +import com.nulabinc.zxcvbn.Zxcvbn; import java.io.File; import java.text.ParseException; @@ -129,7 +133,7 @@ public class GenerateFragment extends Fragment { }); Helper.showKeyboard(getActivity()); -//############## + etWalletName.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_NEXT)) { @@ -256,11 +260,61 @@ public class GenerateFragment extends Fragment { } }); + etWalletPassword.getEditText().addTextChangedListener(new TextWatcher() { + @Override + public void afterTextChanged(Editable editable) { + checkPassword(); + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + }); + etWalletName.requestFocus(); + initZxcvbn(); return view; } + Zxcvbn zxcvbn = new Zxcvbn(); + + // initialize zxcvbn engine in background thread + private void initZxcvbn() { + new Thread(new Runnable() { + @Override + public void run() { + zxcvbn.measure(""); + } + }).start(); + } + + private void checkPassword() { + String password = etWalletPassword.getEditText().getText().toString(); + if (!password.isEmpty()) { + Strength strength = zxcvbn.measure(password); + int msg; + double guessesLog10 = strength.getGuessesLog10(); + if (guessesLog10 < 10) + msg = R.string.password_weak; + else if (guessesLog10 < 11) + msg = R.string.password_fair; + else if (guessesLog10 < 12) + msg = R.string.password_good; + else if (guessesLog10 < 13) + msg = R.string.password_strong; + else + msg = R.string.password_very_strong; + etWalletPassword.setError(getResources().getString(msg)); + } else { + etWalletPassword.setError(null); + } + } + private boolean checkName() { String name = etWalletName.getEditText().getText().toString(); boolean ok = true; diff --git a/app/src/main/res/layout/layout_fabmenu.xml b/app/src/main/res/layout/layout_fabmenu.xml index 826c4d9c..35de8eec 100644 --- a/app/src/main/res/layout/layout_fabmenu.xml +++ b/app/src/main/res/layout/layout_fabmenu.xml @@ -113,7 +113,8 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_marginBottom="88dp" - android:layout_marginEnd="16dp"> + android:layout_marginEnd="16dp" + android:background="?android:attr/selectableItemBackgroundBorderless"> <TextView android:id="@+id/fabSeedT" diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ce523337..2e48bf1e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -13,6 +13,12 @@ <string name="menu_archive">Archivar</string> <string name="menu_backup">Copia de seguridad</string> + <string name="password_weak">Sigue escribiendo …</string> + <string name="password_fair">Mas o menos.</string> + <string name="password_good">Puedes hacerlo mejor.</string> + <string name="password_strong">Casi …</string> + <string name="password_very_strong">¡Bien ahí, hacker nivel 4!</string> + <string name="label_login_wallets">Monederos</string> <string name="label_donate">Donar</string> <string name="label_ok">Aceptar</string> @@ -126,7 +132,7 @@ <string name="generate_title">Crear monedero</string> <string name="generate_name_hint">Nombre del monedero</string> - <string name="generate_password_hint">Contraseña del monedero</string> + <string name="generate_password_hint">Frase de Contraseña</string> <string name="generate_buttonGenerate">¡Házme ya un monedero!</string> <string name="generate_seed">Semilla Mnemotécnica</string> <string name="generate_button_accept">¡He apuntado estas 25 palabras!</string> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd4e8191..6bf7e758 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,12 @@ <string name="menu_archive">Archive</string> <string name="menu_backup">Backup</string> + <string name="password_weak">Continue typing …</string> + <string name="password_fair">Meh …</string> + <string name="password_good">C\'mon, you can do better!</string> + <string name="password_strong">Getting there …</string> + <string name="password_very_strong">Yeah baby, h4x0r style!</string> + <string name="label_login_wallets">Wallets</string> <string name="label_donate">Donate</string> <string name="label_ok">OK</string> @@ -197,7 +203,7 @@ <string name="generate_title">Create Wallet</string> <string name="generate_name_hint">Wallet Name</string> - <string name="generate_password_hint">Wallet Password</string> + <string name="generate_password_hint">Wallet Passphrase</string> <string name="generate_buttonGenerate">Make me a wallet already!</string> <string name="generate_seed">Mnemonic Seed</string> <string name="generate_button_accept">I have noted these 25 words!</string>