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

Commit dadc857d authored by Chia-chi Yeh's avatar Chia-chi Yeh
Browse files

VPN: move VpnDialogs away from system uid.

Bug: 6632536
Change-Id: Iece647c077caf5298ccfe7d7aba5f0911a4ed0d1
parent 37e0c368
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -34,17 +34,19 @@ public class VpnConfig implements Parcelable {

    public static final String SERVICE_INTERFACE = "android.net.VpnService";

    public static final String DIALOGS_PACKAGE = "com.android.vpndialogs";

    public static final String LEGACY_VPN = "[Legacy VPN]";

    public static Intent getIntentForConfirmation() {
        Intent intent = new Intent();
        intent.setClassName("com.android.vpndialogs", "com.android.vpndialogs.ConfirmDialog");
        intent.setClassName(DIALOGS_PACKAGE, DIALOGS_PACKAGE + ".ConfirmDialog");
        return intent;
    }

    public static PendingIntent getIntentForStatusPanel(Context context, VpnConfig config) {
        Intent intent = new Intent();
        intent.setClassName("com.android.vpndialogs", "com.android.vpndialogs.ManageDialog");
        intent.setClassName(DIALOGS_PACKAGE, DIALOGS_PACKAGE + ".ManageDialog");
        intent.putExtra("config", config);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY |
                Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+1 −2
Original line number Diff line number Diff line
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android.vpndialogs"
        android:sharedUserId="android.uid.system">
        package="com.android.vpndialogs">

    <application android:label="VpnDialogs"
            android:allowBackup="false" >
+26 −8
Original line number Diff line number Diff line
@@ -106,16 +106,16 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
            return true;
        }

        // Only system user can revoke a package.
        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
            throw new SecurityException("Unauthorized Caller");
        }
        // Check if the caller is authorized.
        enforceControlPermission();

        // Reset the interface and hide the notification.
        if (mInterface != null) {
            jniReset(mInterface);
            long identity = Binder.clearCallingIdentity();
            mCallback.restore();
            hideNotification();
            Binder.restoreCallingIdentity(identity);
            mInterface = null;
        }

@@ -291,6 +291,26 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
    public void limitReached(String limit, String interfaze) {
    }

    private void enforceControlPermission() {
        // System user is allowed to control VPN.
        if (Binder.getCallingUid() == Process.SYSTEM_UID) {
            return;
        }

        try {
            // System dialogs are also allowed to control VPN.
            PackageManager pm = mContext.getPackageManager();
            ApplicationInfo app = pm.getApplicationInfo(VpnConfig.DIALOGS_PACKAGE, 0);
            if (Binder.getCallingUid() == app.uid) {
                return;
            }
        } catch (Exception e) {
            // ignore
        }

        throw new SecurityException("Unauthorized Caller");
    }

    private class Connection implements ServiceConnection {
        private IBinder mService;

@@ -368,10 +388,8 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
     * Return the information of the current ongoing legacy VPN.
     */
    public synchronized LegacyVpnInfo getLegacyVpnInfo() {
        // Only system user can call this method.
        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
            throw new SecurityException("Unauthorized Caller");
        }
        // Check if the caller is authorized.
        enforceControlPermission();
        return (mLegacyVpnRunner == null) ? null : mLegacyVpnRunner.getInfo();
    }