From 89dff1f5e0a7acc8533482199d97783581089567 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 16 Nov 2020 18:55:04 -0800 Subject: [PATCH] torProvider: now creates new subdir for tor process per run to avoid collisions of zombies; log tor processl bump op.log version --- go.mod | 4 ++-- go.sum | 3 +++ tor/torProvider.go | 41 +++++++++++++++++++++++++++++++---------- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index bdcb3be..5073ad2 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.openprivacy.ca/openprivacy/connectivity go 1.13 require ( - git.openprivacy.ca/openprivacy/bine v0.0.3 - git.openprivacy.ca/openprivacy/log v1.0.0 + git.openprivacy.ca/openprivacy/bine v0.0.4 + git.openprivacy.ca/openprivacy/log v1.0.1 golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee ) diff --git a/go.sum b/go.sum index fd3da83..ebf7d66 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,11 @@ git.openprivacy.ca/openprivacy/bine v0.0.2 h1:2uJyxOYfcYvpQAuRt5XWc81ZXrHuubdFsk git.openprivacy.ca/openprivacy/bine v0.0.2/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU= git.openprivacy.ca/openprivacy/bine v0.0.3 h1:PSHUmNqaW7BZUX8n2eTDeNbjsuRe+t5Ae0Og+P+jDM0= git.openprivacy.ca/openprivacy/bine v0.0.3/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU= +git.openprivacy.ca/openprivacy/bine v0.0.4/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU= git.openprivacy.ca/openprivacy/log v1.0.0 h1:Rvqm1weUdR4AOnJ79b1upHCc9vC/QF1rhSD2Um7sr1Y= git.openprivacy.ca/openprivacy/log v1.0.0/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw= +git.openprivacy.ca/openprivacy/log v1.0.1 h1:NWV5oBTatvlSzUE6wtB+UQCulgyMOtm4BXGd34evMys= +git.openprivacy.ca/openprivacy/log v1.0.1/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw= 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/tor/torProvider.go b/tor/torProvider.go index b7fd0ff..3556f36 100644 --- a/tor/torProvider.go +++ b/tor/torProvider.go @@ -12,6 +12,7 @@ import ( "git.openprivacy.ca/openprivacy/log" "golang.org/x/crypto/ed25519" "golang.org/x/crypto/sha3" + "io/ioutil" "net" "net/textproto" "os" @@ -49,6 +50,15 @@ type NoTorrcError struct { func (e *NoTorrcError) Error() string { return fmt.Sprintf("torrc file does not exist at %v", e.path) } +type logWriter struct { + level log.Level +} + +func (l *logWriter) Write(p []byte) (int, error) { + log.Printf(l.level, "tor: %v", string(p)) + return len(p), nil +} + type onionListenService struct { os *tor.OnionService tp *torProvider @@ -259,9 +269,12 @@ func NewTorACN(appDirectory string, bundledTorPath string) (connectivity.ACN, er // 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) { + loggerDebug := &logWriter{log.LevelDebug} + loggerError := &logWriter{log.LevelError} + cmd := exec.CommandContext(ctx, exePath, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + cmd.Stdout = loggerDebug + cmd.Stderr = loggerError cmd.SysProcAttr = sysProcAttr return cmd, nil }) @@ -287,8 +300,15 @@ func (tp *torProvider) checkVersion() error { } func startTor(appDirectory string, bundledTorPath string, controlPort int, authenticator tor.Authenticator) (*torProvider, error) { - dataDir := path.Join(appDirectory, "tor") - os.MkdirAll(dataDir, 0700) + torDir := path.Join(appDirectory, "tor") + + os.MkdirAll(torDir, 0700) + dataDir := "" + var err error + if dataDir, err = ioutil.TempDir(torDir, "data-dir-"); err != nil { + return nil, fmt.Errorf("Unable to create temp data dir: %v", err) + } + tp := &torProvider{authenticator: authenticator, controlPort: controlPort, appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*onionListenService), breakChan: make(chan bool), statusCallback: nil, lastRestartTime: time.Now().Add(-restartCooldown)} log.Debugf("launching system tor") @@ -302,15 +322,15 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe } // check if the torrc file is present where expected - if _, err := os.Stat(path.Join(dataDir, "torrc")); os.IsNotExist(err) { - err = &NoTorrcError{path.Join(dataDir, "torrc")} + if _, err := os.Stat(path.Join(torDir, "torrc")); os.IsNotExist(err) { + err = &NoTorrcError{path.Join(torDir, "torrc")} log.Debugln(err.Error()) return nil, err } // if not, try running system tor if checkCmdlineTorVersion("tor") { - t, err := tor.Start(nil, &tor.StartConf{ControlPort: tp.controlPort, DisableCookieAuth: true, UseEmbeddedControlConn: false, DisableEagerAuth: true, EnableNetwork: true, DataDir: dataDir, TorrcFile: path.Join(dataDir, "torrc"), DebugWriter: nil, ProcessCreator: newHideCmd("tor")}) + t, err := tor.Start(nil, &tor.StartConf{ControlPort: tp.controlPort, DisableCookieAuth: true, UseEmbeddedControlConn: false, DisableEagerAuth: true, EnableNetwork: true, DataDir: dataDir, TorrcFile: path.Join(torDir, "torrc"), DebugWriter: nil, ProcessCreator: newHideCmd("tor")}) if err != nil { log.Debugf("Error connecting to self-run system tor: %v\n", err) return nil, err @@ -318,7 +338,7 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe tp.t = t } else if bundledTorPath != "" && checkCmdlineTorVersion(bundledTorPath) { log.Debugln("attempting using bundled tor '" + bundledTorPath + "'") - t, err := tor.Start(nil, &tor.StartConf{ControlPort: tp.controlPort, DisableCookieAuth: true, UseEmbeddedControlConn: false, DisableEagerAuth: true, EnableNetwork: true, DataDir: dataDir, TorrcFile: path.Join(dataDir, "torrc"), ExePath: bundledTorPath, DebugWriter: nil, ProcessCreator: newHideCmd(bundledTorPath)}) + t, err := tor.Start(nil, &tor.StartConf{ControlPort: tp.controlPort, DisableCookieAuth: true, UseEmbeddedControlConn: false, DisableEagerAuth: true, EnableNetwork: true, DataDir: dataDir, TorrcFile: path.Join(torDir, "torrc"), ExePath: bundledTorPath, DebugWriter: nil, ProcessCreator: newHideCmd(bundledTorPath)}) if err != nil { log.Debugf("Error running bundled tor %v\n", err) return nil, err @@ -326,8 +346,9 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe tp.t = t } - err := tp.checkVersion() + err = tp.checkVersion() if err == nil { + tp.t.DeleteDataDirOnClose = true return tp, nil } return nil, fmt.Errorf("could not connect to or start Tor that met requirments (min Tor version 0.3.5.x): %v", err) @@ -409,7 +430,7 @@ func createFromExisting(controlport *control.Conn, datadir string) *tor.Tor { Control: controlport, ProcessCancelFunc: nil, DataDir: datadir, - DeleteDataDirOnClose: false, + DeleteDataDirOnClose: true, DebugWriter: nil, StopProcessOnClose: false, GeoIPCreatedFile: "",