diff --git a/backend/app/rest/api/rest.go b/backend/app/rest/api/rest.go index 549798ee..7e286198 100644 --- a/backend/app/rest/api/rest.go +++ b/backend/app/rest/api/rest.go @@ -296,7 +296,7 @@ func (s *Rest) routes() chi.Router { router.Group(func(rroot chi.Router) { tollbooth_chi.LimitHandler(tollbooth.NewLimiter(50, nil)) rroot.Get("/index.html", s.pubRest.getStartedCtrl) - rroot.Get("/robots.txt", s.pubRest.getRobotsCtrl) + rroot.Get("/robots.txt", s.pubRest.robotsCtrl) }) // file server for static content from /web @@ -344,6 +344,47 @@ func (s *Rest) updateLimiter() float64 { return lmt } +// GET /config?site=siteID - returns configuration +func (s *Rest) configCtrl(w http.ResponseWriter, r *http.Request) { + siteID := r.URL.Query().Get("site") + + cnf := struct { + Version string `json:"version"` + EditDuration int `json:"edit_duration"` + MaxCommentSize int `json:"max_comment_size"` + Admins []string `json:"admins"` + AdminEmail string `json:"admin_email"` + Auth []string `json:"auth_providers"` + LowScore int `json:"low_score"` + CriticalScore int `json:"critical_score"` + PositiveScore bool `json:"positive_score"` + ReadOnlyAge int `json:"readonly_age"` + MaxImageSize int `json:"max_image_size"` + }{ + Version: s.Version, + EditDuration: int(s.DataService.EditDuration.Seconds()), + MaxCommentSize: s.DataService.MaxCommentSize, + Admins: s.DataService.AdminStore.Admins(siteID), + AdminEmail: s.DataService.AdminStore.Email(siteID), + LowScore: s.ScoreThresholds.Low, + CriticalScore: s.ScoreThresholds.Critical, + PositiveScore: s.DataService.PositiveScore, + ReadOnlyAge: s.ReadOnlyAge, + MaxImageSize: s.ImageService.Store.SizeLimit(), + } + + cnf.Auth = []string{} + for _, ap := range s.Authenticator.Providers() { + cnf.Auth = append(cnf.Auth, ap.Name()) + } + + if cnf.Admins == nil { // prevent json serialization to nil + cnf.Admins = []string{} + } + render.Status(r, http.StatusOK) + render.JSON(w, r, cnf) +} + // serves static files from /web or embedded by statik func addFileServer(r chi.Router, path string, root http.FileSystem) { diff --git a/backend/app/rest/api/rest_public.go b/backend/app/rest/api/rest_public.go index f9c280b6..c24e3e8a 100644 --- a/backend/app/rest/api/rest_public.go +++ b/backend/app/rest/api/rest_public.go @@ -30,7 +30,6 @@ type public struct { commentFormatter *store.CommentFormatter imageService *image.Service webRoot string - confFn func(siteID string) config } type pubStore interface { @@ -49,20 +48,6 @@ type pubStore interface { Counts(siteID string, postIDs []string) ([]store.PostInfo, error) } -type config struct { - Version string `json:"version"` - EditDuration int `json:"edit_duration"` - MaxCommentSize int `json:"max_comment_size"` - Admins []string `json:"admins"` - AdminEmail string `json:"admin_email"` - Auth []string `json:"auth_providers"` - LowScore int `json:"low_score"` - CriticalScore int `json:"critical_score"` - PositiveScore bool `json:"positive_score"` - ReadOnlyAge int `json:"readonly_age"` - MaxImageSize int `json:"max_image_size"` -} - // GET /find?site=siteID&url=post-url&format=[tree|plain]&sort=[+/-time|+/-score|+/-controversy ] // find comments for given post. Returns in tree or plain formats, sorted func (s *public) findCommentsCtrl(w http.ResponseWriter, r *http.Request) { @@ -265,14 +250,6 @@ func (s *public) findUserCommentsCtrl(w http.ResponseWriter, r *http.Request) { } } -// GET /config?site=siteID - returns configuration -func (s *public) configCtrl(w http.ResponseWriter, r *http.Request) { - siteID := r.URL.Query().Get("site") - cnf := s.confFn(siteID) - render.Status(r, http.StatusOK) - render.JSON(w, r, cnf) -} - // GET /count?site=siteID&url=post-url - get number of comments for given post func (s *public) countCtrl(w http.ResponseWriter, r *http.Request) { locator := store.Locator{SiteID: r.URL.Query().Get("site"), URL: r.URL.Query().Get("url")} @@ -407,7 +384,7 @@ func (s *public) getStartedCtrl(w http.ResponseWriter, r *http.Request) { } // GET /robots.txt -func (s *public) getRobotsCtrl(w http.ResponseWriter, r *http.Request) { +func (s *public) robotsCtrl(w http.ResponseWriter, r *http.Request) { allowed := []string{"/find", "/last", "/id", "/count", "/counts", "/list", "/config", "/img", "/avatar", "/picture"} for i := range allowed {