diff --git a/src/main.go b/src/main.go index 8bbac8d..96d7d3f 100644 --- a/src/main.go +++ b/src/main.go @@ -36,6 +36,7 @@ import ( var noauth = flag.Bool("noauth", false, "Disable authentication for management interface") var showver = flag.Bool("version", false, "Show version of this server") var allowSshLoopback = flag.Bool("sshlb", false, "Allow loopback web ssh connection (DANGER)") +var allowMdnsScanning = flag.Bool("mdns", true, "Enable mDNS scanner and transponder") var ztAuthToken = flag.String("ztauth", "", "ZeroTier authtoken for the local node") var ztAPIPort = flag.Int("ztport", 9993, "ZeroTier controller API port") var acmeAutoRenewInterval = flag.Int("autorenew", 86400, "ACME auto TLS/SSL certificate renew check interval (seconds)") @@ -96,9 +97,12 @@ func ShutdownSeq() { netstatBuffers.Close() fmt.Println("- Closing Statistic Collector") statisticCollector.Close() - fmt.Println("- Stopping mDNS Discoverer") - //Stop the mdns service - mdnsTickerStop <- true + if mdnsTickerStop != nil { + fmt.Println("- Stopping mDNS Discoverer") + // Stop the mdns service + mdnsTickerStop <- true + } + mdnsScanner.Close() fmt.Println("- Closing Certificates Auto Renewer") acmeAutoRenewer.Close() diff --git a/src/mod/dynamicproxy/dpcore/utils.go b/src/mod/dynamicproxy/dpcore/utils.go index 12c7f78..7f99fb4 100644 --- a/src/mod/dynamicproxy/dpcore/utils.go +++ b/src/mod/dynamicproxy/dpcore/utils.go @@ -21,6 +21,15 @@ func replaceLocationHost(urlString string, rrr *ResponseRewriteRuleSet, useTLS b u.Scheme = "http" } + //Issue #39: Check if it is location target match the proxying domain + //E.g. Proxy config: blog.example.com -> example.com/blog + //Check if it is actually redirecting to example.com instead of a new domain + //like news.example.com. + if rrr.ProxyDomain != u.Host { + //New location domain not matching proxy target domain. + //Do not modify location header + return urlString, nil + } u.Host = rrr.OriginalHost if strings.Contains(rrr.ProxyDomain, "/") { diff --git a/src/mod/mdns/mdns.go b/src/mod/mdns/mdns.go index 3a0022d..f266029 100644 --- a/src/mod/mdns/mdns.go +++ b/src/mod/mdns/mdns.go @@ -226,7 +226,7 @@ func (m *MDNSHost) Scan(timeout int, domainFilter string) []*NetworkHost { return discoveredHost } -//Get all mac address of all interfaces +// Get all mac address of all interfaces func getMacAddr() ([]string, error) { ifas, err := net.Interfaces() if err != nil { diff --git a/src/reverseproxy.go b/src/reverseproxy.go index a5f8159..000653c 100644 --- a/src/reverseproxy.go +++ b/src/reverseproxy.go @@ -649,6 +649,13 @@ func HandleIncomingPortSet(w http.ResponseWriter, r *http.Request) { } //Check if it is identical as proxy root (recursion!) + if dynamicProxyRouter.Root == nil || dynamicProxyRouter.Root.Domain == "" { + //Check if proxy root is set before checking recursive listen + //Fixing issue #43 + utils.SendErrorResponse(w, "Proxy root not set") + return + } + proxyRoot := strings.TrimSuffix(dynamicProxyRouter.Root.Domain, "/") if strings.HasPrefix(proxyRoot, "localhost:"+strconv.Itoa(newIncomingPortInt)) || strings.HasPrefix(proxyRoot, "127.0.0.1:"+strconv.Itoa(newIncomingPortInt)) { //Listening port is same as proxy root diff --git a/src/start.go b/src/start.go index 30d5eb2..0cf999c 100644 --- a/src/start.go +++ b/src/start.go @@ -114,47 +114,49 @@ func startupSequence() { This discover nearby ArozOS Nodes or other services that provide mDNS discovery with domain (e.g. Synology NAS) */ - portInt, err := strconv.Atoi(strings.Split(handler.Port, ":")[1]) - if err != nil { - portInt = 8000 - } - mdnsScanner, err = mdns.NewMDNS(mdns.NetworkHost{ - HostName: "zoraxy_" + nodeUUID, - Port: portInt, - Domain: "zoraxy.imuslab.com", - Model: "Network Gateway", - UUID: nodeUUID, - Vendor: "imuslab.com", - BuildVersion: version, - }, "") - if err != nil { - log.Println("Unable to startup mDNS service.") - log.Fatal(err) - } - //Start initial scanning - go func() { - hosts := mdnsScanner.Scan(30, "") - previousmdnsScanResults = hosts - log.Println("mDNS Startup scan completed") - }() - - //Create a ticker to update mDNS results every 5 minutes - ticker := time.NewTicker(15 * time.Minute) - stopChan := make(chan bool) - go func() { - for { - select { - case <-stopChan: - ticker.Stop() - case <-ticker.C: + if *allowMdnsScanning { + portInt, err := strconv.Atoi(strings.Split(handler.Port, ":")[1]) + if err != nil { + portInt = 8000 + } + mdnsScanner, err = mdns.NewMDNS(mdns.NetworkHost{ + HostName: "zoraxy_" + nodeUUID, + Port: portInt, + Domain: "zoraxy.arozos.com", + Model: "Network Gateway", + UUID: nodeUUID, + Vendor: "imuslab.com", + BuildVersion: version, + }, "") + if err != nil { + log.Println("Unable to startup mDNS service. Disabling mDNS services") + } else { + //Start initial scanning + go func() { hosts := mdnsScanner.Scan(30, "") previousmdnsScanResults = hosts - log.Println("mDNS scan result updated") - } + log.Println("mDNS Startup scan completed") + }() + + //Create a ticker to update mDNS results every 5 minutes + ticker := time.NewTicker(15 * time.Minute) + stopChan := make(chan bool) + go func() { + for { + select { + case <-stopChan: + ticker.Stop() + case <-ticker.C: + hosts := mdnsScanner.Scan(30, "") + previousmdnsScanResults = hosts + log.Println("mDNS scan result updated") + } + } + }() + mdnsTickerStop = stopChan } - }() - mdnsTickerStop = stopChan + } /* Global Area Network diff --git a/src/web/tools/mdns.html b/src/web/tools/mdns.html index 2dc63e8..2044e30 100644 --- a/src/web/tools/mdns.html +++ b/src/web/tools/mdns.html @@ -96,6 +96,13 @@ $('').text('Vendor') ) ); + + if (data.error != undefined){ + $('#mdns-hosts').html(`
`); + $('#mdns-hosts').find("tbody").append(` ${data.error}`); + $("#discover").addClass("disabled"); + return; + } // Create table body var tableBody = $(''); diff --git a/src/wrappers.go b/src/wrappers.go index cf95cd9..77c4569 100644 --- a/src/wrappers.go +++ b/src/wrappers.go @@ -156,11 +156,19 @@ func HandleUptimeMonitorListing(w http.ResponseWriter, r *http.Request) { // Handle listing current registered mdns nodes func HandleMdnsListing(w http.ResponseWriter, r *http.Request) { + if mdnsScanner == nil { + utils.SendErrorResponse(w, "mDNS scanner is disabled on this host") + return + } js, _ := json.Marshal(previousmdnsScanResults) utils.SendJSONResponse(w, string(js)) } func HandleMdnsScanning(w http.ResponseWriter, r *http.Request) { + if mdnsScanner == nil { + utils.SendErrorResponse(w, "mDNS scanner is disabled on this host") + return + } domain, err := utils.PostPara(r, "domain") var hosts []*mdns.NetworkHost if err != nil {