diff --git a/go.mod b/go.mod index 51c4a83..f7462f5 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,8 @@ require ( golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce ) +require github.com/go-ole/go-ole v1.2.6 // indirect + require ( github.com/eyedeekay/sam3 v0.32.32 github.com/justinas/nosurf v1.1.1 diff --git a/go.sum b/go.sum index 743cb87..3f4b314 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/eyedeekay/sam3 v0.32.32/go.mod h1:qRA9KIIVxbrHlkj+ZB+OoxFGFgdKeGp1vSg github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -82,6 +84,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/link_linux.go b/link_linux.go new file mode 100644 index 0000000..f1a9467 --- /dev/null +++ b/link_linux.go @@ -0,0 +1,58 @@ +package main + +import ( + "io/ioutil" + "log" + "os/user" + "path/filepath" +) + +func DesktopDirectory() (string, error) { + myself, err := user.Current() + if err != nil { + return "", err + } + homedir := myself.HomeDir + desktop := filepath.Join(homedir, ".local", "share", "applications") + return desktop, nil +} + +func CreateShortcuts() error { + desktopDir, err := DesktopDirectory() + if err != nil { + return err + } + torBrowserPath, err := pathToMe() + if err != nil { + return err + } + tordesktop := filepath.Join(desktopDir, "torbrowser.desktop") + torbrowserShortcut := torBrowserPath + " -torbrowser" + if err := makeLink(torbrowserShortcut, tordesktop); err != nil { + return err + } + i2pbrowserPath := torBrowserPath + " -i2pbrowser" + i2pdesktop := filepath.Join(desktopDir, "i2ptorbrowser.desktop") + if err := makeLink(i2pbrowserPath, i2pdesktop); err != nil { + return err + } + return nil +} + +func desktopTemplate(command string) string { + return `[Desktop Entry] +Encoding=UTF-8 +Version=1.0 +Type=Application +Terminal=false +Exec=/bin/sh -c "` + command + `" +Name=Tor Browser +Categories=Network;WebBrowser; +Icon=/var/lib/i2pbrowser/icons/onion.png +` +} + +func makeLink(src, dst string) error { + log.Println("Creating desktop shortcut:", dst) + return ioutil.WriteFile(dst, []byte(desktopTemplate(src)), 0644) +} diff --git a/link_windows.go b/link_windows.go new file mode 100644 index 0000000..7b094b5 --- /dev/null +++ b/link_windows.go @@ -0,0 +1,62 @@ +package main + +import ( + "github.com/go-ole/go-ole" + "github.com/go-ole/go-ole/oleutil" + "os/user" + "path/filepath" +) + +func DesktopDirectory() (string, error) { + myself, error := user.Current() + if error != nil { + return "", error + } + homedir := myself.HomeDir + desktop := filepath.Join(homedir, "Desktop") + return desktop, nil +} + +func CreateShortcuts() error { + desktopDir, err := DesktopDirectory() + if err != nil { + return err + } + desktop := filepath.Join(desktopDir, "torbrowser.lnk") + torBrowserPath, err := pathToMe() + if err != nil { + return err + } + torbrowserShortcut := torBrowserPath + " -torbrowser" + if err := makeLink(torbrowserShortcut, desktop); err != nil { + return err + } + i2pBrowserPath := torBrowserPath + " -i2pbrowser" + if err := makeLink(i2pBrowserPath, desktop); err != nil { + return err + } + return nil +} + +func makeLink(src, dst string) error { + log.Println("Creating desktop shortcut:", dst) + ole.CoInitializeEx(0, ole.COINIT_APARTMENTTHREADED|ole.COINIT_SPEED_OVER_MEMORY) + oleShellObject, err := oleutil.CreateObject("WScript.Shell") + if err != nil { + return err + } + defer oleShellObject.Release() + wshell, err := oleShellObject.QueryInterface(ole.IID_IDispatch) + if err != nil { + return err + } + defer wshell.Release() + cs, err := oleutil.CallMethod(wshell, "CreateShortcut", dst) + if err != nil { + return err + } + idispatch := cs.ToIDispatch() + oleutil.PutProperty(idispatch, "TargetPath", src) + oleutil.CallMethod(idispatch, "Save") + return nil +} diff --git a/main.go b/main.go index bc93fd4..750e277 100644 --- a/main.go +++ b/main.go @@ -17,6 +17,8 @@ import ( //go:embed tor-browser/TPO-signing-key.pub //go:embed garliconion.png //go:embed onion.png +//go:embed torbrowser.desktop +//go:embed i2ptorbrowser.desktop var content embed.FS func OS() string { @@ -53,8 +55,9 @@ var ( 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") /*mirror = flag.String("mirror", "", "Mirror to use")*/ - bemirror = flag.Bool("bemirror", false, "Act as an in-I2P mirror when you're done downloading") ) func main() { @@ -83,6 +86,12 @@ func main() { if err != nil { log.Fatal("Couldn't create client", err) } + if *shortcuts { + err := CreateShortcuts() + if err != nil { + log.Fatal("Couldn't create desktop shortcuts", err) + } + } client.Host = *host client.Port = *port client.TBS.Profile = &content @@ -99,3 +108,15 @@ func main() { } } } + +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 +}