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

Commit 7bdfda77 authored by Pavel Grafov's avatar Pavel Grafov Committed by Android (Google) Code Review
Browse files

Merge "Password constraints cleanup."

parents 42d9a709 69cac2c9
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -1410,9 +1410,6 @@
        <item quantity="other">Must be fewer than <xliff:g id="number" example="17">%d</xliff:g> digits</item>
    </plurals>
    <!-- Error shown when in PIN mode and user enters a non-digit -->
    <string name="lockpassword_pin_contains_non_digits">Must contain only digits 0-9</string>
    <!-- Error shown when in PIN mode and PIN has been used recently. Please keep this string short! -->
    <string name="lockpassword_pin_recently_used">Device admin doesn\'t allow using a recent PIN</string>
@@ -1467,6 +1464,11 @@
        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-letter characters</item>
    </plurals>
    <plurals name="lockpassword_password_requires_nonnumerical">
        <item quantity="one">Must contain at least 1 non-numerical character</item>
        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-numerical characters</item>
    </plurals>
    <!-- Error shown when in PASSWORD mode and password has been used recently. Please keep this string short! -->
    <string name="lockpassword_password_recently_used">Device admin doesn\'t allow using a recent
        password</string>
+1 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ public class ChooseLockGenericController {
     */
    public int upgradeQuality(int quality) {
        // Compare specified quality and dpm quality
        // TODO(b/142781408): convert from quality to credential type once PIN is supported.
        int dpmUpgradedQuality = Math.max(quality, mDpm.getPasswordQuality(null, mUserId));
        return Math.max(dpmUpgradedQuality,
                PasswordMetrics.complexityLevelToMinQuality(mRequestedMinComplexity));
+110 −315

File changed.

Preview size limit exceeded, changes collapsed.

+35 −13
Original line number Diff line number Diff line
@@ -77,7 +77,6 @@ public class ChooseLockPasswordTest {
        SettingsShadowResources.overrideResource(
                com.android.internal.R.string.config_headlineFontFamily, "");
        mShadowDpm = ShadowDevicePolicyManager.getShadow();
        mShadowDpm.setPasswordMaximumLength(16);
    }

    @After
@@ -157,7 +156,7 @@ public class ChooseLockPasswordTest {
                /* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createNone(),
                "Must contain at least 1 letter",
                "Must contain at least 1 non-numerical character",
                "Must be at least 10 characters");
    }

@@ -180,7 +179,7 @@ public class ChooseLockPasswordTest {
                /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createNone(),
                "Must contain at least 1 letter",
                "Must contain at least 1 non-numerical character",
                "Must be at least 4 characters");
    }

@@ -193,7 +192,7 @@ public class ChooseLockPasswordTest {
                /* minComplexity= */ PASSWORD_COMPLEXITY_LOW,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createNone(),
                "Must contain at least 1 letter",
                "Must contain at least 1 non-numerical character",
                "Must contain at least 1 numerical digit",
                "Must be at least 9 characters");
    }
@@ -220,7 +219,9 @@ public class ChooseLockPasswordTest {
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createNone(),
                "Must contain at least 2 special symbols",
                "Must be at least 6 characters");
                "Must be at least 6 characters",
                "Must contain at least 1 letter",
                "Must contain at least 1 numerical digit");
    }

    @Test
@@ -280,7 +281,7 @@ public class ChooseLockPasswordTest {
                /* minComplexity= */ PASSWORD_COMPLEXITY_LOW,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"),
                "Must contain at least 1 letter");
                "Ascending, descending, or repeated sequence of digits isn't allowed");
    }

    @Test
@@ -291,8 +292,8 @@ public class ChooseLockPasswordTest {
                /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createNone(),
                "Must contain at least 1 letter",
                "Must be at least 6 characters");
                "Must be at least 6 characters",
                "Must contain at least 1 non-numerical character");
    }

    @Test
