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

Commit 7c1f4023 authored by Eran Messeri's avatar Eran Messeri Committed by Android (Google) Code Review
Browse files

Merge "DPMS: Fix password complexity comparison"

parents f24001ca e38292a2
Loading
Loading
Loading
Loading
+16 −30
Original line number Diff line number Diff line
@@ -406,11 +406,6 @@ public final class PasswordMetrics implements Parcelable {
                return containsNonNumeric ? 6 : 8;
            }

            @Override
            boolean allowsNumericPassword() {
                return false;
            }

            @Override
            boolean allowsCredType(int credType) {
                return credType == CREDENTIAL_TYPE_PASSWORD;
@@ -427,11 +422,6 @@ public final class PasswordMetrics implements Parcelable {
                return 4;
            }

            @Override
            boolean allowsNumericPassword() {
                return false;
            }

            @Override
            boolean allowsCredType(int credType) {
                return credType == CREDENTIAL_TYPE_PASSWORD;
@@ -448,11 +438,6 @@ public final class PasswordMetrics implements Parcelable {
                return 0;
            }

            @Override
            boolean allowsNumericPassword() {
                return true;
            }

            @Override
            boolean allowsCredType(int credType) {
                return credType != CREDENTIAL_TYPE_NONE;
@@ -469,11 +454,6 @@ public final class PasswordMetrics implements Parcelable {
                return 0;
            }

            @Override
            boolean allowsNumericPassword() {
                return true;
            }

            @Override
            boolean allowsCredType(int credType) {
                return true;
@@ -484,7 +464,6 @@ public final class PasswordMetrics implements Parcelable {

        abstract boolean canHaveSequence();
        abstract int getMinimumLength(boolean containsNonNumeric);
        abstract boolean allowsNumericPassword();
        abstract boolean allowsCredType(int credType);

        ComplexityBucket(int complexityLevel) {
@@ -591,7 +570,14 @@ public final class PasswordMetrics implements Parcelable {
            result.add(new PasswordValidationError(TOO_LONG, MAX_PASSWORD_LENGTH));
        }

        final PasswordMetrics minMetrics = applyComplexity(adminMetrics, isPin, bucket);
        // A flag indicating whether the provided password already has non-numeric characters in
        // it or if the admin imposes the requirement of any non-numeric characters.
        final boolean hasOrWouldNeedNonNumeric =
                actualMetrics.nonNumeric > 0 || adminMetrics.nonNumeric > 0
                        || adminMetrics.letters > 0 || adminMetrics.lowerCase > 0
                        || adminMetrics.upperCase > 0 || adminMetrics.symbols > 0;
        final PasswordMetrics minMetrics =
                applyComplexity(adminMetrics, hasOrWouldNeedNonNumeric, bucket);

        // Clamp required length between maximum and minimum valid values.
        minMetrics.length = Math.min(MAX_PASSWORD_LENGTH,
@@ -684,23 +670,23 @@ public final class PasswordMetrics implements Parcelable {
     * TODO: move to PasswordPolicy
     */
    public static PasswordMetrics applyComplexity(
            PasswordMetrics adminMetrics, boolean isPin, int complexity) {
        return applyComplexity(adminMetrics, isPin, ComplexityBucket.forComplexity(complexity));
            PasswordMetrics adminMetrics, boolean withNonNumericCharacters,
            int complexity) {
        return applyComplexity(adminMetrics, withNonNumericCharacters,
                ComplexityBucket.forComplexity(complexity));
    }

    private static PasswordMetrics applyComplexity(
            PasswordMetrics adminMetrics, boolean isPin, ComplexityBucket bucket) {
            PasswordMetrics adminMetrics, boolean withNonNumericCharacters,
            ComplexityBucket bucket) {
        final PasswordMetrics minMetrics = new PasswordMetrics(adminMetrics);

        if (!bucket.canHaveSequence()) {
            minMetrics.seqLength = Math.min(minMetrics.seqLength, MAX_ALLOWED_SEQUENCE);
        }

        minMetrics.length = Math.max(minMetrics.length, bucket.getMinimumLength(!isPin));

        if (!isPin && !bucket.allowsNumericPassword()) {
            minMetrics.nonNumeric = Math.max(minMetrics.nonNumeric, 1);
        }
        minMetrics.length = Math.max(minMetrics.length,
                bucket.getMinimumLength(withNonNumericCharacters));

        return minMetrics;
    }