diff options
4 files changed, 30 insertions, 40 deletions
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 69e4df01c4db..14277d3c5988 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -49,13 +49,11 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; -import com.android.server.SystemConfig; import com.android.server.SystemService; import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.util.Collections; import java.util.Set; /** @@ -80,8 +78,6 @@ public class BackupManagerService { // Keeps track of all unlocked users registered with this service. Indexed by user id. private final SparseArray<UserBackupManagerService> mServiceUsers = new SparseArray<>(); - private Set<ComponentName> mTransportWhitelist; - private final BroadcastReceiver mUserRemovedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -99,13 +95,6 @@ public class BackupManagerService { mContext = checkNotNull(context); mTrampoline = checkNotNull(trampoline); - // Set up our transport options. - SystemConfig systemConfig = SystemConfig.getInstance(); - mTransportWhitelist = systemConfig.getBackupTransportWhitelist(); - if (mTransportWhitelist == null) { - mTransportWhitelist = Collections.emptySet(); - } - mContext.registerReceiver(mUserRemovedReceiver, new IntentFilter(Intent.ACTION_USER_REMOVED)); } @@ -147,7 +136,7 @@ public class BackupManagerService { * UserBackupManagerService} and registering it with this service. */ @VisibleForTesting - protected void startServiceForUser(int userId) { + protected void startServiceForUser(int userId, Set<ComponentName> transportWhitelist) { if (mServiceUsers.get(userId) != null) { Slog.i(TAG, "userId " + userId + " already started, so not starting again"); return; @@ -155,7 +144,7 @@ public class BackupManagerService { UserBackupManagerService userBackupManagerService = UserBackupManagerService.createAndInitializeService( - userId, mContext, mTrampoline, mTransportWhitelist); + userId, mContext, mTrampoline, transportWhitelist); startServiceForUser(userId, userBackupManagerService); } @@ -364,19 +353,6 @@ public class BackupManagerService { : userBackupManagerService.listAllTransportComponents(); } - /** Report all system whitelisted transports. */ - @Nullable - public String[] getTransportWhitelist() { - // No permission check, intentionally. - String[] whitelistedTransports = new String[mTransportWhitelist.size()]; - int i = 0; - for (ComponentName component : mTransportWhitelist) { - whitelistedTransports[i] = component.flattenToShortString(); - i++; - } - return whitelistedTransports; - } - /** * Update the attributes of the transport identified by {@code transportComponent}. If the * specified transport has not been bound at least once (for registration), this call will be diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 0061cf02adfd..12fb46bc3eab 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -19,6 +19,8 @@ package com.android.server.backup; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.server.backup.BackupManagerService.TAG; +import static java.util.Collections.emptySet; + import android.Manifest; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -48,12 +50,14 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; +import com.android.server.SystemConfig; import com.android.server.backup.utils.RandomAccessFileUtils; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; +import java.util.Set; /** * A proxy to the {@link BackupManagerService} implementation. @@ -118,6 +122,7 @@ public class Trampoline extends IBackupManager.Stub { @VisibleForTesting protected volatile BackupManagerService mService; private final Handler mHandler; + private final Set<ComponentName> mTransportWhitelist; public Trampoline(Context context) { mContext = context; @@ -128,6 +133,9 @@ public class Trampoline extends IBackupManager.Stub { mHandler = new Handler(handlerThread.getLooper()); mUserManager = UserManager.get(context); mService = new BackupManagerService(mContext, this); + Set<ComponentName> transportWhitelist = + SystemConfig.getInstance().getBackupTransportWhitelist(); + mTransportWhitelist = (transportWhitelist == null) ? emptySet() : transportWhitelist; } // TODO: Remove this when we implement DI by injecting in the construtor. @@ -270,7 +278,7 @@ public class Trampoline extends IBackupManager.Stub { return; } Slog.i(TAG, "Starting service for user: " + userId); - mService.startServiceForUser(userId); + mService.startServiceForUser(userId, mTransportWhitelist); } /** @@ -618,7 +626,17 @@ public class Trampoline extends IBackupManager.Stub { @Override public String[] getTransportWhitelist() { int userId = binderGetCallingUserId(); - return (isUserReadyForBackup(userId)) ? mService.getTransportWhitelist() : null; + if (!isUserReadyForBackup(userId)) { + return null; + } + // No permission check, intentionally. + String[] whitelistedTransports = new String[mTransportWhitelist.size()]; + int i = 0; + for (ComponentName component : mTransportWhitelist) { + whitelistedTransports[i] = component.flattenToShortString(); + i++; + } + return whitelistedTransports; } @Override diff --git a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java index a65d1dca2a57..0d99561af889 100644 --- a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java +++ b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java @@ -36,6 +36,8 @@ import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; import static org.testng.Assert.expectThrows; +import static java.util.Collections.emptySet; + import android.annotation.UserIdInt; import android.app.Application; import android.app.backup.IBackupManagerMonitor; @@ -160,7 +162,7 @@ public class BackupManagerServiceTest { public void testStartServiceForUser_registersUser() throws Exception { BackupManagerService backupManagerService = createService(); - backupManagerService.startServiceForUser(mUserOneId); + backupManagerService.startServiceForUser(mUserOneId, emptySet()); SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices(); assertThat(serviceUsers.size()).isEqualTo(1); diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java index 3da2fd3b6a8e..8668a3cfa26c 100644 --- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java @@ -22,6 +22,7 @@ import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -70,6 +71,7 @@ import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -227,7 +229,9 @@ public class TrampolineTest { trampoline.getBackupHandler().post(unlocked::open); unlocked.block(); assertNull(trampoline.getUserService(NON_USER_SYSTEM)); - verify(mBackupManagerServiceMock, never()).startServiceForUser(NON_USER_SYSTEM); + //noinspection unchecked + verify(mBackupManagerServiceMock, never()).startServiceForUser( + eq(NON_USER_SYSTEM), any(Set.class)); } @Test @@ -752,17 +756,7 @@ public class TrampolineTest { } @Test - public void getTransportWhitelist_forwarded() { - when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); - - assertEquals(TRANSPORTS, mTrampoline.getTransportWhitelist()); - verify(mBackupManagerServiceMock).getTransportWhitelist(); - } - - @Test public void updateTransportAttributesForUser_forwarded() { - when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); - mTrampoline.updateTransportAttributesForUser( mUserId, TRANSPORT_COMPONENT_NAME, |