Move DataDir Caching Responsibility to Caller to allow Cached Consensus
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is failing Details

This commit is contained in:
Sarah Jamie Lewis 2022-01-17 15:54:42 -08:00
parent 04dec3238b
commit 6d5d067d70
3 changed files with 24 additions and 20 deletions

View File

@ -3,6 +3,7 @@ package testing
import ( import (
"git.openprivacy.ca/openprivacy/connectivity/tor" "git.openprivacy.ca/openprivacy/connectivity/tor"
"git.openprivacy.ca/openprivacy/log" "git.openprivacy.ca/openprivacy/log"
"io/ioutil"
"math/rand" "math/rand"
"os" "os"
"path" "path"
@ -25,10 +26,15 @@ func TestLaunchTor(t *testing.T) {
t.Fatalf("failed to create torrc file: %v", err) 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 // Get the current working director, clean the paths to remove relative references
wd, _ := os.Getwd() wd, _ := os.Getwd()
t.Logf("Launching bundled tor at %v", path.Clean(wd+"/../tmp/tor")) 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 { if err != nil {
t.Fatalf("tor failed to start: %v", err) t.Fatalf("tor failed to start: %v", err)
} else { } else {

View File

@ -12,7 +12,6 @@ import (
"git.openprivacy.ca/openprivacy/log" "git.openprivacy.ca/openprivacy/log"
"golang.org/x/crypto/ed25519" "golang.org/x/crypto/ed25519"
"golang.org/x/crypto/sha3" "golang.org/x/crypto/sha3"
"io/ioutil"
"net" "net"
"net/textproto" "net/textproto"
"os" "os"
@ -73,6 +72,7 @@ type torProvider struct {
lastRestartTime time.Time lastRestartTime time.Time
authenticator tor.Authenticator authenticator tor.Authenticator
isClosed bool isClosed bool
dataDir string
} }
func (ols *onionListenService) AddressFull() string { func (ols *onionListenService) AddressFull() string {
@ -325,7 +325,7 @@ func (tp *torProvider) restart() {
tp.t = nil tp.t = nil
log.Debugf("Restarting Tor Process") 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 { if err == nil {
// we need to reassign tor, dialer and callback which will have changed by swapping out // we need to reassign tor, dialer and callback which will have changed by swapping out
// the underlying connection. // 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 // 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) { func NewTorACNWithAuth(appDirectory string, bundledTorPath string, dataDir string, controlPort int, authenticator tor.Authenticator) (connectivity.ACN, error) {
tp, err := startTor(appDirectory, bundledTorPath, controlPort, authenticator) tp, err := startTor(appDirectory, bundledTorPath, dataDir, controlPort, authenticator)
if err == nil { if err == nil {
go tp.monitorRestart() go tp.monitorRestart()
} }
return tp, err 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 // newHideCmd creates a Creator function for bine which generates a cmd that one windows will hide the dosbox
func newHideCmd(exePath string) process.Creator { func newHideCmd(exePath string) process.Creator {
return process.CmdCreatorFunc(func(ctx context.Context, args ...string) (*exec.Cmd, error) { return process.CmdCreatorFunc(func(ctx context.Context, args ...string) (*exec.Cmd, error) {
@ -450,15 +445,10 @@ func (tp *torProvider) checkVersion() error {
return err 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") torDir := path.Join(appDirectory, "tor")
os.MkdirAll(torDir, 0700) 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)} 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)") 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 { 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}) tp.dialer, err = tp.t.Dialer(context.TODO(), &tor.DialConf{Authenticator: tp.authenticator})
return tp, err return tp, err
} }

View File

@ -3,6 +3,7 @@ package tor
import ( import (
"fmt" "fmt"
"git.openprivacy.ca/openprivacy/log" "git.openprivacy.ca/openprivacy/log"
"io/ioutil"
path "path/filepath" path "path/filepath"
"testing" "testing"
) )
@ -22,7 +23,14 @@ func TestTorProvider(t *testing.T) {
NewTorrc().WithControlPort(9051).WithHashedPassword("examplehashedpassword").Build(path.Join("..", "testing", "tor", "torrc")) NewTorrc().WithControlPort(9051).WithHashedPassword("examplehashedpassword").Build(path.Join("..", "testing", "tor", "torrc"))
log.Debugf("setting tor path %v", torpath) 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 { if err != nil {
t.Error(err) t.Error(err)
return return
@ -58,7 +66,7 @@ func TestTorProvider(t *testing.T) {
_, err = acn.GetInfo("not_a_real_onion") _, err = acn.GetInfo("not_a_real_onion")
if err == nil { if err == nil {
t.Fatalf("GetInfo for non existant onion should have errored") t.Fatalf("GetInfo for non existent onion should have errored")
} }
} else { } else {