Jelajahi Sumber

split tunneling functionality added on all protocols as well as AdBlock..

Khubaib 1 tahun lalu
induk
melakukan
ad7f714e67

+ 5 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HomeScreen.kt

@@ -167,6 +167,10 @@ lateinit var homeViewModel1: HomeViewModel
          val wg = VPNConnectionsUtil(context, act , homeViewModel1)
          protocolObj.value = protocol
 
+//         Toast.makeText(
+//             context, "Test", Toast.LENGTH_SHORT
+//         ).show()
+
          Log.d("OnChangeProtocol", "OnChangeProtocol ${protocol.full_name} ${protocol.title}!")
          if (getEnableProtocols(protocol.title, prefHelper)) {
              Log.d("OnChangeProtocol", "getEnableProtocols yes!")
@@ -221,6 +225,7 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
     val wg = VPNConnectionsUtil(context, activity, homeViewModel)
     homeViewModel1 = homeViewModel
 
+
     var isConnect: Int? = homeViewModel.isConnect.observeAsState().value
     Log.d("isConnect_State", "live: $isConnect")
     isConnect = basePreferenceHelper.getConnectState()

+ 103 - 20
app/src/main/java/com/vpn/fastestvpnservice/utils/VPNConnectionsUtil.kt

@@ -82,6 +82,9 @@ class VPNConnectionsUtil: VpnStatus.StateListener {
     var pm: ProfileManager? = null
     var thread: Thread? = null
 
+    private lateinit var openVpnStateReceiver: OpenVpnStateReceiver
+
+
     private val mConnection: ServiceConnection = object : ServiceConnection {
         override fun onServiceConnected(className: ComponentName, service: IBinder) {
             App.mService = IOpenVPNServiceInternal.Stub.asInterface(service)
@@ -320,11 +323,28 @@ class VPNConnectionsUtil: VpnStatus.StateListener {
     fun vpnWireGuard(isUp: Boolean) {
         Log.d("test_wg", "vpnWireGuard = $isUp")
 
+        dnswg = if (basePreferenceHelper.getAdBlockState()) {
+            "10.8.8.8"
+        } else {
+            "10.9.9.9"
+        }
+
+        Log.d("test_wg", "dnswg = $dnswg")
+
+
         val interfaceBuilder: Interface.Builder? = Interface.Builder()
         // WireGuard
 
         AsyncTask.execute {
             try {
+                val type = object : TypeToken<SortedSet<String?>?>() {}.type
+                val selectedApps = Gson().fromJson<SortedSet<String>>(
+                    basePreferenceHelper.getSplitTunneledApps(), type
+                )
+                val selectedAppsNoVpn = Gson().fromJson<SortedSet<String>>(
+                    basePreferenceHelper.getSplitTunneledAppsNotAllow(), type
+                )
+
                 if (isUp) {
                     App.tunnelStatus = Tunnel.State.UP
                     homeViewModel.setConnectState(App.CONNECTED)
@@ -340,28 +360,58 @@ class VPNConnectionsUtil: VpnStatus.StateListener {
                 val wireguard = basePreferenceHelper.getWireGuard()
                 Log.d("test_wg", "server = ${server?.server_name}, dns = ${server?.dns}, wg.ip = ${wireguard?.ip}, wg.key = ${wireguard?.key}")
 
+                basePreferenceHelper.getSplitPosition().let {
+                    when(it) {
+                        splitList[0] -> {
+                            App.backend?.setState(
+                                App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
+                                    interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
+                                        .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
+                                        .parseDnsServers(dnswg)
+                                        .build()
+                                ).addPeer(
+                                    App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
+                                        .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getServerObject()?.dns + ":51820"))
+                                        .parsePublicKey(basePreferenceHelper.getServerObject()?.wg_key).build()
+                                ).build()
+                            )
+                        }
+                        splitList[1] -> {
+                            App.backend?.setState(
+                                App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
+                                    interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
+                                        .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
+                                        .parseDnsServers(dnswg)
+                                        .includeApplications(selectedApps)
+                                        .build()
+                                ).addPeer(
+                                    App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
+                                        .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getServerObject()?.dns + ":51820"))
+                                        .parsePublicKey(basePreferenceHelper.getServerObject()?.wg_key).build()
+                                ).build()
+                            )
+                        }
+                        splitList[2] -> {
+                            App.backend?.setState(
+                                App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
+                                    interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
+                                        .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
+                                        .parseDnsServers(dnswg)
+                                        .includeApplications(selectedAppsNoVpn)
+                                        .build()
+                                ).addPeer(
+                                    App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
+                                        .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getServerObject()?.dns + ":51820"))
+                                        .parsePublicKey(basePreferenceHelper.getServerObject()?.wg_key).build()
+                                ).build()
+                            )
+                        }
+                        else -> {}
+                    }
+                }
+
                 Log.d("test_wg", "${App.backend} ${App.getTunnel()} ${App.tunnelStatus} ${App.peerBuilder}")
-                App.backend?.setState(
-                    App.getTunnel(), App.tunnelStatus, Config.Builder().setInterface(
-                        interfaceBuilder!!.addAddress(InetNetwork.parse(basePreferenceHelper.getWireGuard()?.ip + "/32"))
-                            .parsePrivateKey(basePreferenceHelper.getWireGuard()?.key)
-                            .parseDnsServers("10.8.8.8")
-                            .build()
-                    ).addPeer(
-                        App.peerBuilder.addAllowedIp(InetNetwork.parse("0.0.0.0/0"))
-                            .setEndpoint(InetEndpoint.parse(basePreferenceHelper.getServerObject()?.dns + ":51820"))
-                            .parsePublicKey(basePreferenceHelper.getServerObject()?.wg_key).build()
-                    ).build()
-                )
 
-//                    try {
-//                        App.backend?.runningTunnelNames
-//                    } catch (e: Exception) {
-//                        val back = GoBackend(context)
-//                        App.setBackend(back)
-//                        App.backend = App.getBackend()
-//                    }
-//                homeViewModel.setConnectState(true)
 
             } catch (e: java.lang.Exception) {
                 e.printStackTrace()
@@ -538,6 +588,21 @@ class VPNConnectionsUtil: VpnStatus.StateListener {
         }
     }
 
