diff options
author | Arne Schwabe <arne@rfc2549.org> | 2013-09-01 18:53:01 +0200 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2013-09-01 18:53:01 +0200 |
commit | cc588b680ff3b6978950422c7f7b27e47940702e (patch) | |
tree | 56690aa23547a78c74639cf179a69c1cac5b8c8f /vpndialogxposed/src/main | |
parent | 7a0dc02b51044b6dc5e7ca2e8e1cca9eee813574 (diff) |
Add Xposed module to ignore VPN Confirmation dialog (does not work yet…)
Diffstat (limited to 'vpndialogxposed/src/main')
-rw-r--r-- | vpndialogxposed/src/main/AndroidManifest.xml | 22 | ||||
-rw-r--r-- | vpndialogxposed/src/main/assets/xposed_init | 1 | ||||
-rw-r--r-- | vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/IConnectivityManager.java | 105 | ||||
-rw-r--r-- | vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/VpnDialogPatcher.java | 66 | ||||
-rw-r--r-- | vpndialogxposed/src/main/res/drawable-hdpi/ic_launcher.png | bin | 0 -> 741 bytes | |||
-rw-r--r-- | vpndialogxposed/src/main/res/drawable-mdpi/ic_launcher.png | bin | 0 -> 549 bytes | |||
-rw-r--r-- | vpndialogxposed/src/main/res/drawable-xhdpi/ic_launcher.png | bin | 0 -> 1061 bytes | |||
-rw-r--r-- | vpndialogxposed/src/main/res/drawable-xxhdpi/ic_launcher.png | bin | 0 -> 1647 bytes | |||
-rw-r--r-- | vpndialogxposed/src/main/res/layout/activity_main.xml | 16 | ||||
-rw-r--r-- | vpndialogxposed/src/main/res/menu/main.xml | 6 | ||||
-rw-r--r-- | vpndialogxposed/src/main/res/values/strings.xml | 8 | ||||
-rw-r--r-- | vpndialogxposed/src/main/res/values/styles.xml | 20 |
12 files changed, 244 insertions, 0 deletions
diff --git a/vpndialogxposed/src/main/AndroidManifest.xml b/vpndialogxposed/src/main/AndroidManifest.xml new file mode 100644 index 00000000..d34264c7 --- /dev/null +++ b/vpndialogxposed/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="de.blinkt.vpndialogxposed" + android:versionCode="1" + android:versionName="1.0" > + + <uses-sdk + android:minSdkVersion="14" + android:targetSdkVersion="17" /> + + <application + android:allowBackup="true" + android:icon="@drawable/ic_launcher" + android:label="@string/app_name" + android:theme="@style/AppTheme" > + + <meta-data android:value="true" android:name="xposedmodule"/> + <meta-data android:value="2.0*" android:name="xposedminversion"/> + <meta-data android:value="Allows OpenVPN for Android to establish a VPN connection without confirmation dialog" android:name="xposeddescription"/> + </application> + +</manifest> diff --git a/vpndialogxposed/src/main/assets/xposed_init b/vpndialogxposed/src/main/assets/xposed_init new file mode 100644 index 00000000..b228b31c --- /dev/null +++ b/vpndialogxposed/src/main/assets/xposed_init @@ -0,0 +1 @@ +de.blinkt.vpndialogxposed.VpnDialogPatcher diff --git a/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/IConnectivityManager.java b/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/IConnectivityManager.java new file mode 100644 index 00000000..9b26283e --- /dev/null +++ b/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/IConnectivityManager.java @@ -0,0 +1,105 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + * Original file: /Users/arne/software/icsopenvpn/vpndialogxposed/src/main/aidl/android/net/IConnectivityManager.aidl + */ +package de.blinkt.vpndialogxposed; +/** + * Interface that answers queries about, and allows changing, the + * state of network connectivity. + */ + +/** + * {@hide} + */ +public interface IConnectivityManager extends android.os.IInterface { + public boolean prepareVpn(java.lang.String oldPackage, java.lang.String newPackage) throws android.os.RemoteException; + + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements IConnectivityManager { + static final int TRANSACTION_prepareVpn = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + private static final java.lang.String DESCRIPTOR = "android.net.IConnectivityManager"; + + /** Construct the stub at attach it to the interface. */ + public Stub() { + this.attachInterface(this, DESCRIPTOR); + } + + /** + * Cast an IBinder object into an android.net.IConnectivityManager interface, + * generating a proxy if needed. + */ + public static IConnectivityManager asInterface(android.os.IBinder obj) { + if ((obj == null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin != null) && (iin instanceof IConnectivityManager))) { + return ((IConnectivityManager) iin); + } + return new IConnectivityManager.Stub.Proxy(obj); + } + + @Override + public android.os.IBinder asBinder() { + return this; + } + + @Override + public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { + switch (code) { + case INTERFACE_TRANSACTION: { + reply.writeString(DESCRIPTOR); + return true; + } + case TRANSACTION_prepareVpn: { + data.enforceInterface(DESCRIPTOR); + java.lang.String _arg0; + _arg0 = data.readString(); + java.lang.String _arg1; + _arg1 = data.readString(); + boolean _result = this.prepareVpn(_arg0, _arg1); + reply.writeNoException(); + reply.writeInt(((_result) ? (1) : (0))); + return true; + } + } + return super.onTransact(code, data, reply, flags); + } + + private static class Proxy implements IConnectivityManager { + private android.os.IBinder mRemote; + + Proxy(android.os.IBinder remote) { + mRemote = remote; + } + + @Override + public android.os.IBinder asBinder() { + return mRemote; + } + + public java.lang.String getInterfaceDescriptor() { + return DESCRIPTOR; + } + + @Override + public boolean prepareVpn(java.lang.String oldPackage, java.lang.String newPackage) throws android.os.RemoteException { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + boolean _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(oldPackage); + _data.writeString(newPackage); + mRemote.transact(Stub.TRANSACTION_prepareVpn, _data, _reply, 0); + _reply.readException(); + _result = (0 != _reply.readInt()); + } finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + } + } +} diff --git a/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/VpnDialogPatcher.java b/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/VpnDialogPatcher.java new file mode 100644 index 00000000..74cd97e4 --- /dev/null +++ b/vpndialogxposed/src/main/java/de/blinkt/vpndialogxposed/VpnDialogPatcher.java @@ -0,0 +1,66 @@ +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; + } + + if (mPackage.equals("de.blinkt.openvpn")) { + mService.prepareVpn(null, mPackage); + Toast.makeText((Context)param.thisObject,"Allowed de.blinkt.openvpn",Toast.LENGTH_LONG).show(); + } + + } catch (Exception e) { + e.printStackTrace(); + + } + + } + + + }); + + } +} diff --git a/vpndialogxposed/src/main/res/drawable-hdpi/ic_launcher.png b/vpndialogxposed/src/main/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..a134d5fa --- /dev/null +++ b/vpndialogxposed/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/vpndialogxposed/src/main/res/drawable-mdpi/ic_launcher.png b/vpndialogxposed/src/main/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..ad6d2155 --- /dev/null +++ b/vpndialogxposed/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/vpndialogxposed/src/main/res/drawable-xhdpi/ic_launcher.png b/vpndialogxposed/src/main/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..10d3c009 --- /dev/null +++ b/vpndialogxposed/src/main/res/drawable-xhdpi/ic_launcher.png diff --git a/vpndialogxposed/src/main/res/drawable-xxhdpi/ic_launcher.png b/vpndialogxposed/src/main/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..22db1531 --- /dev/null +++ b/vpndialogxposed/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/vpndialogxposed/src/main/res/layout/activity_main.xml b/vpndialogxposed/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..efcbf18d --- /dev/null +++ b/vpndialogxposed/src/main/res/layout/activity_main.xml @@ -0,0 +1,16 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin" + tools:context=".MainActivity"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/hello_world" /> + +</RelativeLayout> diff --git a/vpndialogxposed/src/main/res/menu/main.xml b/vpndialogxposed/src/main/res/menu/main.xml new file mode 100644 index 00000000..f3b10b6c --- /dev/null +++ b/vpndialogxposed/src/main/res/menu/main.xml @@ -0,0 +1,6 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/action_settings" + android:title="@string/action_settings" + android:orderInCategory="100" + android:showAsAction="never" /> +</menu> diff --git a/vpndialogxposed/src/main/res/values/strings.xml b/vpndialogxposed/src/main/res/values/strings.xml new file mode 100644 index 00000000..f233e945 --- /dev/null +++ b/vpndialogxposed/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <string name="app_name">VpnDialog Xposed Module</string> + <string name="action_settings">Settings</string> + <string name="hello_world">Hello world!</string> + +</resources> diff --git a/vpndialogxposed/src/main/res/values/styles.xml b/vpndialogxposed/src/main/res/values/styles.xml new file mode 100644 index 00000000..6ce89c7b --- /dev/null +++ b/vpndialogxposed/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ +<resources> + + <!-- + Base application theme, dependent on API level. This theme is replaced + by AppBaseTheme from res/values-vXX/styles.xml on newer devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Light"> + <!-- + Theme customizations available in newer API levels can go in + res/values-vXX/styles.xml, while customizations related to + backward-compatibility can go here. + --> + </style> + + <!-- Application theme. --> + <style name="AppTheme" parent="AppBaseTheme"> + <!-- All customizations that are NOT specific to a particular API-level can go here. --> + </style> + +</resources> |