diff options
| author | Costin Manolache <costin@google.com> | 2010-12-13 14:50:45 -0800 |
|---|---|---|
| committer | Costin Manolache <costin@google.com> | 2010-12-17 11:26:34 -0800 |
| commit | a40c6304deb860f10a51ce950ac1abc21a23d08b (patch) | |
| tree | cacc7d7fe7a65d61f0d0cd3a77212529fe32ffac /core/java/android/accounts | |
| parent | 43c0db48d265a3d8f136d107e181e8c23455ec37 (diff) | |
| download | frameworks_base-a40c6304deb860f10a51ce950ac1abc21a23d08b.zip frameworks_base-a40c6304deb860f10a51ce950ac1abc21a23d08b.tar.gz frameworks_base-a40c6304deb860f10a51ce950ac1abc21a23d08b.tar.bz2 | |
Add a new attribute to auth descriptors to indicate custom handling of permission and token caching
Change-Id: Icf6bd0e7bf265db9ef8bf368e8f3d8e91182f834
Diffstat (limited to 'core/java/android/accounts')
4 files changed, 46 insertions, 8 deletions
diff --git a/core/java/android/accounts/AccountAuthenticatorCache.java b/core/java/android/accounts/AccountAuthenticatorCache.java index 524d3f4..7214c50 100644 --- a/core/java/android/accounts/AccountAuthenticatorCache.java +++ b/core/java/android/accounts/AccountAuthenticatorCache.java @@ -38,7 +38,7 @@ import java.io.IOException; * @hide */ /* package private */ class AccountAuthenticatorCache - extends RegisteredServicesCache<AuthenticatorDescription> + extends RegisteredServicesCache<AuthenticatorDescription> implements IAccountAuthenticatorCache { private static final String TAG = "Account"; private static final MySerializer sSerializer = new MySerializer(); @@ -64,11 +64,13 @@ import java.io.IOException; com.android.internal.R.styleable.AccountAuthenticator_smallIcon, 0); final int prefId = sa.getResourceId( com.android.internal.R.styleable.AccountAuthenticator_accountPreferences, 0); + final boolean customTokens = sa.getBoolean( + com.android.internal.R.styleable.AccountAuthenticator_customTokens, false); if (TextUtils.isEmpty(accountType)) { return null; } - return new AuthenticatorDescription(accountType, packageName, labelId, iconId, - smallIconId, prefId); + return new AuthenticatorDescription(accountType, packageName, labelId, iconId, + smallIconId, prefId, customTokens); } finally { sa.recycle(); } diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index fd3a0d0..6388dc5 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -188,6 +188,12 @@ 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 + */ + public static final String KEY_CALLER_UID = "callerUid"; + public static final String KEY_CALLER_PID = "callerPid"; public static final String ACTION_AUTHENTICATOR_INTENT = "android.accounts.AccountAuthenticator"; diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index a815b3a..f19b58b 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -893,13 +893,29 @@ public class AccountManagerService if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null"); checkBinderPermission(Manifest.permission.USE_CREDENTIALS); final int callerUid = Binder.getCallingUid(); - final boolean permissionGranted = permissionIsGranted(account, authTokenType, callerUid); + final int callerPid = Binder.getCallingPid(); + + AccountAuthenticatorCache.ServiceInfo<AuthenticatorDescription> authenticatorInfo = + mAuthenticatorCache.getServiceInfo( + AuthenticatorDescription.newKey(account.type)); + final boolean customTokens = + authenticatorInfo != null && authenticatorInfo.type.customTokens; + + // skip the check if customTokens + final boolean permissionGranted = customTokens || + permissionIsGranted(account, authTokenType, callerUid); + + if (customTokens) { + // let authenticator know the identity of the caller + loginOptions.putInt(AccountManager.KEY_CALLER_UID, callerUid); + loginOptions.putInt(AccountManager.KEY_CALLER_PID, callerPid); + } long identityToken = clearCallingIdentity(); try { // if the caller has permission, do the peek. otherwise go the more expensive // route of starting a Session - if (permissionGranted) { + if (!customTokens && permissionGranted) { String authToken = readAuthTokenFromCache(account, authTokenType); if (authToken != null) { Bundle result = new Bundle(); @@ -953,8 +969,10 @@ public class AccountManagerService "the type and name should not be empty"); return; } - saveAuthTokenToDatabase(new Account(name, type), - authTokenType, authToken); + if (!customTokens) { + saveAuthTokenToDatabase(new Account(name, type), + authTokenType, authToken); + } } Intent intent = result.getParcelable(AccountManager.KEY_INTENT); diff --git a/core/java/android/accounts/AuthenticatorDescription.java b/core/java/android/accounts/AuthenticatorDescription.java index c651567..5d9abb0 100644 --- a/core/java/android/accounts/AuthenticatorDescription.java +++ b/core/java/android/accounts/AuthenticatorDescription.java @@ -44,9 +44,12 @@ public class AuthenticatorDescription implements Parcelable { /** The package name that can be used to lookup the resources from above. */ final public String packageName; + /** Authenticator handles its own token caching and permission screen */ + final public boolean customTokens; + /** A constructor for a full AuthenticatorDescription */ public AuthenticatorDescription(String type, String packageName, int labelId, int iconId, - int smallIconId, int prefId) { + int smallIconId, int prefId, boolean customTokens) { if (type == null) throw new IllegalArgumentException("type cannot be null"); if (packageName == null) throw new IllegalArgumentException("packageName cannot be null"); this.type = type; @@ -55,6 +58,12 @@ public class AuthenticatorDescription implements Parcelable { this.iconId = iconId; this.smallIconId = smallIconId; this.accountPreferencesId = prefId; + this.customTokens = customTokens; + } + + public AuthenticatorDescription(String type, String packageName, int labelId, int iconId, + int smallIconId, int prefId) { + this(type, packageName, labelId, iconId, smallIconId, prefId, false); } /** @@ -74,6 +83,7 @@ public class AuthenticatorDescription implements Parcelable { this.iconId = 0; this.smallIconId = 0; this.accountPreferencesId = 0; + this.customTokens = false; } private AuthenticatorDescription(Parcel source) { @@ -83,6 +93,7 @@ public class AuthenticatorDescription implements Parcelable { this.iconId = source.readInt(); this.smallIconId = source.readInt(); this.accountPreferencesId = source.readInt(); + this.customTokens = source.readByte() == 1; } /** @inheritDoc */ @@ -115,6 +126,7 @@ public class AuthenticatorDescription implements Parcelable { dest.writeInt(iconId); dest.writeInt(smallIconId); dest.writeInt(accountPreferencesId); + dest.writeByte((byte) (customTokens ? 1 : 0)); } /** Used to create the object from a parcel. */ |
