Get blocked restore keys directly from UserBMS

Bug: 145126096
Test: atest KeyValueRestoreExclusionHostSideTest
      atest PerformUnifiedRestoreHostSideTest
      atest UserBackupPreferencesTest

Currently PerformUnifiedRestoreTask gets the list of blocked restore
keys at construction. However, at that point the list might not be fully
constructed yet. We should get the keys through the getter avaialble in
UserBMS when we need them.

Change-Id: I62ad34138ba7a893e66d6af05d2e242c9c964a44
This commit is contained in:
Ruslan Tkhakokhov
2020-02-10 10:26:21 +00:00
parent 2b1f4315b0
commit 9de0b77cbc
9 changed files with 67 additions and 94 deletions

View File

@@ -1080,12 +1080,8 @@ public class UserBackupManagerService {
}
}
public Map<String, Set<String>> getExcludedRestoreKeys(String... packages) {
return mBackupPreferences.getExcludedRestoreKeysForPackages(packages);
}
public Map<String, Set<String>> getAllExcludedRestoreKeys() {
return mBackupPreferences.getAllExcludedRestoreKeys();
public Set<String> getExcludedRestoreKeys(String packageName) {
return mBackupPreferences.getExcludedRestoreKeysForPackage(packageName);
}
/** Used for generating random salts or passwords. */
@@ -3356,8 +3352,7 @@ public class UserBackupManagerService {
restoreSet,
packageName,
token,
listener,
getExcludedRestoreKeys(packageName));
listener);
mBackupHandler.sendMessage(msg);
} catch (Exception e) {
// Calling into the transport broke; back off and proceed with the installation.

View File

@@ -48,16 +48,7 @@ public class UserBackupPreferences {
mEditor.commit();
}
Map<String, Set<String>> getExcludedRestoreKeysForPackages(String... packages) {
Map<String, Set<String>> excludedKeys = new HashMap<>();
for (String packageName : packages) {
excludedKeys.put(packageName,
mPreferences.getStringSet(packageName, Collections.emptySet()));
}
return excludedKeys;
}
Map<String, Set<String>> getAllExcludedRestoreKeys() {
return (Map<String, Set<String>>) mPreferences.getAll();
Set<String> getExcludedRestoreKeysForPackage(String packageName) {
return mPreferences.getStringSet(packageName, Collections.emptySet());
}
}

View File

@@ -299,8 +299,7 @@ public class BackupHandler extends Handler {
params.pmToken,
params.isSystemRestore,
params.filterSet,
params.listener,
params.excludedKeys);
params.listener);
synchronized (backupManagerService.getPendingRestores()) {
if (backupManagerService.isRestoreInProgress()) {

View File

@@ -37,7 +37,6 @@ public class RestoreParams {
public final boolean isSystemRestore;
@Nullable public final String[] filterSet;
public final OnTaskFinishedListener listener;
public final Map<String, Set<String>> excludedKeys;
/**
* No kill after restore.
@@ -48,8 +47,7 @@ public class RestoreParams {
IBackupManagerMonitor monitor,
long token,
PackageInfo packageInfo,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
return new RestoreParams(
transportClient,
observer,
@@ -59,8 +57,7 @@ public class RestoreParams {
/* pmToken */ 0,
/* isSystemRestore */ false,
/* filterSet */ null,
listener,
excludedKeys);
listener);
}
/**
@@ -73,8 +70,7 @@ public class RestoreParams {
long token,
String packageName,
int pmToken,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
String[] filterSet = {packageName};
return new RestoreParams(
transportClient,
@@ -85,8 +81,7 @@ public class RestoreParams {
pmToken,
/* isSystemRestore */ false,
filterSet,
listener,
excludedKeys);
listener);
}
/**
@@ -97,8 +92,7 @@ public class RestoreParams {
IRestoreObserver observer,
IBackupManagerMonitor monitor,
long token,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
return new RestoreParams(
transportClient,
observer,
@@ -108,8 +102,7 @@ public class RestoreParams {
/* pmToken */ 0,
/* isSystemRestore */ true,
/* filterSet */ null,
listener,
excludedKeys);
listener);
}
/**
@@ -122,8 +115,7 @@ public class RestoreParams {
long token,
String[] filterSet,
boolean isSystemRestore,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
return new RestoreParams(
transportClient,
observer,
@@ -133,8 +125,7 @@ public class RestoreParams {
/* pmToken */ 0,
isSystemRestore,
filterSet,
listener,
excludedKeys);
listener);
}
private RestoreParams(
@@ -146,8 +137,7 @@ public class RestoreParams {
int pmToken,
boolean isSystemRestore,
@Nullable String[] filterSet,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
this.transportClient = transportClient;
this.observer = observer;
this.monitor = monitor;
@@ -157,6 +147,5 @@ public class RestoreParams {
this.isSystemRestore = isSystemRestore;
this.filterSet = filterSet;
this.listener = listener;
this.excludedKeys = excludedKeys;
}
}

View File

@@ -178,8 +178,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
observer,
monitor,
token,
listener,
mBackupManagerService.getAllExcludedRestoreKeys()),
listener),
"RestoreSession.restoreAll()");
} finally {
Binder.restoreCallingIdentity(oldId);
@@ -272,8 +271,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
token,
packages,
/* isSystemRestore */ packages.length > 1,
listener,
mBackupManagerService.getExcludedRestoreKeys(packages)),
listener),
"RestoreSession.restorePackages(" + packages.length + " packages)");
} finally {
Binder.restoreCallingIdentity(oldId);
@@ -365,8 +363,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub {
monitor,
token,
app,
listener,
mBackupManagerService.getExcludedRestoreKeys(app.packageName)),
listener),
"RestoreSession.restorePackage(" + packageName + ")");
} finally {
Binder.restoreCallingIdentity(oldId);

View File

@@ -155,8 +155,6 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// When finished call listener
private final OnTaskFinishedListener mListener;
private final Map<String, Set<String>> mExcludedKeys;
// Key/value: bookkeeping about staged data and files for agent access
private File mBackupDataName;
private File mStageName;
@@ -168,14 +166,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
@VisibleForTesting
PerformUnifiedRestoreTask(Map<String, Set<String>> excludedKeys) {
mExcludedKeys = excludedKeys;
PerformUnifiedRestoreTask(UserBackupManagerService backupManagerService) {
mListener = null;
mAgentTimeoutParameters = null;
mTransportClient = null;
mTransportManager = null;
mEphemeralOpToken = 0;
mUserId = 0;
this.backupManagerService = backupManagerService;
}
// This task can assume that the wakelock is properly held for it and doesn't have to worry
@@ -190,8 +188,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
int pmToken,
boolean isFullSystemRestore,
@Nullable String[] filterSet,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
this.backupManagerService = backupManagerService;
mUserId = backupManagerService.getUserId();
mTransportManager = backupManagerService.getTransportManager();
@@ -213,8 +210,6 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
mExcludedKeys = excludedKeys;
if (targetPackage != null) {
// Single package restore
mAcceptSet = new ArrayList<>();
@@ -791,8 +786,9 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
!getExcludedKeysForPackage(PLATFORM_PACKAGE_NAME).isEmpty();
}
private Set<String> getExcludedKeysForPackage(String packageName) {
return mExcludedKeys.getOrDefault(packageName, Collections.emptySet());
@VisibleForTesting
Set<String> getExcludedKeysForPackage(String packageName) {
return backupManagerService.getExcludedRestoreKeys(packageName);
}
@VisibleForTesting

View File

@@ -67,8 +67,7 @@ public class ShadowPerformUnifiedRestoreTask {
int pmToken,
boolean isFullSystemRestore,
@Nullable String[] filterSet,
OnTaskFinishedListener listener,
Map<String, Set<String>> excludedKeys) {
OnTaskFinishedListener listener) {
mBackupManagerService = backupManagerService;
mPackage = targetPackage;
mIsFullSystemRestore = isFullSystemRestore;

View File

@@ -16,8 +16,6 @@
package com.android.server.backup;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import androidx.test.InstrumentationRegistry;
@@ -33,18 +31,15 @@ import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class UserBackupPreferencesTest {
private static final String EXCLUDED_PACKAGE_1 = "package1";
private static final String EXCLUDED_PACKAGE_2 = "package2";
private static final List<String> EXCLUDED_KEYS_1 = Arrays.asList("key1", "key2");
private static final List<String> EXCLUDED_KEYS_2 = Arrays.asList("key1");
private static final List<String> EXCLUDED_KEYS_2 = Arrays.asList("key3");
@Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
@@ -60,27 +55,13 @@ public class UserBackupPreferencesTest {
}
@Test
public void testGetExcludedKeysForPackages_returnsExcludedKeys() {
public void testGetExcludedKeysForPackage_returnsExcludedKeys() {
mExcludedRestoreKeysStorage.addExcludedKeys(EXCLUDED_PACKAGE_1, EXCLUDED_KEYS_1);
mExcludedRestoreKeysStorage.addExcludedKeys(EXCLUDED_PACKAGE_2, EXCLUDED_KEYS_2);
mExcludedRestoreKeysStorage.addExcludedKeys(EXCLUDED_PACKAGE_1, EXCLUDED_KEYS_2);
Map<String, Set<String>> excludedKeys =
mExcludedRestoreKeysStorage.getExcludedRestoreKeysForPackages(EXCLUDED_PACKAGE_1);
assertTrue(excludedKeys.containsKey(EXCLUDED_PACKAGE_1));
assertFalse(excludedKeys.containsKey(EXCLUDED_PACKAGE_2));
assertEquals(new HashSet<>(EXCLUDED_KEYS_1), excludedKeys.get(EXCLUDED_PACKAGE_1));
}
@Test
public void testGetExcludedKeysForPackages_withEmpty_list_returnsAllExcludedKeys() {
mExcludedRestoreKeysStorage.addExcludedKeys(EXCLUDED_PACKAGE_1, EXCLUDED_KEYS_1);
mExcludedRestoreKeysStorage.addExcludedKeys(EXCLUDED_PACKAGE_2, EXCLUDED_KEYS_2);
Map<String, Set<String>> excludedKeys =
mExcludedRestoreKeysStorage.getAllExcludedRestoreKeys();
assertTrue(excludedKeys.containsKey(EXCLUDED_PACKAGE_1));
assertTrue(excludedKeys.containsKey(EXCLUDED_PACKAGE_2));
assertEquals(new HashSet<>(EXCLUDED_KEYS_1), excludedKeys.get(EXCLUDED_PACKAGE_1));
assertEquals(new HashSet<>(EXCLUDED_KEYS_2), excludedKeys.get(EXCLUDED_PACKAGE_2));
Set<String> excludedKeys =
mExcludedRestoreKeysStorage.getExcludedRestoreKeysForPackage(EXCLUDED_PACKAGE_1);
assertTrue(excludedKeys.containsAll(EXCLUDED_KEYS_1));
assertTrue(excludedKeys.containsAll(EXCLUDED_KEYS_2));
}
}

View File

@@ -20,7 +20,9 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import androidx.test.InstrumentationRegistry;
@@ -30,6 +32,8 @@ import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.platform.test.annotations.Presubmit;
import com.android.server.backup.UserBackupManagerService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,6 +44,7 @@ import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -59,6 +64,7 @@ public class PerformUnifiedRestoreTaskTest {
@Mock private BackupDataInput mBackupDataInput;
@Mock private BackupDataOutput mBackupDataOutput;
@Mock private UserBackupManagerService mBackupManagerService;
private Set<String> mExcludedkeys = new HashSet<>();
private Map<String, String> mBackupData = new HashMap<>();
@@ -99,6 +105,8 @@ public class PerformUnifiedRestoreTaskTest {
return null;
}
});
mRestoreTask = new PerformUnifiedRestoreTask(mBackupManagerService);
}
private void populateTestData() {
@@ -114,8 +122,9 @@ public class PerformUnifiedRestoreTaskTest {
@Test
public void testFilterExcludedKeys() throws Exception {
mRestoreTask = new PerformUnifiedRestoreTask(Collections.singletonMap(
PACKAGE_NAME, mExcludedkeys));
when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
mExcludedkeys);
mRestoreTask.filterExcludedKeys(PACKAGE_NAME, mBackupDataInput, mBackupDataOutput);
// Verify only the correct were written into BackupDataOutput object.
@@ -124,33 +133,50 @@ public class PerformUnifiedRestoreTaskTest {
assertEquals(allowedBackupKeys, mBackupDataDump);
}
@Test
public void testGetExcludedKeysForPackage_alwaysReturnsLatestKeys() {
Set<String> firstExcludedKeys = new HashSet<>(Collections.singletonList(EXCLUDED_KEY_1));
when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
firstExcludedKeys);
assertEquals(firstExcludedKeys, mRestoreTask.getExcludedKeysForPackage(PACKAGE_NAME));
Set<String> secondExcludedKeys = new HashSet<>(Arrays.asList(EXCLUDED_KEY_1,
EXCLUDED_KEY_2));
when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
secondExcludedKeys);
assertEquals(secondExcludedKeys, mRestoreTask.getExcludedKeysForPackage(PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForNonSystemPackageWithKeysToExclude() {
mRestoreTask = new PerformUnifiedRestoreTask(Collections.singletonMap(
PACKAGE_NAME, mExcludedkeys));
when(mBackupManagerService.getExcludedRestoreKeys(eq(NON_SYSTEM_PACKAGE_NAME))).thenReturn(
mExcludedkeys);
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForNonSystemPackageWithNoKeysToExclude() {
mRestoreTask = new PerformUnifiedRestoreTask(Collections.emptyMap());
when(mBackupManagerService.getExcludedRestoreKeys(any())).thenReturn(
Collections.emptySet());
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_doNotStageForSystemPackageWithNoKeysToExclude() {
mRestoreTask = new PerformUnifiedRestoreTask(Collections.emptyMap());
when(mBackupManagerService.getExcludedRestoreKeys(any())).thenReturn(
Collections.emptySet());
assertFalse(mRestoreTask.shouldStageBackupData(SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForSystemPackageWithKeysToExclude() {
mRestoreTask = new PerformUnifiedRestoreTask(Collections.singletonMap(
PACKAGE_NAME, mExcludedkeys));
when(mBackupManagerService.getExcludedRestoreKeys(eq(SYSTEM_PACKAGE_NAME))).thenReturn(
mExcludedkeys);
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
assertTrue(mRestoreTask.shouldStageBackupData(SYSTEM_PACKAGE_NAME));
}
}