From 7c828d391670d73d74c9751b2f78b5f0ab371bb0 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Tue, 21 Jan 2020 23:28:25 -0500 Subject: [PATCH] Use new Bine CmdCreatorFunc to make a ProcessCreator to hide Tor dos window. Also hide it in checkTorVersion --- connectivity/sysProcAttr_rest.go | 9 +++++++++ connectivity/sysProcAttr_win.go | 9 +++++++++ connectivity/torProvider.go | 18 ++++++++++++++++-- connectivity/torProvider_test.go | 3 ++- go.mod | 2 +- go.sum | 2 ++ 6 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 connectivity/sysProcAttr_rest.go create mode 100644 connectivity/sysProcAttr_win.go diff --git a/connectivity/sysProcAttr_rest.go b/connectivity/sysProcAttr_rest.go new file mode 100644 index 0000000..e5aa6d6 --- /dev/null +++ b/connectivity/sysProcAttr_rest.go @@ -0,0 +1,9 @@ +// +build !windows + +package connectivity + +import ( + "syscall" +) + +var sysProcAttr = &syscall.SysProcAttr{} diff --git a/connectivity/sysProcAttr_win.go b/connectivity/sysProcAttr_win.go new file mode 100644 index 0000000..501ff9d --- /dev/null +++ b/connectivity/sysProcAttr_win.go @@ -0,0 +1,9 @@ +// +build windows + +package connectivity + +import ( + "syscall" +) + +var sysProcAttr = &syscall.SysProcAttr{HideWindow: true} diff --git a/connectivity/torProvider.go b/connectivity/torProvider.go index d3950c9..4a1e524 100644 --- a/connectivity/torProvider.go +++ b/connectivity/torProvider.go @@ -1,10 +1,12 @@ package connectivity import ( + "context" "errors" "git.openprivacy.ca/openprivacy/libricochet-go/log" "git.openprivacy.ca/openprivacy/libricochet-go/utils" "github.com/cretz/bine/control" + "github.com/cretz/bine/process" "github.com/cretz/bine/tor" bineed255192 "github.com/cretz/bine/torutil/ed25519" "golang.org/x/crypto/ed25519" @@ -213,6 +215,17 @@ func StartTor(appDirectory string, bundledTorPath string) (ACN, error) { return tp, err } +// newHideCmd creates a Creator function for bine which generates a cmd that one windows will hide the dosbox +func newHideCmd(exePath string) process.Creator { + return process.CmdCreatorFunc(func(ctx context.Context, args ...string) (*exec.Cmd, error) { + cmd := exec.CommandContext(ctx, exePath, args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.SysProcAttr = sysProcAttr + return cmd, nil + }) +} + func startTor(appDirectory string, bundledTorPath string) (*torProvider, error) { dataDir := path.Join(appDirectory, "tor") os.MkdirAll(dataDir, 0700) @@ -239,7 +252,7 @@ func startTor(appDirectory string, bundledTorPath string) (*torProvider, error) // if not, try running system tor if checkCmdlineTorVersion("tor") { - t, err := tor.Start(nil, &tor.StartConf{EnableNetwork: true, DataDir: dataDir, DebugWriter: nil}) + t, err := tor.Start(nil, &tor.StartConf{EnableNetwork: true, DataDir: dataDir, DebugWriter: nil, ProcessCreator: newHideCmd("tor")}) if err == nil { tp.t = t return tp, nil @@ -250,7 +263,7 @@ func startTor(appDirectory string, bundledTorPath string) (*torProvider, error) // try running bundledTor if bundledTorPath != "" && checkCmdlineTorVersion(bundledTorPath) { log.Debugln("using bundled tor '" + bundledTorPath + "'") - t, err := tor.Start(nil, &tor.StartConf{EnableNetwork: true, DataDir: dataDir, ExePath: bundledTorPath, DebugWriter: nil}) + t, err := tor.Start(nil, &tor.StartConf{EnableNetwork: true, DataDir: dataDir, ExePath: bundledTorPath, DebugWriter: nil, ProcessCreator: newHideCmd(bundledTorPath)}) if err != nil { log.Debugf("Error running bundled tor: %v\n", err) } @@ -341,6 +354,7 @@ func createFromExisting(controlport *control.Conn, datadir string) *tor.Tor { func checkCmdlineTorVersion(torCmd string) bool { cmd := exec.Command(torCmd, "--version") + cmd.SysProcAttr = sysProcAttr out, err := cmd.CombinedOutput() re := regexp.MustCompile("[0-1]\\.[0-9]\\.[0-9]\\.[0-9]") sysTorVersion := re.Find(out) diff --git a/connectivity/torProvider_test.go b/connectivity/torProvider_test.go index cf3a404..e3fce67 100644 --- a/connectivity/torProvider_test.go +++ b/connectivity/torProvider_test.go @@ -15,10 +15,11 @@ func getStatusCallback(progChan chan int) func(int, string) { func TestTorProvider(t *testing.T) { progChan := make(chan int) acn, err := StartTor(".", "") - acn.SetStatusCallback(getStatusCallback(progChan)) if err != nil { t.Error(err) + return } + acn.SetStatusCallback(getStatusCallback(progChan)) progress := 0 for progress < 100 { diff --git a/go.mod b/go.mod index 7fcefae..092c273 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module git.openprivacy.ca/openprivacy/libricochet-go require ( github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 - github.com/cretz/bine v0.1.0 + github.com/cretz/bine v0.1.1-0.20200124154328-f9f678b84cca github.com/golang/protobuf v1.2.0 github.com/stretchr/testify v1.3.0 // indirect golang.org/x/crypto v0.0.0-20190128193316-c7b33c32a30b diff --git a/go.sum b/go.sum index 01660fa..386332a 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7I github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= github.com/cretz/bine v0.1.0 h1:1/fvhLE+fk0bPzjdO5Ci+0ComYxEMuB1JhM4X5skT3g= github.com/cretz/bine v0.1.0/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw= +github.com/cretz/bine v0.1.1-0.20200124154328-f9f678b84cca h1:Q2r7AxHdJwWfLtBZwvW621M3sPqxPc6ITv2j1FGsYpw= +github.com/cretz/bine v0.1.1-0.20200124154328-f9f678b84cca/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw= 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/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=