summaryrefslogtreecommitdiff
path: root/pkg/app
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/app')
-rw-r--r--pkg/app/app.go31
-rw-r--r--pkg/app/config.go21
-rw-r--r--pkg/app/tor.go44
3 files changed, 96 insertions, 0 deletions
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
+}