diff options
author | Ruben Pollan <meskio@sindominio.net> | 2020-09-24 12:24:48 +0200 |
---|---|---|
committer | Ruben Pollan <meskio@sindominio.net> | 2020-09-24 16:50:04 +0200 |
commit | 998b5cb54ad23be1f6df0ee8abd08af5614f38db (patch) | |
tree | aafb1c6f11ba23da120b29170ed712d6a07d5336 | |
parent | 3a74c28cce41fe783d9dde707ebb6de941d5cf0a (diff) |
[feat] send cmd flags to the go backend
Also disable autostart if manual quit, remove custom printer that was
used for i18n and disable previous autostart if -disable-autostart
We didn't disable autostart after the migration to qt.
- Resolves: #355 #289
-rw-r--r-- | go.mod | 1 | ||||
-rw-r--r-- | go.sum | 2 | ||||
-rw-r--r-- | gui/backend.go | 8 | ||||
-rw-r--r-- | gui/main.cpp | 38 | ||||
-rw-r--r-- | pkg/backend/api.go | 12 | ||||
-rw-r--r-- | pkg/backend/init.go | 36 | ||||
-rw-r--r-- | pkg/backend/status.go | 1 | ||||
-rw-r--r-- | pkg/bitmask/autostart.go | 8 | ||||
-rw-r--r-- | pkg/bitmask/init.go | 41 | ||||
-rw-r--r-- | pkg/config/gui.go | 7 |
10 files changed, 101 insertions, 53 deletions
@@ -11,7 +11,6 @@ require ( github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect github.com/apparentlymart/go-openvpn-mgmt v0.0.0-20161009010951-9a305aecd7f2 github.com/dchest/siphash v1.2.1 // indirect - github.com/jmshal/go-locale v0.0.0-20190124211249-eb00fb25cc61 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/rakyll/statik v0.1.7 @@ -16,8 +16,6 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/siphash v1.2.1 h1:4cLinnzVJDKxTCl9B01807Yiy+W7ZzVHj/KIroQRvT4= github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= -github.com/jmshal/go-locale v0.0.0-20190124211249-eb00fb25cc61 h1:9vsXCXRCUb82jJKv4O+R8Hyo4oPJsOjVwT0pWvHgeyc= -github.com/jmshal/go-locale v0.0.0-20190124211249-eb00fb25cc61/go.mod h1:+Ny9b1U6p4zX0L9w+k3hSkz3puupLFP14Mion+rGNF8= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= diff --git a/gui/backend.go b/gui/backend.go index 7632bb4..92fbb97 100644 --- a/gui/backend.go +++ b/gui/backend.go @@ -53,9 +53,15 @@ func SubscribeToEvent(event string, f unsafe.Pointer) { } //export InitializeBitmaskContext -func InitializeBitmaskContext(provider string, jsonPtr unsafe.Pointer, jsonLen C.int) { +func InitializeBitmaskContext(provider string, + jsonPtr unsafe.Pointer, jsonLen C.int, + obfs4 bool, disableAutostart bool, startVPN string) { + json := C.GoBytes(jsonPtr, jsonLen) opts := backend.InitOptsFromJSON(provider, string(json)) + opts.Obfs4 = obfs4 + opts.DisableAutostart = disableAutostart + opts.StartVPN = startVPN backend.InitializeBitmaskContext(opts) } diff --git a/gui/main.cpp b/gui/main.cpp index 4ba9dd6..42123ae 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -76,15 +76,50 @@ int main(int argc, char **argv) { "main", "Install helpers (linux only, requires sudo)."), }, + { + {"v", "version"}, + QApplication::translate( + "main", + "Version of the bitmask-vpn."), + }, + { + {"o", "obfs4"}, + QApplication::translate( + "main", + "Use obfs4 to obfuscate the traffic is available in the provider."), + }, + { + {"a", "disable-autostart"}, + QApplication::translate( + "main", + "Disable the autostart for the next run."), + }, + { + {"s", "start-vpn"}, + QApplication::translate( + "main", + "Start the vpn in turned 'on' or 'off'."), + }, }); QCommandLineOption webPortOption("web-port", QApplication::translate("main", "Web api port (default: 8080)"), "port", "8080"); parser.addOption(webPortOption); + QCommandLineOption startVPNOption("start-vpn", QApplication::translate("main", "Start the vpn in turned 'on' or 'off'."), "status", ""); + parser.addOption(startVPNOption); parser.process(app); bool hideSystray = parser.isSet("no-systray"); bool installHelpers = parser.isSet("install-helpers"); bool webAPI = parser.isSet("web-api"); QString webPort = parser.value("web-port"); + bool version = parser.isSet("version"); + bool obfs4 = parser.isSet("obfs4"); + bool disAutostart = parser.isSet("disable-autostart"); + QString startVPN = parser.value("start-vpn"); + + if (version) { + qDebug() << backend.getVersion(); + exit(0); + } if (hideSystray) { qDebug() << "Not showing systray icon because --no-systray option is set."; @@ -152,7 +187,8 @@ int main(int argc, char **argv) { /* let the Go side initialize its internal state */ InitializeBitmaskContext( toGoStr(defaultProvider.toString()), - (char*)QProvidersJSON.toUtf8().data(), strlen(QProvidersJSON.toUtf8().data())); + (char*)QProvidersJSON.toUtf8().data(), strlen(QProvidersJSON.toUtf8().data()), + obfs4, disAutostart, toGoStr(startVPN)); /* if requested, enable web api for controlling the VPN */ if (webAPI) { diff --git a/pkg/backend/api.go b/pkg/backend/api.go index 9706bdf..a8d16a3 100644 --- a/pkg/backend/api.go +++ b/pkg/backend/api.go @@ -11,8 +11,8 @@ import ( "0xacab.org/leap/bitmask-vpn/pkg/bitmask" "0xacab.org/leap/bitmask-vpn/pkg/config/version" - "0xacab.org/leap/bitmask-vpn/pkg/pid" "0xacab.org/leap/bitmask-vpn/pkg/pickle" + "0xacab.org/leap/bitmask-vpn/pkg/pid" ) func Login(username, password string) { @@ -48,6 +48,7 @@ func SwitchOff() { } func Quit() { + ctx.autostart.Disable() if ctx.Status != off { go setStatus(stopping) ctx.cfg.SetUserStoppedVPN(false) @@ -74,8 +75,11 @@ type Providers struct { } type InitOpts struct { - ProviderOptions *bitmask.ProviderOpts - SkipLaunch bool + ProviderOptions *bitmask.ProviderOpts + SkipLaunch bool + Obfs4 bool + DisableAutostart bool + StartVPN string } func InitOptsFromJSON(provider, providersJSON string) *InitOpts { @@ -88,7 +92,7 @@ func InitOptsFromJSON(provider, providersJSON string) *InitOpts { panic("BUG: we do not support multi-provider yet") } providerOpts := &providers.Data[0] - return &InitOpts{providerOpts, false} + return &InitOpts{ProviderOptions: providerOpts} } func InitializeBitmaskContext(opts *InitOpts) { diff --git a/pkg/backend/init.go b/pkg/backend/init.go index c0d8f37..842c91b 100644 --- a/pkg/backend/init.go +++ b/pkg/backend/init.go @@ -52,6 +52,7 @@ func initializeBitmask(errCh chan string, opts *InitOpts) { } bitmask.InitializeLogger() ctx.cfg = config.ParseConfig() + setConfigOpts(opts, ctx.cfg) err := pid.AcquirePID() if err != nil { @@ -60,12 +61,13 @@ func initializeBitmask(errCh chan string, opts *InitOpts) { return } - b, err := bitmask.InitializeBitmask(opts.SkipLaunch) + b, err := bitmask.InitializeBitmask(ctx.cfg) if err != nil { log.Println("error: cannot initialize bitmask") errCh <- err.Error() return } + ctx.autostart = initializeAutostart(ctx.cfg) helpers, privilege, err := b.VPNCheck() @@ -85,3 +87,35 @@ func initializeBitmask(errCh chan string, opts *InitOpts) { ctx.bm = b } + +func setConfigOpts(opts *InitOpts, conf *config.Config) { + conf.SkipLaunch = opts.SkipLaunch + if opts.StartVPN != "" { + if opts.StartVPN != "on" && opts.StartVPN != "off" { + log.Println("-start-vpn should be 'on' or 'off'") + } else { + conf.StartVPN = opts.StartVPN == "on" + } + } + if opts.Obfs4 { + conf.Obfs4 = opts.Obfs4 + } + if opts.DisableAutostart { + conf.DisableAustostart = opts.DisableAutostart + } +} + +func initializeAutostart(conf *config.Config) bitmask.Autostart { + autostart := bitmask.NewAutostart(config.ApplicationName, "") + if conf.SkipLaunch || conf.DisableAustostart { + autostart.Disable() + autostart = &bitmask.DummyAutostart{} + } + + err := autostart.Enable() + if err != nil { + log.Printf("Error enabling autostart: %v", err) + } + return autostart + +} diff --git a/pkg/backend/status.go b/pkg/backend/status.go index f06d26d..ffa79fc 100644 --- a/pkg/backend/status.go +++ b/pkg/backend/status.go @@ -43,6 +43,7 @@ type connectionCtx struct { Errors string `json:"errors"` Status status `json:"status"` bm bitmask.Bitmask + autostart bitmask.Autostart cfg *config.Config } diff --git a/pkg/bitmask/autostart.go b/pkg/bitmask/autostart.go index 9e37fe4..f314dbc 100644 --- a/pkg/bitmask/autostart.go +++ b/pkg/bitmask/autostart.go @@ -36,7 +36,7 @@ type Autostart interface { } // newAutostart creates a handler for the autostart of your platform -func newAutostart(appName string, iconPath string) Autostart { +func NewAutostart(appName string, iconPath string) Autostart { exec := os.Args if os.Getenv("SNAP") != "" { re := regexp.MustCompile("/snap/([^/]*)/") @@ -65,12 +65,12 @@ func newAutostart(appName string, iconPath string) Autostart { } } -type dummyAutostart struct{} +type DummyAutostart struct{} -func (a *dummyAutostart) Disable() error { +func (a *DummyAutostart) Disable() error { return nil } -func (a *dummyAutostart) Enable() error { +func (a *DummyAutostart) Enable() error { return nil } diff --git a/pkg/bitmask/init.go b/pkg/bitmask/init.go index 401f8a7..00f145e 100644 --- a/pkg/bitmask/init.go +++ b/pkg/bitmask/init.go @@ -17,14 +17,12 @@ package bitmask import ( "errors" + "fmt" "log" "os" "path" "strconv" - "github.com/jmshal/go-locale" - "golang.org/x/text/message" - "0xacab.org/leap/bitmask-vpn/pkg/config" "0xacab.org/leap/bitmask-vpn/pkg/vpn" ) @@ -89,27 +87,24 @@ func InitializeLogger() { } } -func initBitmask(printer *message.Printer) (Bitmask, error) { +func initBitmask() (Bitmask, error) { b, err := vpn.Init() if err != nil { log.Printf("An error ocurred starting bitmask: %v", err) - err = errors.New(printer.Sprintf(errorMsg, err)) + err = errors.New(fmt.Sprintf(errorMsg, err)) } return b, err } -func InitializeBitmask(skipLaunch bool) (Bitmask, error) { - if skipLaunch { +func InitializeBitmask(conf *config.Config) (Bitmask, error) { + if conf.SkipLaunch { log.Println("Initializing bitmask, but not launching it...") } if _, err := os.Stat(config.Path); os.IsNotExist(err) { os.MkdirAll(config.Path, os.ModePerm) } - conf := config.ParseConfig() - conf.Printer = initPrinter() - - b, err := initBitmask(conf.Printer) + b, err := initBitmask() if err != nil { return nil, err } @@ -119,39 +114,19 @@ func InitializeBitmask(skipLaunch bool) (Bitmask, error) { return nil, err } - if !skipLaunch { + if !conf.SkipLaunch { err := maybeStartVPN(b, conf) if err != nil { log.Println("Error starting VPN: ", err) return nil, err } } - - var as Autostart - if skipLaunch || conf.DisableAustostart { - as = &dummyAutostart{} - } else { - as = newAutostart(config.ApplicationName, "") - } - - err = as.Enable() - if err != nil { - log.Printf("Error enabling autostart: %v", err) - } return b, nil } -func initPrinter() *message.Printer { - locale, err := go_locale.DetectLocale() - if err != nil { - log.Println("Error detecting the system locale: ", err) - } - - return message.NewPrinter(message.MatchLanguage(locale, "en")) -} - func setTransport(b Bitmask, conf *config.Config) error { if conf.Obfs4 { + log.Printf("Use transport Obfs4") err := b.UseTransport("obfs4") if err != nil { log.Printf("Error setting transport: %v", err) diff --git a/pkg/config/gui.go b/pkg/config/gui.go index 7f2515c..3df1197 100644 --- a/pkg/config/gui.go +++ b/pkg/config/gui.go @@ -20,8 +20,6 @@ import ( "os" "path" "time" - - "golang.org/x/text/message" ) const ( @@ -39,16 +37,14 @@ type Config struct { file struct { LastReminded time.Time Donated time.Time - SelectGateway bool Obfs4 bool UserStoppedVPN bool DisableAustostart bool } - SelectGateway bool Obfs4 bool DisableAustostart bool StartVPN bool - Printer *message.Printer + SkipLaunch bool } // ParseConfig reads the configuration from the configuration file @@ -64,7 +60,6 @@ func ParseConfig() *Config { err = dec.Decode(&conf.file) } - conf.SelectGateway = conf.file.SelectGateway conf.Obfs4 = conf.file.Obfs4 conf.DisableAustostart = conf.file.DisableAustostart conf.StartVPN = !conf.file.UserStoppedVPN |