Merge "Fix bug where fingerprint for wrong userId was attempted to be removed." into nyc-dev

This commit is contained in:
Jim Miller
2016-04-20 21:33:13 +00:00
committed by Android (Google) Code Review
6 changed files with 23 additions and 27 deletions

View File

@@ -590,7 +590,7 @@ public class FingerprintManager {
if (mService != null) try {
mRemovalCallback = callback;
mRemovalFingerprint = fp;
mService.remove(mToken, fp.getFingerId(), userId, mServiceReceiver);
mService.remove(mToken, fp.getFingerId(), fp.getGroupId(), userId, mServiceReceiver);
} catch (RemoteException e) {
Log.w(TAG, "Remote exception in remove: ", e);
if (callback != null) {
@@ -810,11 +810,13 @@ public class FingerprintManager {
if (mRemovalCallback != null) {
int reqFingerId = mRemovalFingerprint.getFingerId();
int reqGroupId = mRemovalFingerprint.getGroupId();
if (reqFingerId != 0 && fingerId != reqFingerId) {
if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) {
Log.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId);
return;
}
if (groupId != reqGroupId) {
Log.w(TAG, "Group id didn't match: " + groupId + " != " + reqGroupId);
return;
}
mRemovalCallback.onRemovalSucceeded(new Fingerprint(null, groupId, fingerId,
deviceId));

View File

@@ -41,7 +41,8 @@ interface IFingerprintService {
void cancelEnrollment(IBinder token);
// Any errors resulting from this call will be returned to the listener
void remove(IBinder token, int fingerId, int groupId, IFingerprintServiceReceiver receiver);
void remove(IBinder token, int fingerId, int groupId, int userId,
IFingerprintServiceReceiver receiver);
// Rename the fingerprint specified by fingerId and groupId to the given name
void rename(int fingerId, int groupId, String name);

View File

@@ -38,7 +38,7 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
protected static final boolean DEBUG = FingerprintService.DEBUG;
private IBinder mToken;
private IFingerprintServiceReceiver mReceiver;
private int mCallingUserId;
private int mTargetUserId;
private int mGroupId;
private boolean mIsRestricted; // True if client does not have MANAGE_FINGERPRINT permission
private String mOwner;
@@ -50,20 +50,20 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
* @param halDeviceId the HAL device ID of the associated fingerprint hardware
* @param token a unique token for the client
* @param receiver recipient of related events (e.g. authentication)
* @param callingUserId user id of calling user
* @param userId target user id for operation
* @param groupId groupId for the fingerprint set
* @param restricted whether or not client has the {@link Manifest#MANAGE_FINGERPRINT}
* permission
* @param owner name of the client that owns this
*/
public ClientMonitor(Context context, long halDeviceId, IBinder token,
IFingerprintServiceReceiver receiver, int callingUserId, int groupId,boolean restricted,
IFingerprintServiceReceiver receiver, int userId, int groupId,boolean restricted,
String owner) {
mContext = context;
mHalDeviceId = halDeviceId;
mToken = token;
mReceiver = receiver;
mCallingUserId = callingUserId;
mTargetUserId = userId;
mGroupId = groupId;
mIsRestricted = restricted;
mOwner = owner;
@@ -197,8 +197,8 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
return mIsRestricted;
}
public final int getCallingUserId() {
return mCallingUserId;
public final int getTargetUserId() {
return mTargetUserId;
}
public final int getGroupId() {

View File

@@ -41,7 +41,7 @@ public abstract class EnumerateClient extends ClientMonitor {
try {
final int result = daemon.enumerate();
if (result != 0) {
Slog.w(TAG, "start enumerate for user " + getCallingUserId()
Slog.w(TAG, "start enumerate for user " + getTargetUserId()
+ " failed, result=" + result);
onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
return result;

View File

@@ -356,7 +356,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
}
}
void startRemove(IBinder token, int fingerId, int callingUserId, int groupId,
void startRemove(IBinder token, int fingerId, int groupId, int userId,
IFingerprintServiceReceiver receiver, boolean restricted) {
IFingerprintDaemon daemon = getFingerprintDaemon();
if (daemon == null) {
@@ -364,7 +364,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
return;
}
RemovalClient client = new RemovalClient(getContext(), mHalDeviceId, token,
receiver, callingUserId, groupId, fingerId, restricted, token.toString()) {
receiver, fingerId, groupId, userId, restricted, token.toString()) {
@Override
public void notifyUserActivity() {
FingerprintService.this.userActivity();
@@ -794,14 +794,13 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
@Override // Binder call
public void remove(final IBinder token, final int fingerId, final int groupId,
final IFingerprintServiceReceiver receiver) {
final int userId, final IFingerprintServiceReceiver receiver) {
checkPermission(MANAGE_FINGERPRINT); // TODO: Maybe have another permission
final boolean restricted = isRestricted();
final int callingUserId = UserHandle.getCallingUserId();
mHandler.post(new Runnable() {
@Override
public void run() {
startRemove(token, fingerId, callingUserId, groupId, receiver, restricted);
startRemove(token, fingerId, groupId, userId, receiver, restricted);
}
});

View File

@@ -30,14 +30,12 @@ import android.util.Slog;
*/
public abstract class RemovalClient extends ClientMonitor {
private int mFingerId;
private int mUserIdForRemove;
public RemovalClient(Context context, long halDeviceId, IBinder token,
IFingerprintServiceReceiver receiver, int userId, int groupId, int fingerId,
IFingerprintServiceReceiver receiver, int fingerId, int groupId, int userId,
boolean restricted, String owner) {
super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
mFingerId = fingerId;
mUserIdForRemove = userId;
}
@Override
@@ -72,25 +70,21 @@ public abstract class RemovalClient extends ClientMonitor {
*/
private boolean sendRemoved(int fingerId, int groupId) {
IFingerprintServiceReceiver receiver = getReceiver();
if (receiver == null)
return true; // client not listening
try {
receiver.onRemoved(getHalDeviceId(), fingerId, groupId);
return fingerId == 0;
if (receiver != null) {
receiver.onRemoved(getHalDeviceId(), fingerId, groupId);
}
} catch (RemoteException e) {
Slog.w(TAG, "Failed to notify Removed:", e);
}
return false;
return fingerId == 0;
}
@Override
public boolean onRemoved(int fingerId, int groupId) {
if (fingerId != 0) {
if (fingerId != mFingerId)
FingerprintUtils.getInstance().removeFingerprintIdForUser(getContext(), fingerId,
mUserIdForRemove);
} else {
mUserIdForRemove = UserHandle.USER_NULL;
getTargetUserId());
}
return sendRemoved(fingerId, getGroupId());
}