diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 7c69a7da14..e3cbef5a11 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1402,6 +1402,20 @@ public class ConnectivityManager { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } + /** {@hide */ + public static final void enforceTetherChangePermission(Context context) { + if (context.getResources().getStringArray( + com.android.internal.R.array.config_mobile_hotspot_provision_app).length == 2) { + // Have a provisioning app - must only let system apps (which check this app) + // turn on tethering + context.enforceCallingOrSelfPermission( + android.Manifest.permission.CONNECTIVITY_INTERNAL, "ConnectivityService"); + } else { + context.enforceCallingOrSelfPermission( + android.Manifest.permission.CHANGE_NETWORK_STATE, "ConnectivityService"); + } + } + /** * Get the set of tetherable, available interfaces. This list is limited by * device configuration and current interface existence. diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index dfec307ab0..967681b20d 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1357,13 +1357,6 @@ public class ConnectivityService extends IConnectivityManager.Stub { "ConnectivityService"); } - // TODO Make this a special check when it goes public - private void enforceTetherChangePermission() { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.CHANGE_NETWORK_STATE, - "ConnectivityService"); - } - private void enforceTetherAccessPermission() { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_NETWORK_STATE, @@ -2389,8 +2382,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // javadoc from interface public int tether(String iface) { - enforceTetherChangePermission(); - + ConnectivityManager.enforceTetherChangePermission(mContext); if (isTetheringSupported()) { return mTethering.tether(iface); } else { @@ -2400,7 +2392,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // javadoc from interface public int untether(String iface) { - enforceTetherChangePermission(); + ConnectivityManager.enforceTetherChangePermission(mContext); if (isTetheringSupported()) { return mTethering.untether(iface); @@ -2449,7 +2441,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } public int setUsbTethering(boolean enable) { - enforceTetherChangePermission(); + ConnectivityManager.enforceTetherChangePermission(mContext); if (isTetheringSupported()) { return mTethering.setUsbTethering(enable); } else {