mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-31 18:16:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package plg_starter_tor
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"github.com/cretz/bine/tor"
 | |
| 	"github.com/gorilla/mux"
 | |
| 	. "github.com/mickael-kerjean/filestash/server/common"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	enable_plugin func() bool
 | |
| 	tor_url       func() string
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	enable_plugin = func() bool {
 | |
| 		return Config.Get("features.server.tor_enable").Schema(func(f *FormElement) *FormElement {
 | |
| 			if f == nil {
 | |
| 				f = &FormElement{}
 | |
| 			}
 | |
| 			f.Default = false
 | |
| 			f.Name = "tor_enable"
 | |
| 			f.Type = "enable"
 | |
| 			f.Target = []string{"tor_url"}
 | |
| 			f.Description = "Enable/Disable tor server"
 | |
| 			f.Placeholder = "Default: false"
 | |
| 			return f
 | |
| 		}).Bool()
 | |
| 	}
 | |
| 	tor_url = func() string {
 | |
| 		return Config.Get("features.server.tor_url").Schema(func(f *FormElement) *FormElement {
 | |
| 			if f == nil {
 | |
| 				f = &FormElement{}
 | |
| 			}
 | |
| 			f.Id = "tor_url"
 | |
| 			f.Name = "tor_url"
 | |
| 			f.Type = "text"
 | |
| 			f.Target = []string{}
 | |
| 			f.Description = "Your onion site"
 | |
| 			f.ReadOnly = true
 | |
| 			f.Placeholder = "LOADING... Refresh the page in a few seconds"
 | |
| 			return f
 | |
| 		}).String()
 | |
| 	}
 | |
| 
 | |
| 	Hooks.Register.Onload(func() {
 | |
| 		tor_url()
 | |
| 		enable_plugin()
 | |
| 	})
 | |
| 	Hooks.Register.Starter(func(r *mux.Router) {
 | |
| 		torPath := GetAbsolutePath(CERT_PATH, "tor")
 | |
| 		os.MkdirAll(torPath, os.ModePerm)
 | |
| 
 | |
| 		if enable_plugin() == false {
 | |
| 			startTor := false
 | |
| 			onChange := Config.ListenForChange()
 | |
| 			for {
 | |
| 				select {
 | |
| 				case <-onChange.Listener:
 | |
| 					startTor = enable_plugin()
 | |
| 				}
 | |
| 				if startTor == true {
 | |
| 					break
 | |
| 				}
 | |
| 			}
 | |
| 			Config.UnlistenForChange(onChange)
 | |
| 		}
 | |
| 
 | |
| 		Log.Info("[tor] starting ...")
 | |
| 		t, err := tor.Start(nil, &tor.StartConf{
 | |
| 			DataDir: torPath,
 | |
| 		})
 | |
| 		if err != nil {
 | |
| 			Log.Error("[tor] Unable to start Tor: %v", err)
 | |
| 			return
 | |
| 		}
 | |
| 		defer t.Close()
 | |
| 		listenCtx, listenCancel := context.WithTimeout(context.Background(), 3*time.Minute)
 | |
| 		defer listenCancel()
 | |
| 		onion, err := t.Listen(listenCtx, &tor.ListenConf{Version3: true, RemotePorts: []int{80}})
 | |
| 		if err != nil {
 | |
| 			Log.Error("[tor] Unable to create onion service: %v", err)
 | |
| 			return
 | |
| 		}
 | |
| 		defer onion.Close()
 | |
| 
 | |
| 		srv := &http.Server{
 | |
| 			Handler: r,
 | |
| 		}
 | |
| 		Log.Info("[tor] started http://%s.onion\n", onion.ID)
 | |
| 		Config.Get("features.server.tor_url").Set("http://" + onion.ID + ".onion")
 | |
| 		srv.Serve(onion)
 | |
| 	})
 | |
| }
 | 
