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

Commit 3a9d50e9 authored by William Escande's avatar William Escande
Browse files

Permissions: Properly annotate MODIFY_PHONE_STATE

The annotation @RequiresPermissions warn when a permission is not
properly enforce.
Fix all annotation to match the API behavior and make sure that the
permission are enforced as soon as the call reach the bluetooth process.
This allow to remove permission enforcement for internal Bluetooth call

Bug: 349682934
Test: m Bluetooth when errorprone is in failure mode
Flag: Exempt mechanical
Change-Id: Ifb929a9f922cfa4b777dc5353698c89fcbc32e9d
parent 9f6ec894
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -64,9 +64,9 @@ interface IBluetoothHeadset {
    boolean getAudioRouteAllowed(in AttributionSource attributionSource);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)")
    void setForceScoAudio(boolean forced, in AttributionSource attributionSource);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE})")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    boolean startScoUsingVirtualVoiceCall(in AttributionSource attributionSource);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE})")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    boolean stopScoUsingVirtualVoiceCall(in AttributionSource attributionSource);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.MODIFY_PHONE_STATE})")
    void phoneStateChanged(int numActive, int numHeld, int callState, String number, int type, String name, in AttributionSource attributionSource);
+0 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.bluetooth.btservice;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
@@ -909,7 +908,6 @@ public class ActiveDeviceManager implements AdapterService.BluetoothStateCallbac
        return true;
    }

    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    private boolean setHfpActiveDevice(BluetoothDevice device) {
        synchronized (mLock) {
            Log.d(TAG, "setHfpActiveDevice(" + device + ")");
@@ -1268,7 +1266,6 @@ public class ActiveDeviceManager implements AdapterService.BluetoothStateCallbac
     * wired audio device is connected.
     */
    @VisibleForTesting
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    void wiredAudioDeviceConnected() {
        Log.d(TAG, "wiredAudioDeviceConnected");
        setA2dpActiveDevice(null, true);
+8 −20
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
package com.android.bluetooth.btservice;

import static android.Manifest.permission.BLUETOOTH_SCAN;
import static android.Manifest.permission.MODIFY_PHONE_STATE;
import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE;
import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE;
import static android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE;
@@ -1863,11 +1864,7 @@ public class AdapterService extends Service {
     * @param device is the device with which we are connecting the profiles
     * @return {@link BluetoothStatusCodes#SUCCESS}
     */
    @RequiresPermission(
            allOf = {
                android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                android.Manifest.permission.MODIFY_PHONE_STATE,
            })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    private int connectEnabledProfiles(BluetoothDevice device) {
        if (mCsipSetCoordinatorService != null
                && isProfileSupported(device, BluetoothProfile.CSIP_SET_COORDINATOR)
@@ -2884,6 +2881,7 @@ public class AdapterService extends Service {
                    || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return false;
            }
            service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);
            Log.i(
                    TAG,
                    "removeActiveDevice: profiles="
@@ -2903,6 +2901,7 @@ public class AdapterService extends Service {
                return false;
            }

            service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);
            enforceBluetoothPrivilegedPermission(service);

            Log.i(
@@ -2951,6 +2950,7 @@ public class AdapterService extends Service {
                return BluetoothStatusCodes.ERROR_MISSING_BLUETOOTH_CONNECT_PERMISSION;
            }

            service.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);
            enforceBluetoothPrivilegedPermission(service);

            Log.i(
@@ -5087,11 +5087,7 @@ public class AdapterService extends Service {
     *     {@link BluetoothAdapter#ACTIVE_DEVICE_ALL}
     * @return false if profiles value is not one of the constants we accept, true otherwise
     */
    @RequiresPermission(
            allOf = {
                android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                android.Manifest.permission.MODIFY_PHONE_STATE,
            })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    public boolean setActiveDevice(BluetoothDevice device, @ActiveDeviceUse int profiles) {
        boolean setA2dp = false;
        boolean setHeadset = false;
@@ -5281,11 +5277,7 @@ public class AdapterService extends Service {
     * @return {@link BluetoothStatusCodes#SUCCESS} if all profiles connections are attempted, false
     *     if an error occurred
     */
    @RequiresPermission(
            allOf = {
                android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                android.Manifest.permission.MODIFY_PHONE_STATE,
            })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    public int connectAllEnabledProfiles(BluetoothDevice device) {
        if (!profileServicesRunning()) {
            Log.e(TAG, "connectAllEnabledProfiles: Not all profile services running");
@@ -5307,11 +5299,7 @@ public class AdapterService extends Service {
     *
     * @param device is the remote device with which to connect all supported profiles
     */
    @RequiresPermission(
            allOf = {
                android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                android.Manifest.permission.MODIFY_PHONE_STATE,
            })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    void connectAllSupportedProfiles(BluetoothDevice device) {
        int numProfilesConnected = 0;

+0 −2
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.bluetooth.btservice;
import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID;

import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
@@ -734,7 +733,6 @@ public class AudioRoutingManager extends ActiveDeviceManager {
         * time a wired audio device is connected.
         */
        @VisibleForTesting
        @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
        void wiredAudioDeviceConnected() {
            Log.d(TAG, "wiredAudioDeviceConnected");
            removeActiveDevice(BluetoothProfile.A2DP, true);
+1 −5
Original line number Diff line number Diff line
@@ -767,11 +767,7 @@ final class BondStateMachine extends StateMachine {
        removeMessages(what);
    }

    @RequiresPermission(
            allOf = {
                android.Manifest.permission.BLUETOOTH_PRIVILEGED,
                android.Manifest.permission.MODIFY_PHONE_STATE,
            })
    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    private void clearProfilePriority(BluetoothDevice device) {
        HidHostService hidService = HidHostService.getHidHostService();
        A2dpService a2dpService = A2dpService.getA2dpService();
Loading