diff --git a/CHANGELOG.md b/CHANGELOG.md index df837cbe9..fbaf1d0be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## v0.4.39 +FEATURE: Support `html_path` directive in `interstitial` stanza of public frontend configuration to support using an external HTML file for the interstitial page (https://github.com/openziti/zrok/issues/716) + CHANGE: Update `github.com/openziti/sdk-golang` (and related dependencies) to version `v0.23.40`. CHANGE: upgrade to ziti v1.1.7 CLI in zrok container image diff --git a/endpoints/publicProxy/config.go b/endpoints/publicProxy/config.go index 233c1a4ea..c39708a73 100644 --- a/endpoints/publicProxy/config.go +++ b/endpoints/publicProxy/config.go @@ -23,6 +23,7 @@ type Config struct { type InterstitialConfig struct { Enabled bool + HtmlPath string UserAgentPrefixes []string } diff --git a/endpoints/publicProxy/http.go b/endpoints/publicProxy/http.go index 69de6330e..2cd52ebad 100644 --- a/endpoints/publicProxy/http.go +++ b/endpoints/publicProxy/http.go @@ -180,7 +180,7 @@ func shareHandler(handler http.Handler, pcfg *Config, key []byte, ctx ziti.Conte _, zrokOkErr := r.Cookie("zrok_interstitial") if skip == "" && zrokOkErr != nil { logrus.Debugf("forcing interstitial for '%v'", r.URL) - interstitialUi.WriteInterstitialAnnounce(w) + interstitialUi.WriteInterstitialAnnounce(w, pcfg.Interstitial.HtmlPath) return } } diff --git a/endpoints/publicProxy/interstitialUi/handler.go b/endpoints/publicProxy/interstitialUi/handler.go index 98bd5dbc3..2ae08753a 100644 --- a/endpoints/publicProxy/interstitialUi/handler.go +++ b/endpoints/publicProxy/interstitialUi/handler.go @@ -3,19 +3,35 @@ package interstitialUi import ( "github.com/sirupsen/logrus" "net/http" + "os" ) -func WriteInterstitialAnnounce(w http.ResponseWriter) { - if data, err := FS.ReadFile("index.html"); err == nil { - w.WriteHeader(http.StatusOK) - n, err := w.Write(data) - if n != len(data) { - logrus.Errorf("short write") - return +var externalFile []byte + +func WriteInterstitialAnnounce(w http.ResponseWriter, htmlPath string) { + if htmlPath != "" && externalFile == nil { + if data, err := os.ReadFile(htmlPath); err == nil { + externalFile = data + } else { + logrus.Errorf("error reading external interstitial file '%v': %v", htmlPath, err) } - if err != nil { - logrus.Error(err) - return + } + var htmlData = externalFile + if htmlData == nil { + if data, err := FS.ReadFile("index.html"); err == nil { + htmlData = data + } else { + logrus.Errorf("error reading embedded interstitial html 'index.html': %v", err) } } + w.WriteHeader(http.StatusOK) + n, err := w.Write(htmlData) + if n != len(htmlData) { + logrus.Errorf("short write") + return + } + if err != nil { + logrus.Error(err) + return + } } diff --git a/etc/frontend.yml b/etc/frontend.yml index ecf723a98..9e27b0f9f 100644 --- a/etc/frontend.yml +++ b/etc/frontend.yml @@ -18,6 +18,11 @@ v: 3 # # # enabled: true # +# # Specify a path to an external HTML file containing the interstitial page. Leaving out of configuration will fall back +# # to embedded interstitial HTML. See `endpoints/publicProxy/interstitialUi/index.html` for details on how the page works. +# # +# html_path: /some/path/to/interstitial.html +# # # Specify a list of User-Agent prefixes that should receive the interstitial page. If interstitial pages are enabled # # and this list is not set, all user agents will receive an interstitial page. # #