diff options
author | Jeff Davidson <jpd@google.com> | 2014-11-18 02:30:54 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-11-18 02:30:54 +0000 |
commit | c79924f7412d527f640595bc2ad9f2ab631e83b7 (patch) | |
tree | ba12845075ad64b9d88db90f927a6b4943eb697f | |
parent | f7d0b20e9ed5727a9b9b1a0c0cc4fc7383a7859f (diff) | |
parent | b431a198ec255be7efb30b4c81a779a4eb5009f6 (diff) | |
download | frameworks_base-c79924f7412d527f640595bc2ad9f2ab631e83b7.zip frameworks_base-c79924f7412d527f640595bc2ad9f2ab631e83b7.tar.gz frameworks_base-c79924f7412d527f640595bc2ad9f2ab631e83b7.tar.bz2 |
am b431a198: am e6bc5adf: am e0cb56b0: Merge "Enforce VPN control "permission" with an actual permission." into lmp-mr1-dev
* commit 'b431a198ec255be7efb30b4c81a779a4eb5009f6':
Enforce VPN control "permission" with an actual permission.
-rw-r--r-- | core/res/AndroidManifest.xml | 9 | ||||
-rw-r--r-- | core/res/res/values/strings.xml | 5 | ||||
-rw-r--r-- | packages/SystemUI/AndroidManifest.xml | 1 | ||||
-rw-r--r-- | packages/VpnDialogs/AndroidManifest.xml | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/connectivity/Vpn.java | 27 |
5 files changed, 19 insertions, 25 deletions
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ef5f002..9d5fc3e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2430,6 +2430,15 @@ android:description="@string/permdesc_controlWifiDisplay" android:protectionLevel="signature" /> + <!-- @SystemApi Allows an application to control VPN. + <p>Not for use by third-party applications.</p> + @hide --> + <permission android:name="android.permission.CONTROL_VPN" + android:label="@string/permlab_controlVpn" + android:description="@string/permdesc_controlVpn" + android:protectionLevel="signature|system" /> + <uses-permission android:name="android.permission.CONTROL_VPN" /> + <!-- @SystemApi Allows an application to capture audio output. <p>Not for use by third-party applications.</p> --> <permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index f0852e2..27b5910 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1650,6 +1650,11 @@ <string name="permdesc_controlWifiDisplay">Allows the app to control low-level features of Wifi displays.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_controlVpn">control Virtual Private Networks</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_controlVpn">Allows the app to control low-level features of Virtual Private Networks.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_captureAudioOutput">capture audio output</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_captureAudioOutput">Allows the app to capture and redirect audio output.</string> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index b3e60d1..5f024ac 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -55,6 +55,7 @@ <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> + <uses-permission android:name="android.permission.CONTROL_VPN" /> <!-- Physical hardware --> <uses-permission android:name="android.permission.MANAGE_USB" /> diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index 03d920a..375c5d8 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -19,6 +19,8 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.vpndialogs"> + <uses-permission android:name="android.permission.CONTROL_VPN" /> + <application android:label="VpnDialogs" android:allowBackup="false" > <activity android:name=".ConfirmDialog" diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 83756aa..03c05ec 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -23,6 +23,7 @@ import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_INET6; +import android.Manifest; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.PendingIntent; @@ -739,31 +740,7 @@ public class Vpn { }; private void enforceControlPermission() { - // System user is allowed to control VPN. - if (Binder.getCallingUid() == Process.SYSTEM_UID) { - return; - } - int appId = UserHandle.getAppId(Binder.getCallingUid()); - final long token = Binder.clearCallingIdentity(); - try { - // System VPN dialogs are also allowed to control VPN. - PackageManager pm = mContext.getPackageManager(); - ApplicationInfo app = pm.getApplicationInfo(VpnConfig.DIALOGS_PACKAGE, 0); - if (((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) && (appId == app.uid)) { - return; - } - // SystemUI dialogs are also allowed to control VPN. - ApplicationInfo sysUiApp = pm.getApplicationInfo("com.android.systemui", 0); - if (((sysUiApp.flags & ApplicationInfo.FLAG_SYSTEM) != 0) && (appId == sysUiApp.uid)) { - return; - } - } catch (Exception e) { - // ignore - } finally { - Binder.restoreCallingIdentity(token); - } - - throw new SecurityException("Unauthorized Caller"); + mContext.enforceCallingPermission(Manifest.permission.CONTROL_VPN, "Unauthorized Caller"); } private class Connection implements ServiceConnection { |