From c57734d65c91116508cbabb25d6f0e00457da5f6 Mon Sep 17 00:00:00 2001 From: idk Date: Tue, 15 Mar 2022 20:33:01 -0400 Subject: [PATCH] add a bunch of requested features, tor disablement, fix static builds --- Makefile | 11 +++++++++-- README.md | 2 +- get/get.go | 28 +++++++++++++++++++++++++++- get/torrent.go | 9 ++++++++- main.go | 16 +++++++++++----- serve/serve.go | 7 ++++--- 6 files changed, 60 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index ad54f57..4a04ce4 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ GOARCH?="amd64" ARG=-v -tags netgo -ldflags '-w' # -extldflags "-static"' #FLAGS=/usr/lib/x86_64-linux-gnu/libboost_system.a /usr/lib/x86_64-linux-gnu/libboost_date_time.a /usr/lib/x86_64-linux-gnu/libboost_filesystem.a /usr/lib/x86_64-linux-gnu/libboost_program_options.a /usr/lib/x86_64-linux-gnu/libssl.a /usr/lib/x86_64-linux-gnu/libcrypto.a /usr/lib/x86_64-linux-gnu/libz.a -#ARG=-ldflags '-w -linkmode=external -extldflags "-static -ldl $(FLAGS)"' +STATIC=-v -tags netgo -ldflags '-w -extldflags "-static"' #NOSTATIC=-v -tags netgo -ldflags '-w -extldflags "-ldl $(FLAGS)"' WINGUI=-ldflags '-H=windowsgui' @@ -29,7 +29,7 @@ winbinary: GOOS=windows go build $(WINGUI) -tags="netgo osusergo systray" -o $(BINARY)-$(GOOS)-$(GOARCH) . nosystray: - go build $(NOSTATIC) -tags="netgo osusergo nosystray" -o $(BINARY)-$(GOOS)-$(GOARCH) . + CGO_ENABLED=0 go build $(STATIC) -tags="netgo osusergo nosystray" -o $(BINARY)-$(GOOS)-$(GOARCH)-static . lint: golint supervise/*.go @@ -347,3 +347,10 @@ docker: xhost -e DISPLAY=unix$(DISPLAY) \ -v /tmp/.X11-unix:/tmp/.X11-unix \ --rm eyedeekay/i2p.plugins.tor-manager + +torrents: + ./i2p.plugins.tor-manager -nounpack -notor -os win + ./i2p.plugins.tor-manager -nounpack -notor -os osx + ./i2p.plugins.tor-manager -nounpack -notor -os linux + ./i2p.plugins.tor-manager -nounpack -notor -os win -arch 32 + ./i2p.plugins.tor-manager -nounpack -notor -os linux -arch 32 \ No newline at end of file diff --git a/README.md b/README.md index fe61776..8129d56 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ The plugin will not start a Tor instance if a SOCKS proxy is open on port 9050. 3. Set up an onion site which announces an I2P mirror exists - Works on Windows, Linux, OSX 4. Use Bittorrent-over-I2P to download the Tor Browser software - - Not Done, but pretty trivial. Fetch it from "somewhere", and drop it in the Snark directory. + - Worksish. Still a little janky. Usable on any platform if you're a little patient. 5. Embed jpackaged I2P routers and manage them internally - Works on Windows and Linux. Can be done on OSX but needs to be different. AMD64 only. 6. Encrypt the "Working directory" with all the plugin data using a password. diff --git a/get/get.go b/get/get.go index 4156e58..e0fb077 100644 --- a/get/get.go +++ b/get/get.go @@ -80,6 +80,7 @@ type TBDownloader struct { OS, ARCH string Mirror string Verbose bool + NoUnpack bool Profile *embed.FS listener net.Listener } @@ -608,6 +609,24 @@ func (t *TBDownloader) DownloadUpdaterForLang(ietf string) (string, string, stri } version := t.GetVersion() if strings.Contains(t.Mirror, "i2psnark") { + if !TorrentDownloaded() { + //t.Log("DownloadUpdaterForLang()", "Downloading torrent") + //Download the torrent files from their static locations. + i2psnark, err := FindSnarkDirectory() + if err != nil { + return "", "", "", err + } + asctorrent := filepath.Join(t.NamePerPlatform(ietf, version)+".asc", ".torrent") + _, err = t.SingleFileDownload("http://idk.i2p/torbrowser/"+asctorrent, filepath.Join(i2psnark, asctorrent), 0) + if err != nil { + return "", "", "", fmt.Errorf("DownloadUpdaterForLang: %s", err) + } + bintorrent := filepath.Join(t.NamePerPlatform(ietf, version), ".torrent") + _, err = t.SingleFileDownload("http://idk.i2p/torbrowser/"+bintorrent, filepath.Join(i2psnark, bintorrent), 0) + if err != nil { + return "", "", "", fmt.Errorf("DownloadUpdaterForLang: %s", err) + } + } for !TorrentDownloaded() { time.Sleep(time.Second * 10) log.Println("DownloadUpdaterForLang:", "Waiting for torrent to download") @@ -641,6 +660,9 @@ func (t *TBDownloader) BrowserDir() string { // UnpackUpdater unpacks the updater to the given path. // it returns the path or an erorr if one is encountered. func (t *TBDownloader) UnpackUpdater(binpath string) (string, error) { + if t.NoUnpack { + return binpath, nil + } t.Log("UnpackUpdater()", fmt.Sprintf("Unpacking %s", binpath)) if t.OS == "win" { installPath := t.BrowserDir() @@ -748,7 +770,11 @@ func (t *TBDownloader) CheckSignature(binpath, sigpath string) (string, error) { var err error if err = Verify(pk, sigpath, binpath); err == nil { log.Println("CheckSignature: signature", "verified successfully") - return t.UnpackUpdater(binpath) + if !t.NoUnpack { + return t.UnpackUpdater(binpath) + } + log.Printf("CheckSignature: %s", "NoUnpack set, skipping unpack") + return t.BrowserDir(), nil } return "", fmt.Errorf("CheckSignature: %s", err) } diff --git a/get/torrent.go b/get/torrent.go index a8113df..2bfbf0c 100644 --- a/get/torrent.go +++ b/get/torrent.go @@ -179,6 +179,7 @@ func TorrentPath() (string, string) { func TorrentDownloaded() bool { cmpsize := 8661000 + found := false if dir, err := FindSnarkDirectory(); err == nil { err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { @@ -189,12 +190,18 @@ func TorrentDownloaded() bool { if strings.HasPrefix(path, prefix) && strings.HasSuffix(path, suffix) { if info.Size() > int64(cmpsize) { log.Println("TorrentDownloaded: Torrent Download found:", path) + found = true return nil + } else { + return fmt.Errorf("TorrentDownloaded: Torrent Download found but size is too small: %s", path) } } return nil }) - return err == nil + if found { + return err == nil + } + return false } return false } diff --git a/main.go b/main.go index 193289c..de12fff 100644 --- a/main.go +++ b/main.go @@ -93,6 +93,7 @@ var ( password = flag.String("password", Password(), "Password to encrypt the working directory with. Implies -destruct, only the encrypted container will be saved.") chat = flag.Bool("chat", false, "Open a WebChat client") notor = flag.Bool("notor", false, "Do not automatically start Tor") + nounpack = flag.Bool("nounpack", false, "Do not unpack the Tor Browser") ptop = flag.Bool("p2p", tbget.TorrentDownloaded(), "Use bittorrent over I2P to download the initial copy of Tor Browser") ) @@ -137,7 +138,6 @@ func Mirror() string { if mir := os.Getenv("TOR_MANAGER_MIRROR"); mir != "" { return mir } - log.Println("No mirror specified, using default") if runtime.GOOS == "linux" && runtime.GOARCH == "arm64" { log.Println("Using arm64 mirror") return "https://sourceforge.net/projects/tor-browser-ports/files" @@ -287,7 +287,7 @@ func main() { } } var err error - client, err = tbserve.NewClient(*verbose, *lang, *system, *arch, *mirror, &content) + client, err = tbserve.NewClient(*verbose, *lang, *system, *arch, *mirror, &content, *nounpack) if err != nil { log.Fatal("Couldn't create client", err) } @@ -337,15 +337,21 @@ func main() { } return } - client.TBS.UnpackI2PAppData() - client.TBS.UnpackI2PData() if *torrent { log.Println("Generating I2P torrents of Tor packages") if err := client.TBD.GenerateMissingTorrents(); err != nil { log.Fatal(err) } } - if !*clearnet && !*notor { + client.TBS.UnpackI2PAppData() + client.TBS.UnpackI2PData() + if *nounpack { + log.Println("not unpacking, cannot continue") + os.Exit(0) + } + if !(*clearnet || *notor) { + log.Println("CLEARNET", *clearnet) + log.Println("NOTOR", *notor) client.TBS.RunTorWithLang() } diff --git a/serve/serve.go b/serve/serve.go index 7054db7..16ad21a 100644 --- a/serve/serve.go +++ b/serve/serve.go @@ -37,12 +37,13 @@ type Client struct { } // NewClient creates a new Client. -func NewClient(verbose bool, lang, OS, arch, mirror string, content *embed.FS) (*Client, error) { +func NewClient(verbose bool, lang, OS, arch, mirror string, content *embed.FS, nounpack bool) (*Client, error) { m := &Client{ TBD: tbget.NewTBDownloader(lang, OS, arch, content), } m.TBD.Mirror = mirror m.TBD.Verbose = verbose + m.TBD.NoUnpack = nounpack m.TBD.MakeTBDirectory() var err error m.Onion, err = i2pdotonion.NewOnionService(m.TBD.DownloadPath) @@ -91,7 +92,7 @@ func NewClient(verbose bool, lang, OS, arch, mirror string, content *embed.FS) ( log.Printf("Signature check passed: %s %s", tgz, sig) } m.TBS = TBSupervise.NewSupervisor(home, lang) - go m.TBS.RunTorWithLang() + //go m.TBS.RunTorWithLang() return m, nil } var home string @@ -105,7 +106,7 @@ func NewClient(verbose bool, lang, OS, arch, mirror string, content *embed.FS) ( log.Printf("Signature check passed: %s %s", tgz, sig) } m.TBS = TBSupervise.NewSupervisor(home, lang) - go m.TBS.RunTorWithLang() + //go m.TBS.RunTorWithLang() return m, nil }