Merge "Fix several challenge paths" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-28 23:48:32 +00:00
committed by Android (Google) Code Review

View File

@@ -48,16 +48,15 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
private static final int CHOOSE_LOCK_REQUEST = 2002; private static final int CHOOSE_LOCK_REQUEST = 2002;
private static final String SAVE_STATE_CONFIRM_CREDETIAL = "confirm_credential"; private static final String SAVE_STATE_CONFIRM_CREDETIAL = "confirm_credential";
private static final String DO_NOT_FINISH_ACTIVITY = "do_not_finish_activity";
protected int mUserId; protected int mUserId;
protected long mFaceChallenge;
protected long mFingerprintChallenge;
protected int mFaceSensorId;
protected int mFingerprintSensorId;
protected long mGkPwHandle; protected long mGkPwHandle;
private boolean mConfirmCredential; private boolean mConfirmCredential;
@Nullable private FaceManager mFaceManager; @Nullable private FaceManager mFaceManager;
@Nullable private FingerprintManager mFingerprintManager; @Nullable private FingerprintManager mFingerprintManager;
// Do not finish() if choosing/confirming credential, or showing fp/face settings
private boolean mDoNotFinishActivity;
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
@@ -78,6 +77,7 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
if (savedInstanceState != null) { if (savedInstanceState != null) {
mConfirmCredential = savedInstanceState.getBoolean(SAVE_STATE_CONFIRM_CREDETIAL); mConfirmCredential = savedInstanceState.getBoolean(SAVE_STATE_CONFIRM_CREDETIAL);
mDoNotFinishActivity = savedInstanceState.getBoolean(DO_NOT_FINISH_ACTIVITY);
if (savedInstanceState.containsKey( if (savedInstanceState.containsKey(
ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE)) { ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE)) {
mGkPwHandle = savedInstanceState.getLong( mGkPwHandle = savedInstanceState.getLong(
@@ -92,31 +92,47 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
} }
@Override @Override
public void onDestroy() { public void onResume() {
super.onDestroy(); super.onResume();
if (getActivity().isFinishing()) { if (!mConfirmCredential) {
mFaceManager.revokeChallenge(mFaceSensorId, mUserId, mFaceChallenge); mDoNotFinishActivity = false;
mFingerprintManager.revokeChallenge(mUserId, mFingerprintChallenge); }
}
@Override
public void onStop() {
super.onStop();
if (!getActivity().isChangingConfigurations() && !mDoNotFinishActivity) {
BiometricUtils.removeGatekeeperPasswordHandle(getActivity(), mGkPwHandle); BiometricUtils.removeGatekeeperPasswordHandle(getActivity(), mGkPwHandle);
getActivity().finish();
} }
} }
@Override @Override
public boolean onPreferenceTreeClick(Preference preference) { public boolean onPreferenceTreeClick(Preference preference) {
final String key = preference.getKey(); final String key = preference.getKey();
// Generate challenge (and request LSS to create a HAT) each time the preference is clicked,
// since FingerprintSettings and FaceSettings revoke the challenge when finishing.
if (getFacePreferenceKey().equals(key)) { if (getFacePreferenceKey().equals(key)) {
final byte[] token = BiometricUtils.requestGatekeeperHat(getActivity(), mGkPwHandle, mDoNotFinishActivity = true;
mUserId, mFaceChallenge); mFaceManager.generateChallenge((sensorId, challenge) -> {
final Bundle extras = preference.getExtras(); final byte[] token = BiometricUtils.requestGatekeeperHat(getActivity(), mGkPwHandle,
extras.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); mUserId, challenge);
extras.putInt(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, mFaceSensorId); final Bundle extras = preference.getExtras();
extras.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, mFaceChallenge); extras.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
extras.putInt(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, sensorId);
extras.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, challenge);
});
} else if (getFingerprintPreferenceKey().equals(key)) { } else if (getFingerprintPreferenceKey().equals(key)) {
final byte[] token = BiometricUtils.requestGatekeeperHat(getActivity(), mGkPwHandle, mDoNotFinishActivity = true;
mUserId, mFingerprintChallenge); mFingerprintManager.generateChallenge(mUserId, (sensorId, challenge) -> {
final Bundle extras = preference.getExtras(); final byte[] token = BiometricUtils.requestGatekeeperHat(getActivity(), mGkPwHandle,
extras.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); mUserId, challenge);
extras.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, mFingerprintChallenge); final Bundle extras = preference.getExtras();
extras.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
extras.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, challenge);
});
} }
return super.onPreferenceTreeClick(preference); return super.onPreferenceTreeClick(preference);
} }
@@ -125,6 +141,7 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putBoolean(SAVE_STATE_CONFIRM_CREDETIAL, mConfirmCredential); outState.putBoolean(SAVE_STATE_CONFIRM_CREDETIAL, mConfirmCredential);
outState.putBoolean(DO_NOT_FINISH_ACTIVITY, mDoNotFinishActivity);
if (mGkPwHandle != 0L) { if (mGkPwHandle != 0L) {
outState.putLong(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, mGkPwHandle); outState.putLong(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, mGkPwHandle);
} }
@@ -135,17 +152,10 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CONFIRM_REQUEST || requestCode == CHOOSE_LOCK_REQUEST) { if (requestCode == CONFIRM_REQUEST || requestCode == CHOOSE_LOCK_REQUEST) {
mConfirmCredential = false; mConfirmCredential = false;
mDoNotFinishActivity = false;
if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) { if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
if (data != null && BiometricUtils.containsGatekeeperPasswordHandle(data)) { if (BiometricUtils.containsGatekeeperPasswordHandle(data)) {
mGkPwHandle = BiometricUtils.getGatekeeperPasswordHandle(data); mGkPwHandle = BiometricUtils.getGatekeeperPasswordHandle(data);
mFaceManager.generateChallenge((sensorId, challenge) -> {
mFaceSensorId = sensorId;
mFaceChallenge = challenge;
});
mFingerprintManager.generateChallenge(mUserId, (sensorId, challenge) -> {
mFingerprintSensorId = sensorId;
mFingerprintChallenge = challenge;
});
} else { } else {
Log.d(getLogTag(), "Data null or GK PW missing."); Log.d(getLogTag(), "Data null or GK PW missing.");
finish(); finish();
@@ -178,6 +188,7 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
if (mUserId != UserHandle.USER_NULL) { if (mUserId != UserHandle.USER_NULL) {
builder.setUserId(mUserId); builder.setUserId(mUserId);
} }
mDoNotFinishActivity = true;
final boolean launched = builder.show(); final boolean launched = builder.show();
if (!launched) { if (!launched) {