Bind fingerprint when we start authentication
This fixes a bug where it was possible to authenticate the wrong user. We now bind the userId when we start authentication and confirm it when authentication completes. Fixes bug 30744668 Change-Id: I346d92c301414ed81e11fa9c171584c7ae4341c2
This commit is contained in:
@@ -259,6 +259,7 @@ public class FingerprintManager {
|
||||
public static class AuthenticationResult {
|
||||
private Fingerprint mFingerprint;
|
||||
private CryptoObject mCryptoObject;
|
||||
private int mUserId;
|
||||
|
||||
/**
|
||||
* Authentication result
|
||||
@@ -267,9 +268,10 @@ public class FingerprintManager {
|
||||
* @param fingerprint the recognized fingerprint data, if allowed.
|
||||
* @hide
|
||||
*/
|
||||
public AuthenticationResult(CryptoObject crypto, Fingerprint fingerprint) {
|
||||
public AuthenticationResult(CryptoObject crypto, Fingerprint fingerprint, int userId) {
|
||||
mCryptoObject = crypto;
|
||||
mFingerprint = fingerprint;
|
||||
mUserId = userId;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -286,6 +288,12 @@ public class FingerprintManager {
|
||||
* @hide
|
||||
*/
|
||||
public Fingerprint getFingerprint() { return mFingerprint; }
|
||||
|
||||
/**
|
||||
* Obtain the userId for which this fingerprint was authenticated.
|
||||
* @hide
|
||||
*/
|
||||
public int getUserId() { return mUserId; }
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -792,7 +800,7 @@ public class FingerprintManager {
|
||||
sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */);
|
||||
break;
|
||||
case MSG_AUTHENTICATION_SUCCEEDED:
|
||||
sendAuthenticatedSucceeded((Fingerprint) msg.obj);
|
||||
sendAuthenticatedSucceeded((Fingerprint) msg.obj, msg.arg1 /* userId */);
|
||||
break;
|
||||
case MSG_AUTHENTICATION_FAILED:
|
||||
sendAuthenticatedFailed();
|
||||
@@ -840,9 +848,10 @@ public class FingerprintManager {
|
||||
}
|
||||
}
|
||||
|
||||
private void sendAuthenticatedSucceeded(Fingerprint fp) {
|
||||
private void sendAuthenticatedSucceeded(Fingerprint fp, int userId) {
|
||||
if (mAuthenticationCallback != null) {
|
||||
final AuthenticationResult result = new AuthenticationResult(mCryptoObject, fp);
|
||||
final AuthenticationResult result =
|
||||
new AuthenticationResult(mCryptoObject, fp, userId);
|
||||
mAuthenticationCallback.onAuthenticationSucceeded(result);
|
||||
}
|
||||
}
|
||||
@@ -981,8 +990,8 @@ public class FingerprintManager {
|
||||
}
|
||||
|
||||
@Override // binder call
|
||||
public void onAuthenticationSucceeded(long deviceId, Fingerprint fp) {
|
||||
mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, fp).sendToTarget();
|
||||
public void onAuthenticationSucceeded(long deviceId, Fingerprint fp, int userId) {
|
||||
mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, userId, 0, fp).sendToTarget();
|
||||
}
|
||||
|
||||
@Override // binder call
|
||||
|
||||
@@ -26,7 +26,7 @@ import android.os.UserHandle;
|
||||
oneway interface IFingerprintServiceReceiver {
|
||||
void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining);
|
||||
void onAcquired(long deviceId, int acquiredInfo);
|
||||
void onAuthenticationSucceeded(long deviceId, in Fingerprint fp);
|
||||
void onAuthenticationSucceeded(long deviceId, in Fingerprint fp, int userId);
|
||||
void onAuthenticationFailed(long deviceId);
|
||||
void onError(long deviceId, int error);
|
||||
void onRemoved(long deviceId, int fingerId, int groupId);
|
||||
|
||||
Reference in New Issue
Block a user