From da1350f28011ef7ed6b02d514c3a86a8cc8007de Mon Sep 17 00:00:00 2001 From: Sander Alewijnse Date: Thu, 8 May 2014 16:59:42 +0100 Subject: [PATCH] AccountManager cannot modify accounts according to device policy. Change-Id: Ied03b16c31312f7a4a934616c3c25b2481de818e --- .../server/accounts/AccountManagerService.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index f587cccdd419d..b2aaf74b71155 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -34,6 +34,7 @@ import android.app.AppGlobals; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentValues; @@ -857,7 +858,7 @@ public class AccountManagerService checkManageAccountsPermission(); UserHandle user = Binder.getCallingUserHandle(); UserAccounts accounts = getUserAccountsForCaller(); - if (!canUserModifyAccounts(Binder.getCallingUid())) { + if (!canUserModifyAccounts(Binder.getCallingUid(), account.type)) { try { response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION, "User cannot modify accounts"); @@ -1512,7 +1513,7 @@ public class AccountManagerService checkManageAccountsPermission(); // Is user disallowed from modifying accounts? - if (!canUserModifyAccounts(Binder.getCallingUid())) { + if (!canUserModifyAccounts(Binder.getCallingUid(), accountType)) { try { response.onError(AccountManager.ERROR_CODE_USER_RESTRICTED, "User is not allowed to add an account!"); @@ -2758,7 +2759,7 @@ public class AccountManagerService Manifest.permission.USE_CREDENTIALS); } - private boolean canUserModifyAccounts(int callingUid) { + private boolean canUserModifyAccounts(int callingUid, String accountType) { if (callingUid != Process.myUid()) { if (getUserManager().getUserRestrictions( new UserHandle(UserHandle.getUserId(callingUid))) @@ -2766,6 +2767,15 @@ public class AccountManagerService return false; } } + + DevicePolicyManager dpm = (DevicePolicyManager) mContext + .getSystemService(Context.DEVICE_POLICY_SERVICE); + String[] typesArray = dpm.getAccountTypesWithManagementDisabled(); + for (String forbiddenType : typesArray) { + if (forbiddenType.equals(accountType)) { + return false; + } + } return true; }