From d38a88be8e94873187c3b82e9b3827faa3875541 Mon Sep 17 00:00:00 2001 From: davy wybiral Date: Wed, 3 Jul 2019 16:46:59 -0500 Subject: Tor (#12) * added tor support * change text --- pkg/app/app.go | 31 +++++++++++++++++++++++++++++++ pkg/app/config.go | 21 +++++++++++++++++++++ pkg/app/tor.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 pkg/app/tor.go (limited to 'pkg/app') diff --git a/pkg/app/app.go b/pkg/app/app.go index 22ad91f..57c0aa4 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -16,6 +16,7 @@ import ( "github.com/gorilla/feeds" "github.com/gorilla/mux" "github.com/wybiral/tube/pkg/media" + "github.com/wybiral/tube/pkg/onionkey" ) // App represents main application. @@ -24,6 +25,7 @@ type App struct { Library *media.Library Watcher *fsnotify.Watcher Templates *template.Template + Tor *tor Listener net.Listener Router *mux.Router } @@ -52,6 +54,14 @@ func NewApp(cfg *Config) (*App, error) { a.Listener = ln // Setup Templates a.Templates = template.Must(template.ParseGlob("templates/*")) + // Setup Tor + if cfg.Tor.Enable { + t, err := newTor(cfg.Tor) + if err != nil { + return nil, err + } + a.Tor = t + } // Setup Router r := mux.NewRouter().StrictSlash(true) r.HandleFunc("/", a.indexHandler).Methods("GET") @@ -74,6 +84,27 @@ func NewApp(cfg *Config) (*App, error) { // Run imports the library and starts server. func (a *App) Run() error { + if a.Tor != nil { + var err error + cs := a.Config.Server + key := a.Tor.OnionKey + if key == nil { + key, err = onionkey.GenerateKey() + if err != nil { + return err + } + } + onion, err := key.Onion() + if err != nil { + return err + } + onion.Ports[80] = fmt.Sprintf("%s:%d", cs.Host, cs.Port) + err = a.Tor.Controller.AddOnion(onion) + if err != nil { + return err + } + log.Printf("Onion service: http://%s.onion", onion.ServiceID) + } for _, pc := range a.Config.Library { p := &media.Path{ Path: pc.Path, diff --git a/pkg/app/config.go b/pkg/app/config.go index c2ecb45..ec27435 100644 --- a/pkg/app/config.go +++ b/pkg/app/config.go @@ -10,6 +10,7 @@ type Config struct { Library []*PathConfig `json:"library"` Server *ServerConfig `json:"server"` Feed *FeedConfig `json:"feed"` + Tor *TorConfig `json:"tor,omitempty"` } // PathConfig settings for media library path. @@ -37,6 +38,19 @@ type FeedConfig struct { Copyright string `json:"copyright"` } +// TorConfig stores tor configuration. +type TorConfig struct { + Enable bool `json:"enable"` + Controller *TorControllerConfig `json:"controller"` +} + +// TorControllerConfig stores tor controller configuration. +type TorControllerConfig struct { + Host string `json:"host"` + Port int `json:"port"` + Password string `json:"password,omitempty"` +} + // DefaultConfig returns Config initialized with default values. func DefaultConfig() *Config { return &Config{ @@ -53,6 +67,13 @@ func DefaultConfig() *Config { Feed: &FeedConfig{ ExternalURL: "http://localhost", }, + Tor: &TorConfig{ + Enable: false, + Controller: &TorControllerConfig{ + Host: "127.0.0.1", + Port: 9051, + }, + }, } } diff --git a/pkg/app/tor.go b/pkg/app/tor.go new file mode 100644 index 0000000..88f2db2 --- /dev/null +++ b/pkg/app/tor.go @@ -0,0 +1,44 @@ +package app + +import ( + "fmt" + "os" + + "github.com/wybiral/torgo" + "github.com/wybiral/tube/pkg/onionkey" +) + +type tor struct { + OnionKey onionkey.Key + Controller *torgo.Controller +} + +func newTor(ct *TorConfig) (*tor, error) { + addr := fmt.Sprintf("%s:%d", ct.Controller.Host, ct.Controller.Port) + ctrl, err := torgo.NewController(addr) + if err != nil { + return nil, err + } + if len(ct.Controller.Password) > 0 { + err = ctrl.AuthenticatePassword(ct.Controller.Password) + } else { + err = ctrl.AuthenticateCookie() + if err != nil { + err = ctrl.AuthenticateNone() + } + } + if err != nil { + return nil, err + } + key, err := onionkey.ReadFile("onion.key") + if os.IsNotExist(err) { + key = nil + } else if err != nil { + return nil, err + } + t := &tor{ + Controller: ctrl, + OnionKey: key, + } + return t, nil +} -- cgit v1.2.3