@@ -303,8 +304,8 @@ public class ChooseLockPasswordTest {
                /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                /* userEnteredPassword= */ LockscreenCredential.createPassword("1"),
                "Must contain at least 1 letter",
                "Must be at least 6 characters");
                "Must be at least 6 characters",
                "Must contain at least 1 non-numerical character");
    }

    @Test
@@ -329,6 +330,28 @@ public class ChooseLockPasswordTest {
                "Must be at least 6 characters");
    }

    @Test
    public void processAndValidatePasswordRequirements_defaultPinMinimumLength() {
        mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);

        assertPasswordValidationResult(
                /* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
                /* passwordType= */ PASSWORD_QUALITY_NUMERIC,
                /* userEnteredPassword= */ LockscreenCredential.createPassword("11"),
                "PIN must be at least 4 digits");
    }

    @Test
    public void processAndValidatePasswordRequirements_maximumLength() {
        mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);

        assertPasswordValidationResult(
                /* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
                /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
                LockscreenCredential.createPassword("01234567890123456789"),
                "Must be fewer than 17 characters");
    }

    @Test
    public void assertThat_chooseLockIconChanged_WhenFingerprintExtraSet() {
        ShadowDrawable drawable = setActivityAndGetIconDrawable(true);
@@ -369,9 +392,8 @@ public class ChooseLockPasswordTest {
        intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, minComplexity);
        ChooseLockPassword activity = buildChooseLockPasswordActivity(intent);
        ChooseLockPasswordFragment fragment = getChooseLockPasswordFragment(activity);
        int validateResult = fragment.validatePassword(userEnteredPassword);
        String[] messages = fragment.convertErrorCodeToMessages(validateResult);

        fragment.validatePassword(userEnteredPassword);
        String[] messages = fragment.convertErrorCodeToMessages();
        assertThat(messages).asList().containsExactly((Object[]) expectedValidationResult);
    }
}
+8 −22
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.admin.DevicePolicyManager;
import android.app.admin.PasswordMetrics;
import android.app.admin.PasswordPolicy;
import android.content.ComponentName;

import org.robolectric.RuntimeEnvironment;
@@ -26,7 +28,6 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev
    private ComponentName mDeviceOwnerComponentName;
    private int mDeviceOwnerUserId = -1;
    private int mPasswordMinQuality = PASSWORD_QUALITY_UNSPECIFIED;
    private int mPasswordMaxLength = 16;
    private int mPasswordMinLength = 0;
    private int mPasswordMinSymbols = 0;

@@ -77,41 +78,26 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev
    }

    @Implementation
    public int getPasswordQuality(ComponentName admin, int userHandle) {
        return mPasswordMinQuality;
    public PasswordMetrics getPasswordMinimumMetrics(int userHandle) {
        PasswordPolicy policy = new PasswordPolicy();
        policy.quality = mPasswordMinQuality;
        policy.length = mPasswordMinLength;
        policy.symbols = mPasswordMinSymbols;
        return policy.getMinMetrics();
    }

    public void setPasswordQuality(int quality) {
        mPasswordMinQuality = quality;
    }

    @Implementation
    public int getPasswordMinimumLength(ComponentName admin, int userHandle) {
        return mPasswordMinLength;
    }

    public void setPasswordMinimumLength(int length) {
        mPasswordMinLength = length;
    }

    @Implementation
    public int getPasswordMinimumSymbols(ComponentName admin, int userHandle) {
        return mPasswordMinSymbols;
    }

    public void setPasswordMinimumSymbols(int numOfSymbols) {
        mPasswordMinSymbols = numOfSymbols;
    }

    @Implementation
    public int getPasswordMaximumLength(int quality) {
        return mPasswordMaxLength;
    }

    public void setPasswordMaximumLength(int length) {
        mPasswordMaxLength = length;
    }

    public static ShadowDevicePolicyManager getShadow() {
        return (ShadowDevicePolicyManager) Shadow.extract(
                RuntimeEnvironment.application.getSystemService(DevicePolicyManager.class));