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

Commit 746c55ed authored by Oli Lan's avatar Oli Lan Committed by Jeff Sharkey
Browse files

Change bluetooth permission checks to note app ops.

This changes the permission checks for the new bluetooth runtime
permissions (BLUETOOTH_CONNECT, BLUETOOTH_ADVERTISE, and BLUETOOTH_SCAN)
to ForDataDelivery, in order to note the app ops.

AttributionSource is now passed in to all of these checks as
part of this change.

Bug: 183626112
Test: atest AdapterServiceTest
Test: atest CtsPermissionTestCases:android.permission.cts.NearbyDevicesPermissionTest

Change-Id: Ib32c6d2d05ce0813b9929ce540362b0d4952abeb
parent 746d13f3
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -417,9 +417,10 @@ public final class Utils {
     */
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
    public static boolean checkConnectPermissionForDataDelivery(
            Context context, String callingPackage, String callingAttributionTag, String message) {
        int permissionCheckResult = PermissionChecker.checkCallingOrSelfPermissionForDataDelivery(
                context, BLUETOOTH_CONNECT, callingPackage, callingAttributionTag, message);
            Context context, AttributionSource attributionSource, String message) {
        int permissionCheckResult = PermissionChecker.checkPermissionForDataDeliveryFromDataSource(
                context, BLUETOOTH_CONNECT, PID_UNKNOWN,
                new AttributionSource(context.getAttributionSource(), attributionSource), message);
        if (permissionCheckResult == PERMISSION_HARD_DENIED) {
            throw new SecurityException("Need BLUETOOTH_CONNECT permission");
        }
+178 −73

File changed.

Preview size limit exceeded, changes collapsed.

+5 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothProtoEnums;
import android.content.AttributionSource;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -612,15 +613,16 @@ public class DatabaseManager {
     * @return a {@link List} of {@link BluetoothDevice} representing connected bluetooth devices
     * in order of most recently connected
     */
    public List<BluetoothDevice> getMostRecentlyConnectedDevices() {
    public List<BluetoothDevice> getMostRecentlyConnectedDevices(
            AttributionSource attributionSource) {
        List<BluetoothDevice> mostRecentlyConnectedDevices = new ArrayList<>();
        synchronized (mMetadataCache) {
            List<Metadata> sortedMetadata = new ArrayList<>(mMetadataCache.values());
            sortedMetadata.sort((o1, o2) -> Long.compare(o2.last_active_time, o1.last_active_time));
            for (Metadata metadata : sortedMetadata) {
                try {
                    mostRecentlyConnectedDevices.add(BluetoothAdapter.getDefaultAdapter()
                            .getRemoteDevice(metadata.getAddress()));
                    mostRecentlyConnectedDevices.add(
                            new BluetoothDevice(metadata.getAddress(), attributionSource));
                } catch (IllegalArgumentException ex) {
                    Log.d(TAG, "getBondedDevicesOrdered: Invalid address for "
                            + "device " + metadata.getAddress());
+2 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.bluetooth.btservice;

import static android.Manifest.permission.BLUETOOTH_SCAN;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

@@ -245,7 +246,7 @@ public class AdapterServiceTest {

        verify(mMockContext, timeout(CONTEXT_SWITCH_MS).times(2 * invocationNumber + 2))
                .sendBroadcast(any(), eq(BLUETOOTH_SCAN));
        final int scanMode = mServiceBinder.getScanMode();
        final int scanMode = mServiceBinder.getScanMode(mAttributionSource);
        Assert.assertTrue(scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE
                || scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
        Assert.assertTrue(mAdapterService.getState() == BluetoothAdapter.STATE_ON);
+22 −10
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.AttributionSource;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
@@ -69,6 +70,7 @@ public final class DatabaseManagerTest {
    private BluetoothDevice mTestDevice;
    private BluetoothDevice mTestDevice2;
    private BluetoothDevice mTestDevice3;
    private AttributionSource mAttributionSource;

    private static final String LOCAL_STORAGE = "LocalStorage";
    private static final String TEST_BT_ADDR = "11:22:33:44:55:66";
@@ -103,6 +105,7 @@ public final class DatabaseManagerTest {
        when(mAdapterService.getPackageManager()).thenReturn(
                InstrumentationRegistry.getTargetContext().getPackageManager());
        mDatabaseManager = new DatabaseManager(mAdapterService);
        mAttributionSource = InstrumentationRegistry.getTargetContext().getAttributionSource();

        BluetoothDevice[] bondedDevices = {mTestDevice};
        doReturn(bondedDevices).when(mAdapterService).getBondedDevices();
@@ -452,7 +455,7 @@ public final class DatabaseManagerTest {
        Assert.assertTrue(mDatabaseManager
                .mMetadataCache.get(mTestDevice.getAddress()).is_active_a2dp_device);
        List<BluetoothDevice> mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices();
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(mTestDevice, mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        Assert.assertEquals(1, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(0));
@@ -466,7 +469,8 @@ public final class DatabaseManagerTest {
        Assert.assertTrue(mDatabaseManager
                .mMetadataCache.get(mTestDevice2.getAddress()).is_active_a2dp_device);
        Assert.assertEquals(mTestDevice2, mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(2, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice2, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -480,7 +484,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice2.getAddress()).is_active_a2dp_device);
        Assert.assertEquals(mTestDevice, mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(2, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice2, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -494,7 +499,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice2.getAddress()).is_active_a2dp_device);
        Assert.assertNull(mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(2, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice2, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -510,7 +516,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice3.getAddress()).is_active_a2dp_device);
        Assert.assertNull(mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(3, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice3, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -527,7 +534,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice3.getAddress()).is_active_a2dp_device);
        Assert.assertEquals(mTestDevice, mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(3, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice3, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -544,7 +552,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice3.getAddress()).is_active_a2dp_device);
        Assert.assertEquals(mTestDevice, mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(3, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice3, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -561,7 +570,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice3.getAddress()).is_active_a2dp_device);
        Assert.assertEquals(mTestDevice, mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(3, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice3, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -578,7 +588,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice3.getAddress()).is_active_a2dp_device);
        Assert.assertNull(mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(3, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice3, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(1));
@@ -595,7 +606,8 @@ public final class DatabaseManagerTest {
        Assert.assertFalse(mDatabaseManager
                .mMetadataCache.get(mTestDevice3.getAddress()).is_active_a2dp_device);
        Assert.assertNull(mDatabaseManager.getMostRecentlyConnectedA2dpDevice());
        mostRecentlyConnectedDevicesOrdered = mDatabaseManager.getMostRecentlyConnectedDevices();
        mostRecentlyConnectedDevicesOrdered =
                mDatabaseManager.getMostRecentlyConnectedDevices(mAttributionSource);
        Assert.assertEquals(3, mostRecentlyConnectedDevicesOrdered.size());
        Assert.assertEquals(mTestDevice3, mostRecentlyConnectedDevicesOrdered.get(0));
        Assert.assertEquals(mTestDevice, mostRecentlyConnectedDevicesOrdered.get(1));