am 717797db
: am f763b717
: Merge "Authenticate correct user\'s account when pattern fails multiple times." into jb-mr1-dev
* commit '717797db3e59ec34190e1230ebdeafecd14f4948': Authenticate correct user's account when pattern fails multiple times.
This commit is contained in:
@ -28,6 +28,8 @@ import android.os.Looper;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.os.Process;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
@ -42,7 +44,6 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.android.collect.Lists;
|
|
||||||
import com.google.android.collect.Maps;
|
import com.google.android.collect.Maps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -396,8 +397,13 @@ public class AccountManager {
|
|||||||
* (never null) if no accounts of the specified type have been added.
|
* (never null) if no accounts of the specified type have been added.
|
||||||
*/
|
*/
|
||||||
public Account[] getAccountsByType(String type) {
|
public Account[] getAccountsByType(String type) {
|
||||||
|
return getAccountsByTypeAsUser(type, Process.myUserHandle());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @hide Same as {@link #getAccountsByType(String)} but for a specific user. */
|
||||||
|
public Account[] getAccountsByTypeAsUser(String type, UserHandle userHandle) {
|
||||||
try {
|
try {
|
||||||
return mService.getAccounts(type);
|
return mService.getAccountsAsUser(type, userHandle.getIdentifier());
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
// won't ever happen
|
// won't ever happen
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
@ -1175,10 +1181,26 @@ public class AccountManager {
|
|||||||
final Activity activity,
|
final Activity activity,
|
||||||
final AccountManagerCallback<Bundle> callback,
|
final AccountManagerCallback<Bundle> callback,
|
||||||
final Handler handler) {
|
final Handler handler) {
|
||||||
|
return confirmCredentialsAsUser(account, options, activity, callback, handler,
|
||||||
|
Process.myUserHandle());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
* Same as {@link #confirmCredentials(Account, Bundle, Activity, AccountManagerCallback, Handler)}
|
||||||
|
* but for the specified user.
|
||||||
|
*/
|
||||||
|
public AccountManagerFuture<Bundle> confirmCredentialsAsUser(final Account account,
|
||||||
|
final Bundle options,
|
||||||
|
final Activity activity,
|
||||||
|
final AccountManagerCallback<Bundle> callback,
|
||||||
|
final Handler handler, UserHandle userHandle) {
|
||||||
if (account == null) throw new IllegalArgumentException("account is null");
|
if (account == null) throw new IllegalArgumentException("account is null");
|
||||||
|
final int userId = userHandle.getIdentifier();
|
||||||
return new AmsTask(activity, handler, callback) {
|
return new AmsTask(activity, handler, callback) {
|
||||||
public void doWork() throws RemoteException {
|
public void doWork() throws RemoteException {
|
||||||
mService.confirmCredentials(mResponse, account, options, activity != null);
|
mService.confirmCredentialsAsUser(mResponse, account, options, activity != null,
|
||||||
|
userId);
|
||||||
}
|
}
|
||||||
}.start();
|
}.start();
|
||||||
}
|
}
|
||||||
|
@ -1297,8 +1297,17 @@ public class AccountManagerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void confirmCredentials(IAccountManagerResponse response,
|
@Override
|
||||||
final Account account, final Bundle options, final boolean expectActivityLaunch) {
|
public void confirmCredentialsAsUser(IAccountManagerResponse response,
|
||||||
|
final Account account, final Bundle options, final boolean expectActivityLaunch,
|
||||||
|
int userId) {
|
||||||
|
// Only allow the system process to read accounts of other users
|
||||||
|
if (userId != UserHandle.getCallingUserId()
|
||||||
|
&& Binder.getCallingUid() != android.os.Process.myUid()) {
|
||||||
|
throw new SecurityException("User " + UserHandle.getCallingUserId()
|
||||||
|
+ " trying to confirm account credentials for " + userId);
|
||||||
|
}
|
||||||
|
|
||||||
if (Log.isLoggable(TAG, Log.VERBOSE)) {
|
if (Log.isLoggable(TAG, Log.VERBOSE)) {
|
||||||
Log.v(TAG, "confirmCredentials: " + account
|
Log.v(TAG, "confirmCredentials: " + account
|
||||||
+ ", response " + response
|
+ ", response " + response
|
||||||
@ -1309,7 +1318,7 @@ public class AccountManagerService
|
|||||||
if (response == null) throw new IllegalArgumentException("response is null");
|
if (response == null) throw new IllegalArgumentException("response is null");
|
||||||
if (account == null) throw new IllegalArgumentException("account is null");
|
if (account == null) throw new IllegalArgumentException("account is null");
|
||||||
checkManageAccountsPermission();
|
checkManageAccountsPermission();
|
||||||
UserAccounts accounts = getUserAccountsForCaller();
|
UserAccounts accounts = getUserAccounts(userId);
|
||||||
long identityToken = clearCallingIdentity();
|
long identityToken = clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
new Session(accounts, response, account.type, expectActivityLaunch,
|
new Session(accounts, response, account.type, expectActivityLaunch,
|
||||||
@ -1548,14 +1557,22 @@ public class AccountManagerService
|
|||||||
return runningAccounts.toArray(accountsArray);
|
return runningAccounts.toArray(accountsArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Account[] getAccounts(String type) {
|
@Override
|
||||||
|
public Account[] getAccountsAsUser(String type, int userId) {
|
||||||
|
// Only allow the system process to read accounts of other users
|
||||||
|
if (userId != UserHandle.getCallingUserId()
|
||||||
|
&& Binder.getCallingUid() != android.os.Process.myUid()) {
|
||||||
|
throw new SecurityException("User " + UserHandle.getCallingUserId()
|
||||||
|
+ " trying to get account for " + userId);
|
||||||
|
}
|
||||||
|
|
||||||
if (Log.isLoggable(TAG, Log.VERBOSE)) {
|
if (Log.isLoggable(TAG, Log.VERBOSE)) {
|
||||||
Log.v(TAG, "getAccounts: accountType " + type
|
Log.v(TAG, "getAccounts: accountType " + type
|
||||||
+ ", caller's uid " + Binder.getCallingUid()
|
+ ", caller's uid " + Binder.getCallingUid()
|
||||||
+ ", pid " + Binder.getCallingPid());
|
+ ", pid " + Binder.getCallingPid());
|
||||||
}
|
}
|
||||||
checkReadAccountsPermission();
|
checkReadAccountsPermission();
|
||||||
UserAccounts accounts = getUserAccountsForCaller();
|
UserAccounts accounts = getUserAccounts(userId);
|
||||||
long identityToken = clearCallingIdentity();
|
long identityToken = clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
synchronized (accounts.cacheLock) {
|
synchronized (accounts.cacheLock) {
|
||||||
@ -1566,6 +1583,11 @@ public class AccountManagerService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Account[] getAccounts(String type) {
|
||||||
|
return getAccountsAsUser(type, UserHandle.getCallingUserId());
|
||||||
|
}
|
||||||
|
|
||||||
public void getAccountsByFeatures(IAccountManagerResponse response,
|
public void getAccountsByFeatures(IAccountManagerResponse response,
|
||||||
String type, String[] features) {
|
String type, String[] features) {
|
||||||
if (Log.isLoggable(TAG, Log.VERBOSE)) {
|
if (Log.isLoggable(TAG, Log.VERBOSE)) {
|
||||||
|
@ -31,6 +31,7 @@ interface IAccountManager {
|
|||||||
String getUserData(in Account account, String key);
|
String getUserData(in Account account, String key);
|
||||||
AuthenticatorDescription[] getAuthenticatorTypes();
|
AuthenticatorDescription[] getAuthenticatorTypes();
|
||||||
Account[] getAccounts(String accountType);
|
Account[] getAccounts(String accountType);
|
||||||
|
Account[] getAccountsAsUser(String accountType, int userId);
|
||||||
void hasFeatures(in IAccountManagerResponse response, in Account account, in String[] features);
|
void hasFeatures(in IAccountManagerResponse response, in Account account, in String[] features);
|
||||||
void getAccountsByFeatures(in IAccountManagerResponse response, String accountType, in String[] features);
|
void getAccountsByFeatures(in IAccountManagerResponse response, String accountType, in String[] features);
|
||||||
boolean addAccount(in Account account, String password, in Bundle extras);
|
boolean addAccount(in Account account, String password, in Bundle extras);
|
||||||
@ -53,8 +54,8 @@ interface IAccountManager {
|
|||||||
String authTokenType, boolean expectActivityLaunch, in Bundle options);
|
String authTokenType, boolean expectActivityLaunch, in Bundle options);
|
||||||
void editProperties(in IAccountManagerResponse response, String accountType,
|
void editProperties(in IAccountManagerResponse response, String accountType,
|
||||||
boolean expectActivityLaunch);
|
boolean expectActivityLaunch);
|
||||||
void confirmCredentials(in IAccountManagerResponse response, in Account account,
|
void confirmCredentialsAsUser(in IAccountManagerResponse response, in Account account,
|
||||||
in Bundle options, boolean expectActivityLaunch);
|
in Bundle options, boolean expectActivityLaunch, int userId);
|
||||||
void getAuthTokenLabel(in IAccountManagerResponse response, String accountType,
|
void getAuthTokenLabel(in IAccountManagerResponse response, String accountType,
|
||||||
String authTokenType);
|
String authTokenType);
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.LoginFilter;
|
import android.text.LoginFilter;
|
||||||
@ -175,7 +176,8 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit
|
|||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
intent.setClassName(LOCK_PATTERN_PACKAGE, LOCK_PATTERN_CLASS);
|
intent.setClassName(LOCK_PATTERN_PACKAGE, LOCK_PATTERN_CLASS);
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
mContext.startActivity(intent);
|
mContext.startActivityAsUser(intent,
|
||||||
|
new UserHandle(mLockPatternUtils.getCurrentUser()));
|
||||||
mCallback.reportSuccessfulUnlockAttempt();
|
mCallback.reportSuccessfulUnlockAttempt();
|
||||||
|
|
||||||
// dismiss keyguard
|
// dismiss keyguard
|
||||||
@ -220,7 +222,8 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit
|
|||||||
* find a single best match.
|
* find a single best match.
|
||||||
*/
|
*/
|
||||||
private Account findIntendedAccount(String username) {
|
private Account findIntendedAccount(String username) {
|
||||||
Account[] accounts = AccountManager.get(mContext).getAccountsByType("com.google");
|
Account[] accounts = AccountManager.get(mContext).getAccountsByTypeAsUser("com.google",
|
||||||
|
new UserHandle(mLockPatternUtils.getCurrentUser()));
|
||||||
|
|
||||||
// Try to figure out which account they meant if they
|
// Try to figure out which account they meant if they
|
||||||
// typed only the username (and not the domain), or got
|
// typed only the username (and not the domain), or got
|
||||||
@ -267,7 +270,7 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit
|
|||||||
getProgressDialog().show();
|
getProgressDialog().show();
|
||||||
Bundle options = new Bundle();
|
Bundle options = new Bundle();
|
||||||
options.putString(AccountManager.KEY_PASSWORD, password);
|
options.putString(AccountManager.KEY_PASSWORD, password);
|
||||||
AccountManager.get(mContext).confirmCredentials(account, options, null /* activity */,
|
AccountManager.get(mContext).confirmCredentialsAsUser(account, options, null /* activity */,
|
||||||
new AccountManagerCallback<Bundle>() {
|
new AccountManagerCallback<Bundle>() {
|
||||||
public void run(AccountManagerFuture<Bundle> future) {
|
public void run(AccountManagerFuture<Bundle> future) {
|
||||||
try {
|
try {
|
||||||
@ -289,7 +292,7 @@ public class KeyguardAccountView extends LinearLayout implements KeyguardSecurit
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, null /* handler */);
|
}, null /* handler */, new UserHandle(mLockPatternUtils.getCurrentUser()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dialog getProgressDialog() {
|
private Dialog getProgressDialog() {
|
||||||
|
@ -27,6 +27,7 @@ import android.graphics.drawable.Drawable;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.CountDownTimer;
|
import android.os.CountDownTimer;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
@ -295,7 +296,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
|
|||||||
|
|
||||||
private AccountAnalyzer(AccountManager accountManager) {
|
private AccountAnalyzer(AccountManager accountManager) {
|
||||||
mAccountManager = accountManager;
|
mAccountManager = accountManager;
|
||||||
mAccounts = accountManager.getAccountsByType("com.google");
|
mAccounts = accountManager.getAccountsByTypeAsUser("com.google",
|
||||||
|
new UserHandle(mLockPatternUtils.getCurrentUser()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void next() {
|
private void next() {
|
||||||
@ -306,7 +308,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
|
|||||||
}
|
}
|
||||||
|
|
||||||
// lookup the confirmCredentials intent for the current account
|
// lookup the confirmCredentials intent for the current account
|
||||||
mAccountManager.confirmCredentials(mAccounts[mAccountIndex], null, null, this, null);
|
mAccountManager.confirmCredentialsAsUser(mAccounts[mAccountIndex], null, null, this,
|
||||||
|
null, new UserHandle(mLockPatternUtils.getCurrentUser()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
|
Reference in New Issue
Block a user