From 0f43c0444701c1cdb86ea416e452a251abe50137 Mon Sep 17 00:00:00 2001
From: Pea Nut <peanut2@systemli.org>
Date: Tue, 18 Jun 2024 19:47:32 +0200
Subject: [PATCH] Use v5 implementation if configured or env is set

---
 pkg/vpn/bitmask.go | 25 ++++++++++++++++++++++++-
 pkg/vpn/openvpn.go |  9 +++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/pkg/vpn/bitmask.go b/pkg/vpn/bitmask.go
index d40a6013..7fd32d4c 100644
--- a/pkg/vpn/bitmask.go
+++ b/pkg/vpn/bitmask.go
@@ -29,6 +29,7 @@ import (
 	"0xacab.org/leap/bitmask-vpn/pkg/snowflake"
 	"0xacab.org/leap/bitmask-vpn/pkg/vpn/bonafide"
 	"0xacab.org/leap/bitmask-vpn/pkg/vpn/management"
+	"0xacab.org/leap/bitmask-vpn/pkg/vpn/menshen"
 	obfsvpn "0xacab.org/leap/obfsvpn/client"
 )
 
@@ -61,7 +62,29 @@ func Init() (*Bitmask, error) {
 		return nil, err
 	}
 
-	api := bonafide.New()
+	var api apiInterface
+	if os.Getenv("API_VERSION") == "5" {
+		config.ApiVersion = 5
+		log.Debug().Msg("Enforcing API v5 by env variable")
+	}
+	log.Debug().
+		Int("apiVersion", config.ApiVersion).
+		Msg("Using specific API backend version")
+
+	if config.ApiVersion == 5 {
+		api, err = menshen.New()
+		if err != nil {
+			return nil, err
+		}
+	} else if config.ApiVersion == 3 {
+		api = bonafide.New()
+	} else {
+		log.Warn().
+			Int("apiVersion", config.ApiVersion).
+			Msg("ApiVersion of provider was not set correctly. Version 3 and 5 is supported. Using v3 for backwards compatiblity")
+		api = bonafide.New()
+	}
+
 	launch, err := launcher.NewLauncher()
 	if err != nil {
 		return nil, err
diff --git a/pkg/vpn/openvpn.go b/pkg/vpn/openvpn.go
index 0f90770e..edf333ef 100644
--- a/pkg/vpn/openvpn.go
+++ b/pkg/vpn/openvpn.go
@@ -204,6 +204,15 @@ func (b *Bitmask) startOpenVPN(ctx context.Context) error {
 	*/
 	b.statusCh <- Starting
 	if b.GetTransport() == "obfs4" {
+
+		if config.ApiVersion == 5 {
+			// if I return an error, the GUI state does not get updated properly to Failed/Stopped and
+			// continues to stay in state Connecting (also clicking Cancel doesnot work)
+			log.Fatal().Msg("Could not start OpenVPN with obfs4. This is currently not supported via v5")
+			// menshen/v5 has different api endpoints: gateways and bridges
+			// gw.Options is always empty right now
+		}
+
 		var gw bonafide.Gateway
 		var gateways []bonafide.Gateway
 		var proxy string
-- 
GitLab