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

Commit de6f930c authored by Wenhao Wang's avatar Wenhao Wang Committed by Gerrit Code Review
Browse files

Merge "Add command to require strong auth"

parents ff7bc1e8 5bceb302
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -18,12 +18,14 @@ package com.android.server.locksettings;

import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;

import android.app.ActivityManager;
import android.app.admin.PasswordMetrics;
import android.content.Context;
import android.os.ShellCommand;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Slog;

@@ -48,6 +50,8 @@ class LockSettingsShellCommand extends ShellCommand {
    private static final String COMMAND_REMOVE_CACHE = "remove-cache";
    private static final String COMMAND_SET_ROR_PROVIDER_PACKAGE =
            "set-resume-on-reboot-provider-package";
    private static final String COMMAND_REQUIRE_STRONG_AUTH =
            "require-strong-auth";
    private static final String COMMAND_HELP = "help";

    private int mCurrentUserId;
@@ -97,6 +101,9 @@ class LockSettingsShellCommand extends ShellCommand {
                case COMMAND_SET_ROR_PROVIDER_PACKAGE:
                    runSetResumeOnRebootProviderPackage();
                    return 0;
                case COMMAND_REQUIRE_STRONG_AUTH:
                    runRequireStrongAuth();
                    return 0;
                case COMMAND_HELP:
                    onHelp();
                    return 0;
@@ -192,6 +199,10 @@ class LockSettingsShellCommand extends ShellCommand {
            pw.println("    Sets the package name for server based resume on reboot service "
                    + "provider.");
            pw.println("");
            pw.println("  require-strong-auth [--user USER_ID] <reason>");
            pw.println("    Requires the strong authentication. The current supported reasons: "
                    + "STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN.");
            pw.println("");
        }
    }

@@ -288,6 +299,24 @@ class LockSettingsShellCommand extends ShellCommand {
        return true;
    }

    private boolean runRequireStrongAuth() {
        final String reason = mNew;
        int strongAuthReason;
        switch (reason) {
            case "STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN":
                strongAuthReason = STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
                mCurrentUserId = UserHandle.USER_ALL;
                break;
            default:
                getErrPrintWriter().println("Unsupported reason: " + reason);
                return false;
        }
        mLockPatternUtils.requireStrongAuth(strongAuthReason, mCurrentUserId);
        getOutPrintWriter().println("Require strong auth for USER_ID "
                + mCurrentUserId + " because of " + mNew);
        return true;
    }

    private boolean runClear() {
        LockscreenCredential none = LockscreenCredential.createNone();
        if (!isNewCredentialSufficient(none)) {
+16 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;

import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;

import static junit.framework.Assert.assertEquals;

import static org.mockito.ArgumentMatchers.anyInt;
@@ -48,6 +50,7 @@ import android.os.Looper;
import android.os.Process;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;

import androidx.test.InstrumentationRegistry;
@@ -370,6 +373,19 @@ public class LockSettingsShellCommandTest {
                mUserId);
    }

    @Test
    public void testRequireStrongAuth_STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN() throws Exception {
        when(mLockPatternUtils.isSecure(mUserId)).thenReturn(true);

        assertEquals(0, mCommand.exec(new Binder(), in, out, err,
                new String[] { "require-strong-auth", "STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN"},
                mShellCallback, mResultReceiver));

        verify(mLockPatternUtils).requireStrongAuth(
                STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
                UserHandle.USER_ALL);
    }

    private List<LockPatternView.Cell> stringToPattern(String str) {
        return LockPatternUtils.byteArrayToPattern(str.getBytes());
    }