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

Commit a531a7fc authored by Kevin Chyn's avatar Kevin Chyn
Browse files

4/n: AuthContainerView should filter out non-biometric modalities

The code assumed that any modality passed over was biometric-only.
However, this is not guaranteed, since the bitmask may include
DEVICE_CREDENTIAL. As such, remove non-biometric bits from
consideration.

Unit tests will be added in the future when the interface between
BiometricService and SystemUI are updated.

Bug: 149067920

Test: CtsVerifier

Change-Id: I707343b40013cdb7d4709aeaa8245fe0fd30c729
parent 4efee6d8
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ public class AuthContainerView extends LinearLayout
        boolean mRequireConfirmation;
        int mUserId;
        String mOpPackageName;
        int mModalityMask;
        @BiometricAuthenticator.Modality int mModalityMask;
        boolean mSkipIntro;
        long mOperationId;
    }
@@ -158,7 +158,7 @@ public class AuthContainerView extends LinearLayout
            return this;
        }

        public AuthContainerView build(int modalityMask) {
        public AuthContainerView build(@BiometricAuthenticator.Modality int modalityMask) {
            mConfig.mModalityMask = modalityMask;
            return new AuthContainerView(mConfig, new Injector());
        }
@@ -268,14 +268,20 @@ public class AuthContainerView extends LinearLayout

        // Inflate biometric view only if necessary.
        if (Utils.isBiometricAllowed(mConfig.mBiometricPromptBundle)) {
            if (config.mModalityMask == BiometricAuthenticator.TYPE_FINGERPRINT) {
            final @BiometricAuthenticator.Modality int biometricModality =
                    config.mModalityMask & ~BiometricAuthenticator.TYPE_CREDENTIAL;

            switch (biometricModality) {
                case BiometricAuthenticator.TYPE_FINGERPRINT:
                    mBiometricView = (AuthBiometricFingerprintView)
                            factory.inflate(R.layout.auth_biometric_fingerprint_view, null, false);
            } else if (config.mModalityMask == BiometricAuthenticator.TYPE_FACE) {
                    break;
                case BiometricAuthenticator.TYPE_FACE:
                    mBiometricView = (AuthBiometricFaceView)
                            factory.inflate(R.layout.auth_biometric_face_view, null, false);
            } else {
                Log.e(TAG, "Unsupported biometric modality: " + config.mModalityMask);
                    break;
                default:
                    Log.e(TAG, "Unsupported biometric modality: " + biometricModality);
                    mBiometricView = null;
                    mBackgroundView = null;
                    mBiometricScrollView = null;
+6 −4
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
@@ -275,8 +276,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,

    @Override
    public void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver,
            int biometricModality, boolean requireConfirmation, int userId, String opPackageName,
            long operationId) {
            @BiometricAuthenticator.Modality int biometricModality, boolean requireConfirmation,
            int userId, String opPackageName, long operationId) {
        final int authenticators = Utils.getAuthenticators(bundle);

        if (DEBUG) {
@@ -376,7 +377,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,

    private void showDialog(SomeArgs args, boolean skipAnimation, Bundle savedState) {
        mCurrentDialogArgs = args;
        final int type = args.argi1;
        final @BiometricAuthenticator.Modality int type = args.argi1;
        final Bundle biometricPromptBundle = (Bundle) args.arg1;
        final boolean requireConfirmation = (boolean) args.arg3;
        final int userId = args.argi2;
@@ -458,7 +459,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
    }

    protected AuthDialog buildDialog(Bundle biometricPromptBundle, boolean requireConfirmation,
            int userId, int type, String opPackageName, boolean skipIntro, long operationId) {
            int userId, @BiometricAuthenticator.Modality int type, String opPackageName,
            boolean skipIntro, long operationId) {
        return new AuthContainerView.Builder(mContext)
                .setCallback(this)
                .setBiometricPromptBundle(biometricPromptBundle)
+5 −3
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.app.StatusBarManager.WindowType;
import android.app.StatusBarManager.WindowVisibleState;
import android.content.ComponentName;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService.BackDispositionMode;
@@ -262,7 +263,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
        default void onRotationProposal(int rotation, boolean isValid) { }

        default void showAuthenticationDialog(Bundle bundle,
                IBiometricServiceReceiverInternal receiver, int biometricModality,
                IBiometricServiceReceiverInternal receiver,
                @BiometricAuthenticator.Modality int biometricModality,
                boolean requireConfirmation, int userId, String opPackageName,
                long operationId) { }
        default void onBiometricAuthenticated() { }
@@ -791,8 +793,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<

    @Override
    public void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver,
            int biometricModality, boolean requireConfirmation, int userId, String opPackageName,
            long operationId) {
            @BiometricAuthenticator.Modality int biometricModality, boolean requireConfirmation,
            int userId, String opPackageName, long operationId) {
        synchronized (mLock) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = bundle;
+3 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.app.Notification;
import android.app.StatusBarManager;
import android.content.ComponentName;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
@@ -673,8 +674,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D

    @Override
    public void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver,
            int biometricModality, boolean requireConfirmation, int userId, String opPackageName,
            long operationId) {
            @BiometricAuthenticator.Modality int biometricModality, boolean requireConfirmation,
            int userId, String opPackageName, long operationId) {
        enforceBiometricDialog();
        if (mBar != null) {
            try {