Merge "Move generateChallenge/revokeChallenge to ISession"
This commit is contained in:
committed by
Android (Google) Code Review
commit
c9046a071a
@@ -626,10 +626,10 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(MANAGE_FINGERPRINT)
|
||||
public void generateChallenge(int sensorId, GenerateChallengeCallback callback) {
|
||||
public void generateChallenge(int sensorId, int userId, GenerateChallengeCallback callback) {
|
||||
if (mService != null) try {
|
||||
mGenerateChallengeCallback = callback;
|
||||
mService.generateChallenge(mToken, sensorId, mServiceReceiver,
|
||||
mService.generateChallenge(mToken, sensorId, userId, mServiceReceiver,
|
||||
mContext.getOpPackageName());
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
@@ -642,7 +642,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(MANAGE_FINGERPRINT)
|
||||
public void generateChallenge(GenerateChallengeCallback callback) {
|
||||
public void generateChallenge(int userId, GenerateChallengeCallback callback) {
|
||||
final List<FingerprintSensorPropertiesInternal> fingerprintSensorProperties =
|
||||
getSensorPropertiesInternal();
|
||||
if (fingerprintSensorProperties.isEmpty()) {
|
||||
@@ -651,7 +651,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
|
||||
}
|
||||
|
||||
final int sensorId = fingerprintSensorProperties.get(0).sensorId;
|
||||
generateChallenge(sensorId, callback);
|
||||
generateChallenge(sensorId, userId, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -659,10 +659,10 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(MANAGE_FINGERPRINT)
|
||||
public void revokeChallenge() {
|
||||
public void revokeChallenge(int userId) {
|
||||
// On HALs with only single in-flight challenge such as IBiometricsFingerprint@2.1,
|
||||
// this parameter is ignored.
|
||||
revokeChallenge(0L);
|
||||
revokeChallenge(userId, 0L);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -670,9 +670,17 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(MANAGE_FINGERPRINT)
|
||||
public void revokeChallenge(long challenge) {
|
||||
public void revokeChallenge(int userId, long challenge) {
|
||||
if (mService != null) try {
|
||||
mService.revokeChallenge(mToken, mContext.getOpPackageName(), challenge);
|
||||
final List<FingerprintSensorPropertiesInternal> fingerprintSensorProperties =
|
||||
getSensorPropertiesInternal();
|
||||
if (fingerprintSensorProperties.isEmpty()) {
|
||||
Slog.e(TAG, "No sensors");
|
||||
return;
|
||||
}
|
||||
final int sensorId = fingerprintSensorProperties.get(0).sensorId;
|
||||
mService.revokeChallenge(mToken, sensorId, userId, mContext.getOpPackageName(),
|
||||
challenge);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
|
||||
@@ -93,10 +93,10 @@ interface IFingerprintService {
|
||||
boolean isHardwareDetected(String opPackageName);
|
||||
|
||||
// Get a pre-enrollment authentication token
|
||||
void generateChallenge(IBinder token, int sensorId, IFingerprintServiceReceiver receiver, String opPackageName);
|
||||
void generateChallenge(IBinder token, int sensorId, int userId, IFingerprintServiceReceiver receiver, String opPackageName);
|
||||
|
||||
// Finish an enrollment sequence and invalidate the authentication token
|
||||
void revokeChallenge(IBinder token, String opPackageName, long challenge);
|
||||
void revokeChallenge(IBinder token, int sensorId, int userId, String opPackageName, long challenge);
|
||||
|
||||
// Determine if a user has at least one enrolled fingerprint
|
||||
boolean hasEnrolledFingerprints(int userId, String opPackageName);
|
||||
|
||||
@@ -174,7 +174,7 @@ public class FingerprintService extends SystemService {
|
||||
}
|
||||
|
||||
@Override // Binder call
|
||||
public void generateChallenge(IBinder token, int sensorId,
|
||||
public void generateChallenge(IBinder token, int sensorId, int userId,
|
||||
IFingerprintServiceReceiver receiver, String opPackageName) {
|
||||
Utils.checkPermission(getContext(), MANAGE_FINGERPRINT);
|
||||
|
||||
@@ -184,20 +184,21 @@ public class FingerprintService extends SystemService {
|
||||
return;
|
||||
}
|
||||
|
||||
provider.scheduleGenerateChallenge(sensorId, token, receiver, opPackageName);
|
||||
provider.scheduleGenerateChallenge(sensorId, userId, token, receiver, opPackageName);
|
||||
}
|
||||
|
||||
@Override // Binder call
|
||||
public void revokeChallenge(IBinder token, String opPackageName, long challenge) {
|
||||
public void revokeChallenge(IBinder token, int sensorId, int userId, String opPackageName,
|
||||
long challenge) {
|
||||
Utils.checkPermission(getContext(), MANAGE_FINGERPRINT);
|
||||
|
||||
final Pair<Integer, ServiceProvider> provider = getSingleProvider();
|
||||
final ServiceProvider provider = getProviderForSensor(sensorId);
|
||||
if (provider == null) {
|
||||
Slog.w(TAG, "Null provider for revokeChallenge");
|
||||
Slog.w(TAG, "No matching sensor for revokeChallenge, sensorId: " + sensorId);
|
||||
return;
|
||||
}
|
||||
|
||||
provider.second.scheduleRevokeChallenge(provider.first, token, opPackageName,
|
||||
provider.scheduleRevokeChallenge(sensorId, userId, token, opPackageName,
|
||||
challenge);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,10 +64,10 @@ public interface ServiceProvider {
|
||||
|
||||
void scheduleResetLockout(int sensorId, int userId, @Nullable byte[] hardwareAuthToken);
|
||||
|
||||
void scheduleGenerateChallenge(int sensorId, @NonNull IBinder token,
|
||||
void scheduleGenerateChallenge(int sensorId, int userId, @NonNull IBinder token,
|
||||
@NonNull IFingerprintServiceReceiver receiver, String opPackageName);
|
||||
|
||||
void scheduleRevokeChallenge(int sensorId, @NonNull IBinder token,
|
||||
void scheduleRevokeChallenge(int sensorId, int userId, @NonNull IBinder token,
|
||||
@NonNull String opPackageName, long challenge);
|
||||
|
||||
void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken, int userId,
|
||||
|
||||
@@ -19,7 +19,7 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.fingerprint.IFingerprint;
|
||||
import android.hardware.biometrics.fingerprint.IGenerateChallengeCallback;
|
||||
import android.hardware.biometrics.fingerprint.ISession;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
@@ -30,28 +30,12 @@ import com.android.server.biometrics.sensors.GenerateChallengeClient;
|
||||
/**
|
||||
* Fingerprint-specific generateChallenge client for the {@link IFingerprint} AIDL HAL interface.
|
||||
*/
|
||||
class FingerprintGenerateChallengeClient extends GenerateChallengeClient<IFingerprint> {
|
||||
class FingerprintGenerateChallengeClient extends GenerateChallengeClient<ISession> {
|
||||
private static final String TAG = "FingerprintGenerateChallengeClient";
|
||||
private static final int CHALLENGE_TIMEOUT_SEC = 600; // 10 minutes
|
||||
|
||||
private final IGenerateChallengeCallback mGenerateChallengeCallback =
|
||||
new IGenerateChallengeCallback.Stub() {
|
||||
@Override
|
||||
public void onChallengeGenerated(int sensorId, int userId, long challenge) {
|
||||
try {
|
||||
getListener().onChallengeGenerated(sensorId, challenge);
|
||||
mCallback.onClientFinished(FingerprintGenerateChallengeClient.this,
|
||||
true /* success */);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Unable to send challenge", e);
|
||||
mCallback.onClientFinished(FingerprintGenerateChallengeClient.this,
|
||||
false /* success */);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
FingerprintGenerateChallengeClient(@NonNull Context context,
|
||||
@NonNull LazyDaemon<IFingerprint> lazyDaemon,
|
||||
@NonNull LazyDaemon<ISession> lazyDaemon,
|
||||
@NonNull IBinder token,
|
||||
@NonNull ClientMonitorCallbackConverter listener,
|
||||
@NonNull String owner, int sensorId) {
|
||||
@@ -61,11 +45,21 @@ class FingerprintGenerateChallengeClient extends GenerateChallengeClient<IFinger
|
||||
@Override
|
||||
protected void startHalOperation() {
|
||||
try {
|
||||
getFreshDaemon().generateChallenge(getSensorId(), getTargetUserId(),
|
||||
CHALLENGE_TIMEOUT_SEC,
|
||||
mGenerateChallengeCallback);
|
||||
getFreshDaemon().generateChallenge(mSequentialId, CHALLENGE_TIMEOUT_SEC);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Unable to generateChallenge", e);
|
||||
}
|
||||
}
|
||||
|
||||
void onChallengeGenerated(int sensorId, int userId, long challenge) {
|
||||
try {
|
||||
getListener().onChallengeGenerated(sensorId, challenge);
|
||||
mCallback.onClientFinished(FingerprintGenerateChallengeClient.this,
|
||||
true /* success */);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Unable to send challenge", e);
|
||||
mCallback.onClientFinished(FingerprintGenerateChallengeClient.this,
|
||||
false /* success */);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,24 +274,55 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
|
||||
}
|
||||
|
||||
@Override
|
||||
public void scheduleGenerateChallenge(int sensorId, @NonNull IBinder token,
|
||||
public void scheduleGenerateChallenge(int sensorId, int userId, @NonNull IBinder token,
|
||||
@NonNull IFingerprintServiceReceiver receiver, String opPackageName) {
|
||||
mHandler.post(() -> {
|
||||
final FingerprintGenerateChallengeClient client =
|
||||
new FingerprintGenerateChallengeClient(mContext, mLazyDaemon, token,
|
||||
new ClientMonitorCallbackConverter(receiver), opPackageName, sensorId);
|
||||
scheduleForSensor(sensorId, client);
|
||||
final IFingerprint daemon = getHalInstance();
|
||||
if (daemon == null) {
|
||||
Slog.e(getTag(), "Null daemon during generateChallenge, sensorId: " + sensorId);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!mSensors.get(sensorId).hasSessionForUser(userId)) {
|
||||
createNewSessionWithoutHandler(daemon, sensorId, userId);
|
||||
}
|
||||
|
||||
final FingerprintGenerateChallengeClient client =
|
||||
new FingerprintGenerateChallengeClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
new ClientMonitorCallbackConverter(receiver), opPackageName,
|
||||
sensorId);
|
||||
scheduleForSensor(sensorId, client);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(getTag(), "Remote exception when scheduling generateChallenge", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void scheduleRevokeChallenge(int sensorId, @NonNull IBinder token,
|
||||
public void scheduleRevokeChallenge(int sensorId, int userId, @NonNull IBinder token,
|
||||
@NonNull String opPackageName, long challenge) {
|
||||
mHandler.post(() -> {
|
||||
final FingerprintRevokeChallengeClient client =
|
||||
new FingerprintRevokeChallengeClient(mContext, mLazyDaemon, token,
|
||||
opPackageName, sensorId, challenge);
|
||||
scheduleForSensor(sensorId, client);
|
||||
final IFingerprint daemon = getHalInstance();
|
||||
if (daemon == null) {
|
||||
Slog.e(getTag(), "Null daemon during revokeChallenge, sensorId: " + sensorId);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!mSensors.get(sensorId).hasSessionForUser(userId)) {
|
||||
createNewSessionWithoutHandler(daemon, sensorId, userId);
|
||||
}
|
||||
|
||||
final FingerprintRevokeChallengeClient client =
|
||||
new FingerprintRevokeChallengeClient(mContext,
|
||||
mSensors.get(sensorId).getLazySession(), token,
|
||||
opPackageName, sensorId, challenge);
|
||||
scheduleForSensor(sensorId, client);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(getTag(), "Remote exception when scheduling revokeChallenge", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ package com.android.server.biometrics.sensors.fingerprint.aidl;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.Context;
|
||||
import android.hardware.biometrics.fingerprint.IFingerprint;
|
||||
import android.hardware.biometrics.fingerprint.IRevokeChallengeCallback;
|
||||
import android.hardware.biometrics.fingerprint.ISession;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
@@ -29,23 +29,14 @@ import com.android.server.biometrics.sensors.RevokeChallengeClient;
|
||||
/**
|
||||
* Fingerprint-specific revokeChallenge client for the {@link IFingerprint} AIDL HAL interface.
|
||||
*/
|
||||
class FingerprintRevokeChallengeClient extends RevokeChallengeClient<IFingerprint> {
|
||||
class FingerprintRevokeChallengeClient extends RevokeChallengeClient<ISession> {
|
||||
|
||||
private static final String TAG = "FingerpirntRevokeChallengeClient";
|
||||
|
||||
private final long mChallenge;
|
||||
|
||||
private final IRevokeChallengeCallback mRevokeChallengeCallback =
|
||||
new IRevokeChallengeCallback.Stub() {
|
||||
@Override
|
||||
public void onChallengeRevoked(int sensorId, int userId, long challenge) {
|
||||
final boolean success = challenge == mChallenge;
|
||||
mCallback.onClientFinished(FingerprintRevokeChallengeClient.this, success);
|
||||
}
|
||||
};
|
||||
|
||||
FingerprintRevokeChallengeClient(@NonNull Context context,
|
||||
@NonNull LazyDaemon<IFingerprint> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull LazyDaemon<ISession> lazyDaemon, @NonNull IBinder token,
|
||||
@NonNull String owner, int sensorId, long challenge) {
|
||||
super(context, lazyDaemon, token, owner, sensorId);
|
||||
mChallenge = challenge;
|
||||
@@ -54,10 +45,14 @@ class FingerprintRevokeChallengeClient extends RevokeChallengeClient<IFingerprin
|
||||
@Override
|
||||
protected void startHalOperation() {
|
||||
try {
|
||||
getFreshDaemon().revokeChallenge(getSensorId(), getTargetUserId(), mChallenge,
|
||||
mRevokeChallengeCallback);
|
||||
getFreshDaemon().revokeChallenge(mSequentialId, mChallenge);
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Unable to revokeChallenge", e);
|
||||
}
|
||||
}
|
||||
|
||||
void onChallengeRevoked(int sensorId, int userId, long challenge) {
|
||||
final boolean success = challenge == mChallenge;
|
||||
mCallback.onClientFinished(FingerprintRevokeChallengeClient.this, success);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,6 +141,38 @@ class Sensor implements IBinder.DeathRecipient {
|
||||
// TODO(b/162973174)
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChallengeGenerated(long challenge) {
|
||||
mHandler.post(() -> {
|
||||
final ClientMonitor<?> client = mScheduler.getCurrentClient();
|
||||
if (!(client instanceof FingerprintGenerateChallengeClient)) {
|
||||
Slog.e(mTag, "onChallengeGenerated for wrong client: "
|
||||
+ Utils.getClientName(client));
|
||||
return;
|
||||
}
|
||||
|
||||
final FingerprintGenerateChallengeClient generateChallengeClient =
|
||||
(FingerprintGenerateChallengeClient) client;
|
||||
generateChallengeClient.onChallengeGenerated(sensorId, userId, challenge);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChallengeRevoked(long challenge) {
|
||||
mHandler.post(() -> {
|
||||
final ClientMonitor<?> client = mScheduler.getCurrentClient();
|
||||
if (!(client instanceof FingerprintRevokeChallengeClient)) {
|
||||
Slog.e(mTag, "onChallengeRevoked for wrong client: "
|
||||
+ Utils.getClientName(client));
|
||||
return;
|
||||
}
|
||||
|
||||
final FingerprintRevokeChallengeClient revokeChallengeClient =
|
||||
(FingerprintRevokeChallengeClient) client;
|
||||
revokeChallengeClient.onChallengeRevoked(sensorId, userId, challenge);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAcquired(byte info, int vendorCode) {
|
||||
mHandler.post(() -> {
|
||||
|
||||
@@ -505,7 +505,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
}
|
||||
|
||||
@Override
|
||||
public void scheduleGenerateChallenge(int sensorId, @NonNull IBinder token,
|
||||
public void scheduleGenerateChallenge(int sensorId, int userId, @NonNull IBinder token,
|
||||
@NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName) {
|
||||
mHandler.post(() -> {
|
||||
final FingerprintGenerateChallengeClient client =
|
||||
@@ -517,7 +517,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
|
||||
}
|
||||
|
||||
@Override
|
||||
public void scheduleRevokeChallenge(int sensorId, @NonNull IBinder token,
|
||||
public void scheduleRevokeChallenge(int sensorId, int userId, @NonNull IBinder token,
|
||||
@NonNull String opPackageName, long challenge) {
|
||||
mHandler.post(() -> {
|
||||
final FingerprintRevokeChallengeClient client = new FingerprintRevokeChallengeClient(
|
||||
|
||||
Reference in New Issue
Block a user