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
This commit is contained in:
@@ -135,7 +135,18 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
// how long we wait to clear a right pattern
|
// how long we wait to clear a right pattern
|
||||||
private static final int RIGHT_PATTERN_CLEAR_TIMEOUT_MS = 500;
|
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
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
mLockPatternView.clearPattern();
|
mLockPatternView.clearPattern();
|
||||||
@@ -164,8 +175,7 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
@Override
|
@Override
|
||||||
protected void onPreExecute() {
|
protected void onPreExecute() {
|
||||||
super.onPreExecute();
|
super.onPreExecute();
|
||||||
final TextView status = (TextView) findViewById(R.id.status);
|
beginAttempt();
|
||||||
status.setText(R.string.checking_decryption);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -207,6 +217,17 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
showFactoryReset(true);
|
showFactoryReset(true);
|
||||||
return;
|
return;
|
||||||
} else {
|
} 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.
|
// Wrong entry. Handle pattern case.
|
||||||
if (mLockPatternView != null) {
|
if (mLockPatternView != null) {
|
||||||
mLockPatternView.setDisplayMode(DisplayMode.Wrong);
|
mLockPatternView.setDisplayMode(DisplayMode.Wrong);
|
||||||
@@ -243,10 +264,11 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (mLockPatternView != null) {
|
if (mLockPatternView != null) {
|
||||||
mLockPatternView.setDisplayMode(DisplayMode.Wrong);
|
mLockPatternView.setDisplayMode(DisplayMode.Wrong);
|
||||||
|
mLockPatternView.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reenable the password entry
|
// Reenable the password entry
|
||||||
if (mPasswordEntry != null) {
|
if (mPasswordEntry != null) {
|
||||||
mPasswordEntry.setEnabled(true);
|
mPasswordEntry.setEnabled(true);
|
||||||
@@ -255,11 +277,6 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
imm.showSoftInput(mPasswordEntry, 0);
|
imm.showSoftInput(mPasswordEntry, 0);
|
||||||
setBackFunctionality(true);
|
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_SEARCH
|
||||||
| StatusBarManager.DISABLE_RECENT;
|
| 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. */
|
/** @return whether or not this Activity was started for debugging the UI only. */
|
||||||
private boolean isDebugView() {
|
private boolean isDebugView() {
|
||||||
return getIntent().hasExtra(EXTRA_FORCE_VIEW);
|
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 =
|
protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
|
||||||
new LockPatternView.OnPatternListener() {
|
new LockPatternView.OnPatternListener() {
|
||||||
|
|
||||||
@@ -716,7 +740,12 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
@Override
|
@Override
|
||||||
public void onPatternDetected(List<LockPatternView.Cell> pattern) {
|
public void onPatternDetected(List<LockPatternView.Cell> pattern) {
|
||||||
mLockPatternView.setEnabled(false);
|
mLockPatternView.setEnabled(false);
|
||||||
|
if (pattern.size() >= MIN_LENGTH_BEFORE_REPORT) {
|
||||||
new DecryptTask().execute(LockPatternUtils.patternToString(pattern));
|
new DecryptTask().execute(LockPatternUtils.patternToString(pattern));
|
||||||
|
} else {
|
||||||
|
// Allow user to make as many of these as they want.
|
||||||
|
fakeUnlockAttempt(mLockPatternView);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -873,7 +902,12 @@ public class CryptKeeper extends Activity implements TextView.OnEditorActionList
|
|||||||
mPasswordEntry.setEnabled(false);
|
mPasswordEntry.setEnabled(false);
|
||||||
setBackFunctionality(false);
|
setBackFunctionality(false);
|
||||||
|
|
||||||
|
if (password.length() >= LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
|
||||||
new DecryptTask().execute(password);
|
new DecryptTask().execute(password);
|
||||||
|
} else {
|
||||||
|
// Allow user to make as many of these as they want.
|
||||||
|
fakeUnlockAttempt(mPasswordEntry);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user