summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/content/ContentService.java13
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java9
2 files changed, 19 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 4e236d164a69..07276298d66d 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -838,7 +838,7 @@ public final class ContentService extends IContentService.Stub {
SyncManager syncManager = getSyncManager();
if (syncManager != null) {
return syncManager.computeSyncable(
- account, userId, providerName);
+ account, userId, providerName, false);
}
} finally {
restoreCallingIdentity(identityToken);
@@ -854,6 +854,8 @@ public final class ContentService extends IContentService.Stub {
mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS,
"no permission to write the sync settings");
+ syncable = normalizeSyncable(syncable);
+
int userId = UserHandle.getCallingUserId();
long identityToken = clearCallingIdentity();
try {
@@ -1156,6 +1158,15 @@ public final class ContentService extends IContentService.Stub {
}
}
+ private static int normalizeSyncable(int syncable) {
+ if (syncable > 0) {
+ return SyncStorageEngine.AuthorityInfo.SYNCABLE;
+ } else if (syncable == 0) {
+ return SyncStorageEngine.AuthorityInfo.NOT_SYNCABLE;
+ }
+ return SyncStorageEngine.AuthorityInfo.UNDEFINED;
+ }
+
/**
* Hide this class since it is not part of api,
* but current unittest framework requires it to be public
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 131da0bc9d66..653d2410f800 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -1001,7 +1001,12 @@ public class SyncManager {
}
}
- public int computeSyncable(Account account, int userId, String authority) {
+ private int computeSyncable(Account account, int userId, String authority) {
+ return computeSyncable(account, userId, authority, true);
+ }
+
+ public int computeSyncable(Account account, int userId, String authority,
+ boolean checkAccountAccess) {
final int status = getIsSyncable(account, userId, authority);
if (status == AuthorityInfo.NOT_SYNCABLE) {
return AuthorityInfo.NOT_SYNCABLE;
@@ -1025,7 +1030,7 @@ public class SyncManager {
} catch (RemoteException e) {
/* ignore - local call */
}
- if (!canAccessAccount(account, owningPackage, owningUid)) {
+ if (checkAccountAccess && !canAccessAccount(account, owningPackage, owningUid)) {
Log.w(TAG, "Access to " + account + " denied for package "
+ owningPackage + " in UID " + syncAdapterInfo.uid);
return AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS;