Drop PendingIntent extras from external packages during enrollment.

Bug: 388528350
Flag: EXEMPT bugfix
Test: atest FingerprintEnrollIntroductionTest FaceEnrollIntroductionTest
Change-Id: I61281dcf95e53100a96d6a218f3f00fd1b4ea3f9
(cherry picked from commit 4ccdeee849d5fef78498ba33cadc525523efcbd7)
This commit is contained in:
Joe Bolinger
2025-04-05 02:30:30 +00:00
parent 12ea1a89e5
commit 9dd5ed1cea
3 changed files with 64 additions and 2 deletions

View File

@@ -50,6 +50,8 @@ import com.google.android.setupdesign.span.LinkSpan;
import com.google.android.setupdesign.template.RequireScrollMixin;
import com.google.android.setupdesign.util.DynamicColorPalette;
import java.util.List;
/**
* Abstract base class for the intro onboarding activity for biometric enrollment.
*/
@@ -249,6 +251,19 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
!isScrollNeeded && !enrollmentCompleted ? View.VISIBLE : View.INVISIBLE);
}
@Override
protected void onStart() {
super.onStart();
if (!getPackageName().equals(getCallingPackage())) {
for (String key : List.of(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL,
MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE,
MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)) {
getIntent().removeExtra(key);
}
}
}
@Override
protected void onResume() {
super.onResume();
@@ -497,14 +512,15 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT);
}
protected void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) {
private void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) {
if (data != null
&& data.getBooleanExtra(
MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) {
removeEnrollNextBiometric();
}
}
protected void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) {
private void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) {
removeEnrollNextBiometricIfSkipEnroll(data);
if (resultCode == RESULT_SKIP) {
onEnrollmentSkipped(data);

View File

@@ -32,11 +32,13 @@ import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -64,6 +66,7 @@ import com.android.settings.R;
import com.android.settings.Settings;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.MultiBiometricEnrollHelper;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.SettingsShadowResources;
@@ -206,6 +209,12 @@ public class FaceEnrollIntroductionTest {
testIntent.putExtra(BiometricUtils.EXTRA_ENROLL_REASON,
FaceEnrollOptions.ENROLL_REASON_SETTINGS);
testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE,
mock(PendingIntent.class));
testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT,
mock(PendingIntent.class));
testIntent.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false);
when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn(
null /* Simulate no posture intent */);
mContext = spy(ApplicationProvider.getApplicationContext());
@@ -690,4 +699,16 @@ public class FaceEnrollIntroductionTest {
.isEqualTo(FaceEnrollOptions.ENROLL_REASON_SETTINGS);
}
@Test
public void drops_pendingIntents() {
setupActivity();
mController.start();
Shadows.shadowOf(Looper.getMainLooper()).idle();
final Intent intent = mActivity.getIntent();
assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL)).isFalse();
assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE)).isFalse();
assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)).isFalse();
}
}

View File

@@ -34,6 +34,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -44,6 +45,7 @@ import android.hardware.fingerprint.FingerprintEnrollOptions;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorProperties;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Looper;
import android.os.UserManager;
import android.view.View;
@@ -55,6 +57,7 @@ import com.android.internal.widget.VerifyCredentialResponse;
import com.android.settings.R;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.GatekeeperPasswordProvider;
import com.android.settings.biometrics.MultiBiometricEnrollHelper;
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.GlifLayout;
@@ -70,6 +73,7 @@ import org.mockito.stubbing.Answer;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.android.controller.ActivityController;
import java.util.ArrayList;
@@ -353,7 +357,19 @@ public class FingerprintEnrollIntroductionTest {
false);
Assert.assertEquals(View.INVISIBLE,
mFingerprintEnrollIntroduction.getSecondaryFooterButton().getVisibility());
}
@Test
public void drops_pendingIntents() {
setupFingerprintEnrollIntroWith(newExternalPendingIntent());
mController.start();
Shadows.shadowOf(Looper.getMainLooper()).idle();
final Intent intent = mFingerprintEnrollIntroduction.getIntent();
assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL)).isFalse();
assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE)).isFalse();
assertThat(intent.hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT)).isFalse();
}
private Intent newTokenOnlyIntent() {
@@ -383,6 +399,15 @@ public class FingerprintEnrollIntroductionTest {
.putExtra(EXTRA_KEY_GK_PW_HANDLE, 1L);
}
private Intent newExternalPendingIntent() {
return newTokenOnlyIntent()
.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE,
mock(PendingIntent.class))
.putExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT,
mock(PendingIntent.class))
.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false);
}
private VerifyCredentialResponse newGoodCredential(long gkPwHandle, @NonNull byte[] hat) {
return new VerifyCredentialResponse.Builder()
.setGatekeeperPasswordHandle(gkPwHandle)