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

Commit ce725e30 authored by Bernardo Rufino's avatar Bernardo Rufino Committed by Android (Google) Code Review
Browse files

Merge "Move transport whitelist to Trampoline"

parents e7367568 973194fa
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;
@@ -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);
+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,