2022-01-16 14:31:31 -05:00
|
|
|
package main
|
|
|
|
|
2022-01-16 14:45:43 -05:00
|
|
|
import (
|
2022-01-23 12:00:37 -05:00
|
|
|
"embed"
|
2022-01-16 14:45:43 -05:00
|
|
|
"flag"
|
|
|
|
"log"
|
2022-01-24 17:09:50 -05:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
2022-01-16 14:45:43 -05:00
|
|
|
|
2022-01-16 15:33:47 -05:00
|
|
|
"github.com/cloudfoundry/jibber_jabber"
|
2022-01-31 16:14:30 -05:00
|
|
|
i2cpcheck "github.com/eyedeekay/checki2cp"
|
2022-01-29 01:18:37 -05:00
|
|
|
tbget "i2pgit.org/idk/i2p.plugins.tor-manager/get"
|
2022-01-21 22:47:18 -05:00
|
|
|
tbserve "i2pgit.org/idk/i2p.plugins.tor-manager/serve"
|
2022-01-16 14:45:43 -05:00
|
|
|
)
|
|
|
|
|
2022-01-23 12:00:37 -05:00
|
|
|
//go:embed tor-browser/unpack/i2p.firefox/*
|
2022-02-06 16:57:30 -05:00
|
|
|
//go:embed tor-browser/unpack/i2p.firefox.config/*
|
2022-02-07 16:57:13 -05:00
|
|
|
//go:embed tor-browser/unpack/awo@eyedeekay.github.io.xpi
|
2022-01-23 13:40:14 -05:00
|
|
|
//go:embed tor-browser/TPO-signing-key.pub
|
2022-01-28 00:09:18 -05:00
|
|
|
//go:embed garliconion.png
|
|
|
|
//go:embed onion.png
|
2022-01-30 16:45:50 -05:00
|
|
|
//go:embed torbrowser.desktop
|
|
|
|
//go:embed i2ptorbrowser.desktop
|
2022-01-23 12:00:37 -05:00
|
|
|
var content embed.FS
|
|
|
|
|
2022-01-24 17:09:50 -05:00
|
|
|
func OS() string {
|
|
|
|
switch runtime.GOOS {
|
|
|
|
case "darwin":
|
|
|
|
return "mac"
|
|
|
|
case "linux":
|
|
|
|
return "linux"
|
|
|
|
case "windows":
|
|
|
|
return "win"
|
|
|
|
default:
|
|
|
|
return "unknown"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ARCH() string {
|
|
|
|
switch runtime.GOARCH {
|
|
|
|
case "386":
|
|
|
|
return "32"
|
|
|
|
case "amd64":
|
|
|
|
return "64"
|
|
|
|
default:
|
|
|
|
return "unknown"
|
|
|
|
}
|
|
|
|
}
|
2022-01-16 21:22:04 -05:00
|
|
|
|
2022-01-16 14:45:43 -05:00
|
|
|
var (
|
2022-01-23 11:42:23 -05:00
|
|
|
lang = flag.String("lang", "", "Language to download")
|
2022-01-24 17:09:50 -05:00
|
|
|
system = flag.String("os", OS(), "OS/arch to download")
|
|
|
|
arch = flag.String("arch", ARCH(), "OS/arch to download")
|
2022-01-23 11:42:23 -05:00
|
|
|
i2pbrowser = flag.Bool("i2pbrowser", false, "Open I2P in Tor Browser")
|
2022-02-06 16:57:30 -05:00
|
|
|
i2pconfig = flag.Bool("i2pconfig", false, "Open I2P routerconsole in Tor Browser with javscript enabled and non-routerconsole sites disabled")
|
2022-01-23 11:42:23 -05:00
|
|
|
torbrowser = flag.Bool("torbrowser", false, "Open Tor Browser")
|
2022-01-27 22:41:30 -05:00
|
|
|
verbose = flag.Bool("verbose", false, "Verbose output")
|
2022-01-29 01:18:37 -05:00
|
|
|
directory = flag.String("directory", "", "Directory operate in")
|
|
|
|
host = flag.String("host", "127.0.0.1", "Host to serve on")
|
|
|
|
port = flag.Int("port", 7695, "Port to serve on")
|
2022-01-30 16:45:50 -05:00
|
|
|
bemirror = flag.Bool("bemirror", false, "Act as an in-I2P mirror when you're done downloading")
|
|
|
|
shortcuts = flag.Bool("shortcuts", false, "Create desktop shortcuts")
|
2022-01-31 02:09:02 -05:00
|
|
|
apparmor = flag.Bool("apparmor", false, "Generate apparmor rules")
|
2022-02-07 16:57:13 -05:00
|
|
|
offline = flag.Bool("offline", false, "Work offline")
|
2022-02-07 16:18:55 -05:00
|
|
|
profile = flag.String("profile", "", "use a custom profile path, normally blank")
|
|
|
|
help = flag.Bool("help", false, "Print help")
|
2022-01-16 21:22:04 -05:00
|
|
|
/*mirror = flag.String("mirror", "", "Mirror to use")*/
|
2022-01-16 14:45:43 -05:00
|
|
|
)
|
2022-01-16 14:34:46 -05:00
|
|
|
|
2022-01-31 02:09:02 -05:00
|
|
|
var client *tbserve.Client
|
|
|
|
|
2022-01-16 14:31:31 -05:00
|
|
|
func main() {
|
2022-01-24 17:09:50 -05:00
|
|
|
filename := filepath.Base(os.Args[0])
|
2022-02-07 16:18:55 -05:00
|
|
|
flag.Usage = func() {
|
|
|
|
log.Println(`
|
|
|
|
Usage of ./i2p.plugins.tor-manager-linux-amd64:
|
|
|
|
-apparmor
|
|
|
|
Generate apparmor rules
|
|
|
|
-arch string
|
|
|
|
OS/arch to download (default "64")
|
|
|
|
-bemirror
|
|
|
|
Act as an in-I2P mirror when you're done downloading
|
|
|
|
-directory string
|
|
|
|
Directory operate in
|
|
|
|
-host string
|
|
|
|
Host to serve on (default "127.0.0.1")
|
|
|
|
-i2pbrowser
|
|
|
|
Open I2P in Tor Browser
|
|
|
|
-i2pconfig
|
|
|
|
Open I2P routerconsole in Tor Browser with javscript enabled and non-routerconsole sites disabled
|
|
|
|
-lang string
|
|
|
|
Language to download
|
|
|
|
-os string
|
|
|
|
OS/arch to download (default "linux")
|
|
|
|
-port int
|
|
|
|
Port to serve on (default 7695)
|
|
|
|
-profile string
|
|
|
|
use a custom profile path, normally blank
|
|
|
|
-shortcuts
|
|
|
|
Create desktop shortcuts
|
|
|
|
-torbrowser
|
|
|
|
Open Tor Browser
|
|
|
|
-verbose
|
|
|
|
Verbose output
|
|
|
|
-watch-profiles string
|
2022-02-07 16:57:13 -05:00
|
|
|
Monitor and control these Firefox profiles. Temporarily Unused.
|
|
|
|
-help
|
|
|
|
Print help
|
|
|
|
-offline
|
|
|
|
Work offline`)
|
2022-02-07 16:18:55 -05:00
|
|
|
}
|
2022-01-16 14:45:43 -05:00
|
|
|
flag.Parse()
|
2022-01-29 01:18:37 -05:00
|
|
|
tbget.WORKING_DIR = *directory
|
2022-01-24 17:09:50 -05:00
|
|
|
if filename == "i2pbrowser" {
|
|
|
|
log.Println("Starting I2P in Tor Browser")
|
|
|
|
*i2pbrowser = true
|
|
|
|
} else if filename == "torbrowser" {
|
|
|
|
log.Println("Starting Tor Browser")
|
|
|
|
*torbrowser = true
|
|
|
|
}
|
|
|
|
if *i2pbrowser && *torbrowser {
|
2022-01-23 11:42:23 -05:00
|
|
|
log.Fatal("Please don't open I2P and Tor Browser at the same time when running from the terminal.")
|
|
|
|
}
|
2022-01-16 15:33:47 -05:00
|
|
|
if *lang == "" {
|
|
|
|
var err error
|
|
|
|
*lang, err = jibber_jabber.DetectIETF()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Please specify a language", err)
|
|
|
|
}
|
|
|
|
log.Println("Using auto-detected language", *lang)
|
|
|
|
}
|
2022-01-31 02:09:02 -05:00
|
|
|
var err error
|
|
|
|
client, err = tbserve.NewClient(*verbose, *lang, *system, *arch, &content)
|
2022-01-16 14:31:31 -05:00
|
|
|
if err != nil {
|
2022-01-21 22:47:18 -05:00
|
|
|
log.Fatal("Couldn't create client", err)
|
2022-01-16 14:31:31 -05:00
|
|
|
}
|
2022-02-07 15:53:16 -05:00
|
|
|
if *i2pbrowser {
|
|
|
|
if tbget.TestHTTPDefaultProxy() {
|
|
|
|
log.Println("I2P HTTP proxy OK")
|
|
|
|
} else {
|
|
|
|
log.Println("I2P HTTP proxy not OK")
|
|
|
|
run, err := i2cpcheck.ConditionallyLaunchI2P()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Couldn't launch I2P", err)
|
|
|
|
}
|
|
|
|
if run {
|
|
|
|
if tbget.TestHTTPDefaultProxy() {
|
|
|
|
log.Println("I2P HTTP proxy OK after launching I2P")
|
|
|
|
} else {
|
|
|
|
go proxy()
|
|
|
|
if !tbget.TestHTTPBackupProxy() {
|
|
|
|
log.Fatal("Please set the I2P HTTP proxy on localhost:4444", err)
|
|
|
|
}
|
2022-01-31 16:14:30 -05:00
|
|
|
}
|
2022-02-07 15:53:16 -05:00
|
|
|
} else {
|
|
|
|
log.Fatal("Failed to run I2P", err)
|
2022-02-07 16:46:36 -05:00
|
|
|
//TODO: Link libi2pd and start our own router if we cant find one anywhere.
|
2022-02-07 16:57:13 -05:00
|
|
|
//TODO: loop again until TestHTTPDefaultProxy is up
|
2022-01-31 16:14:30 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-01-31 02:09:02 -05:00
|
|
|
if *apparmor {
|
|
|
|
err := GenerateAppArmor()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Couldn't generate apparmor rules", err)
|
|
|
|
}
|
|
|
|
log.Println("################################################################")
|
|
|
|
log.Println("# AppArmor rules generated successfully #")
|
|
|
|
log.Println("################################################################")
|
|
|
|
log.Println("!IMPORTANT! You must now run the following commands:")
|
|
|
|
log.Println("sudo mkdir -p /etc/apparmor.d/tunables/")
|
|
|
|
log.Println("sudo cp tunables.torbrowser.apparmor /etc/apparmor.d/tunables/torbrowser")
|
|
|
|
log.Println("sudo cp torbrowser.Tor.tor.apparmor /etc/apparmor.d/torbrowser.Tor.tor")
|
|
|
|
log.Println("sudo cp torbrowser.Browser.firefox.apparmor /etc/apparmor.d/torbrowser.Browser.firefox")
|
|
|
|
log.Println("sudo apparmor_parser -r /etc/apparmor.d/tunables/torbrowser")
|
|
|
|
log.Println("sudo apparmor_parser -r /etc/apparmor.d/torbrowser.Tor.tor")
|
|
|
|
log.Println("sudo apparmor_parser -r /etc/apparmor.d/torbrowser.Browser.firefox")
|
|
|
|
log.Println("To copy them to apparmor profiles directory and reload AppArmor")
|
|
|
|
return
|
|
|
|
}
|
2022-01-30 16:45:50 -05:00
|
|
|
if *shortcuts {
|
|
|
|
err := CreateShortcuts()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Couldn't create desktop shortcuts", err)
|
|
|
|
}
|
|
|
|
}
|
2022-01-29 01:18:37 -05:00
|
|
|
client.Host = *host
|
|
|
|
client.Port = *port
|
2022-01-23 12:00:37 -05:00
|
|
|
client.TBS.Profile = &content
|
2022-02-06 16:57:30 -05:00
|
|
|
client.TBS.PassThroughArgs = flag.Args()
|
|
|
|
// log.Fatalf("%s", client.TBS.PassThroughArgs)
|
2022-02-07 16:18:55 -05:00
|
|
|
if *help {
|
|
|
|
flag.Usage()
|
|
|
|
client.TBS.RunTBHelpWithLang()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if *profile != "" {
|
|
|
|
if tbget.FileExists(*profile) {
|
|
|
|
client.TBS.RunTBBWithProfile(*profile)
|
|
|
|
}
|
|
|
|
} else if *i2pbrowser {
|
2022-01-23 11:42:23 -05:00
|
|
|
client.TBS.RunI2PBWithLang()
|
2022-02-06 16:57:30 -05:00
|
|
|
} else if *i2pconfig {
|
|
|
|
client.TBS.RunI2PBAppWithLang()
|
2022-01-23 11:42:23 -05:00
|
|
|
} else if *torbrowser {
|
|
|
|
client.TBS.RunTBWithLang()
|
|
|
|
} else {
|
2022-01-29 01:18:37 -05:00
|
|
|
if *bemirror {
|
|
|
|
go client.TBD.Serve()
|
|
|
|
}
|
2022-01-23 11:42:23 -05:00
|
|
|
if err := client.Serve(); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2022-01-16 21:22:04 -05:00
|
|
|
}
|
2022-01-16 14:31:31 -05:00
|
|
|
}
|
2022-01-30 16:45:50 -05:00
|
|
|
|
|
|
|
func pathToMe() (string, error) {
|
|
|
|
ex, err := os.Executable()
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
exPath, err := filepath.Abs(ex)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return exPath, nil
|
|
|
|
}
|