diff options
author | Christopher Tate <ctate@google.com> | 2012-09-11 12:15:49 -0700 |
---|---|---|
committer | Christopher Tate <ctate@google.com> | 2012-09-11 14:51:33 -0700 |
commit | 4dc7a68dbeaa0edd8815b2105915753310d58343 (patch) | |
tree | 9f6feb41247440858dba81a6cb47ec0301563b2a /packages/SettingsProvider/src | |
parent | 2fa10c675b42d22e73492154ca0ca1cbdbceaa3a (diff) | |
download | frameworks_base-4dc7a68dbeaa0edd8815b2105915753310d58343.zip frameworks_base-4dc7a68dbeaa0edd8815b2105915753310d58343.tar.gz frameworks_base-4dc7a68dbeaa0edd8815b2105915753310d58343.tar.bz2 |
Set up default (random) Android IDs for all users
Also correct some now-misleading terminology in a permission-check
log message, and fix a bug in which a system component trying to
write to a secondary user's settings would wind up writing the
owner's settings instead.
Bug 7132405
Change-Id: I5b8fafc35720390a01652e386ab5b7c0ad751abe
Diffstat (limited to 'packages/SettingsProvider/src')
-rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 6773482..523b95e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -61,7 +61,7 @@ import android.util.SparseArray; public class SettingsProvider extends ContentProvider { private static final String TAG = "SettingsProvider"; - private static final boolean LOCAL_LOGV = true; + private static final boolean LOCAL_LOGV = false; private static final String TABLE_SYSTEM = "system"; private static final String TABLE_SECURE = "secure"; @@ -422,10 +422,6 @@ public class SettingsProvider extends ContentProvider { } } }, userFilter); - - if (!ensureAndroidIdIsSet()) { - return false; - } } return true; } @@ -473,6 +469,8 @@ public class SettingsProvider extends ContentProvider { sObserverInstances.append(userHandle, observer); observer.startWatching(); + ensureAndroidIdIsSet(userHandle); + startAsyncCachePopulation(userHandle); } @@ -537,24 +535,27 @@ public class SettingsProvider extends ContentProvider { } } - private boolean ensureAndroidIdIsSet() { - final Cursor c = query(Settings.Secure.CONTENT_URI, + private boolean ensureAndroidIdIsSet(int userHandle) { + final Cursor c = queryForUser(Settings.Secure.CONTENT_URI, new String[] { Settings.NameValueTable.VALUE }, Settings.NameValueTable.NAME + "=?", - new String[] { Settings.Secure.ANDROID_ID }, null); + new String[] { Settings.Secure.ANDROID_ID }, null, + userHandle); try { final String value = c.moveToNext() ? c.getString(0) : null; if (value == null) { final SecureRandom random = new SecureRandom(); final String newAndroidIdValue = Long.toHexString(random.nextLong()); - Log.d(TAG, "Generated and saved new ANDROID_ID [" + newAndroidIdValue + "]"); final ContentValues values = new ContentValues(); values.put(Settings.NameValueTable.NAME, Settings.Secure.ANDROID_ID); values.put(Settings.NameValueTable.VALUE, newAndroidIdValue); - final Uri uri = insert(Settings.Secure.CONTENT_URI, values); + final Uri uri = insertForUser(Settings.Secure.CONTENT_URI, values, userHandle); if (uri == null) { + Slog.e(TAG, "Unable to generate new ANDROID_ID for user " + userHandle); return false; } + Slog.d(TAG, "Generated and saved new ANDROID_ID [" + newAndroidIdValue + + "] for user " + userHandle); } return true; } finally { @@ -732,12 +733,17 @@ public class SettingsProvider extends ContentProvider { @Override public Cursor query(Uri url, String[] select, String where, String[] whereArgs, String sort) { - final int callingUser = UserHandle.getCallingUserId(); - if (LOCAL_LOGV) Slog.v(TAG, "query() for user " + callingUser); + return queryForUser(url, select, where, whereArgs, sort, UserHandle.getCallingUserId()); + } + + public Cursor queryForUser(Uri url, String[] select, String where, String[] whereArgs, + String sort, int forUser) { + if (LOCAL_LOGV) Slog.v(TAG, "query(" + url + ") for user " + forUser); SqlArguments args = new SqlArguments(url, where, whereArgs); DatabaseHelper dbH; synchronized (this) { - dbH = getOrEstablishDatabaseLocked(callingUser); + dbH = getOrEstablishDatabaseLocked( + TABLE_GLOBAL.equals(args.table) ? UserHandle.USER_OWNER : forUser); } SQLiteDatabase db = dbH.getReadableDatabase(); @@ -795,7 +801,8 @@ public class SettingsProvider extends ContentProvider { mutationCount.incrementAndGet(); DatabaseHelper dbH; synchronized (this) { - dbH = getOrEstablishDatabaseLocked(callingUser); + dbH = getOrEstablishDatabaseLocked( + TABLE_GLOBAL.equals(args.table) ? UserHandle.USER_OWNER : callingUser); } SQLiteDatabase db = dbH.getWritableDatabase(); db.beginTransaction(); @@ -898,7 +905,7 @@ public class SettingsProvider extends ContentProvider { private Uri insertForUser(Uri url, ContentValues initialValues, int desiredUserHandle) { final int callingUser = UserHandle.getCallingUserId(); if (callingUser != desiredUserHandle) { - getContext().enforceCallingPermission( + getContext().enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, "Not permitted to access settings for other users"); } @@ -934,7 +941,7 @@ public class SettingsProvider extends ContentProvider { mutationCount.incrementAndGet(); DatabaseHelper dbH; synchronized (this) { - dbH = getOrEstablishDatabaseLocked(callingUser); + dbH = getOrEstablishDatabaseLocked(desiredUserHandle); } SQLiteDatabase db = dbH.getWritableDatabase(); final long rowId = db.insert(args.table, null, initialValues); @@ -952,13 +959,15 @@ public class SettingsProvider extends ContentProvider { @Override public int delete(Uri url, String where, String[] whereArgs) { - final int callingUser = UserHandle.getCallingUserId(); + int callingUser = UserHandle.getCallingUserId(); if (LOCAL_LOGV) Slog.v(TAG, "delete() for user " + callingUser); SqlArguments args = new SqlArguments(url, where, whereArgs); if (TABLE_FAVORITES.equals(args.table)) { return 0; } else if (TABLE_OLD_FAVORITES.equals(args.table)) { args.table = TABLE_FAVORITES; + } else if (TABLE_GLOBAL.equals(args.table)) { + callingUser = UserHandle.USER_OWNER; } checkWritePermissions(args); @@ -987,11 +996,13 @@ public class SettingsProvider extends ContentProvider { // intended effect (the update will be invisible to the rest of the system). // This should have no practical effect, since writes to the Secure db can only // be done by system code, and that code should be using the correct API up front. - final int callingUser = UserHandle.getCallingUserId(); + int callingUser = UserHandle.getCallingUserId(); if (LOCAL_LOGV) Slog.v(TAG, "update() for user " + callingUser); SqlArguments args = new SqlArguments(url, where, whereArgs); if (TABLE_FAVORITES.equals(args.table)) { return 0; + } else if (TABLE_GLOBAL.equals(args.table)) { + callingUser = UserHandle.USER_OWNER; } checkWritePermissions(args); |