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

Commit 5ac4a5fa authored by Nick Kralevich's avatar Nick Kralevich Committed by Android (Google) Code Review
Browse files

Merge "Fix USB access control when adb is disabled." into mnc-dev

parents a6dd714a 67401906
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -85,6 +85,16 @@ interface IUsbManager
    /* Sets the current USB function. */
    void setCurrentFunction(String function);

    /* Sets whether USB data (for example, MTP exposed pictures) should be made
     * available on the USB connection. Unlocking data should only be done with
     * user involvement, since exposing pictures or other data could leak sensitive
     * user information.
     */
    void setUsbDataUnlocked(boolean unlock);

    /* Returns true iff sensitive user data is exposed on the USB connection. */
    boolean isUsbDataUnlocked();

    /* Allow USB debugging from the attached host. If alwaysAllow is true, add the
     * the public key to list of host keys that the user has approved.
     */
+40 −0
Original line number Diff line number Diff line
@@ -141,6 +141,16 @@ public class UsbManager {
     */
    public static final String USB_CONFIGURED = "configured";

    /**
     * Boolean extra indicating whether confidential user data, such as photos, should be
     * made available on the USB connection. This variable will only be set when the user
     * has explicitly asked for this data to be unlocked.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast.
     *
     * {@hide}
     */
    public static final String USB_DATA_UNLOCKED = "unlocked";

    /**
     * Name of the USB mass storage USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
@@ -464,4 +474,34 @@ public class UsbManager {
            Log.e(TAG, "RemoteException in setCurrentFunction", e);
        }
    }

    /**
     * Sets whether USB data (for example, MTP exposed pictures) should be made available
     * on the USB connection. Unlocking usb data should only be done with user involvement,
     * since exposing pictures or other data could leak sensitive user information.
     *
     * {@hide}
     */
    public void setUsbDataUnlocked(boolean unlocked) {
        try {
            mService.setUsbDataUnlocked(unlocked);
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in setUsbDataUnlocked", e);
        }
    }

    /**
     * Returns {@code true} iff access to sensitive USB data is currently allowed.
     *
     * {@hide}
     */
    public boolean isUsbDataUnlocked() {
        try {
            return mService.isUsbDataUnlocked();
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in isUsbDataUnlocked", e);
        }
        return false;
    }

}
+37 −3
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ public class UsbDeviceManager {
    private static final int MSG_SYSTEM_READY = 3;
    private static final int MSG_BOOT_COMPLETED = 4;
    private static final int MSG_USER_SWITCHED = 5;
    private static final int MSG_SET_USB_DATA_UNLOCKED = 6;

    private static final int AUDIO_MODE_SOURCE = 1;

@@ -314,6 +315,7 @@ public class UsbDeviceManager {
        // current USB state
        private boolean mConnected;
        private boolean mConfigured;
        private boolean mUsbDataUnlocked;
        private String mCurrentFunctions;
        private UsbAccessory mCurrentAccessory;
        private int mUsbNotificationId;
@@ -350,7 +352,7 @@ public class UsbDeviceManager {
                        SystemProperties.get(UsbManager.ADB_PERSISTENT_PROPERTY, "adb"),
                        UsbManager.USB_FUNCTION_ADB);

                mCurrentFunctions = mAdbEnabled ? "adb" : "none";
                mCurrentFunctions = mAdbEnabled ? "adb" : UsbManager.USB_FUNCTION_MTP;
                String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
                updateState(state);

@@ -459,6 +461,15 @@ public class UsbDeviceManager {
            }
        }

        /**
         * Stop and start the USB driver. This is needed to close all outstanding
         * USB connections.
         */
        private void restartCurrentFunction() {
            setUsbConfig("none");
            setUsbConfig(mCurrentFunctions);
        }

        private void setEnabledFunctions(String functions) {
            if (DEBUG) Slog.d(TAG, "setEnabledFunctions " + functions);

@@ -531,6 +542,7 @@ public class UsbDeviceManager {
            intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
            intent.putExtra(UsbManager.USB_CONNECTED, mConnected);
            intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured);
            intent.putExtra(UsbManager.USB_DATA_UNLOCKED, mUsbDataUnlocked);

            if (mCurrentFunctions != null) {
                String[] functions = mCurrentFunctions.split(",");
@@ -599,6 +611,10 @@ public class UsbDeviceManager {
                case MSG_UPDATE_STATE:
                    mConnected = (msg.arg1 == 1);
                    mConfigured = (msg.arg2 == 1);
                    if (!mConnected) {
                        // When a disconnect occurs, relock access to sensitive user data
                        mUsbDataUnlocked = false;
                    }
                    updateUsbNotification();
                    updateAdbNotification();
                    if (containsFunction(mCurrentFunctions,
@@ -621,6 +637,12 @@ public class UsbDeviceManager {
                    String functions = (String)msg.obj;
                    setEnabledFunctions(functions);
                    break;
                case MSG_SET_USB_DATA_UNLOCKED:
                    mUsbDataUnlocked = (msg.arg1 == 1);
                    updateUsbNotification();
                    updateUsbState();
                    restartCurrentFunction();
                    break;
                case MSG_SYSTEM_READY:
                    setUsbConfig(mCurrentFunctions);
                    updatePersistentProperty();
@@ -676,7 +698,9 @@ public class UsbDeviceManager {
            int id = 0;
            Resources r = mContext.getResources();
            if (mConnected) {
                if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) {
                if (!mUsbDataUnlocked) {
                    id = com.android.internal.R.string.usb_charging_notification_title;
                } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_MTP)) {
                    id = com.android.internal.R.string.usb_mtp_notification_title;
                } else if (containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_PTP)) {
                    id = com.android.internal.R.string.usb_ptp_notification_title;
@@ -771,7 +795,7 @@ public class UsbDeviceManager {
        }

        private String getDefaultFunctions() {
            return "none";
            return UsbManager.USB_FUNCTION_MTP;
        }

        public void dump(FileDescriptor fd, PrintWriter pw) {
@@ -817,6 +841,16 @@ public class UsbDeviceManager {
        mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);
    }

    public void setUsbDataUnlocked(boolean unlocked) {
        if (DEBUG) Slog.d(TAG, "setUsbDataUnlocked(" + unlocked + ")");
        mHandler.sendMessage(MSG_SET_USB_DATA_UNLOCKED, unlocked);
    }

    public boolean isUsbDataUnlocked() {
        if (DEBUG) Slog.d(TAG, "isUsbDataUnlocked() -> " + mHandler.mUsbDataUnlocked);
        return mHandler.mUsbDataUnlocked;
    }

    private void readOemUsbOverrideConfig() {
        String[] configList = mContext.getResources().getStringArray(
            com.android.internal.R.array.config_oemUsbModeOverride);
+12 −0
Original line number Diff line number Diff line
@@ -270,6 +270,18 @@ public class UsbService extends IUsbManager.Stub {
        }
    }

    @Override
    public void setUsbDataUnlocked(boolean unlocked) {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
        mDeviceManager.setUsbDataUnlocked(unlocked);
    }

    @Override
    public boolean isUsbDataUnlocked() {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
        return mDeviceManager.isUsbDataUnlocked();
    }

    @Override
    public void allowUsbDebugging(boolean alwaysAllow, String publicKey) {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);