From 5037eac2e6d08fc8601added6569e9002d4b1360 Mon Sep 17 00:00:00 2001 From: Leonid Maslakov Date: Sat, 21 Jan 2023 18:22:42 +0700 Subject: [PATCH] Add HTTP Server header --- internal/apiv1/api.go | 50 ++++++++++++++-------------- internal/apiv1/api_new.go | 6 ++-- internal/apiv1/api_server.go | 24 +++++++------- internal/config/config.go | 2 ++ internal/raw/raw.go | 5 +++ internal/web/web.go | 63 ++++++++++++++++++------------------ internal/web/web_about.go | 18 +++++------ internal/web/web_error.go | 4 +-- internal/web/web_new.go | 18 +++++------ internal/web/web_settings.go | 6 ++-- internal/web/web_sitemap.go | 4 +-- internal/web/web_terms.go | 2 +- internal/web/web_themes.go | 10 +++--- 13 files changed, 111 insertions(+), 101 deletions(-) diff --git a/internal/apiv1/api.go b/internal/apiv1/api.go index 58c3bf8..0e379fe 100644 --- a/internal/apiv1/api.go +++ b/internal/apiv1/api.go @@ -34,24 +34,24 @@ type Data struct { RateLimitNew *netshare.RateLimitSystem RateLimitGet *netshare.RateLimitSystem - Lexers *[]string + Lexers []string - Version *string + Version string - TitleMaxLen *int - BodyMaxLen *int - MaxLifeTime *int64 + TitleMaxLen int + BodyMaxLen int + MaxLifeTime int64 - ServerAbout *string - ServerRules *string - ServerTermsOfUse *string + ServerAbout string + ServerRules string + ServerTermsOfUse string - AdminName *string - AdminMail *string + AdminName string + AdminMail string - LenPasswdFile *string + LenPasswdFile string - UiDefaultLifeTime *string + UiDefaultLifeTime string } func Load(db storage.DB, cfg config.Config) *Data { @@ -62,18 +62,18 @@ func Load(db storage.DB, cfg config.Config) *Data { Log: cfg.Log, RateLimitNew: cfg.RateLimitNew, RateLimitGet: cfg.RateLimitGet, - Lexers: &lexers, - Version: &cfg.Version, - TitleMaxLen: &cfg.TitleMaxLen, - BodyMaxLen: &cfg.BodyMaxLen, - MaxLifeTime: &cfg.MaxLifeTime, - ServerAbout: &cfg.ServerAbout, - ServerRules: &cfg.ServerRules, - ServerTermsOfUse: &cfg.ServerTermsOfUse, - AdminName: &cfg.AdminName, - AdminMail: &cfg.AdminMail, - LenPasswdFile: &cfg.LenPasswdFile, - UiDefaultLifeTime: &cfg.UiDefaultLifetime, + Lexers: lexers, + Version: cfg.Version, + TitleMaxLen: cfg.TitleMaxLen, + BodyMaxLen: cfg.BodyMaxLen, + MaxLifeTime: cfg.MaxLifeTime, + ServerAbout: cfg.ServerAbout, + ServerRules: cfg.ServerRules, + ServerTermsOfUse: cfg.ServerTermsOfUse, + AdminName: cfg.AdminName, + AdminMail: cfg.AdminMail, + LenPasswdFile: cfg.LenPasswdFile, + UiDefaultLifeTime: cfg.UiDefaultLifetime, } } @@ -81,6 +81,8 @@ func (data *Data) Hand(rw http.ResponseWriter, req *http.Request) { // Process request var err error + rw.Header().Set("Server", config.Software+"/"+data.Version) + switch req.URL.Path { // Search engines case "/api/v1/new": diff --git a/internal/apiv1/api_new.go b/internal/apiv1/api_new.go index 15c6ad5..648e928 100644 --- a/internal/apiv1/api_new.go +++ b/internal/apiv1/api_new.go @@ -36,12 +36,12 @@ func (data *Data) newHand(rw http.ResponseWriter, req *http.Request) error { var err error // Check auth - if *data.LenPasswdFile != "" { + if data.LenPasswdFile != "" { authOk := false user, pass, authExist := req.BasicAuth() if authExist == true { - authOk, err = lenpasswd.LoadAndCheck(*data.LenPasswdFile, user, pass) + authOk, err = lenpasswd.LoadAndCheck(data.LenPasswdFile, user, pass) if err != nil { return err } @@ -58,7 +58,7 @@ func (data *Data) newHand(rw http.ResponseWriter, req *http.Request) error { } // Get form data and create paste - pasteID, createTime, deleteTime, err := netshare.PasteAddFromForm(req, data.DB, data.RateLimitNew, *data.TitleMaxLen, *data.BodyMaxLen, *data.MaxLifeTime, *data.Lexers) + pasteID, createTime, deleteTime, err := netshare.PasteAddFromForm(req, data.DB, data.RateLimitNew, data.TitleMaxLen, data.BodyMaxLen, data.MaxLifeTime, data.Lexers) if err != nil { return err } diff --git a/internal/apiv1/api_server.go b/internal/apiv1/api_server.go index 403440b..ef1986c 100644 --- a/internal/apiv1/api_server.go +++ b/internal/apiv1/api_server.go @@ -50,18 +50,18 @@ func (data *Data) getServerInfoHand(rw http.ResponseWriter, req *http.Request) e // Prepare data serverInfo := serverInfoType{ Software: "Lenpaste", - Version: *data.Version, - TitleMaxLen: *data.TitleMaxLen, - BodyMaxLen: *data.BodyMaxLen, - MaxLifeTime: *data.MaxLifeTime, - ServerAbout: *data.ServerAbout, - ServerRules: *data.ServerRules, - ServerTermsOfUse: *data.ServerTermsOfUse, - AdminName: *data.AdminName, - AdminMail: *data.AdminMail, - Syntaxes: *data.Lexers, - UiDefaultLifeTime: *data.UiDefaultLifeTime, - AuthRequired: *data.LenPasswdFile != "", + Version: data.Version, + TitleMaxLen: data.TitleMaxLen, + BodyMaxLen: data.BodyMaxLen, + MaxLifeTime: data.MaxLifeTime, + ServerAbout: data.ServerAbout, + ServerRules: data.ServerRules, + ServerTermsOfUse: data.ServerTermsOfUse, + AdminName: data.AdminName, + AdminMail: data.AdminMail, + Syntaxes: data.Lexers, + UiDefaultLifeTime: data.UiDefaultLifeTime, + AuthRequired: data.LenPasswdFile != "", } // Return response diff --git a/internal/config/config.go b/internal/config/config.go index 3119b67..b058e7e 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -23,6 +23,8 @@ import ( "git.lcomrade.su/root/lenpaste/internal/netshare" ) +const Software = "Lenpaste" + type Config struct { Log logger.Logger diff --git a/internal/raw/raw.go b/internal/raw/raw.go index 08ba720..e5604e3 100644 --- a/internal/raw/raw.go +++ b/internal/raw/raw.go @@ -31,6 +31,8 @@ type Data struct { Log logger.Logger RateLimitGet *netshare.RateLimitSystem + + Version string } func Load(db storage.DB, cfg config.Config) *Data { @@ -38,10 +40,13 @@ func Load(db storage.DB, cfg config.Config) *Data { DB: db, Log: cfg.Log, RateLimitGet: cfg.RateLimitGet, + Version: cfg.Version, } } func (data *Data) Hand(rw http.ResponseWriter, req *http.Request) { + rw.Header().Set("Server", config.Software+"/"+data.Version) + err := data.rawHand(rw, req) if err == nil { diff --git a/internal/web/web.go b/internal/web/web.go index ca75e9d..f85908e 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -41,7 +41,7 @@ type Data struct { RateLimitNew *netshare.RateLimitSystem RateLimitGet *netshare.RateLimitSystem - Lexers *[]string + Lexers []string Locales Locales LocalesList LocalesList Themes Themes @@ -70,26 +70,26 @@ type Data struct { EmbeddedPage *template.Template EmbeddedHelpPage *template.Template - Version *string + Version string - TitleMaxLen *int - BodyMaxLen *int - MaxLifeTime *int64 + TitleMaxLen int + BodyMaxLen int + MaxLifeTime int64 - ServerAbout *string - ServerRules *string - ServerTermsExist *bool - ServerTermsOfUse *string + ServerAbout string + ServerRules string + ServerTermsExist bool + ServerTermsOfUse string - AdminName *string - AdminMail *string + AdminName string + AdminMail string - RobotsDisallow *bool + RobotsDisallow bool - LenPasswdFile *string + LenPasswdFile string - UiDefaultLifeTime *string - UiDefaultTheme *string + UiDefaultLifeTime string + UiDefaultTheme string } func Load(db storage.DB, cfg config.Config) (*Data, error) { @@ -103,33 +103,32 @@ func Load(db storage.DB, cfg config.Config) (*Data, error) { data.RateLimitNew = cfg.RateLimitNew data.RateLimitGet = cfg.RateLimitGet - data.Version = &cfg.Version + data.Version = cfg.Version - data.TitleMaxLen = &cfg.TitleMaxLen - data.BodyMaxLen = &cfg.BodyMaxLen - data.MaxLifeTime = &cfg.MaxLifeTime - data.UiDefaultLifeTime = &cfg.UiDefaultLifetime - data.UiDefaultTheme = &cfg.UiDefaultTheme - data.LenPasswdFile = &cfg.LenPasswdFile + data.TitleMaxLen = cfg.TitleMaxLen + data.BodyMaxLen = cfg.BodyMaxLen + data.MaxLifeTime = cfg.MaxLifeTime + data.UiDefaultLifeTime = cfg.UiDefaultLifetime + data.UiDefaultTheme = cfg.UiDefaultTheme + data.LenPasswdFile = cfg.LenPasswdFile - data.ServerAbout = &cfg.ServerAbout - data.ServerRules = &cfg.ServerRules - data.ServerTermsOfUse = &cfg.ServerTermsOfUse + data.ServerAbout = cfg.ServerAbout + data.ServerRules = cfg.ServerRules + data.ServerTermsOfUse = cfg.ServerTermsOfUse serverTermsExist := false if cfg.ServerTermsOfUse != "" { serverTermsExist = true } - data.ServerTermsExist = &serverTermsExist + data.ServerTermsExist = serverTermsExist - data.AdminName = &cfg.AdminName - data.AdminMail = &cfg.AdminMail + data.AdminName = cfg.AdminName + data.AdminMail = cfg.AdminMail - data.RobotsDisallow = &cfg.RobotsDisallow + data.RobotsDisallow = cfg.RobotsDisallow // Get Chroma lexers - lexers := chromaLexers.Names(false) - data.Lexers = &lexers + data.Lexers = chromaLexers.Names(false) // Load locales data.Locales, data.LocalesList, err = loadLocales(embFS, "data/locale") @@ -271,6 +270,8 @@ func (data *Data) Handler(rw http.ResponseWriter, req *http.Request) { // Process request var err error + rw.Header().Set("Server", config.Software+"/"+data.Version) + switch req.URL.Path { // Search engines case "/robots.txt": diff --git a/internal/web/web_about.go b/internal/web/web_about.go index a538f0d..7e73565 100644 --- a/internal/web/web_about.go +++ b/internal/web/web_about.go @@ -47,15 +47,15 @@ type aboutMinTmp struct { // Pattern: /about func (data *Data) aboutHand(rw http.ResponseWriter, req *http.Request) error { dataTmpl := aboutTmpl{ - Version: *data.Version, - TitleMaxLen: *data.TitleMaxLen, - BodyMaxLen: *data.BodyMaxLen, - MaxLifeTime: *data.MaxLifeTime, - ServerAbout: *data.ServerAbout, - ServerRules: *data.ServerRules, - ServerTermsExist: *data.ServerTermsExist, - AdminName: *data.AdminName, - AdminMail: *data.AdminMail, + Version: data.Version, + TitleMaxLen: data.TitleMaxLen, + BodyMaxLen: data.BodyMaxLen, + MaxLifeTime: data.MaxLifeTime, + ServerAbout: data.ServerAbout, + ServerRules: data.ServerRules, + ServerTermsExist: data.ServerTermsExist, + AdminName: data.AdminName, + AdminMail: data.AdminMail, Highlight: data.Themes.findTheme(req, data.UiDefaultTheme).tryHighlight, Translate: data.Locales.findLocale(req).translate, } diff --git a/internal/web/web_error.go b/internal/web/web_error.go index e0d3786..d97a008 100644 --- a/internal/web/web_error.go +++ b/internal/web/web_error.go @@ -37,8 +37,8 @@ type errorTmpl struct { func (data *Data) writeError(rw http.ResponseWriter, req *http.Request, e error) (int, error) { errData := errorTmpl{ Code: 0, - AdminName: *data.AdminName, - AdminMail: *data.AdminMail, + AdminName: data.AdminName, + AdminMail: data.AdminMail, Translate: data.Locales.findLocale(req).translate, } diff --git a/internal/web/web_new.go b/internal/web/web_new.go index 6695e03..11034ab 100644 --- a/internal/web/web_new.go +++ b/internal/web/web_new.go @@ -49,12 +49,12 @@ func (data *Data) newPasteHand(rw http.ResponseWriter, req *http.Request) error // Check auth authOk := true - if *data.LenPasswdFile != "" { + if data.LenPasswdFile != "" { authOk = false user, pass, authExist := req.BasicAuth() if authExist == true { - authOk, err = lenpasswd.LoadAndCheck(*data.LenPasswdFile, user, pass) + authOk, err = lenpasswd.LoadAndCheck(data.LenPasswdFile, user, pass) if err != nil { return err } @@ -68,7 +68,7 @@ func (data *Data) newPasteHand(rw http.ResponseWriter, req *http.Request) error // Create paste if need if req.Method == "POST" { - pasteID, _, _, err := netshare.PasteAddFromForm(req, data.DB, data.RateLimitNew, *data.TitleMaxLen, *data.BodyMaxLen, *data.MaxLifeTime, *data.Lexers) + pasteID, _, _, err := netshare.PasteAddFromForm(req, data.DB, data.RateLimitNew, data.TitleMaxLen, data.BodyMaxLen, data.MaxLifeTime, data.Lexers) if err != nil { return err } @@ -80,13 +80,13 @@ func (data *Data) newPasteHand(rw http.ResponseWriter, req *http.Request) error // Else show create page tmplData := createTmpl{ - TitleMaxLen: *data.TitleMaxLen, - BodyMaxLen: *data.BodyMaxLen, + TitleMaxLen: data.TitleMaxLen, + BodyMaxLen: data.BodyMaxLen, AuthorAllMaxLen: netshare.MaxLengthAuthorAll, - MaxLifeTime: *data.MaxLifeTime, - UiDefaultLifeTime: *data.UiDefaultLifeTime, - Lexers: *data.Lexers, - ServerTermsExist: *data.ServerTermsExist, + MaxLifeTime: data.MaxLifeTime, + UiDefaultLifeTime: data.UiDefaultLifeTime, + Lexers: data.Lexers, + ServerTermsExist: data.ServerTermsExist, AuthorDefault: getCookie(req, "author"), AuthorEmailDefault: getCookie(req, "authorEmail"), AuthorURLDefault: getCookie(req, "authorURL"), diff --git a/internal/web/web_settings.go b/internal/web/web_settings.go index 7780f5e..6d9d9e5 100644 --- a/internal/web/web_settings.go +++ b/internal/web/web_settings.go @@ -51,12 +51,12 @@ func (data *Data) settingsHand(rw http.ResponseWriter, req *http.Request) error // Check auth authOk := true - if *data.LenPasswdFile != "" { + if data.LenPasswdFile != "" { authOk = false user, pass, authExist := req.BasicAuth() if authExist == true { - authOk, err = lenpasswd.LoadAndCheck(*data.LenPasswdFile, user, pass) + authOk, err = lenpasswd.LoadAndCheck(data.LenPasswdFile, user, pass) if err != nil { return err } @@ -80,7 +80,7 @@ func (data *Data) settingsHand(rw http.ResponseWriter, req *http.Request) error } if dataTmpl.Theme == "" { - dataTmpl.Theme = *data.UiDefaultTheme + dataTmpl.Theme = data.UiDefaultTheme } // Show page diff --git a/internal/web/web_sitemap.go b/internal/web/web_sitemap.go index 27d3c07..3c45c96 100644 --- a/internal/web/web_sitemap.go +++ b/internal/web/web_sitemap.go @@ -28,7 +28,7 @@ func (data *Data) robotsTxtHand(rw http.ResponseWriter, req *http.Request) error // Generate robots.txt robotsTxt := "User-agent: *\nDisallow: /\n" - if *data.RobotsDisallow == false { + if data.RobotsDisallow == false { proto := netshare.GetProtocol(req.Header) host := netshare.GetHost(req) @@ -46,7 +46,7 @@ func (data *Data) robotsTxtHand(rw http.ResponseWriter, req *http.Request) error } func (data *Data) sitemapHand(rw http.ResponseWriter, req *http.Request) error { - if *data.RobotsDisallow { + if data.RobotsDisallow { return netshare.ErrNotFound } diff --git a/internal/web/web_terms.go b/internal/web/web_terms.go index d0ce872..439954e 100644 --- a/internal/web/web_terms.go +++ b/internal/web/web_terms.go @@ -34,7 +34,7 @@ type termsOfUseTmpl struct { func (data *Data) termsOfUseHand(rw http.ResponseWriter, req *http.Request) error { rw.Header().Set("Content-Type", "text/html; charset=utf-8") return data.TermsOfUse.Execute(rw, termsOfUseTmpl{ - TermsOfUse: *data.ServerTermsOfUse, + TermsOfUse: data.ServerTermsOfUse, Highlight: data.Themes.findTheme(req, data.UiDefaultTheme).tryHighlight, Translate: data.Locales.findLocale(req).translate}, ) diff --git a/internal/web/web_themes.go b/internal/web/web_themes.go index 8a42f1f..4938fa5 100644 --- a/internal/web/web_themes.go +++ b/internal/web/web_themes.go @@ -39,7 +39,7 @@ type Themes map[string]Theme type ThemesListPart map[string]string type ThemesList map[string]ThemesListPart -func loadThemes(hostThemeDir string, localesList LocalesList, defaultTheme *string) (Themes, ThemesList, error) { +func loadThemes(hostThemeDir string, localesList LocalesList, defaultTheme string) (Themes, ThemesList, error) { themes := make(Themes) themesList := make(ThemesList) @@ -154,9 +154,9 @@ func loadThemes(hostThemeDir string, localesList LocalesList, defaultTheme *stri } // Check default theme exist - _, ok := themes[*defaultTheme] + _, ok := themes[defaultTheme] if ok == false { - return nil, nil, errors.New("web: default theme '" + *defaultTheme + "' not found") + return nil, nil, errors.New("web: default theme '" + defaultTheme + "' not found") } return themes, themesList, nil @@ -177,7 +177,7 @@ func (themesList ThemesList) getForLocale(req *http.Request) ThemesListPart { return theme } -func (themes Themes) findTheme(req *http.Request, defaultTheme *string) Theme { +func (themes Themes) findTheme(req *http.Request, defaultTheme string) Theme { // Get theme by cookie themeCookie := getCookie(req, "theme") if themeCookie != "" { @@ -188,7 +188,7 @@ func (themes Themes) findTheme(req *http.Request, defaultTheme *string) Theme { } // Load default theme - theme, _ := themes[*defaultTheme] + theme, _ := themes[defaultTheme] return theme }