Quellcode durchsuchen

auto update script executed

Toby Chui vor 1 Jahr
Ursprung
Commit
10a8a87c94
6 geänderte Dateien mit 116 neuen und 32 gelöschten Zeilen
  1. 1 0
      api.go
  2. 0 2
      cert.go
  3. 34 21
      mod/dynamicproxy/dynamicproxy.go
  4. 46 9
      reverseproxy.go
  5. BIN
      sys.db
  6. 35 0
      web/components/status.html

+ 1 - 0
api.go

@@ -17,6 +17,7 @@ func initAPIs() {
 	http.HandleFunc("/list", ReverseProxyList)
 	http.HandleFunc("/del", DeleteProxyEndpoint)
 	http.HandleFunc("/setIncoming", HandleIncomingPortSet)
+	http.HandleFunc("/useHttpsRedirect", HandleUpdateHttpsRedirect)
 
 	//TLS / SSL config
 	http.HandleFunc("/cert/tls", handleToggleTLSProxy)

+ 0 - 2
cert.go

@@ -94,12 +94,10 @@ func handleToggleTLSProxy(w http.ResponseWriter, r *http.Request) {
 			sysdb.Write("settings", "usetls", true)
 			log.Println("Enabling TLS mode on reverse proxy")
 			dynamicProxyRouter.UpdateTLSSetting(true)
-			dynamicProxyRouter.Restart()
 		} else if newState == "false" {
 			sysdb.Write("settings", "usetls", false)
 			log.Println("Disabling TLS mode on reverse proxy")
 			dynamicProxyRouter.UpdateTLSSetting(false)
-			dynamicProxyRouter.Restart()
 		} else {
 			utils.SendErrorResponse(w, "invalid state given. Only support true or false")
 			return

+ 34 - 21
mod/dynamicproxy/dynamicproxy.go

@@ -24,21 +24,25 @@ import (
 
 */
 type Router struct {
-	ListenPort        int
-	ProxyEndpoints    *sync.Map
-	SubdomainEndpoint *sync.Map
-	Running           bool
-	Root              *ProxyEndpoint
-	tlsCertManager    *tlscert.Manager
-	mux               http.Handler
-	TlsManager        *tlscert.Manager
-	useTLS            bool
-	server            *http.Server
-	tlsListener       net.Listener
+	ListenPort             int
+	ProxyEndpoints         *sync.Map
+	SubdomainEndpoint      *sync.Map
+	Running                bool
+	Root                   *ProxyEndpoint
+	tlsCertManager         *tlscert.Manager
+	mux                    http.Handler
+	TlsManager             *tlscert.Manager
+	useTLS                 bool
+	useHttpToHttpsRedirect bool
+	server                 *http.Server
+	tlsListener            net.Listener
 }
 
 type RouterOption struct {
-	Port int
+	Port               int
+	UseTls             bool
+	ForceHttpsRedirect bool
+	TlsManager         *tlscert.Manager
 }
 
 type ProxyEndpoint struct {
@@ -59,17 +63,18 @@ type ProxyHandler struct {
 	Parent *Router
 }
 
-func NewDynamicProxy(port int, useTls bool, tlsManager *tlscert.Manager) (*Router, error) {
+func NewDynamicProxy(option RouterOption) (*Router, error) {
 	proxyMap := sync.Map{}
 	domainMap := sync.Map{}
 	thisRouter := Router{
-		ListenPort:        port,
-		ProxyEndpoints:    &proxyMap,
-		SubdomainEndpoint: &domainMap,
-		Running:           false,
-		tlsCertManager:    tlsManager,
-		useTLS:            useTls,
-		server:            nil,
+		ListenPort:             option.Port,
+		ProxyEndpoints:         &proxyMap,
+		SubdomainEndpoint:      &domainMap,
+		Running:                false,
+		tlsCertManager:         option.TlsManager,
+		useTLS:                 option.UseTls,
+		useHttpToHttpsRedirect: option.ForceHttpsRedirect,
+		server:                 nil,
 	}
 
 	thisRouter.mux = &ProxyHandler{
@@ -83,6 +88,13 @@ func NewDynamicProxy(port int, useTls bool, tlsManager *tlscert.Manager) (*Route
 //if it is already running in the background
 func (router *Router) UpdateTLSSetting(tlsEnabled bool) {
 	router.useTLS = tlsEnabled
+	router.Restart()
+}
+
+//Update https redirect, which will require updates
+func (router *Router) UpdateHttpToHttpsRedirectSetting(useRedirect bool) {
+	router.useHttpToHttpsRedirect = useRedirect
+	router.Restart()
 }
 
 //Start the dynamic routing
@@ -111,7 +123,7 @@ func (router *Router) StartProxyService() error {
 		router.server = &http.Server{Addr: ":" + strconv.Itoa(router.ListenPort), Handler: router.mux}
 		router.Running = true
 
-		if router.ListenPort == 443 {
+		if router.ListenPort == 443 && router.useHttpToHttpsRedirect {
 			//Add a 80 to 443 redirector
 			httpServer := &http.Server{
 				Addr: ":80",
@@ -133,6 +145,7 @@ func (router *Router) StartProxyService() error {
 					ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 					defer cancel()
 					httpServer.Shutdown(ctx)
+					log.Println(":80 to :433 redirection listener stopped")
 				}()
 				if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
 					log.Fatalf("Could not start server: %v\n", err)

+ 46 - 9
reverseproxy.go

@@ -9,6 +9,7 @@ import (
 	"strings"
 
 	"imuslab.com/arozos/ReverseProxy/mod/dynamicproxy"
+	"imuslab.com/arozos/ReverseProxy/mod/utils"
 )
 
 var (
@@ -26,19 +27,27 @@ func ReverseProxtInit() {
 	}
 
 	useTls := false
-	if sysdb.KeyExists("settings", "usetls") {
-		sysdb.Read("settings", "usetls", &useTls)
-		if useTls {
-			log.Println("TLS mode enabled. Serving proxxy request with TLS")
-		} else {
-			log.Println("TLS mode disabled. Serving proxy request with plain http")
-		}
+	sysdb.Read("settings", "usetls", &useTls)
+	if useTls {
+		log.Println("TLS mode enabled. Serving proxxy request with TLS")
+	} else {
+		log.Println("TLS mode disabled. Serving proxy request with plain http")
+	}
 
+	forceHttpsRedirect := false
+	sysdb.Read("settings", "redirect", &forceHttpsRedirect)
+	if forceHttpsRedirect {
+		log.Println("Force HTTPS mode enabled")
 	} else {
-		log.Println("Using no TLS for serving proxy domains")
+		log.Println("Force HTTPS mode disabled")
 	}
 
-	dprouter, err := dynamicproxy.NewDynamicProxy(inboundPort, useTls, tlsCertManager)
+	dprouter, err := dynamicproxy.NewDynamicProxy(dynamicproxy.RouterOption{
+		Port:               inboundPort,
+		UseTls:             useTls,
+		ForceHttpsRedirect: forceHttpsRedirect,
+		TlsManager:         tlsCertManager,
+	})
 	if err != nil {
 		log.Println(err.Error())
 		return
@@ -213,6 +222,34 @@ func ReverseProxyList(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
+//Handle https redirect
+func HandleUpdateHttpsRedirect(w http.ResponseWriter, r *http.Request) {
+	useRedirect, err := utils.GetPara(r, "set")
+	if err != nil {
+		currentRedirectToHttps := false
+		//Load the current status
+		err = sysdb.Read("settings", "redirect", &currentRedirectToHttps)
+		if err != nil {
+			sendErrorResponse(w, err.Error())
+			return
+		}
+		js, _ := json.Marshal(currentRedirectToHttps)
+		sendJSONResponse(w, string(js))
+	} else {
+		if useRedirect == "true" {
+			sysdb.Write("settings", "redirect", true)
+			log.Println("Updating force HTTPS redirection to true")
+			dynamicProxyRouter.UpdateHttpToHttpsRedirectSetting(true)
+		} else if useRedirect == "false" {
+			sysdb.Write("settings", "redirect", false)
+			log.Println("Updating force HTTPS redirection to false")
+			dynamicProxyRouter.UpdateHttpToHttpsRedirectSetting(false)
+		}
+
+		utils.SendOK(w)
+	}
+}
+
 //Handle incoming port set. Change the current proxy incoming port
 func HandleIncomingPortSet(w http.ResponseWriter, r *http.Request) {
 	newIncomingPort, err := mv(r, "incoming", true)

BIN
sys.db


+ 35 - 0
web/components/status.html

@@ -19,6 +19,12 @@
     <label>Use TLS to serve proxy request</label>
 </div>
 <br>
+<div id="redirect" class="ui toggle checkbox" style="margin-top: 0.6em;">
+    <input type="checkbox">
+    <label>Force redirect HTTP request to HTTPS<br>
+        <small>(Only apply when listening port is 433)</small></label>
+</div>
+<br>
 <div id="portUpdateSucc" class="ui green message" style="display:none;">
     <i class="ui green checkmark icon"></i> Setting Updated
 </div>
@@ -82,6 +88,35 @@
         });
     }
 
+    function initHTTPtoHTTPSRedirectSetting(){
+        $.get("/useHttpsRedirect", function(data){
+            if (data == true){
+                $("#redirect").checkbox("set checked");
+            }
+
+            //Initiate the input listener on the checkbox
+            $("#redirect").find("input").on("change", function(){
+                let thisValue = $("#redirect").checkbox("is checked");
+                    $.ajax({
+                        url: "/useHttpsRedirect",
+                        data: {set: thisValue},
+                        success: function(data){
+                            if (data.error != undefined){
+                                alert(data.error);
+                            }else{
+                                //Updated
+                                $("#portUpdateSucc").stop().finish().slideDown("fast").delay(3000).slideUp("fast");
+                                initRPStaste();
+                            }
+                        }
+                    })
+            });
+        });
+
+          
+    }
+    initHTTPtoHTTPSRedirectSetting();
+
     function initTlsSetting(){
         $.get("/cert/tls", function(data){
             if (data == true){