diff --git a/CHANGELOG.md b/CHANGELOG.md index ec757c4e3..8cddd98c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #3330, Incorrect admin server `/ready` response on slow schema cache loads - @steve-chavez - #3327, Fix slow responses on schema cache reloads - @steve-chavez - #3340, Log when the LISTEN channel gets a notification - @steve-chavez + - #3345, Fix in-database configuration values not loading for `pgrst.server_trace_header` and `pgrst.server_cors_allowed_origins` - @laurenceisla ### Deprecated diff --git a/src/PostgREST/App.hs b/src/PostgREST/App.hs index dc336f0d9..95716a3f6 100644 --- a/src/PostgREST/App.hs +++ b/src/PostgREST/App.hs @@ -9,7 +9,6 @@ Some of its functionality includes: - Producing HTTP Headers according to RFCs. - Content Negotiation -} -{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RecordWildCards #-} module PostgREST.App ( postgrest @@ -49,7 +48,7 @@ import PostgREST.ApiRequest (Action (..), ApiRequest (..), Mutation (..)) import PostgREST.AppState (AppState) import PostgREST.Auth (AuthResult (..)) -import PostgREST.Config (AppConfig (..)) +import PostgREST.Config (AppConfig (..), LogLevel (..)) import PostgREST.Config.PgVersion (PgVersion (..)) import PostgREST.Error (Error) import PostgREST.Observation (Observation (..)) @@ -81,7 +80,7 @@ run appState observer = do Admin.runAdmin conf appState (serverSettings conf) observer - let app = postgrest conf appState (AppState.connectionWorker appState) observer + let app = postgrest configLogLevel appState (AppState.connectionWorker appState) observer case configServerUnixSocket of Just path -> do @@ -100,12 +99,12 @@ serverSettings AppConfig{..} = & setServerName ("postgrest/" <> prettyVersion) -- | PostgREST application -postgrest :: AppConfig -> AppState.AppState -> IO () -> (Observation -> IO ()) -> Wai.Application -postgrest conf appState connWorker observer = - traceHeaderMiddleware conf . - Cors.middleware (configServerCorsAllowedOrigins conf) . +postgrest :: LogLevel -> AppState.AppState -> IO () -> (Observation -> IO ()) -> Wai.Application +postgrest logLevel appState connWorker observer = + traceHeaderMiddleware appState . + Cors.middleware appState . Auth.middleware appState . - Logger.middleware (configLogLevel conf) $ + Logger.middleware logLevel $ -- fromJust can be used, because the auth middleware will **always** add -- some AuthResult to the vault. \req respond -> case fromJust $ Auth.getResult req of @@ -251,9 +250,11 @@ calcTiming timingEnabled f = if timingEnabled r <- f pure (Nothing, r) -traceHeaderMiddleware :: AppConfig -> Wai.Middleware -traceHeaderMiddleware AppConfig{configServerTraceHeader} app req respond = - case configServerTraceHeader of +traceHeaderMiddleware :: AppState -> Wai.Middleware +traceHeaderMiddleware appState app req respond = do + conf <- AppState.getConfig appState + + case configServerTraceHeader conf of Nothing -> app req respond Just hdr -> let hdrVal = L.lookup hdr $ Wai.requestHeaders req in diff --git a/src/PostgREST/Config/Database.hs b/src/PostgREST/Config/Database.hs index 3792a48d7..01bc0fa07 100644 --- a/src/PostgREST/Config/Database.hs +++ b/src/PostgREST/Config/Database.hs @@ -65,6 +65,7 @@ dbSettingsNames = ,"openapi_security_active" ,"openapi_server_proxy_uri" ,"raw_media_types" + ,"server_cors_allowed_origins" ,"server_trace_header" ,"server_timing_enabled" ] diff --git a/src/PostgREST/Cors.hs b/src/PostgREST/Cors.hs index fea3733df..1e4c34b36 100644 --- a/src/PostgREST/Cors.hs +++ b/src/PostgREST/Cors.hs @@ -15,10 +15,15 @@ import qualified Network.Wai.Middleware.Cors as Wai import Data.List (lookup) +import PostgREST.AppState (AppState, getConfig) +import PostgREST.Config (AppConfig (..)) + import Protolude -middleware :: Maybe [Text] -> Wai.Middleware -middleware corsAllowedOrigins = Wai.cors $ corsPolicy corsAllowedOrigins +middleware :: AppState -> Wai.Middleware +middleware appState app req res = do + conf <- getConfig appState + Wai.cors (corsPolicy $ configServerCorsAllowedOrigins conf) app req res -- | CORS policy to be used in by Wai Cors middleware corsPolicy :: Maybe [Text] -> Wai.Request -> Maybe Wai.CorsResourcePolicy diff --git a/test/io/configs/expected/no-defaults-with-db-other-authenticator.config b/test/io/configs/expected/no-defaults-with-db-other-authenticator.config index b33a0a34e..db18fa99f 100644 --- a/test/io/configs/expected/no-defaults-with-db-other-authenticator.config +++ b/test/io/configs/expected/no-defaults-with-db-other-authenticator.config @@ -27,7 +27,7 @@ log-level = "info" openapi-mode = "disabled" openapi-security-active = false openapi-server-proxy-uri = "https://otherexample.org/api" -server-cors-allowed-origins = "http://example.com" +server-cors-allowed-origins = "http://otherorigin.com" server-host = "0.0.0.0" server-port = 80 server-trace-header = "traceparent" diff --git a/test/io/configs/expected/no-defaults-with-db.config b/test/io/configs/expected/no-defaults-with-db.config index d1fd38c87..739f3a48f 100644 --- a/test/io/configs/expected/no-defaults-with-db.config +++ b/test/io/configs/expected/no-defaults-with-db.config @@ -27,7 +27,7 @@ log-level = "info" openapi-mode = "ignore-privileges" openapi-security-active = true openapi-server-proxy-uri = "https://example.org/api" -server-cors-allowed-origins = "http://example.com" +server-cors-allowed-origins = "http://origin.com" server-host = "0.0.0.0" server-port = 80 server-trace-header = "CF-Ray" diff --git a/test/io/db_config.sql b/test/io/db_config.sql index 65380590e..84be9097a 100644 --- a/test/io/db_config.sql +++ b/test/io/db_config.sql @@ -19,7 +19,7 @@ ALTER ROLE db_config_authenticator SET pgrst.db_pre_request = 'test.custom_heade ALTER ROLE db_config_authenticator SET pgrst.db_max_rows = '1000'; ALTER ROLE db_config_authenticator SET pgrst.db_extra_search_path = 'public, extensions'; ALTER ROLE db_config_authenticator SET pgrst.not_existing = 'should be ignored'; -ALTER ROLE db_config_authenticator SET pgrst.server_cors_allowed_origins = 'http://example.com'; +ALTER ROLE db_config_authenticator SET pgrst.server_cors_allowed_origins = 'http://origin.com'; ALTER ROLE db_config_authenticator SET pgrst.server_trace_header = 'CF-Ray'; ALTER ROLE db_config_authenticator SET pgrst.server_timing_enabled = 'true'; @@ -66,7 +66,7 @@ ALTER ROLE other_authenticator SET pgrst.db_max_rows = '100'; ALTER ROLE other_authenticator SET pgrst.db_extra_search_path = 'public, extensions, other'; ALTER ROLE other_authenticator SET pgrst.openapi_mode = 'disabled'; ALTER ROLE other_authenticator SET pgrst.openapi_security_active = 'false'; -ALTER ROLE other_authenticator SET pgrst.server_cors_allowed_origins = 'http://example.com'; +ALTER ROLE other_authenticator SET pgrst.server_cors_allowed_origins = 'http://otherorigin.com'; ALTER ROLE other_authenticator SET pgrst.server_trace_header = 'traceparent'; ALTER ROLE other_authenticator SET pgrst.db_pre_config = 'postgrest.pre_config'; ALTER ROLE other_authenticator SET pgrst.server_timing_enabled = 'true'; diff --git a/test/spec/Main.hs b/test/spec/Main.hs index a6edf2367..8c31bcd64 100644 --- a/test/spec/Main.hs +++ b/test/spec/Main.hs @@ -83,7 +83,7 @@ main = do appState <- AppState.initWithPool sockets pool config noObs AppState.putPgVersion appState actualPgVersion AppState.putSchemaCache appState (Just baseSchemaCache) - return ((), postgrest config appState (pure ()) noObs) + return ((), postgrest (configLogLevel config) appState (pure ()) noObs) -- For tests that run with a different SchemaCache(depends on configSchemas) appDbs config = do @@ -91,7 +91,7 @@ main = do appState <- AppState.initWithPool sockets pool config noObs AppState.putPgVersion appState actualPgVersion AppState.putSchemaCache appState (Just customSchemaCache) - return ((), postgrest config appState (pure ()) noObs) + return ((), postgrest (configLogLevel config) appState (pure ()) noObs) let withApp = app testCfg maxRowsApp = app testMaxRowsCfg