Skip to content

Commit cb12d64

Browse files
authored
Various Fixes (#279)
* load password only if it's passed * cancel fingerprint if password entered * rework fingerprint code * cleanup unused params * new version code
1 parent a8f08fb commit cb12d64

File tree

7 files changed

+125
-100
lines changed

7 files changed

+125
-100
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.m2049r.xmrwallet"
88
minSdkVersion 21
99
targetSdkVersion 25
10-
versionCode 92
11-
versionName "1.5.2 'CrAzY Nacho'"
10+
versionCode 93
11+
versionName "1.5.3 'CrAzY Nacho'"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
externalNativeBuild {
1414
cmake {

app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import com.m2049r.xmrwallet.widget.Toolbar;
5454

5555
import java.io.File;
56-
import java.security.KeyStoreException;
5756

5857
import timber.log.Timber;
5958

@@ -392,27 +391,27 @@ protected void onPreExecute() {
392391

393392
@Override
394393
protected Boolean doInBackground(String... params) {
395-
if (params.length != 4) return false;
396-
File walletFile = Helper.getWalletFile(getActivity(), params[0]);
397-
String oldPassword = params[1];
398-
String userPassword = params[2];
399-
boolean fingerprintAuthAllowed = Boolean.valueOf(params[3]);
394+
if (params.length != 2) return false;
395+
final String userPassword = params[0];
396+
final boolean fingerPassValid = Boolean.valueOf(params[1]);
400397
newPassword = KeyStoreHelper.getCrazyPass(getActivity(), userPassword);
401-
boolean success = changeWalletPassword(newPassword);
398+
final boolean success = changeWalletPassword(newPassword);
402399
if (success) {
403-
if (fingerprintAuthAllowed) {
404-
KeyStoreHelper.saveWalletUserPass(getActivity(), walletName, userPassword);
405-
} else {
406-
KeyStoreHelper.removeWalletUserPass(getActivity(), walletName);
407-
}
400+
Context ctx = getActivity();
401+
if (ctx != null)
402+
if (fingerPassValid) {
403+
KeyStoreHelper.saveWalletUserPass(ctx, walletName, userPassword);
404+
} else {
405+
KeyStoreHelper.removeWalletUserPass(ctx, walletName);
406+
}
408407
}
409408
return success;
410409
}
411410

412411
@Override
413412
protected void onPostExecute(Boolean result) {
414413
super.onPostExecute(result);
415-
if (getActivity().isDestroyed()) {
414+
if ((getActivity() == null) || getActivity().isDestroyed()) {
416415
return;
417416
}
418417
if (progressCallback != null)
@@ -467,11 +466,7 @@ public void onClick(DialogInterface dialogInterface, int i) {
467466
}
468467
});
469468

470-
try {
471-
swFingerprintAllowed.setChecked(FingerprintHelper.isFingerprintAuthAllowed(walletName));
472-
} catch (KeyStoreException ex) {
473-
ex.printStackTrace();
474-
}
469+
swFingerprintAllowed.setChecked(FingerprintHelper.isFingerPassValid(getActivity(), walletName));
475470
}
476471

477472
etPasswordA.getEditText().addTextChangedListener(new TextWatcher() {
@@ -547,7 +542,7 @@ public void onClick(View view) {
547542
} else if (!newPasswordA.equals(newPasswordB)) {
548543
etPasswordB.setError(getString(R.string.generate_bad_passwordB));
549544
} else if (newPasswordA.equals(newPasswordB)) {
550-
new AsyncChangePassword().execute(walletName, getPassword(), newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
545+
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
551546
Helper.hideKeyboardAlways(getActivity());
552547
openDialog.dismiss();
553548
openDialog = null;
@@ -569,7 +564,7 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
569564
} else if (!newPasswordA.equals(newPasswordB)) {
570565
etPasswordB.setError(getString(R.string.generate_bad_passwordB));
571566
} else if (newPasswordA.equals(newPasswordB)) {
572-
new AsyncChangePassword().execute(walletName, getPassword(), newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
567+
new AsyncChangePassword().execute(newPasswordA, Boolean.toString(swFingerprintAllowed.isChecked()));
573568
Helper.hideKeyboardAlways(getActivity());
574569
openDialog.dismiss();
575570
openDialog = null;

app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import com.m2049r.xmrwallet.model.Wallet;
5151
import com.m2049r.xmrwallet.model.WalletManager;
5252
import com.m2049r.xmrwallet.service.WalletService;
53-
import com.m2049r.xmrwallet.util.FingerprintHelper;
5453
import com.m2049r.xmrwallet.util.Helper;
5554
import com.m2049r.xmrwallet.util.KeyStoreHelper;
5655
import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor;
@@ -63,7 +62,6 @@
6362
import java.net.Socket;
6463
import java.net.SocketAddress;
6564
import java.nio.channels.FileChannel;
66-
import java.security.KeyStoreException;
6765
import java.util.Date;
6866

6967
import timber.log.Timber;
@@ -229,17 +227,20 @@ protected void onPreExecute() {
229227
@Override
230228
protected Boolean doInBackground(String... params) {
231229
if (params.length != 2) return false;
232-
File walletFile = Helper.getWalletFile(LoginActivity.this, params[0]);
230+
String oldName = params[0];
233231
String newName = params[1];
232+
File walletFile = Helper.getWalletFile(LoginActivity.this, oldName);
234233
boolean success = renameWallet(walletFile, newName);
235234
try {
236-
if (success && FingerprintHelper.isFingerprintAuthAllowed(params[0])) {
237-
String savedPass = KeyStoreHelper.loadWalletUserPass(LoginActivity.this, params[0]);
235+
if (success) {
236+
String savedPass = KeyStoreHelper.loadWalletUserPass(LoginActivity.this, oldName);
238237
KeyStoreHelper.saveWalletUserPass(LoginActivity.this, newName, savedPass);
239-
KeyStoreHelper.removeWalletUserPass(LoginActivity.this, params[0]);
240238
}
241-
} catch (KeyStoreException ex) {
242-
ex.printStackTrace();
239+
} catch (KeyStoreHelper.BrokenPasswordStoreException ex) {
240+
Timber.w(ex);
241+
} finally {
242+
// we have either set a new password or it is broken - kill the old one either way
243+
KeyStoreHelper.removeWalletUserPass(LoginActivity.this, oldName);
243244
}
244245
return success;
245246
}

app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ private void startWalletService() {
133133
acquireWakeLock();
134134
String walletId = extras.getString(REQUEST_ID);
135135
needVerifyIdentity = extras.getBoolean(REQUEST_FINGERPRINT_USED);
136+
password = extras.getString(REQUEST_PW);
136137
connectWalletService(walletId, password);
137138
} else {
138139
finish();
@@ -259,8 +260,6 @@ public void onButton(int type) {
259260
.add(R.id.fragment_container, walletFragment, WalletFragment.class.getName()).commit();
260261
Timber.d("fragment added");
261262

262-
password = getIntent().getExtras().getString(REQUEST_PW);
263-
264263
startWalletService();
265264
Timber.d("onCreate() done.");
266265
}

app/src/main/java/com/m2049r/xmrwallet/util/FingerprintHelper.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
66
import android.support.v4.os.CancellationSignal;
77

8-
import java.security.KeyStore;
9-
import java.security.KeyStoreException;
8+
import timber.log.Timber;
109

1110
public class FingerprintHelper {
1211

@@ -20,21 +19,19 @@ public static boolean isDeviceSupported(Context context) {
2019
fingerprintManager.hasEnrolledFingerprints();
2120
}
2221

23-
public static boolean isFingerprintAuthAllowed(String wallet) throws KeyStoreException {
24-
KeyStore keyStore = KeyStore.getInstance(KeyStoreHelper.SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
22+
public static boolean isFingerPassValid(Context context, String wallet) {
2523
try {
26-
keyStore.load(null);
27-
} catch (Exception ex) {
28-
throw new IllegalStateException("Could not load KeyStore", ex);
24+
KeyStoreHelper.loadWalletUserPass(context, wallet);
25+
return true;
26+
} catch (KeyStoreHelper.BrokenPasswordStoreException ex) {
27+
Timber.w(ex);
28+
return false;
2929
}
30-
31-
return keyStore.containsAlias(KeyStoreHelper.SecurityConstants.WALLET_PASS_KEY_PREFIX + wallet);
3230
}
3331

3432
public static void authenticate(Context context, CancellationSignal cancelSignal,
3533
FingerprintManagerCompat.AuthenticationCallback callback) {
3634
FingerprintManagerCompat manager = FingerprintManagerCompat.from(context);
3735
manager.authenticate(null, 0, cancelSignal, callback, null);
3836
}
39-
4037
}

app/src/main/java/com/m2049r/xmrwallet/util/Helper.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import java.net.MalformedURLException;
6565
import java.net.SocketTimeoutException;
6666
import java.net.URL;
67-
import java.security.KeyStoreException;
6867
import java.util.Locale;
6968

7069
import javax.net.ssl.HttpsURLConnection;
@@ -368,12 +367,7 @@ static public void promptPassword(final Context context, final String wallet, bo
368367
final TextInputLayout etPassword = (TextInputLayout) promptsView.findViewById(R.id.etPassword);
369368
etPassword.setHint(context.getString(R.string.prompt_password, wallet));
370369

371-
boolean fingerprintAuthCheck;
372-
try {
373-
fingerprintAuthCheck = FingerprintHelper.isFingerprintAuthAllowed(wallet);
374-
} catch (KeyStoreException ex) {
375-
fingerprintAuthCheck = false;
376-
}
370+
final boolean fingerprintAuthCheck = FingerprintHelper.isFingerPassValid(context, wallet);
377371

378372
final boolean fingerprintAuthAllowed = !fingerprintDisabled && fingerprintAuthCheck;
379373
final CancellationSignal cancelSignal = new CancellationSignal();
@@ -425,13 +419,18 @@ public void onAuthenticationError(int errMsgId, CharSequence errString) {
425419

426420
@Override
427421
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
428-
String userPass = KeyStoreHelper.loadWalletUserPass(context, wallet);
429-
if (Helper.processPasswordEntry(context, wallet, userPass, true, action)) {
430-
Helper.hideKeyboardAlways((Activity) context);
431-
openDialog.dismiss();
432-
openDialog = null;
433-
} else {
422+
try {
423+
String userPass = KeyStoreHelper.loadWalletUserPass(context, wallet);
424+
if (Helper.processPasswordEntry(context, wallet, userPass, true, action)) {
425+
Helper.hideKeyboardAlways((Activity) context);
426+
openDialog.dismiss();
427+
openDialog = null;
428+
} else {
429+
etPassword.setError(context.getString(R.string.bad_password));
430+
}
431+
} catch (KeyStoreHelper.BrokenPasswordStoreException ex) {
434432
etPassword.setError(context.getString(R.string.bad_password));
433+
// TODO: better errror message here - what would it be?
435434
}
436435
}
437436

@@ -455,6 +454,7 @@ public void onClick(View view) {
455454
String pass = etPassword.getEditText().getText().toString();
456455
if (processPasswordEntry(context, wallet, pass, false, action)) {
457456
Helper.hideKeyboardAlways((Activity) context);
457+
cancelSignal.cancel();
458458
openDialog.dismiss();
459459
openDialog = null;
460460
} else {
@@ -472,6 +472,7 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
472472
String pass = etPassword.getEditText().getText().toString();
473473
if (processPasswordEntry(context, wallet, pass, false, action)) {
474474
Helper.hideKeyboardAlways((Activity) context);
475+
cancelSignal.cancel();
475476
openDialog.dismiss();
476477
openDialog = null;
477478
} else {

0 commit comments

Comments
 (0)