diff options
| author | Costin Manolache <costin@google.com> | 2010-12-02 16:44:46 -0800 |
|---|---|---|
| committer | Costin Manolache <costin@google.com> | 2010-12-09 16:53:33 -0800 |
| commit | 5d275bba42aea034959e94a47b6568376d93e7ad (patch) | |
| tree | 51bbc4248641886101844263c6b592f157ecbf34 /core/java/android/accounts | |
| parent | a218e01437c3c47c49ced7ab363bf98fe92cf1e3 (diff) | |
| download | frameworks_base-5d275bba42aea034959e94a47b6568376d93e7ad.zip frameworks_base-5d275bba42aea034959e94a47b6568376d93e7ad.tar.gz frameworks_base-5d275bba42aea034959e94a47b6568376d93e7ad.tar.bz2 | |
Fix bug in permission grant system.
Change-Id: Ic7d712e5a672c3eded16fee83235db01ab3c74fa
Diffstat (limited to 'core/java/android/accounts')
| -rw-r--r-- | core/java/android/accounts/AccountManagerService.java | 64 | ||||
| -rw-r--r-- | core/java/android/accounts/GrantCredentialsPermissionActivity.java | 51 |
2 files changed, 89 insertions, 26 deletions
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 1d9e0f1..9a8cc15 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -802,6 +802,44 @@ public class AccountManagerService } } + void getAuthTokenLabel(final IAccountManagerResponse response, + final Account account, final String authTokenType) { + if (account == null) throw new IllegalArgumentException("account is null"); + if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null"); + + checkBinderPermission(Manifest.permission.USE_CREDENTIALS); + + long identityToken = clearCallingIdentity(); + try { + new Session(response, account.type, false, + false /* stripAuthTokenFromResult */) { + protected String toDebugString(long now) { + return super.toDebugString(now) + ", getAuthTokenLabel" + + ", " + account + + ", authTokenType " + authTokenType; + } + + public void run() throws RemoteException { + mAuthenticator.getAuthTokenLabel(this, authTokenType); + } + + public void onResult(Bundle result) { + if (result != null) { + String label = result.getString(AccountManager.KEY_AUTH_TOKEN_LABEL); + Bundle bundle = new Bundle(); + bundle.putString(AccountManager.KEY_AUTH_TOKEN_LABEL, label); + super.onResult(bundle); + return; + } else { + super.onResult(result); + } + } + }.bind(); + } finally { + restoreCallingIdentity(identityToken); + } + } + public void getAuthToken(IAccountManagerResponse response, final Account account, final String authTokenType, final boolean notifyOnAuthFailure, final boolean expectActivityLaunch, final Bundle loginOptions) { @@ -912,36 +950,36 @@ public class AccountManagerService .notify(getCredentialPermissionNotificationId(account, authTokenType, uid), n); } - private Intent newGrantCredentialsPermissionIntent(Account account, int uid, - AccountAuthenticatorResponse response, String authTokenType, String authTokenLabel) { + String getAccountLabel(String accountType) { RegisteredServicesCache.ServiceInfo<AuthenticatorDescription> serviceInfo = - mAuthenticatorCache.getServiceInfo( - AuthenticatorDescription.newKey(account.type)); + mAuthenticatorCache.getServiceInfo( + AuthenticatorDescription.newKey(accountType)); if (serviceInfo == null) { - throw new IllegalArgumentException("unknown account type: " + account.type); + throw new IllegalArgumentException("unknown account type: " + accountType); } final Context authContext; try { authContext = mContext.createPackageContext( - serviceInfo.type.packageName, 0); + serviceInfo.type.packageName, 0); } catch (PackageManager.NameNotFoundException e) { - throw new IllegalArgumentException("unknown account type: " + account.type); + throw new IllegalArgumentException("unknown account type: " + accountType); } + return authContext.getString(serviceInfo.type.labelId); + } + + private Intent newGrantCredentialsPermissionIntent(Account account, int uid, + AccountAuthenticatorResponse response, String authTokenType, String authTokenLabel) { Intent intent = new Intent(mContext, GrantCredentialsPermissionActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory( String.valueOf(getCredentialPermissionNotificationId(account, authTokenType, uid))); + intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_ACCOUNT, account); - intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_AUTH_TOKEN_LABEL, authTokenLabel); intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_RESPONSE, response); - intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_ACCOUNT_TYPE_LABEL, - authContext.getString(serviceInfo.type.labelId)); - intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_PACKAGES, - mContext.getPackageManager().getPackagesForUid(uid)); intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_REQUESTING_UID, uid); + return intent; } diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java index fd340cbe..83e4fd9 100644 --- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java +++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java @@ -17,6 +17,7 @@ package android.accounts; import android.app.Activity; import android.os.Bundle; +import android.os.RemoteException; import android.widget.TextView; import android.widget.LinearLayout; import android.widget.ImageView; @@ -26,6 +27,7 @@ import android.view.Window; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.RegisteredServicesCache; import android.text.TextUtils; import android.graphics.drawable.Drawable; import com.android.internal.R; @@ -46,6 +48,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View private int mUid; private Bundle mResultBundle = null; protected LayoutInflater mInflater; + private final AccountManagerService accountManagerService = AccountManagerService.getSingleton(); protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -55,27 +58,56 @@ public class GrantCredentialsPermissionActivity extends Activity implements View mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); final Bundle extras = getIntent().getExtras(); + + // Grant 'account'/'type' to mUID mAccount = extras.getParcelable(EXTRAS_ACCOUNT); mAuthTokenType = extras.getString(EXTRAS_AUTH_TOKEN_TYPE); + mUid = extras.getInt(EXTRAS_REQUESTING_UID); + final PackageManager pm = getPackageManager(); + final String[] packages = pm.getPackagesForUid(mUid); - if (mAccount == null || mAuthTokenType == null) { + if (mAccount == null || mAuthTokenType == null || packages == null) { // we were somehow started with bad parameters. abort the activity. setResult(Activity.RESULT_CANCELED); finish(); return; } - mUid = extras.getInt(EXTRAS_REQUESTING_UID); - final String accountTypeLabel = extras.getString(EXTRAS_ACCOUNT_TYPE_LABEL); - final String[] packages = extras.getStringArray(EXTRAS_PACKAGES); - final String authTokenLabel = extras.getString(EXTRAS_AUTH_TOKEN_LABEL); + final String accountTypeLabel = accountManagerService.getAccountLabel(mAccount.type); + + + final TextView authTokenTypeView = (TextView) findViewById(R.id.authtoken_type); + authTokenTypeView.setVisibility(View.GONE); + + /** Handles the responses from the AccountManager */ + IAccountManagerResponse response = new IAccountManagerResponse.Stub() { + public void onResult(Bundle bundle) { + final String authTokenLabel = + bundle.getString(AccountManager.KEY_AUTH_TOKEN_LABEL); + if (!TextUtils.isEmpty(authTokenLabel)) { + runOnUiThread(new Runnable() { + public void run() { + if (!isFinishing()) { + authTokenTypeView.setText(authTokenLabel); + authTokenTypeView.setVisibility(View.VISIBLE); + } + } + }); + } + } + + public void onError(int code, String message) { + } + }; + + accountManagerService.getAuthTokenLabel( + response, mAccount, mAuthTokenType); findViewById(R.id.allow_button).setOnClickListener(this); findViewById(R.id.deny_button).setOnClickListener(this); LinearLayout packagesListView = (LinearLayout) findViewById(R.id.packages_list); - final PackageManager pm = getPackageManager(); for (String pkg : packages) { String packageLabel; try { @@ -88,12 +120,6 @@ public class GrantCredentialsPermissionActivity extends Activity implements View ((TextView) findViewById(R.id.account_name)).setText(mAccount.name); ((TextView) findViewById(R.id.account_type)).setText(accountTypeLabel); - TextView authTokenTypeView = (TextView) findViewById(R.id.authtoken_type); - if (TextUtils.isEmpty(authTokenLabel)) { - authTokenTypeView.setVisibility(View.GONE); - } else { - authTokenTypeView.setText(authTokenLabel); - } } private View newPackageView(String packageLabel) { @@ -103,7 +129,6 @@ public class GrantCredentialsPermissionActivity extends Activity implements View } public void onClick(View v) { - final AccountManagerService accountManagerService = AccountManagerService.getSingleton(); switch (v.getId()) { case R.id.allow_button: accountManagerService.grantAppPermission(mAccount, mAuthTokenType, mUid); |
