Fix the misuse of calling user id as group id
1. The userId stored in different clients are actually calling user id. groupId should be used to do all the operations. Also, renamed the variable to avoid further confusion. 2. Fix the bug null is always returned in getFingerprintDaemon in RemovalClient. 3. Fix the misuse of calling uid as calling user id in startAuthentication. Fix: 28268635 Fix: 28264725 Change-Id: I618ac3c6d913ae5c86e7b04cb3f9ead39828f216
This commit is contained in:
@@ -39,9 +39,9 @@ public abstract class AuthenticationClient extends ClientMonitor {
|
||||
public abstract void resetFailedAttempts();
|
||||
|
||||
public AuthenticationClient(Context context, long halDeviceId, IBinder token,
|
||||
IFingerprintServiceReceiver receiver, int userId, int groupId, long opId,
|
||||
IFingerprintServiceReceiver receiver, int callingUserId, int groupId, long opId,
|
||||
boolean restricted, String owner) {
|
||||
super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
|
||||
super(context, halDeviceId, token, receiver, callingUserId, groupId, restricted, owner);
|
||||
mOpId = opId;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 mUserId;
|
||||
private int mCallingUserId;
|
||||
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 userId userId for the fingerprint set
|
||||
* @param callingUserId user id of calling user
|
||||
* @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 userId, int groupId,boolean restricted,
|
||||
IFingerprintServiceReceiver receiver, int callingUserId, int groupId,boolean restricted,
|
||||
String owner) {
|
||||
mContext = context;
|
||||
mHalDeviceId = halDeviceId;
|
||||
mToken = token;
|
||||
mReceiver = receiver;
|
||||
mUserId = userId;
|
||||
mCallingUserId = callingUserId;
|
||||
mGroupId = groupId;
|
||||
mIsRestricted = restricted;
|
||||
mOwner = owner;
|
||||
@@ -197,8 +197,8 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
|
||||
return mIsRestricted;
|
||||
}
|
||||
|
||||
public final int getUserId() {
|
||||
return mUserId;
|
||||
public final int getCallingUserId() {
|
||||
return mCallingUserId;
|
||||
}
|
||||
|
||||
public final int getGroupId() {
|
||||
|
||||
@@ -46,9 +46,12 @@ public abstract class EnrollClient extends ClientMonitor {
|
||||
|
||||
@Override
|
||||
public boolean onEnrollResult(int fingerId, int groupId, int remaining) {
|
||||
if (groupId != getGroupId()) {
|
||||
Slog.w(TAG, "groupId != getGroupId(), groupId: " + groupId +
|
||||
" getGroupId():" + getGroupId());
|
||||
}
|
||||
if (remaining == 0) {
|
||||
FingerprintUtils.getInstance().addFingerprintForUser(getContext(), fingerId,
|
||||
getUserId());
|
||||
FingerprintUtils.getInstance().addFingerprintForUser(getContext(), fingerId, groupId);
|
||||
}
|
||||
return sendEnrollResult(fingerId, groupId, remaining);
|
||||
}
|
||||
|
||||
@@ -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 " + getUserId()
|
||||
Slog.w(TAG, "start enumerate for user " + getCallingUserId()
|
||||
+ " failed, result=" + result);
|
||||
onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
|
||||
return result;
|
||||
|
||||
@@ -356,7 +356,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
}
|
||||
}
|
||||
|
||||
void startRemove(IBinder token, int fingerId, int userId, int groupId,
|
||||
void startRemove(IBinder token, int fingerId, int callingUserId, int groupId,
|
||||
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, userId, groupId, fingerId, restricted, token.toString()) {
|
||||
receiver, callingUserId, groupId, fingerId, restricted, token.toString()) {
|
||||
@Override
|
||||
public void notifyUserActivity() {
|
||||
FingerprintService.this.userActivity();
|
||||
@@ -372,8 +372,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
|
||||
@Override
|
||||
public IFingerprintDaemon getFingerprintDaemon() {
|
||||
FingerprintService.this.getFingerprintDaemon();
|
||||
return null;
|
||||
return FingerprintService.this.getFingerprintDaemon();
|
||||
}
|
||||
};
|
||||
startClient(client, true);
|
||||
@@ -494,7 +493,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
}
|
||||
}
|
||||
|
||||
private void startAuthentication(IBinder token, long opId, int realUserId, int groupId,
|
||||
private void startAuthentication(IBinder token, long opId, int callingUserId, int groupId,
|
||||
IFingerprintServiceReceiver receiver, int flags, boolean restricted,
|
||||
String opPackageName) {
|
||||
updateActiveGroup(groupId, opPackageName);
|
||||
@@ -502,7 +501,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
if (DEBUG) Slog.v(TAG, "startAuthentication(" + opPackageName + ")");
|
||||
|
||||
AuthenticationClient client = new AuthenticationClient(getContext(), mHalDeviceId, token,
|
||||
receiver, realUserId, groupId, opId, restricted, opPackageName) {
|
||||
receiver, callingUserId, groupId, opId, restricted, opPackageName) {
|
||||
@Override
|
||||
public boolean handleFailedAttempt() {
|
||||
mFailedAttempts++;
|
||||
@@ -541,13 +540,13 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
startClient(client, true /* initiatedByClient */);
|
||||
}
|
||||
|
||||
private void startEnrollment(IBinder token, byte [] cryptoToken, int userId, int groupId,
|
||||
private void startEnrollment(IBinder token, byte [] cryptoToken, int callingUserId, int groupId,
|
||||
IFingerprintServiceReceiver receiver, int flags, boolean restricted,
|
||||
String opPackageName) {
|
||||
updateActiveGroup(groupId, opPackageName);
|
||||
|
||||
EnrollClient client = new EnrollClient(getContext(), mHalDeviceId, token, receiver,
|
||||
userId, groupId, cryptoToken, restricted, opPackageName) {
|
||||
callingUserId, groupId, cryptoToken, restricted, opPackageName) {
|
||||
|
||||
@Override
|
||||
public IFingerprintDaemon getFingerprintDaemon() {
|
||||
@@ -687,9 +686,9 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
checkPermission(MANAGE_FINGERPRINT);
|
||||
final int limit = mContext.getResources().getInteger(
|
||||
com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
final int userId = UserHandle.getUserId(callingUid);
|
||||
final int enrolled = FingerprintService.this.getEnrolledFingerprints(userId).size();
|
||||
final int callingUserId = UserHandle.getCallingUserId();
|
||||
final int enrolled = FingerprintService.this.
|
||||
getEnrolledFingerprints(callingUserId).size();
|
||||
if (enrolled >= limit) {
|
||||
Slog.w(TAG, "Too many fingerprints registered");
|
||||
return;
|
||||
@@ -705,7 +704,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
startEnrollment(token, cryptoToken, userId, groupId, receiver, flags,
|
||||
startEnrollment(token, cryptoToken, callingUserId, groupId, receiver, flags,
|
||||
restricted, opPackageName);
|
||||
}
|
||||
});
|
||||
@@ -735,7 +734,8 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
public void authenticate(final IBinder token, final long opId, final int groupId,
|
||||
final IFingerprintServiceReceiver receiver, final int flags,
|
||||
final String opPackageName) {
|
||||
final int realUserId = Binder.getCallingUid();
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
final int callingUserId = UserHandle.getCallingUserId();
|
||||
final int pid = Binder.getCallingPid();
|
||||
final boolean restricted = isRestricted();
|
||||
mHandler.post(new Runnable() {
|
||||
@@ -743,11 +743,11 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
public void run() {
|
||||
MetricsLogger.histogram(mContext, "fingerprint_token", opId != 0L ? 1 : 0);
|
||||
if (!canUseFingerprint(opPackageName, true /* foregroundOnly */,
|
||||
realUserId, pid)) {
|
||||
callingUid, pid)) {
|
||||
if (DEBUG) Slog.v(TAG, "authenticate(): reject " + opPackageName);
|
||||
return;
|
||||
}
|
||||
startAuthentication(token, opId, realUserId, groupId, receiver,
|
||||
startAuthentication(token, opId, callingUserId, groupId, receiver,
|
||||
flags, restricted, opPackageName);
|
||||
}
|
||||
});
|
||||
@@ -797,11 +797,11 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe
|
||||
final IFingerprintServiceReceiver receiver) {
|
||||
checkPermission(MANAGE_FINGERPRINT); // TODO: Maybe have another permission
|
||||
final boolean restricted = isRestricted();
|
||||
final int realUserId = Binder.getCallingUid();
|
||||
final int callingUserId = UserHandle.getCallingUserId();
|
||||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
startRemove(token, fingerId, realUserId, groupId, receiver, restricted);
|
||||
startRemove(token, fingerId, callingUserId, groupId, receiver, restricted);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ public abstract class RemovalClient extends ClientMonitor {
|
||||
IFingerprintDaemon daemon = getFingerprintDaemon();
|
||||
// The fingerprint template ids will be removed when we get confirmation from the HAL
|
||||
try {
|
||||
final int result = daemon.remove(mFingerId, getUserId());
|
||||
final int result = daemon.remove(mFingerId, getGroupId());
|
||||
if (result != 0) {
|
||||
Slog.w(TAG, "startRemove with id = " + mFingerId + " failed, result=" + result);
|
||||
onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
|
||||
|
||||
Reference in New Issue
Block a user