Files
i2p.plugins.tor-updater/main.go

246 lines
7.1 KiB
Go
Raw Normal View History

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"
2022-02-07 21:38:54 -05:00
"fmt"
2022-01-16 14:45:43 -05:00
"log"
"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"
i2cpcheck "github.com/eyedeekay/checki2cp"
2022-02-08 18:31:32 -05:00
"github.com/itchio/damage"
"github.com/itchio/damage/hdiutil"
"github.com/itchio/headway/state"
tbget "i2pgit.org/idk/i2p.plugins.tor-manager/get"
tbserve "i2pgit.org/idk/i2p.plugins.tor-manager/serve"
2022-01-16 14:45:43 -05:00
)
2022-02-07 21:09:43 -05:00
/*
TODO: A "Default" config file which uses hardened Tor Browser for clearnet
(or default-route) browsing.
*/
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/*
//go:embed tor-browser/unpack/awo@eyedeekay.github.io.xpi
//go:embed tor-browser/TPO-signing-key.pub
2022-01-28 00:09:18 -05:00
//go:embed garliconion.png
//go:embed onion.png
//go:embed torbrowser.desktop
//go:embed i2ptorbrowser.desktop
2022-01-23 12:00:37 -05:00
var content embed.FS
func OS() string {
switch runtime.GOOS {
case "darwin":
2022-02-08 01:23:30 -05:00
return "osx"
case "linux":
return "linux"
case "windows":
return "win"
default:
return "unknown"
}
}
func ARCH() string {
2022-02-08 18:31:32 -05:00
// if OS() == "osx" {
// return ""
// }
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")
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")
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")
bemirror = flag.Bool("bemirror", false, "Act as an in-I2P mirror when you're done downloading")
shortcuts = flag.Bool("shortcuts", false, "Create desktop shortcuts")
apparmor = flag.Bool("apparmor", false, "Generate apparmor rules")
offline = flag.Bool("offline", false, "Work offline")
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
)
var client *tbserve.Client
func main() {
filename := filepath.Base(os.Args[0])
2022-02-07 21:09:43 -05:00
usage := flag.Usage
flag.Usage = func() {
2022-02-07 21:38:54 -05:00
fmt.Printf("Usage: %s %s\n", filename, "[options]")
fmt.Printf("\n")
fmt.Printf("Downloads, verifies and unpacks Tor Browser. Manages the Tor Browser\n")
fmt.Printf("system in environments where Tor is not in use.\n")
fmt.Printf("\n")
fmt.Printf("Options:\n")
fmt.Printf("\n")
2022-02-07 21:09:43 -05:00
usage()
}
2022-01-16 14:45:43 -05:00
flag.Parse()
tbget.WORKING_DIR = *directory
if filename == "i2pbrowser" {
log.Println("Starting I2P in Tor Browser")
*i2pbrowser = true
} else if filename == "torbrowser" {
log.Println("Starting Tor Browser")
*torbrowser = true
2022-02-07 21:09:43 -05:00
} else if filename == "i2pconfig" {
log.Println("Starting I2P routerconsole in Tor Browser")
*i2pconfig = true
} else if filename == "firefox" {
log.Println("Starting Firefox")
if *profile != "" {
*profile = filepath.Join(tbget.WORKING_DIR, "i2p.firefox")
}
log.Println("Using profile", *profile)
}
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)
}
var err error
client, err = tbserve.NewClient(*verbose, *lang, *system, *arch, &content)
if err != nil {
log.Fatal("Couldn't create client", err)
}
2022-02-07 21:17:05 -05:00
if *i2pbrowser || *i2pconfig {
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)
}
}
} 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.
//TODO: loop again until TestHTTPDefaultProxy is up
}
}
}
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
}
if *shortcuts {
err := CreateShortcuts()
if err != nil {
log.Fatal("Couldn't create desktop shortcuts", err)
}
}
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()
2022-02-08 18:31:32 -05:00
consumer := &state.Consumer{
OnMessage: func(lvl string, msg string) {
log.Printf("[%s] %s", lvl, msg)
},
}
host := hdiutil.NewHost(consumer)
defer damage.Unmount(host, client.TBD.BrowserDir())
2022-02-06 16:57:30 -05:00
// log.Fatalf("%s", client.TBS.PassThroughArgs)
if *help {
flag.Usage()
client.TBS.RunTBHelpWithLang()
return
}
2022-02-07 21:09:43 -05:00
if *profile != "" && !*offline {
log.Println("Using a custom profile")
2022-02-08 18:31:32 -05:00
if client.TBS.RunTBBWithProfile(*profile); err != nil {
log.Fatal(err)
}
2022-02-07 21:09:43 -05:00
} else if *offline {
if *profile == "" {
*profile = "firefox.offline"
}
log.Println("Working offline")
2022-02-08 18:31:32 -05:00
if client.TBS.RunTBBWithOfflineProfile(*profile, *offline); err != nil {
log.Fatal(err)
}
} else if *i2pbrowser {
2022-02-08 18:31:32 -05:00
if client.TBS.RunI2PBWithLang(); err != nil {
log.Fatal(err)
}
2022-02-06 16:57:30 -05:00
} else if *i2pconfig {
2022-02-08 18:31:32 -05:00
if client.TBS.RunI2PBAppWithLang(); err != nil {
log.Fatal(err)
}
2022-01-23 11:42:23 -05:00
} else if *torbrowser {
2022-02-08 18:31:32 -05:00
if err := client.TBS.RunTBWithLang(); err != nil {
log.Fatal(err)
}
2022-01-23 11:42:23 -05:00
} else {
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
}
}
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
}