Browse Source

Merge branch 'tor' of cwtch.im/cwtch into master

Sarah Jamie Lewis 1 year ago
parent
commit
44384d1cec

+ 4 - 2
app/app.go

@@ -8,7 +8,8 @@ import (
 
 // Application is a facade over a cwtchPeer that provides some wrapping logic.
 type Application struct {
-	Peer peer.CwtchPeerInterface
+	Peer       peer.CwtchPeerInterface
+	TorManager *tor.Manager
 }
 
 // NewProfile creates a new cwtchPeer with a given name.
@@ -42,10 +43,11 @@ func (app *Application) SetProfile(filename string, password string) error {
 	app.Peer = profile
 	if err == nil {
 
-		_, err := tor.NewTorManager(9050, 9051)
+		tm, err := tor.NewTorManager(9050, 9051)
 		if err != nil {
 			return err
 		}
+		app.TorManager = tm
 
 		go func() {
 			err := app.Peer.Listen()

+ 11 - 1
app/cli/main.go

@@ -10,6 +10,7 @@ import (
 
 	"bytes"
 	"golang.org/x/crypto/ssh/terminal"
+	"os"
 	"syscall"
 )
 
@@ -428,7 +429,16 @@ func main() {
 			}
 		}
 		if profilefile != "" {
-			app.Peer.Save(profilefile)
+			if app.Peer != nil {
+				app.Peer.Save(profilefile)
+			}
 		}
 	}
+
+	if app.TorManager != nil {
+		fmt.Println("Shutting down Tor process...")
+		app.TorManager.Shutdown()
+	}
+	os.Exit(0)
+
 }

+ 48 - 0
connectivity/tor/tormanager.go

@@ -4,9 +4,14 @@ import (
 	"errors"
 	"fmt"
 	"github.com/yawning/bulb"
+	"log"
 	"net"
 	"net/http"
 	"net/url"
+	"os"
+	"os/exec"
+	"os/user"
+	"path"
 	"strings"
 	"time"
 )
@@ -15,6 +20,7 @@ import (
 type Manager struct {
 	socksPort   int
 	controlPort int
+	process     *exec.Cmd
 }
 
 // NewTorManager Instantiates a new connection manager, returns non-nil error if it fails to connect to a tor daemon on the given ports.
@@ -23,6 +29,39 @@ func NewTorManager(socksPort int, controlPort int) (*Manager, error) {
 	torManager.socksPort = socksPort
 	torManager.controlPort = controlPort
 	err := torManager.TestConnection()
+
+	if err != nil {
+
+		usr, err := user.Current()
+		if err != nil {
+			return nil, err
+		}
+
+		torrc := path.Join(usr.HomeDir, ".cwtch", "torrc")
+		if _, err := os.Stat(torrc); os.IsNotExist(err) {
+
+			os.MkdirAll(path.Join(usr.HomeDir, ".cwtch"), 0700)
+
+			file, err := os.Create(torrc)
+			if err != nil {
+				return nil, err
+			}
+			fmt.Fprintf(file, "SOCKSPort %d\nControlPort %d\n", socksPort, controlPort)
+			file.Close()
+		}
+
+		cmd := exec.Command("tor", "-f", torrc)
+		err = cmd.Start()
+		if err != nil {
+			return nil, err
+		}
+		fmt.Printf("\nWaiting to connect to Tor Proxy...\n")
+		time.Sleep(time.Second * 5)
+		torManager.process = cmd
+		err = torManager.TestConnection()
+		return torManager, err
+	}
+
 	return torManager, err
 }
 
@@ -35,6 +74,15 @@ const (
 	proxyStatusTimeout
 )
 
+// Shutdown kills the managed Tor Process
+func (tm *Manager) Shutdown() {
+	if tm.process != nil {
+		if err := tm.process.Process.Kill(); err != nil {
+			log.Fatal("failed to kill process: ", err)
+		}
+	}
+}
+
 // Detect whether a proxy is connectable and is a Tor proxy
 func checkTorProxy(proxyAddress string) proxyStatus {
 	// A trick to do this without making an outward connection is,

+ 1 - 1
model/group.go

@@ -5,8 +5,8 @@ import (
 	"cwtch.im/cwtch/protocol"
 	"errors"
 	"fmt"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
+	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/nacl/secretbox"
 	"io"
 	"sync"

+ 1 - 1
model/profile.go

@@ -6,8 +6,8 @@ import (
 	"cwtch.im/cwtch/protocol"
 	"encoding/asn1"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
+	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/ed25519"
 	"io"
 	"sync"

+ 1 - 1
peer/connections/peerpeerconnection.go

@@ -1,13 +1,13 @@
 package connections
 
 import (
+	"cwtch.im/cwtch/model"
 	"cwtch.im/cwtch/peer/peer"
 	"cwtch.im/cwtch/protocol"
 	"git.openprivacy.ca/openprivacy/libricochet-go"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/connection"
 	"git.openprivacy.ca/openprivacy/libricochet-go/identity"
-	"cwtch.im/cwtch/model"
 	"log"
 	"time"
 )

+ 2 - 2
peer/cwtch_peer_test.go

@@ -6,10 +6,10 @@ import (
 
 func TestCwtchPeerGenerate(t *testing.T) {
 
-	alice := NewCwtchPeer("alice","testpass")
+	alice := NewCwtchPeer("alice", "testpass")
 	alice.Save("./test_profile")
 
-	aliceLoaded, err := LoadCwtchPeer("./test_profile","testpass")
+	aliceLoaded, err := LoadCwtchPeer("./test_profile", "testpass")
 	if err != nil || aliceLoaded.GetProfile().Name != "alice" {
 		t.Errorf("something went wrong saving and loading profiles %v %v", err, aliceLoaded)
 	}

+ 1 - 1
peer/fetch/peer_fetch_channel.go

@@ -3,10 +3,10 @@ package fetch
 import (
 	"cwtch.im/cwtch/protocol"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 )
 
 // CwtchPeerFetchChannel is the peer implementation of the im.cwtch.server.fetch

+ 1 - 1
peer/fetch/peer_fetch_channel_test.go

@@ -2,9 +2,9 @@ package fetch
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 	"time"
 )

+ 1 - 1
peer/listen/peer_listen_channel.go

@@ -3,10 +3,10 @@ package listen
 import (
 	"cwtch.im/cwtch/protocol"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 )
 
 // CwtchPeerListenChannel is the peer implementation of im.cwtch.server.listen

+ 1 - 1
peer/listen/peer_listen_channel_test.go

@@ -2,9 +2,9 @@ package listen
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 	"time"
 )

+ 1 - 1
peer/peer/peer_channel.go

@@ -2,10 +2,10 @@ package peer
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"log"
 )
 

+ 1 - 1
peer/peer/peer_channel_test.go

@@ -2,9 +2,9 @@ package peer
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 )
 

+ 1 - 1
peer/send/peer_send_channel.go

@@ -4,10 +4,10 @@ import (
 	"cwtch.im/cwtch/protocol"
 	"cwtch.im/cwtch/protocol/spam"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 )
 
 // CwtchPeerSendChannel is the peer implementation of im.cwtch.server.send

+ 1 - 1
peer/send/peer_send_channel_test.go

@@ -3,9 +3,9 @@ package send
 import (
 	"cwtch.im/cwtch/protocol"
 	"cwtch.im/cwtch/protocol/spam"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 )
 

+ 1 - 1
protocol/spam/spamguard.go

@@ -4,9 +4,9 @@ import (
 	"crypto/rand"
 	"crypto/sha256"
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"io"
 	//"fmt"
 )

+ 1 - 1
protocol/spam/spamguard_test.go

@@ -2,8 +2,8 @@ package spam
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 )
 

+ 1 - 1
server/fetch/server_fetch_channel.go

@@ -3,10 +3,10 @@ package fetch
 import (
 	"cwtch.im/cwtch/protocol"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 )
 
 // CwtchServerFetchChannel implements the ChannelHandler interface for a channel of

+ 1 - 1
server/fetch/server_fetch_channel_test.go

@@ -2,9 +2,9 @@ package fetch
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 )
 

+ 1 - 1
server/listen/server_listen_channel.go

@@ -3,10 +3,10 @@ package listen
 import (
 	"cwtch.im/cwtch/protocol"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/utils"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 )
 
 // CwtchServerListenChannel implements the ChannelHandler interface for a channel of

+ 1 - 1
server/listen/server_listen_channel_test.go

@@ -2,9 +2,9 @@ package listen
 
 import (
 	"cwtch.im/cwtch/protocol"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 )
 

+ 1 - 1
server/send/server_send_channel.go

@@ -4,9 +4,9 @@ import (
 	"cwtch.im/cwtch/protocol"
 	"cwtch.im/cwtch/protocol/spam"
 	"errors"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"log"
 )
 

+ 1 - 1
server/send/server_send_channel_test.go

@@ -3,9 +3,9 @@ package send
 import (
 	"cwtch.im/cwtch/protocol"
 	"cwtch.im/cwtch/protocol/spam"
-	"github.com/golang/protobuf/proto"
 	"git.openprivacy.ca/openprivacy/libricochet-go/channels"
 	"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
+	"github.com/golang/protobuf/proto"
 	"testing"
 )
 

+ 3 - 3
testing/cwtch_peer_server_intergration_test.go

@@ -143,17 +143,17 @@ func TestCwtchPeerIntegration(t *testing.T) {
 	// ***** Peer setup *****
 
 	fmt.Println("Creating Alice...")
-	alice := peer.NewCwtchPeer("Alice","alicepass")
+	alice := peer.NewCwtchPeer("Alice", "alicepass")
 	go alice.Listen()
 	fmt.Println("Alice created:", alice.GetProfile().Onion)
 
 	fmt.Println("Creating Bob...")
-	bob := peer.NewCwtchPeer("Bob","bobpass")
+	bob := peer.NewCwtchPeer("Bob", "bobpass")
 	go bob.Listen()
 	fmt.Println("Bob created:", bob.GetProfile().Onion)
 
 	fmt.Println("Creating Carol...")
-	carol := peer.NewCwtchPeer("Carol","carolpass")
+	carol := peer.NewCwtchPeer("Carol", "carolpass")
 	go carol.Listen()
 	fmt.Println("Carol created:", carol.GetProfile().Onion)
 

+ 4 - 0
testing/quality.sh

@@ -10,3 +10,7 @@ echo ""
 echo "Linting:"
 
 go list ./... | xargs golint
+
+
+echo "Time to format"
+gofmt -l -s -w .