From 6d5d067d70ab35355e4d5b9ba5713b2bc5f03c05 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 17 Jan 2022 15:54:42 -0800 Subject: [PATCH 1/3] Move DataDir Caching Responsibility to Caller to allow Cached Consensus --- testing/launch_tor_integration_test.go | 8 +++++++- tor/torProvider.go | 24 +++++++----------------- tor/torProvider_test.go | 12 ++++++++++-- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/testing/launch_tor_integration_test.go b/testing/launch_tor_integration_test.go index 7611c74..10d0669 100644 --- a/testing/launch_tor_integration_test.go +++ b/testing/launch_tor_integration_test.go @@ -3,6 +3,7 @@ package testing import ( "git.openprivacy.ca/openprivacy/connectivity/tor" "git.openprivacy.ca/openprivacy/log" + "io/ioutil" "math/rand" "os" "path" @@ -25,10 +26,15 @@ func TestLaunchTor(t *testing.T) { t.Fatalf("failed to create torrc file: %v", err) } + dataDir := "" + if dataDir, err = ioutil.TempDir(path.Join("..", "testing", "tor"), "data-dir-"); err != nil { + t.Fatalf("could not create data dir") + } + // Get the current working director, clean the paths to remove relative references wd, _ := os.Getwd() t.Logf("Launching bundled tor at %v", path.Clean(wd+"/../tmp/tor")) - acn, err := tor.NewTorACNWithAuth(path.Clean(wd+"/../tmp/data"), path.Clean(wd+"/../tmp/tor"), controlPort, tor.HashedPasswordAuthenticator{Password: password}) + acn, err := tor.NewTorACNWithAuth(path.Clean(wd+"/../tmp/data"), path.Clean(wd+"/../tmp/tor"), dataDir, controlPort, tor.HashedPasswordAuthenticator{Password: password}) if err != nil { t.Fatalf("tor failed to start: %v", err) } else { diff --git a/tor/torProvider.go b/tor/torProvider.go index d8ea076..14de1f5 100644 --- a/tor/torProvider.go +++ b/tor/torProvider.go @@ -12,7 +12,6 @@ import ( "git.openprivacy.ca/openprivacy/log" "golang.org/x/crypto/ed25519" "golang.org/x/crypto/sha3" - "io/ioutil" "net" "net/textproto" "os" @@ -73,6 +72,7 @@ type torProvider struct { lastRestartTime time.Time authenticator tor.Authenticator isClosed bool + dataDir string } func (ols *onionListenService) AddressFull() string { @@ -325,7 +325,7 @@ func (tp *torProvider) restart() { tp.t = nil log.Debugf("Restarting Tor Process") - newTp, err := startTor(tp.appDirectory, tp.bundeledTorPath, tp.controlPort, tp.authenticator) + newTp, err := startTor(tp.appDirectory, tp.bundeledTorPath, tp.dataDir, tp.controlPort, tp.authenticator) if err == nil { // we need to reassign tor, dialer and callback which will have changed by swapping out // the underlying connection. @@ -401,19 +401,14 @@ func (tp *torProvider) callStatusCallback(prog int, status string) { } // NewTorACNWithAuth creates/starts a Tor ACN and returns a usable ACN object -func NewTorACNWithAuth(appDirectory string, bundledTorPath string, controlPort int, authenticator tor.Authenticator) (connectivity.ACN, error) { - tp, err := startTor(appDirectory, bundledTorPath, controlPort, authenticator) +func NewTorACNWithAuth(appDirectory string, bundledTorPath string, dataDir string, controlPort int, authenticator tor.Authenticator) (connectivity.ACN, error) { + tp, err := startTor(appDirectory, bundledTorPath, dataDir, controlPort, authenticator) if err == nil { go tp.monitorRestart() } return tp, err } -// NewTorACN creates/starts a Tor ACN and returns a usable ACN object with a NullAuthenticator - this will fail. -func NewTorACN(appDirectory string, bundledTorPath string) (connectivity.ACN, error) { - return NewTorACNWithAuth(appDirectory, bundledTorPath, 9051, NullAuthenticator{}) -} - // 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) { @@ -450,15 +445,10 @@ func (tp *torProvider) checkVersion() error { return err } -func startTor(appDirectory string, bundledTorPath string, controlPort int, authenticator tor.Authenticator) (*torProvider, error) { +func startTor(appDirectory string, bundledTorPath string, dataDir string, controlPort int, authenticator tor.Authenticator) (*torProvider, error) { 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)} @@ -502,9 +492,9 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe return nil, fmt.Errorf("could not connect to or start Tor that met requirements (min Tor version 0.3.5.x)") } - err = tp.checkVersion() + err := tp.checkVersion() if err == nil { - tp.t.DeleteDataDirOnClose = true + tp.t.DeleteDataDirOnClose = false // caller is repsonsible for dealing with cached information... tp.dialer, err = tp.t.Dialer(context.TODO(), &tor.DialConf{Authenticator: tp.authenticator}) return tp, err } diff --git a/tor/torProvider_test.go b/tor/torProvider_test.go index 3c12575..cfcb79c 100644 --- a/tor/torProvider_test.go +++ b/tor/torProvider_test.go @@ -3,6 +3,7 @@ package tor import ( "fmt" "git.openprivacy.ca/openprivacy/log" + "io/ioutil" path "path/filepath" "testing" ) @@ -22,7 +23,14 @@ func TestTorProvider(t *testing.T) { NewTorrc().WithControlPort(9051).WithHashedPassword("examplehashedpassword").Build(path.Join("..", "testing", "tor", "torrc")) log.Debugf("setting tor path %v", torpath) - acn, err := NewTorACNWithAuth(path.Join("../testing/"), torpath, 9051, HashedPasswordAuthenticator{"examplehashedpassword"}) + + dataDir := "" + var err error + if dataDir, err = ioutil.TempDir(path.Join("..", "testing", "tor"), "data-dir-"); err != nil { + t.Fatalf("could not create data dir") + } + + acn, err := NewTorACNWithAuth(path.Join("../testing/"), torpath, dataDir, 9051, HashedPasswordAuthenticator{"examplehashedpassword"}) if err != nil { t.Error(err) return @@ -58,7 +66,7 @@ func TestTorProvider(t *testing.T) { _, err = acn.GetInfo("not_a_real_onion") if err == nil { - t.Fatalf("GetInfo for non existant onion should have errored") + t.Fatalf("GetInfo for non existent onion should have errored") } } else { From 1a402de50d305ae7d8ab83823ea0ec1738c52e26 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 17 Jan 2022 16:03:06 -0800 Subject: [PATCH 2/3] Fixup Testing Directories --- testing/launch_tor_integration_test.go | 2 +- tor/torProvider_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/launch_tor_integration_test.go b/testing/launch_tor_integration_test.go index 10d0669..d79656b 100644 --- a/testing/launch_tor_integration_test.go +++ b/testing/launch_tor_integration_test.go @@ -27,7 +27,7 @@ func TestLaunchTor(t *testing.T) { } dataDir := "" - if dataDir, err = ioutil.TempDir(path.Join("..", "testing", "tor"), "data-dir-"); err != nil { + if dataDir, err = ioutil.TempDir(path.Join("..", "testing"), "data-dir-"); err != nil { t.Fatalf("could not create data dir") } diff --git a/tor/torProvider_test.go b/tor/torProvider_test.go index cfcb79c..d6b8365 100644 --- a/tor/torProvider_test.go +++ b/tor/torProvider_test.go @@ -26,7 +26,7 @@ func TestTorProvider(t *testing.T) { dataDir := "" var err error - if dataDir, err = ioutil.TempDir(path.Join("..", "testing", "tor"), "data-dir-"); err != nil { + if dataDir, err = ioutil.TempDir(path.Join("..", "testing"), "data-dir-"); err != nil { t.Fatalf("could not create data dir") } From 8ad13a6b368a1ce319399d59e3a061a7fd5a7968 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Tue, 18 Jan 2022 12:43:47 -0800 Subject: [PATCH 3/3] createFromExisting does not delete data dir on close --- tor/torProvider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tor/torProvider.go b/tor/torProvider.go index 14de1f5..c7e398f 100644 --- a/tor/torProvider.go +++ b/tor/torProvider.go @@ -555,7 +555,7 @@ func createFromExisting(controlport *control.Conn, datadir string) *tor.Tor { Control: controlport, ProcessCancelFunc: nil, DataDir: datadir, - DeleteDataDirOnClose: true, + DeleteDataDirOnClose: false, DebugWriter: nil, StopProcessOnClose: false, GeoIPCreatedFile: "",