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

Commit 2555e5f1 authored by Paul Crowley's avatar Paul Crowley
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
parent c44ad35e
Loading
Loading
Loading
Loading
+87 −53
Original line number Diff line number Diff line
@@ -135,7 +135,18 @@ 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;

    private Runnable mClearPatternRunnable = new Runnable() {
    // 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 final Runnable mClearPatternRunnable = new Runnable() {
        @Override
        public void run() {
            mLockPatternView.clearPattern();
@@ -164,8 +175,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            final TextView status = (TextView) findViewById(R.id.status);
            status.setText(R.string.checking_decryption);
            beginAttempt();
        }

        @Override
@@ -207,6 +217,17 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
                showFactoryReset(true);
                return;
            } else {
                handleBadAttempt(failedAttempts);
            }
        }
    }

    private void beginAttempt() {
        final TextView status = (TextView) findViewById(R.id.status);
        status.setText(R.string.checking_decryption);
    }

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


            if (mLockPatternView != null) {
                mLockPatternView.setDisplayMode(DisplayMode.Wrong);
                mLockPatternView.setEnabled(true);
            }

            // Reenable the password entry
            if (mPasswordEntry != null) {
                mPasswordEntry.setEnabled(true);
@@ -255,11 +277,6 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
                imm.showSoftInput(mPasswordEntry, 0);
                setBackFunctionality(true);
            }
                    if (mLockPatternView != null) {
                        mLockPatternView.setEnabled(true);
                    }
                }
            }
        }
    }

@@ -329,6 +346,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);
@@ -701,6 +720,11 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
        }
    }

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

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

@@ -716,7 +740,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
@@ -873,7 +902,12 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
            mPasswordEntry.setEnabled(false);
            setBackFunctionality(false);

            if (password.length() >= LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
                new DecryptTask().execute(password);
            } else {
                // Allow user to make as many of these as they want.
                fakeUnlockAttempt(mPasswordEntry);
            }

            return true;
        }