Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 973194fa authored by Bernardo Rufino's avatar Bernardo Rufino
Browse files

Move transport whitelist to Trampoline

From BMS.

Test: adb shell bmgr whitelist
Bug: 135661048
Change-Id: Ice0b49dc574cb1dfd7348a956e80abcd6c73cfa2
parent 11b651c2
Loading
Loading
Loading
Loading
+2 −26
Original line number Diff line number Diff line
@@ -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
+20 −2
Original line number Diff line number Diff line
@@ -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
+3 −1
Original line number Diff line number Diff line
@@ -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;
@@ -154,7 +156,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);
+5 −11
Original line number Diff line number Diff line
@@ -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
@@ -751,18 +755,8 @@ public class TrampolineTest {
        verify(mBackupManagerServiceMock).listAllTransportComponents(mUserId);
    }

    @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,