[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [meek/extension] Add meek-client-torbrowser program.
commit 7cba0a659c3abd4b92eb289b20263726d1c6d610
Author: David Fifield <david@xxxxxxxxxxxxxxx>
Date: Sun Apr 6 10:07:33 2014 -0700
Add meek-client-torbrowser program.
This program starts firefox with the meek-http-helper profile and then
starts meek-client set up to talk to it.
---
.gitignore | 1 +
meek-client-torbrowser/Makefile | 18 +++++
meek-client-torbrowser/linux.go | 10 +++
meek-client-torbrowser/mac.go | 10 +++
meek-client-torbrowser/main.go | 160 +++++++++++++++++++++++++++++++++++++
meek-client-torbrowser/windows.go | 10 +++
6 files changed, 209 insertions(+)
diff --git a/.gitignore b/.gitignore
index e085380..3d5729c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/meek-client/meek-client
+/meek-client-torbrowser/meek-client-torbrowser
/meek-server/meek-server
diff --git a/meek-client-torbrowser/Makefile b/meek-client-torbrowser/Makefile
new file mode 100644
index 0000000..7ce013b
--- /dev/null
+++ b/meek-client-torbrowser/Makefile
@@ -0,0 +1,18 @@
+DESTDIR =
+PREFIX = /usr/local
+BINDIR = $(PREFIX)/bin
+
+GOBUILDFLAGS =
+
+all: meek-client
+
+meek-client: *.go
+ go build $(GOBUILDFLAGS)
+
+clean:
+ rm -f meek-client-torbrowser
+
+fmt:
+ go fmt
+
+.PHONY: all install clean fmt
diff --git a/meek-client-torbrowser/linux.go b/meek-client-torbrowser/linux.go
new file mode 100644
index 0000000..73e363a
--- /dev/null
+++ b/meek-client-torbrowser/linux.go
@@ -0,0 +1,10 @@
+// +build linux
+// This file is compiled only on linux. It contains paths used by the linux
+// browser bundle.
+// http://golang.org/pkg/go/build/#hdr-Build_Constraints
+
+package main
+
+var firefoxPath = "Browser/firefox"
+var firefoxProfilePath = "Data/Browser/profile.meek-http-helper"
+var meekClientPath = "Tor/PluggableTransports/meek-client"
diff --git a/meek-client-torbrowser/mac.go b/meek-client-torbrowser/mac.go
new file mode 100644
index 0000000..6830da1
--- /dev/null
+++ b/meek-client-torbrowser/mac.go
@@ -0,0 +1,10 @@
+// +build darwin
+// This file is compiled only on mac. It contains paths used by the mac
+// browser bundle.
+// http://golang.org/pkg/go/build/#hdr-Build_Constraints
+
+package main
+
+var firefoxPath = "../Contents/MacOS/TorBrowser.app/Contents/MacOS/firefox"
+var firefoxProfilePath = "../Data/Browser/profile.meek-http-helper"
+var meekClientPath = "PluggableTransports/meek-client"
diff --git a/meek-client-torbrowser/main.go b/meek-client-torbrowser/main.go
new file mode 100644
index 0000000..8890f6d
--- /dev/null
+++ b/meek-client-torbrowser/main.go
@@ -0,0 +1,160 @@
+// The meek-client-torbrowser program starts a copy of Tor Browser running
+// meek-http-helper in a special profile, and then starts meek-client set up to
+// use the browser helper.
+//
+// Arguments to this program are passed unmodified to meek-client, with the
+// addition of a --helper option pointing to the browser helper.
+package main
+
+import (
+ "bufio"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "os/signal"
+ "path/filepath"
+ "regexp"
+ "syscall"
+)
+
+var helperAddrPattern *regexp.Regexp
+
+// Log a call to os.Process.Kill.
+func logKill(p *os.Process) error {
+ log.Printf("killing PID %d", p.Pid)
+ err := p.Kill()
+ if err != nil {
+ log.Print(err)
+ }
+ return err
+}
+
+// Log a call to os.Process.Signal.
+func logSignal(p *os.Process, sig os.Signal) error {
+ log.Printf("sending signal %s to PID %d", sig, p.Pid)
+ err := p.Signal(sig)
+ if err != nil {
+ log.Print(err)
+ }
+ return err
+}
+
+// Run firefox and return its exec.Cmd and stdout pipe.
+func runFirefox() (cmd *exec.Cmd, stdout io.Reader, err error) {
+ var profilePath string
+ // Mac OS X needs an absolute profile path.
+ profilePath, err = filepath.Abs(firefoxProfilePath)
+ if err != nil {
+ return
+ }
+ cmd = exec.Command(firefoxPath, "-no-remote", "-profile", profilePath)
+ cmd.Stderr = os.Stderr
+ stdout, err = cmd.StdoutPipe()
+ if err != nil {
+ return
+ }
+ log.Printf("running firefox command %q", cmd.Args)
+ err = cmd.Start()
+ if err != nil {
+ return
+ }
+ log.Printf("firefox started with pid %d", cmd.Process.Pid)
+ return cmd, stdout, nil
+}
+
+// Look for the magic meek-http-helper address string in the Reader, and return
+// the address it contains. Start a goroutine to continue reading and discarding
+// output of the Reader before returning.
+func grepHelperAddr(r io.Reader) (string, error) {
+ var helperAddr string
+ scanner := bufio.NewScanner(r)
+ for scanner.Scan() {
+ line := scanner.Text()
+ if m := helperAddrPattern.FindStringSubmatch(line); m != nil {
+ helperAddr = m[1]
+ break
+ }
+ }
+ err := scanner.Err()
+ if err != nil {
+ return "", err
+ }
+ // Ran out of input before finding the pattern.
+ if helperAddr == "" {
+ return "", io.EOF
+ }
+ // Keep reading from the browser to avoid its output buffer filling.
+ go io.Copy(ioutil.Discard, r)
+ return helperAddr, nil
+}
+
+// Run meek-client and return its exec.Cmd.
+func runMeekClient(helperAddr string) (cmd *exec.Cmd, err error) {
+ args := os.Args[1:]
+ args = append(args, []string{"--helper", helperAddr}...)
+ cmd = exec.Command(meekClientPath, args...)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ log.Printf("running meek-client command %q", cmd.Args)
+ err = cmd.Start()
+ if err != nil {
+ return
+ }
+ log.Printf("meek-client started with pid %d", cmd.Process.Pid)
+ return cmd, nil
+}
+
+func main() {
+ var err error
+
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
+
+ // This magic string is emitted by meek-http-helper.
+ helperAddrPattern, err = regexp.Compile(`^meek-http-helper: listen (127\.0\.0\.1:\d+)$`)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Start firefox.
+ firefoxCmd, stdout, err := runFirefox()
+ if err != nil {
+ log.Print(err)
+ return
+ }
+ defer logKill(firefoxCmd.Process)
+
+ // Find out the helper's listening address.
+ helperAddr, err := grepHelperAddr(stdout)
+ if err != nil {
+ log.Print(err)
+ return
+ }
+
+ // Start meek-client with the helper address.
+ meekClientCmd, err := runMeekClient(helperAddr)
+ if err != nil {
+ log.Print(err)
+ return
+ }
+ defer logKill(meekClientCmd.Process)
+
+ sig := <-sigChan
+ log.Printf("sig %s", sig)
+ err = logSignal(meekClientCmd.Process, sig)
+ if err != nil {
+ log.Print(err)
+ }
+
+ // If SIGINT, wait for a second SIGINT.
+ if sig == syscall.SIGINT {
+ sig := <-sigChan
+ log.Printf("sig %s", sig)
+ err = logSignal(meekClientCmd.Process, sig)
+ if err != nil {
+ log.Print(err)
+ }
+ }
+}
diff --git a/meek-client-torbrowser/windows.go b/meek-client-torbrowser/windows.go
new file mode 100644
index 0000000..ed590d8
--- /dev/null
+++ b/meek-client-torbrowser/windows.go
@@ -0,0 +1,10 @@
+// +build windows
+// This file is compiled only on windows. It contains paths used by the windows
+// browser bundle.
+// http://golang.org/pkg/go/build/#hdr-Build_Constraints
+
+package main
+
+var firefoxPath string = "Browser/firefox.exe"
+var firefoxProfilePath = "Data/Browser/profile.meek-http-helper"
+var meekClientPath = "Tor/PluggableTransports/meek-client.exe"
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits