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

Commit fbe3410b authored by Oli Lan's avatar Oli Lan
Browse files

Check BLUETOOTH_SCAN and disavowal when starting discovery.

This replaces the BLUETOOTH_ADMIN permission check with a check
for BLUETOOTH_SCAN, and checks if location has been disavowed.

Bug: 183203469
Test: atest AdapterServiceTest
Change-Id: Iba2cdfa829006427023e7486285f46bcab3555f7
parent 35f0f59b
Loading
Loading
Loading
Loading
+22 −13
Original line number Diff line number Diff line
@@ -1415,7 +1415,10 @@ public class AdapterService extends Service {
                return false;
            }

            enforceBluetoothAdminPermission(service);
            if (!Utils.checkScanPermissionForDataDelivery(
                    service, callingPackage, callingFeatureId, "Starting discovery.")) {
                return false;
            }

            return service.startDiscovery(callingPackage, callingFeatureId);
        }
@@ -1427,7 +1430,7 @@ public class AdapterService extends Service {
                return false;
            }

            enforceBluetoothAdminPermission(service);
            Utils.checkScanPermissionForPreflight(service);

            service.debugLog("cancelDiscovery");
            return service.cancelDiscoveryNative();
@@ -2392,24 +2395,30 @@ public class AdapterService extends Service {
        debugLog("startDiscovery");
        mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
        boolean isQApp = Utils.isQApp(this, callingPackage);
        boolean hasDisavowedLocation =
                Utils.hasDisavowedLocationForScan(this, callingPackage);
        String permission = null;
        if (Utils.checkCallerHasNetworkSettingsPermission(this)) {
            permission = android.Manifest.permission.NETWORK_SETTINGS;
        } else if (Utils.checkCallerHasNetworkSetupWizardPermission(this)) {
            permission = android.Manifest.permission.NETWORK_SETUP_WIZARD;
        } else if (isQApp) {
            if (!Utils.checkCallerHasFineLocation(this, mAppOps, callingPackage, callingFeatureId,
        } else if (!hasDisavowedLocation) {
            if (isQApp) {
                if (!Utils.checkCallerHasFineLocation(this, mAppOps, callingPackage,
                        callingFeatureId,
                        callingUser)) {
                    return false;
                }
                permission = android.Manifest.permission.ACCESS_FINE_LOCATION;
            } else {
            if (!Utils.checkCallerHasCoarseLocation(this, mAppOps, callingPackage, callingFeatureId,
                if (!Utils.checkCallerHasCoarseLocation(this, mAppOps, callingPackage,
                        callingFeatureId,
                        callingUser)) {
                    return false;
                }
                permission = android.Manifest.permission.ACCESS_COARSE_LOCATION;
            }
        }

        synchronized (mDiscoveringPackages) {
            mDiscoveringPackages.add(new DiscoveringPackage(callingPackage, permission));
+5 −0
Original line number Diff line number Diff line
@@ -16,8 +16,12 @@

package com.android.bluetooth.btservice;

import android.annotation.Nullable;

final class DiscoveringPackage {
    private String mPackageName;

    @Nullable
    private String mPermission;

    DiscoveringPackage(String packageName, String permission) {
@@ -29,6 +33,7 @@ final class DiscoveringPackage {
        return mPackageName;
    }

    @Nullable
    public String getPermission() {
        return mPermission;
    }
+11 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.bluetooth.btservice;

import static android.Manifest.permission.BLUETOOTH_SCAN;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAssignedNumbers;
import android.bluetooth.BluetoothClass;
@@ -601,9 +603,15 @@ final class RemoteDevices {
        synchronized (packages) {
            for (DiscoveringPackage pkg : packages) {
                intent.setPackage(pkg.getPackageName());
                sAdapterService.sendBroadcastMultiplePermissions(intent, new String[]{
                        AdapterService.BLUETOOTH_PERM, pkg.getPermission()
                });

                String[] perms;
                if (pkg.getPermission() == null) {
                    perms = new String[] { BLUETOOTH_SCAN };
                } else {
                    perms = new String[] { BLUETOOTH_SCAN, pkg.getPermission() };
                }

                sAdapterService.sendBroadcastMultiplePermissions(intent, perms);
            }
        }
    }