Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5867860 authored by Paul Crowley's avatar Paul Crowley Committed by The Android Automerger
Browse files

Prevent factory reset for short passwords in CryptKeeper

Since patterns and passwords can't be shorter than 4
elements, we shouldn't count them against attempts to unlock
the device.  If we do, we risk resetting the device
due to stray input.

Bug: 18211475
Bug: 18273380

Change-Id: Ib329cd3383471483cda68bfac4278b17d0c09c57

Conflicts:
	src/com/android/settings/CryptKeeper.java

Conflicts:
	src/com/android/settings/CryptKeeper.java
parent e6793771
Loading
Loading
Loading
Loading
+69 −38
Original line number Diff line number Diff line
@@ -137,6 +137,17 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
    // how long we wait to clear a right pattern
    private static final int RIGHT_PATTERN_CLEAR_TIMEOUT_MS = 500;

    // When the user enters a short pin/password, run this to show an error,
    // but don't count it against attempts.
    private final Runnable mFakeUnlockAttemptRunnable = new Runnable() {
        public void run() {
            handleBadAttempt(1 /* failedAttempt */);
        }
    };

    // TODO: this should be tuned to match minimum decryption timeout
    private static final int FAKE_ATTEMPT_DELAY = 1000;

    private Runnable mClearPatternRunnable = new Runnable() {
        public void run() {
            mLockPatternView.clearPattern();
@@ -200,6 +211,12 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
                showFactoryReset(true);
                return;
            } else {
                handleBadAttempt(failedAttempts);
            }
        }
    }

    private void handleBadAttempt(Integer failedAttempts) {
        // Wrong entry. Handle pattern case.
        if (mLockPatternView != null) {
            mLockPatternView.setDisplayMode(DisplayMode.Wrong);
@@ -238,8 +255,6 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
            }
        }
    }
        }
    }

    private class ValidationTask extends AsyncTask<Void, Void, Boolean> {
        int state;
@@ -307,6 +322,8 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
            | StatusBarManager.DISABLE_SEARCH
            | StatusBarManager.DISABLE_RECENT;

    protected static final int MIN_LENGTH_BEFORE_REPORT = LockPatternUtils.MIN_LOCK_PATTERN_SIZE;

    /** @return whether or not this Activity was started for debugging the UI only. */
    private boolean isDebugView() {
        return getIntent().hasExtra(EXTRA_FORCE_VIEW);
@@ -679,6 +696,10 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
        }
    }

    private void fakeUnlockAttempt(View postingView) {
        postingView.postDelayed(mFakeUnlockAttemptRunnable, FAKE_ATTEMPT_DELAY);
    }

    protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
        new LockPatternView.OnPatternListener() {

@@ -694,7 +715,12 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
        @Override
        public void onPatternDetected(List<LockPatternView.Cell> pattern) {
            mLockPatternView.setEnabled(false);
            if (pattern.size() >= MIN_LENGTH_BEFORE_REPORT) {
                new DecryptTask().execute(LockPatternUtils.patternToString(pattern));
            } else {
                // Allow user to make as many of these as they want.
                fakeUnlockAttempt(mLockPatternView);
            }
        }

        @Override
@@ -851,8 +877,13 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
            mPasswordEntry.setEnabled(false);
            setBackFunctionality(false);

            if (password.length() >= LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
                Log.d(TAG, "Attempting to send command to decrypt");
                new DecryptTask().execute(password);
            } else {
                // Allow user to make as many of these as they want.
                fakeUnlockAttempt(mPasswordEntry);
            }

            return true;
        }