From 729b6d2d0876f9c835e83f09b164827ad66e0136 Mon Sep 17 00:00:00 2001 From: Umputun Date: Mon, 27 Jul 2020 16:58:47 -0500 Subject: [PATCH] add `--proxy-cors` $PROXY_CORS disabling internal cors middleware #749 --- README.md | 1 + backend/app/cmd/server.go | 2 ++ backend/app/rest/api/rest.go | 23 ++++++++++++++--------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ba8991e7..a1208adb 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,7 @@ _this is the recommended way to run remark42_ | image-proxy.cache-external | IMAGE_PROXY_CACHE_EXTERNAL | `false` | enable caching external images to current image storage | | emoji | EMOJI | `false` | enable emoji support | | simple-view | SIMPLE_VIEW | `false` | minimized UI with basic info only | +| proxy-cors | PROXY_CORS | `false` | disable internal CORS and delegate it to proxy | | port | REMARK_PORT | `8080` | web server port | | web-root | REMARK_WEB_ROOT | `./web` | web server root directory | | update-limit | UPDATE_LIMIT | `0.5` | updates/sec limit | diff --git a/backend/app/cmd/server.go b/backend/app/cmd/server.go index be109042..3c291716 100644 --- a/backend/app/cmd/server.go +++ b/backend/app/cmd/server.go @@ -75,6 +75,7 @@ type ServerCommand struct { RestrictedWords []string `long:"restricted-words" env:"RESTRICTED_WORDS" description:"words prohibited to use in comments" env-delim:","` EnableEmoji bool `long:"emoji" env:"EMOJI" description:"enable emoji"` SimpleView bool `long:"simpler-view" env:"SIMPLE_VIEW" description:"minimal comment editor mode"` + ProxyCORS bool `long:"proxy-cors" env:"PROXY_CORS" description:"disable internal CORS and delegate it to proxy"` Auth struct { TTL struct { @@ -453,6 +454,7 @@ func (s *ServerCommand) newServerApp() (*serverApp, error) { EmojiEnabled: s.EnableEmoji, AnonVote: s.AnonymousVote && s.RestrictVoteIP, SimpleView: s.SimpleView, + ProxyCORS: s.ProxyCORS, } // enable admin notifications only if admin email is set diff --git a/backend/app/rest/api/rest.go b/backend/app/rest/api/rest.go index 5d6fdfb6..f79404fb 100644 --- a/backend/app/rest/api/rest.go +++ b/backend/app/rest/api/rest.go @@ -62,6 +62,7 @@ type Rest struct { EmailNotifications bool EmojiEnabled bool SimpleView bool + ProxyCORS bool SSLConfig SSLConfig httpsServer *http.Server @@ -187,15 +188,19 @@ func (s *Rest) routes() chi.Router { s.pubRest, s.privRest, s.adminRest, s.rssRest = s.controllerGroups() // assign controllers for groups - corsMiddleware := cors.New(cors.Options{ - AllowedOrigins: []string{"*"}, - AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, - AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-XSRF-Token", "X-JWT"}, - ExposedHeaders: []string{"Authorization"}, - AllowCredentials: true, - MaxAge: 300, - }) - router.Use(corsMiddleware.Handler) + if s.ProxyCORS { + log.Printf("[WARN] internal CORS disabled") + } else { + corsMiddleware := cors.New(cors.Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, + AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-XSRF-Token", "X-JWT"}, + ExposedHeaders: []string{"Authorization"}, + AllowCredentials: true, + MaxAge: 300, + }) + router.Use(corsMiddleware.Handler) + } ipFn := func(ip string) string { return store.HashValue(ip, s.SharedSecret)[:12] } // logger uses it for anonymization logInfoWithBody := logger.New(logger.Log(log.Default()), logger.WithBody, logger.IPfn(ipFn), logger.Prefix("[INFO]")).Handler