summaryrefslogtreecommitdiff
path: root/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/VpnDialogPatcher.java
blob: d87b2d898316179a13e307e8b519fa3e5bea519a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package de.blinkt.vpndialogxposed;

import android.app.Activity;
import android.content.Context;
import android.os.IBinder;
import android.widget.Toast;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

import java.lang.reflect.Method;

public class VpnDialogPatcher implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
        if (!lpparam.packageName.equals("com.android.vpndialogs"))
            return;


        XposedBridge.log("Got VPN Dialog");

        XposedHelpers.findAndHookMethod("com.android.vpndialogs.ConfirmDialog", lpparam.classLoader,
                "onResume", new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

               // IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
                //        ServiceManager.getService(Context.CONNECTIVITY_SERVICE));

                try {

                    /*Class servicemanager = Class.forName("android.os.ServiceManager");
                    Method getService = servicemanager.getMethod("getService",String.class);

                    IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
                            (IBinder) getService.invoke(servicemanager, Context.CONNECTIVITY_SERVICE));

                    */
                    Object mService = XposedHelpers.getObjectField(param.thisObject, "mService");

                    String mPackage = ((Activity) param.thisObject).getCallingPackage();

                     // App is already allowed do nothing
                    /*if (mService.prepareVpn(mPackage, null)) {
                        return;
                    }*/


                    Class<?>[] prepareVPNsignature = {String.class, String.class};
                    if((Boolean) XposedHelpers.callMethod(mService,"prepareVpn",prepareVPNsignature,  mPackage,(String)null))
                        return;

                    if (mPackage.equals("de.blinkt.openvpn")) {
                        //mService.prepareVpn(null, mPackage);
                        XposedHelpers.callMethod(mService,"prepareVpn",prepareVPNsignature, (String)null,mPackage);
                        ((Activity) param.thisObject).setResult(Activity.RESULT_OK);
                        Toast.makeText((Context)param.thisObject,"Allowed de.blinkt.openvpn",Toast.LENGTH_LONG).show();
                        ((Activity) param.thisObject).finish();
                    }

                } catch (Exception e) {
                    e.printStackTrace();

                }

            }


        });

    }
}