diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 029d1079def3e..be9070dd2c533 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -189,6 +189,7 @@ public class AccountManager { public static final String KEY_ERROR_CODE = "errorCode"; public static final String KEY_ERROR_MESSAGE = "errorMessage"; public static final String KEY_USERDATA = "userdata"; + /** * Authenticators using 'customTokens' option will also get the UID of the * caller @@ -814,11 +815,13 @@ public class AccountManager { final Activity activity, AccountManagerCallback callback, Handler handler) { if (account == null) throw new IllegalArgumentException("account is null"); if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null"); + final Bundle optionsIn = options == null ? new Bundle() : options; + optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName()); return new AmsTask(activity, handler, callback) { public void doWork() throws RemoteException { mService.getAuthToken(mResponse, account, authTokenType, false /* notifyOnAuthFailure */, true /* expectActivityLaunch */, - options); + optionsIn); } }.start(); } @@ -895,16 +898,11 @@ public class AccountManager { */ @Deprecated public AccountManagerFuture getAuthToken( - final Account account, final String authTokenType, final boolean notifyAuthFailure, + final Account account, final String authTokenType, + final boolean notifyAuthFailure, AccountManagerCallback callback, Handler handler) { - if (account == null) throw new IllegalArgumentException("account is null"); - if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null"); - return new AmsTask(null, handler, callback) { - public void doWork() throws RemoteException { - mService.getAuthToken(mResponse, account, authTokenType, - notifyAuthFailure, false /* expectActivityLaunch */, null /* options */); - } - }.start(); + return getAuthToken(account, authTokenType, null, notifyAuthFailure, callback, + handler); } /** @@ -978,15 +976,18 @@ public class AccountManager { * account before requesting an auth token. */ public AccountManagerFuture getAuthToken( - final Account account, final String authTokenType, - final Bundle options, final boolean notifyAuthFailure, + final Account account, final String authTokenType, final Bundle options, + final boolean notifyAuthFailure, AccountManagerCallback callback, Handler handler) { + if (account == null) throw new IllegalArgumentException("account is null"); if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null"); + final Bundle optionsIn = options == null ? new Bundle() : options; + optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName()); return new AmsTask(null, handler, callback) { public void doWork() throws RemoteException { mService.getAuthToken(mResponse, account, authTokenType, - notifyAuthFailure, false /* expectActivityLaunch */, options); + notifyAuthFailure, false /* expectActivityLaunch */, optionsIn); } }.start(); } @@ -1044,10 +1045,14 @@ public class AccountManager { final Bundle addAccountOptions, final Activity activity, AccountManagerCallback callback, Handler handler) { if (accountType == null) throw new IllegalArgumentException("accountType is null"); + final Bundle options = (addAccountOptions == null) ? new Bundle() : + addAccountOptions; + options.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName()); + return new AmsTask(activity, handler, callback) { public void doWork() throws RemoteException { mService.addAcount(mResponse, accountType, authTokenType, - requiredFeatures, activity != null, addAccountOptions); + requiredFeatures, activity != null, options); } }.start(); } diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 20d5b96933a2a..173da8d41e57a 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -16,10 +16,6 @@ package android.accounts; -import com.android.internal.R; -import com.android.internal.telephony.ITelephony; -import com.android.internal.telephony.TelephonyIntents; - import android.Manifest; import android.app.ActivityManager; import android.app.Notification; @@ -51,13 +47,13 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemClock; -import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import com.android.internal.R; + import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -924,9 +920,6 @@ public class AccountManagerService if (account == null) throw new IllegalArgumentException("account is null"); if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null"); checkBinderPermission(Manifest.permission.USE_CREDENTIALS); - final int callerUid = Binder.getCallingUid(); - final int callerPid = Binder.getCallingPid(); - AccountAuthenticatorCache.ServiceInfo authenticatorInfo = mAuthenticatorCache.getServiceInfo( AuthenticatorDescription.newKey(account.type)); @@ -934,20 +927,19 @@ public class AccountManagerService authenticatorInfo != null && authenticatorInfo.type.customTokens; // skip the check if customTokens + final int callerUid = Binder.getCallingUid(); final boolean permissionGranted = customTokens || permissionIsGranted(account, authTokenType, callerUid); final Bundle loginOptions = (loginOptionsIn == null) ? new Bundle() : loginOptionsIn; - if (customTokens) { - // let authenticator know the identity of the caller - loginOptions.putInt(AccountManager.KEY_CALLER_UID, callerUid); - loginOptions.putInt(AccountManager.KEY_CALLER_PID, callerPid); - if (notifyOnAuthFailure) { - loginOptions.putBoolean(AccountManager.KEY_NOTIFY_ON_FAILURE, true); - } + // let authenticator know the identity of the caller + loginOptions.putInt(AccountManager.KEY_CALLER_UID, callerUid); + loginOptions.putInt(AccountManager.KEY_CALLER_PID, Binder.getCallingPid()); + if (notifyOnAuthFailure) { + loginOptions.putBoolean(AccountManager.KEY_NOTIFY_ON_FAILURE, true); } - + long identityToken = clearCallingIdentity(); try { // if the caller has permission, do the peek. otherwise go the more expensive @@ -1120,7 +1112,7 @@ public class AccountManagerService public void addAcount(final IAccountManagerResponse response, final String accountType, final String authTokenType, final String[] requiredFeatures, - final boolean expectActivityLaunch, final Bundle options) { + final boolean expectActivityLaunch, final Bundle optionsIn) { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "addAccount: accountType " + accountType + ", response " + response @@ -1133,6 +1125,13 @@ public class AccountManagerService if (response == null) throw new IllegalArgumentException("response is null"); if (accountType == null) throw new IllegalArgumentException("accountType is null"); checkManageAccountsPermission(); + + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final Bundle options = (optionsIn == null) ? new Bundle() : optionsIn; + options.putInt(AccountManager.KEY_CALLER_UID, uid); + options.putInt(AccountManager.KEY_CALLER_PID, pid); + long identityToken = clearCallingIdentity(); try { new Session(response, accountType, expectActivityLaunch,