From 9c1e3f260068226f5e20d748998a5b45fc37e79f Mon Sep 17 00:00:00 2001 From: Arjan H Date: Thu, 28 Jul 2022 19:00:21 +0200 Subject: [PATCH] Make title/name on web pages configurable (#52) --- gui/apply-nginx | 52 +++++++++++++++++++++++----- gui/main.go | 55 ++++++++++++++++++++++++------ gui/templates/base.tmpl | 4 +-- gui/templates/partials/nav.tmpl | 2 +- gui/templates/views/dashboard.tmpl | 2 +- gui/templates/views/list.tmpl | 2 +- gui/templates/views/manage.tmpl | 10 ++++-- gui/templates/views/show.tmpl | 2 +- install | 9 +++-- static/502.html | 4 +-- static/certs/index.html | 12 +++---- static/cps/index.html | 32 ++++++++--------- static/index.html | 12 +++---- static/rate-limits.html | 8 ++--- static/terms/v1.html | 6 ++-- 15 files changed, 146 insertions(+), 66 deletions(-) diff --git a/gui/apply-nginx b/gui/apply-nginx index 65bdc57..c4d4754 100755 --- a/gui/apply-nginx +++ b/gui/apply-nginx @@ -2,19 +2,53 @@ set -e +sed -i -e "s|.*|$PKI_WEB_TITLE|g" 502.html +sed -i -e "s|<\!-- BEGIN WEBTITLE -->.*<\!-- END WEBTITLE -->|<\!-- BEGIN WEBTITLE -->$PKI_WEB_TITLE<\!-- END WEBTITLE -->|g" 502.html + PKI_ROOT_DN=$(openssl x509 -noout -in $PKI_ROOT_CERT_BASE.pem -subject | sed -e "s/subject= //") -sed -i -e "s|\[PKI_ROOT_DN\]|$PKI_ROOT_DN|g" certs/index.html +sed -i -e "s|<\!-- BEGIN PKI_ROOT_DN -->.*<\!-- END PKI_ROOT_DN -->|<\!-- BEGIN PKI_ROOT_DN -->$PKI_ROOT_DN<\!-- END PKI_ROOT_DN -->|g" certs/index.html PKI_ROOT_VALIDITY="$(openssl x509 -noout -in $PKI_ROOT_CERT_BASE.pem -startdate | sed -e "s/.*=/Not Before: /")
$(openssl x509 -noout -in $PKI_ROOT_CERT_BASE.pem -enddate | sed -e "s/.*=/Not After: /")" -sed -i -e "s|\[PKI_ROOT_VALIDITY\]|$PKI_ROOT_VALIDITY|g" certs/index.html +sed -i -e "s|<\!-- BEGIN PKI_ROOT_VALIDITY -->.*<\!-- END PKI_ROOT_VALIDITY -->|<\!-- BEGIN PKI_ROOT_VALIDITY -->$PKI_ROOT_VALIDITY<\!-- END PKI_ROOT_VALIDITY -->|g" certs/index.html PKI_INT_DN=$(openssl x509 -noout -in $PKI_INT_CERT_BASE.pem -subject | sed -e "s/subject= //") -sed -i -e "s|\[PKI_INT_DN\]|$PKI_INT_DN|g" certs/index.html +sed -i -e "s|<\!-- BEGIN PKI_INT_DN -->.*<\!-- END PKI_INT_DN -->|<\!-- BEGIN PKI_INT_DN -->$PKI_INT_DN<\!-- END PKI_INT_DN -->|g" certs/index.html PKI_INT_VALIDITY="$(openssl x509 -noout -in $PKI_INT_CERT_BASE.pem -startdate | sed -e "s/.*=/Not Before: /")
$(openssl x509 -noout -in $PKI_INT_CERT_BASE.pem -enddate | sed -e "s/.*=/Not After: /")" -sed -i -e "s|\[PKI_INT_VALIDITY\]|$PKI_INT_VALIDITY|g" certs/index.html +sed -i -e "s|<\!-- BEGIN PKI_INT_VALIDITY -->.*<\!-- END PKI_INT_VALIDITY -->|<\!-- BEGIN PKI_INT_VALIDITY -->$PKI_INT_VALIDITY<\!-- END PKI_INT_VALIDITY -->|g" certs/index.html -sed -i -e "s|\[PKI_COMPANY_NAME\]|$PKI_DEFAULT_O|g" cps/index.html -sed -i -e "s|\[PKI_ROOT_DN\]|$PKI_ROOT_DN|g" cps/index.html +sed -i -e "s|.*|Certificates \| $PKI_WEB_TITLE|g" certs/index.html +sed -i -e "s|<\!-- BEGIN WEBTITLE -->.*<\!-- END WEBTITLE -->|<\!-- BEGIN WEBTITLE -->$PKI_WEB_TITLE<\!-- END WEBTITLE -->|g" certs/index.html + +sed -i -e "s|<\!-- BEGIN PKI_COMPANY_NAME -->.*<\!-- END PKI_COMPANY_NAME -->|<\!-- BEGIN PKI_COMPANY_NAME -->$PKI_DEFAULT_O<\!-- END PKI_COMPANY_NAME -->|g" cps/index.html +sed -i -e "s|<\!-- BEGIN PKI_ROOT_DN -->.*<\!-- END PKI_ROOT_DN -->|<\!-- BEGIN PKI_ROOT_DN -->$PKI_ROOT_DN<\!-- END PKI_ROOT_DN -->|g" cps/index.html PKI_ROOT_FINGERPRINT="$(openssl x509 -noout -in $PKI_ROOT_CERT_BASE.pem -fingerprint | sed -e "s/.*=//" | sed -e "s/.\{21\}/&\\\n/g")" -sed -i -e "s|\[PKI_ROOT_FINGERPRINT\]|$PKI_ROOT_FINGERPRINT|g" cps/index.html -sed -i -e "s|\[PKI_ROOT_VALIDITY\]|$PKI_ROOT_VALIDITY|g" cps/index.html +sed -i -e "s|<\!-- BEGIN PKI_ROOT_FINGERPRINT -->.*<\!-- END PKI_ROOT_FINGERPRINT -->|<\!-- BEGIN PKI_ROOT_FINGERPRINT -->$PKI_ROOT_FINGERPRINT<\!-- END PKI_ROOT_FINGERPRINT -->|g" cps/index.html +sed -i -e "s|<\!-- BEGIN PKI_ROOT_VALIDITY -->.*<\!-- END PKI_ROOT_VALIDITY -->|<\!-- BEGIN PKI_ROOT_VALIDITY -->$PKI_ROOT_VALIDITY<\!-- END PKI_ROOT_VALIDITY -->|g" cps/index.html + +sed -i -e "s|.*|CPS \| $PKI_WEB_TITLE|g" cps/index.html +sed -i -e "s|<\!-- BEGIN WEBTITLE -->.*<\!-- END WEBTITLE -->|<\!-- BEGIN WEBTITLE -->$PKI_WEB_TITLE<\!-- END WEBTITLE -->|g" cps/index.html + +sed -i -e "s|<\!-- BEGIN LABCA_CPS_LOCATION -->.*<\!-- END LABCA_CPS_LOCATION -->|<\!-- BEGIN LABCA_CPS_LOCATION -->http://$PKI_FQDN/cps/<\!-- END LABCA_CPS_LOCATION -->|g" cps/index.html +sed -i -e "s|<\!-- BEGIN LABCA_CERTS_LOCATION -->.*<\!-- END LABCA_CERTS_LOCATION -->|<\!-- BEGIN LABCA_CERTS_LOCATION -->http://$PKI_FQDN/certs/<\!-- END LABCA_CERTS_LOCATION -->|g" cps/index.html + +sed -i -e "s|.*|$PKI_WEB_TITLE|g" index.html +sed -i -e "s|<\!-- BEGIN WEBTITLE -->.*<\!-- END WEBTITLE -->|<\!-- BEGIN WEBTITLE -->$PKI_WEB_TITLE<\!-- END WEBTITLE -->|g" index.html +if [ "$PKI_WEB_TITLE" == "LabCA" ]; then + sed -i -e "s|<\!-- BEGIN WEBTITLE_X1 -->.*<\!-- END WEBTITLE_X1 -->|<\!-- BEGIN WEBTITLE_X1 -->$PKI_WEB_TITLE<\!-- END WEBTITLE_X1 -->|g" index.html + sed -i -e "s|<\!-- BEGIN WEBTITLE_X2 -->.*<\!-- END WEBTITLE_X2 -->|<\!-- BEGIN WEBTITLE_X2 -->this $PKI_WEB_TITLE instance<\!-- END WEBTITLE_X2 -->|g" index.html +else + sed -i -e "s|<\!-- BEGIN WEBTITLE_X1 -->.*<\!-- END WEBTITLE_X1 -->|<\!-- BEGIN WEBTITLE_X1 -->$PKI_WEB_TITLE is running LabCA, which<\!-- END WEBTITLE_X1 -->|g" index.html + sed -i -e "s|<\!-- BEGIN WEBTITLE_X2 -->.*<\!-- END WEBTITLE_X2 -->|<\!-- BEGIN WEBTITLE_X2 -->$PKI_WEB_TITLE<\!-- END WEBTITLE_X2 -->|g" index.html +fi + +sed -i -e "s|.*|Rate Limits \| $PKI_WEB_TITLE|g" rate-limits.html +sed -i -e "s|<\!-- BEGIN WEBTITLE -->.*<\!-- END WEBTITLE -->|<\!-- BEGIN WEBTITLE -->$PKI_WEB_TITLE<\!-- END WEBTITLE -->|g" rate-limits.html +if [ "$PKI_WEB_TITLE" == "LabCA" ]; then + sed -i -e "s|<\!-- BEGIN WEBTITLE_X2 -->.*<\!-- END WEBTITLE_X2 -->|<\!-- BEGIN WEBTITLE_X2 -->this $PKI_WEB_TITLE instance<\!-- END WEBTITLE_X2 -->|g" rate-limits.html +else + sed -i -e "s|<\!-- BEGIN WEBTITLE_X2 -->.*<\!-- END WEBTITLE_X2 -->|<\!-- BEGIN WEBTITLE_X2 -->$PKI_WEB_TITLE<\!-- END WEBTITLE_X2 -->|g" rate-limits.html +fi + +sed -i -e "s|<\!-- BEGIN PKI_COMPANY_NAME -->.*<\!-- END PKI_COMPANY_NAME -->|<\!-- BEGIN PKI_COMPANY_NAME -->$PKI_DEFAULT_O<\!-- END PKI_COMPANY_NAME -->|g" terms/v1.html + +sed -i -e "s|.*|Terms \| $PKI_WEB_TITLE|g" terms/v1.html +sed -i -e "s|<\!-- BEGIN WEBTITLE -->.*<\!-- END WEBTITLE -->|<\!-- BEGIN WEBTITLE -->$PKI_WEB_TITLE<\!-- END WEBTITLE -->|g" terms/v1.html -sed -i -e "s|\[PKI_COMPANY_NAME\]|$PKI_DEFAULT_O|g" terms/v1.html diff --git a/gui/main.go b/gui/main.go index d1282f7..9d994c4 100644 --- a/gui/main.go +++ b/gui/main.go @@ -54,6 +54,7 @@ var ( sessionStore *sessions.CookieStore tmpls *templates.Templates version string + webTitle string dbConn string dbType string isDev bool @@ -152,6 +153,7 @@ func (reg *User) Validate(isNew bool, isChange bool) bool { type SetupConfig struct { Fqdn string Organization string + WebTitle string DNS string DomainMode string LockdownDomains string @@ -505,6 +507,7 @@ func _configUpdateHandler(w http.ResponseWriter, r *http.Request) { cfg := &SetupConfig{ Fqdn: r.Form.Get("fqdn"), Organization: r.Form.Get("organization"), + WebTitle: r.Form.Get("webtitle"), DNS: r.Form.Get("dns"), DomainMode: r.Form.Get("domain_mode"), LockdownDomains: r.Form.Get("lockdown_domains"), @@ -532,6 +535,11 @@ func _configUpdateHandler(w http.ResponseWriter, r *http.Request) { viper.Set("labca.organization", cfg.Organization) } + if cfg.WebTitle != viper.GetString("labca.web_title") { + delta = true + viper.Set("labca.web_title", cfg.WebTitle) + } + matched, err := regexp.MatchString(":\\d+$", cfg.DNS) if err == nil && !matched { cfg.DNS += ":53" @@ -570,6 +578,11 @@ func _configUpdateHandler(w http.ResponseWriter, r *http.Request) { if delta { viper.WriteConfig() + webTitle = viper.GetString("labca.web_title") + if webTitle == "" { + webTitle = "LabCA" + } + err := _applyConfig() if err != nil { res.Success = false @@ -1113,6 +1126,11 @@ func _manageGet(w http.ResponseWriter, r *http.Request) { manageData["Fqdn"] = viper.GetString("labca.fqdn") manageData["Organization"] = viper.GetString("labca.organization") + if viper.Get("labca.web_title") == nil || viper.GetString("labca.web_title") == "" { + manageData["WebTitle"] = "LabCA" + } else { + manageData["WebTitle"] = viper.GetString("labca.web_title") + } manageData["DNS"] = viper.GetString("labca.dns") domainMode := viper.GetString("labca.domain_mode") manageData["DomainMode"] = domainMode @@ -1143,6 +1161,8 @@ func _manageGet(w http.ResponseWriter, r *http.Request) { manageData["Name"] = viper.GetString("user.name") manageData["Email"] = viper.GetString("user.email") + manageData["Title"] = "Manage" + render(w, r, "manage", manageData) } @@ -1205,6 +1225,7 @@ func logsHandler(w http.ResponseWriter, r *http.Request) { "Message": message, "Data": data, "WsUrl": wsurl, + "Title": "Logs", }) } @@ -1525,6 +1546,11 @@ func _applyConfig() error { os.Setenv("PKI_ROOT_CERT_BASE", "data/root-ca") os.Setenv("PKI_INT_CERT_BASE", "data/issuer/ca-int") os.Setenv("PKI_DEFAULT_O", viper.GetString("labca.organization")) + if viper.GetString("labca.web_title") == "" { + os.Setenv("PKI_WEB_TITLE", "LabCA") + } else { + os.Setenv("PKI_WEB_TITLE", viper.GetString("labca.web_title")) + } os.Setenv("PKI_DNS", viper.GetString("labca.dns")) domain := viper.GetString("labca.fqdn") os.Setenv("PKI_FQDN", domain) @@ -2053,7 +2079,7 @@ func accountsHandler(w http.ResponseWriter, r *http.Request) { Accounts, err := GetAccounts(w, r) if err == nil { - render(w, r, "list:accounts", map[string]interface{}{"List": Accounts}) + render(w, r, "list:accounts", map[string]interface{}{"List": Accounts, "Title": "ACME"}) } } @@ -2072,7 +2098,7 @@ func accountHandler(w http.ResponseWriter, r *http.Request) { AccountDetails, err := GetAccount(w, r, id) if err == nil { - render(w, r, "show:accounts", map[string]interface{}{"Details": AccountDetails}) + render(w, r, "show:accounts", map[string]interface{}{"Details": AccountDetails, "Title": "ACME"}) } } @@ -2084,7 +2110,7 @@ func ordersHandler(w http.ResponseWriter, r *http.Request) { Orders, err := GetOrders(w, r) if err == nil { - render(w, r, "list:orders", map[string]interface{}{"List": Orders}) + render(w, r, "list:orders", map[string]interface{}{"List": Orders, "Title": "ACME"}) } } @@ -2103,7 +2129,7 @@ func orderHandler(w http.ResponseWriter, r *http.Request) { OrderDetails, err := GetOrder(w, r, id) if err == nil { - render(w, r, "show:orders", map[string]interface{}{"Details": OrderDetails}) + render(w, r, "show:orders", map[string]interface{}{"Details": OrderDetails, "Title": "ACME"}) } } @@ -2115,7 +2141,7 @@ func authzHandler(w http.ResponseWriter, r *http.Request) { Authz, err := GetAuthz(w, r) if err == nil { - render(w, r, "list:authz", map[string]interface{}{"List": Authz}) + render(w, r, "list:authz", map[string]interface{}{"List": Authz, "Title": "ACME"}) } } @@ -2130,7 +2156,7 @@ func authHandler(w http.ResponseWriter, r *http.Request) { AuthDetails, err := GetAuth(w, r, id) if err == nil { - render(w, r, "show:authz", map[string]interface{}{"Details": AuthDetails}) + render(w, r, "show:authz", map[string]interface{}{"Details": AuthDetails, "Title": "ACME"}) } } @@ -2142,7 +2168,7 @@ func challengesHandler(w http.ResponseWriter, r *http.Request) { Challenges, err := GetChallenges(w, r) if err == nil { - render(w, r, "list:challenges", map[string]interface{}{"List": Challenges}) + render(w, r, "list:challenges", map[string]interface{}{"List": Challenges, "Title": "ACME"}) } } @@ -2161,7 +2187,7 @@ func challengeHandler(w http.ResponseWriter, r *http.Request) { ChallengeDetails, err := GetChallenge(w, r, id) if err == nil { - render(w, r, "show:challenges", map[string]interface{}{"Details": ChallengeDetails}) + render(w, r, "show:challenges", map[string]interface{}{"Details": ChallengeDetails, "Title": "ACME"}) } } @@ -2173,7 +2199,7 @@ func certificatesHandler(w http.ResponseWriter, r *http.Request) { Certificates, err := GetCertificates(w, r) if err == nil { - render(w, r, "list:certificates", map[string]interface{}{"List": Certificates}) + render(w, r, "list:certificates", map[string]interface{}{"List": Certificates, "Title": "ACME"}) } } @@ -2192,7 +2218,7 @@ func certificateHandler(w http.ResponseWriter, r *http.Request) { CertificateDetails, err := GetCertificate(w, r, id, serial) if err == nil { - render(w, r, "show:certificates", map[string]interface{}{"Details": CertificateDetails}) + render(w, r, "show:certificates", map[string]interface{}{"Details": CertificateDetails, "Title": "ACME"}) } } @@ -2425,6 +2451,10 @@ func render(w http.ResponseWriter, r *http.Request, view string, data map[string data["Version"] = version } + if webTitle != "" { + data["WebTitle"] = webTitle + } + b, err := tmpls.Render("base.tmpl", "views/"+viewSlice[0]+".tmpl", data) if err != nil { errorHandler(w, r, err, http.StatusInternalServerError) @@ -2520,6 +2550,11 @@ func init() { version = viper.GetString("version") + webTitle = viper.GetString("labca.web_title") + if webTitle == "" { + webTitle = "LabCA" + } + updateAvailable = false } diff --git a/gui/templates/base.tmpl b/gui/templates/base.tmpl index a2c07fb..aee98a8 100644 --- a/gui/templates/base.tmpl +++ b/gui/templates/base.tmpl @@ -7,7 +7,7 @@ - {{ block "title" . }}{{ if .Title }}{{ .Title }} | {{ end }}LabCA{{ end }} + {{ block "title" . }}{{ if .Title }}{{ .Title }} | {{ end }}{{ .WebTitle }}{{ end }} {{ block "css" . }}{{ template "partials/css.tmpl" . }}{{ end }} {{ block "head" . }}{{ .Head }}{{ end }} @@ -32,7 +32,7 @@ {{ if .Version }}{{ .Version }}{{ end }} diff --git a/gui/templates/partials/nav.tmpl b/gui/templates/partials/nav.tmpl index 5bb1e57..2231d8b 100644 --- a/gui/templates/partials/nav.tmpl +++ b/gui/templates/partials/nav.tmpl @@ -7,7 +7,7 @@ - LabCA + {{ .WebTitle }}