+    inner class OpenVpnStateReceiver : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent?) {
+            if (intent != null && intent.action != null) {
+                val action = intent.action
+                when (action) {
+                    OpenVPNService.ACTION_VPN_CONNECTED -> {
+                        Log.d("OpenVpnStateReceiver", "OpenVpnStateReceiver")
+                        homeViewModel.setConnectState(App.CONNECTED)
+                    }
+                }
+            }
+        }
+    }
+
+
     fun onStopCallBack() {
         Log.d("test_home_resume", "onStopCallBack!")
         VpnStatus.removeStateListener(this)
@@ -588,6 +653,17 @@ class VPNConnectionsUtil: VpnStatus.StateListener {
         } catch (e: Exception) {
             e.printStackTrace()
         }
+
+        try {
+            openVpnStateReceiver = OpenVpnStateReceiver()
+            val filter = IntentFilter()
+            filter.addAction(OpenVPNService.ACTION_VPN_CONNECTED)
+
+            LocalBroadcastManager.getInstance(context)
+                .registerReceiver(openVpnStateReceiver, filter)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
     }
 
     fun onPauseCallBack() {
@@ -615,6 +691,13 @@ class VPNConnectionsUtil: VpnStatus.StateListener {
         } catch (e: Exception) {
             e.printStackTrace()
         }
+
+//        try {
+//            LocalBroadcastManager.getInstance(context)
+//                .unregisterReceiver(openVpnStateReceiver)
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//        }
     }
 
     private fun getJsonFileDetails(): InputStream? {

+ 1 - 0
app/src/main/java/de/blinkt/openvpn/core/App.java

@@ -16,6 +16,7 @@ import android.util.Log;
 
 import com.vpn.fastestvpnservice.R;
 import com.vpn.fastestvpnservice.constants.AppConstant;
+import com.vpn.fastestvpnservice.interfaces.ServerCallbacks;
 import com.wireguard.android.backend.Backend;
 import com.wireguard.android.backend.Tunnel;
 import com.wireguard.config.Config;

+ 12 - 0
app/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java

@@ -45,6 +45,7 @@ import android.widget.Toast;
 
 import androidx.annotation.RequiresApi;
 import androidx.core.app.NotificationCompat;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
 import com.google.firebase.analytics.FirebaseAnalytics;
 import com.google.gson.Gson;
@@ -56,6 +57,7 @@ import com.vpn.fastestvpnservice.constants.AppConstant;
 import com.vpn.fastestvpnservice.constants.AppEnum;
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper;
 import com.vpn.fastestvpnservice.openVpnUtils.Data;
+import com.vpn.fastestvpnservice.viewmodels.HomeViewModel;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
@@ -80,6 +82,8 @@ import java.util.concurrent.TimeUnit;
 import de.blinkt.openvpn.VpnProfile;
 import de.blinkt.openvpn.core.VpnStatus.ByteCountListener;
 import de.blinkt.openvpn.core.VpnStatus.StateListener;
+import kotlinx.coroutines.CoroutineScope;
+import kotlinx.coroutines.Dispatchers;
 
 public class OpenVPNService extends VpnService implements StateListener, Callback, ByteCountListener, IOpenVPNServiceInternal {
     public static final String START_SERVICE = "de.blinkt.openvpn.START_SERVICE";
@@ -90,6 +94,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
     public static final String NOTIFICATION_CHANNEL_NEWSTATUS_ID = "openvpn_newstat";
     private static final String PAUSE_VPN = "de.blinkt.openvpn.PAUSE_VPN";
     private static final String RESUME_VPN = "com.wxy.vpn2018.RESUME_VPN";
+
+    public static final String ACTION_VPN_CONNECTED = "com.vpn.fastestvpnservice.ACTION_VPN_CONNECTED.OpenVPN";
+
     private static final int PRIORITY_MIN = -2;
     private static final int PRIORITY_DEFAULT = 0;
     private static final int PRIORITY_MAX = 2;
@@ -1005,6 +1012,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
     public void updateState(String state, String logmessage, int resid, ConnectionStatus level) {
         // If the process is not running, ignore any state,
         // Notification should be invisible in this state
+        BasePreferenceHelper sessionManager = new BasePreferenceHelper(getBaseContext());
         doSendBroadcast(state, level);
         if (mProcessThread == null && !mNotificationAlwaysVisible) return;
         String channel = NOTIFICATION_CHANNEL_NEWSTATUS_ID;
@@ -1034,6 +1042,10 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
                 updateNotification("");
             } else if (level == LEVEL_CONNECTED) {
                 App.connection_status = 2;
+//                sessionManager.setConnectState(App.CONNECTED);
+
+                Intent in = new Intent(ACTION_VPN_CONNECTED);
+                LocalBroadcastManager.getInstance(getBaseContext()).sendBroadcast(in);
             }
         }
     }