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

Commit 2c551679 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

AuthService should not attempt to register a null <Biometric>Service

Fixes: 147445115
Fixes: 147392558

Test: Modify Blueline to have face auth config. Logs show that face auth
      is not registered to BiometricService

Change-Id: Iaed8a5cb3f054c9e8ba3bbdbe56a9e679c270358
parent 929de647
Loading
Loading
Loading
Loading
+51 −7
Original line number Original line Diff line number Diff line
@@ -99,6 +99,33 @@ public class AuthService extends SystemService {
        public String[] getConfiguration(Context context) {
        public String[] getConfiguration(Context context) {
            return context.getResources().getStringArray(R.array.config_biometric_sensors);
            return context.getResources().getStringArray(R.array.config_biometric_sensors);
        }
        }

        /**
         * Allows us to mock FingerprintService for testing
         */
        @VisibleForTesting
        public IFingerprintService getFingerprintService() {
            return IFingerprintService.Stub.asInterface(
                    ServiceManager.getService(Context.FINGERPRINT_SERVICE));
        }

        /**
         * Allows us to mock FaceService for testing
         */
        @VisibleForTesting
        public IFaceService getFaceService() {
            return IFaceService.Stub.asInterface(
                    ServiceManager.getService(Context.FACE_SERVICE));
        }

        /**
         * Allows us to mock IrisService for testing
         */
        @VisibleForTesting
        public IIrisService getIrisService() {
            return IIrisService.Stub.asInterface(
                    ServiceManager.getService(Context.IRIS_SERVICE));
        }
    }
    }


    private final class AuthServiceImpl extends IAuthService.Stub {
    private final class AuthServiceImpl extends IAuthService.Stub {
@@ -178,7 +205,6 @@ public class AuthService extends SystemService {


        mInjector = injector;
        mInjector = injector;
        mImpl = new AuthServiceImpl();
        mImpl = new AuthServiceImpl();
        final PackageManager pm = context.getPackageManager();
    }
    }


    private void registerAuthenticator(SensorConfig config) throws RemoteException {
    private void registerAuthenticator(SensorConfig config) throws RemoteException {
@@ -191,18 +217,36 @@ public class AuthService extends SystemService {


        switch (config.mModality) {
        switch (config.mModality) {
            case TYPE_FINGERPRINT:
            case TYPE_FINGERPRINT:
                authenticator = new FingerprintAuthenticator(IFingerprintService.Stub.asInterface(
                final IFingerprintService fingerprintService = mInjector.getFingerprintService();
                        ServiceManager.getService(Context.FINGERPRINT_SERVICE)));
                if (fingerprintService == null) {
                    Slog.e(TAG, "Attempting to register with null FingerprintService. Please check"
                            + " your device configuration.");
                    return;
                }

                authenticator = new FingerprintAuthenticator(fingerprintService);
                break;
                break;


            case TYPE_FACE:
            case TYPE_FACE:
                authenticator = new FaceAuthenticator(IFaceService.Stub.asInterface(
                final IFaceService faceService = mInjector.getFaceService();
                        ServiceManager.getService(Context.FACE_SERVICE)));
                if (faceService == null) {
                    Slog.e(TAG, "Attempting to register with null FaceService. Please check your"
                            + " device configuration.");
                    return;
                }

                authenticator = new FaceAuthenticator(faceService);
                break;
                break;


            case TYPE_IRIS:
            case TYPE_IRIS:
                authenticator = new IrisAuthenticator(IIrisService.Stub.asInterface(
                final IIrisService irisService = mInjector.getIrisService();
                        ServiceManager.getService(Context.IRIS_SERVICE)));
                if (irisService == null) {
                    Slog.e(TAG, "Attempting to register with null IrisService. Please check your"
                            + " device configuration.");
                    return;
                }

                authenticator = new IrisAuthenticator(irisService);
                break;
                break;


            default:
            default:
+32 −4
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -32,6 +33,9 @@ import android.content.pm.PackageManager;
import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceReceiver;
import android.hardware.biometrics.IBiometricServiceReceiver;
import android.hardware.face.IFaceService;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.iris.IIrisService;
import android.os.Binder;
import android.os.Binder;
import android.os.Bundle;
import android.os.Bundle;


@@ -61,6 +65,12 @@ public class AuthServiceTest {
    AuthService.Injector mInjector;
    AuthService.Injector mInjector;
    @Mock
    @Mock
    IBiometricService mBiometricService;
    IBiometricService mBiometricService;
    @Mock
    IFingerprintService mFingerprintService;
    @Mock
    IIrisService mIrisService;
    @Mock
    IFaceService mFaceService;


    @Before
    @Before
    public void setUp() {
    public void setUp() {
@@ -76,10 +86,28 @@ public class AuthServiceTest {
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
        when(mInjector.getBiometricService()).thenReturn(mBiometricService);
        when(mInjector.getBiometricService()).thenReturn(mBiometricService);
        when(mInjector.getConfiguration(any())).thenReturn(config);
        when(mInjector.getConfiguration(any())).thenReturn(config);
        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
        when(mInjector.getFingerprintService()).thenReturn(mFingerprintService);
                .thenReturn(true);
        when(mInjector.getFaceService()).thenReturn(mFaceService);
        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_IRIS)).thenReturn(true);
        when(mInjector.getIrisService()).thenReturn(mIrisService);
        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FACE)).thenReturn(true);
    }

    @Test
    public void testRegisterNullService_doesNotRegister() throws Exception {

        // Config contains Fingerprint, Iris, Face, but services are all null

        when(mInjector.getFingerprintService()).thenReturn(null);
        when(mInjector.getFaceService()).thenReturn(null);
        when(mInjector.getIrisService()).thenReturn(null);

        mAuthService = new AuthService(mContext, mInjector);
        mAuthService.onStart();

        verify(mBiometricService, never()).registerAuthenticator(
                anyInt(),
                anyInt(),
                anyInt(),
                any());
    }
    }