diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 0e5d049c78..e4b75c15fe 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1863,8 +1863,12 @@ public class ConnectivityManager { .getPackageNameForUid(context, uid), true /* throwException */); } - /** {@hide */ - public static final void enforceTetherChangePermission(Context context) { + /** {@hide} */ + public static final void enforceTetherChangePermission(Context context, String callingPkg) { + if (null == context || null == callingPkg) { + throw new IllegalArgumentException("arguments should not be null"); + } + 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) @@ -1873,8 +1877,10 @@ public class ConnectivityManager { android.Manifest.permission.TETHER_PRIVILEGED, "ConnectivityService"); } else { int uid = Binder.getCallingUid(); - Settings.checkAndNoteWriteSettingsOperation(context, uid, Settings - .getPackageNameForUid(context, uid), true /* throwException */); + // If callingPkg's uid is not same as Binder.getCallingUid(), + // AppOpsService throws SecurityException. + Settings.checkAndNoteWriteSettingsOperation(context, uid, callingPkg, + true /* throwException */); } } @@ -1997,7 +2003,9 @@ public class ConnectivityManager { */ public int tether(String iface) { try { - return mService.tether(iface); + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "tether caller:" + pkgName); + return mService.tether(iface, pkgName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2023,7 +2031,9 @@ public class ConnectivityManager { */ public int untether(String iface) { try { - return mService.untether(iface); + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "untether caller:" + pkgName); + return mService.untether(iface, pkgName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2114,7 +2124,9 @@ public class ConnectivityManager { }; try { - mService.startTethering(type, wrappedCallback, showProvisioningUi); + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "startTethering caller:" + pkgName); + mService.startTethering(type, wrappedCallback, showProvisioningUi, pkgName); } catch (RemoteException e) { Log.e(TAG, "Exception trying to start tethering.", e); wrappedCallback.send(TETHER_ERROR_SERVICE_UNAVAIL, null); @@ -2134,7 +2146,9 @@ public class ConnectivityManager { @SystemApi public void stopTethering(int type) { try { - mService.stopTethering(type); + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "stopTethering caller:" + pkgName); + mService.stopTethering(type, pkgName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2219,7 +2233,9 @@ public class ConnectivityManager { */ public int setUsbTethering(boolean enable) { try { - return mService.setUsbTethering(enable); + String pkgName = mContext.getOpPackageName(); + Log.i(TAG, "setUsbTethering caller:" + pkgName); + return mService.setUsbTethering(enable, pkgName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 425e494078..63a1f0513e 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -69,17 +69,18 @@ interface IConnectivityManager boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress); - int tether(String iface); + int tether(String iface, String callerPkg); - int untether(String iface); + int untether(String iface, String callerPkg); int getLastTetherError(String iface); boolean isTetheringSupported(); - void startTethering(int type, in ResultReceiver receiver, boolean showProvisioningUi); + void startTethering(int type, in ResultReceiver receiver, boolean showProvisioningUi, + String callerPkg); - void stopTethering(int type); + void stopTethering(int type, String callerPkg); String[] getTetherableIfaces(); @@ -95,7 +96,7 @@ interface IConnectivityManager String[] getTetherableBluetoothRegexs(); - int setUsbTethering(boolean enable); + int setUsbTethering(boolean enable, String callerPkg); void reportInetCondition(int networkType, int percentage); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index a2293a777a..7e54f07880 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2948,8 +2948,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // javadoc from interface @Override - public int tether(String iface) { - ConnectivityManager.enforceTetherChangePermission(mContext); + public int tether(String iface, String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); if (isTetheringSupported()) { final int status = mTethering.tether(iface); return status; @@ -2960,8 +2960,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // javadoc from interface @Override - public int untether(String iface) { - ConnectivityManager.enforceTetherChangePermission(mContext); + public int untether(String iface, String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); if (isTetheringSupported()) { final int status = mTethering.untether(iface); @@ -3015,8 +3015,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override - public int setUsbTethering(boolean enable) { - ConnectivityManager.enforceTetherChangePermission(mContext); + public int setUsbTethering(boolean enable, String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); if (isTetheringSupported()) { return mTethering.setUsbTethering(enable); } else { @@ -3075,8 +3075,9 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override - public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi) { - ConnectivityManager.enforceTetherChangePermission(mContext); + public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi, + String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); if (!isTetheringSupported()) { receiver.send(ConnectivityManager.TETHER_ERROR_UNSUPPORTED, null); return; @@ -3085,8 +3086,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override - public void stopTethering(int type) { - ConnectivityManager.enforceTetherChangePermission(mContext); + public void stopTethering(int type, String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); mTethering.stopTethering(type); } @@ -5482,8 +5483,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING)) { // Untether + String pkgName = mContext.getOpPackageName(); for (String tether : getTetheredIfaces()) { - untether(tether); + untether(tether, pkgName); } }