Correct db settings to use "_" instead of "-"
GUC settings with dashes cannot be shown with show or current_setting. https://www.postgresql.org/message-id/flat/20210209144059.GA21360%40depesz.com
This commit is contained in:
committed by
Steve Chavez
parent
c3ccaf1a08
commit
e4516ab606
@@ -477,18 +477,19 @@ readAppConfig dbSettings env optPath = do
|
||||
(C.Key -> C.Parser C.Value a -> C.Parser C.Config b) ->
|
||||
C.Key -> (C.Value -> a) -> C.Parser C.Config b
|
||||
overrideFromDbOrEnvironment necessity key coercion =
|
||||
case reloadableDbSetting <|> M.lookup name env of
|
||||
case reloadableDbSetting <|> M.lookup envVarName env of
|
||||
Just dbOrEnvVal -> pure $ justIfMaybe $ coercion $ C.String dbOrEnvVal
|
||||
Nothing -> necessity key (coercion <$> C.value)
|
||||
where
|
||||
name = "PGRST_" <> map capitalize (toS key)
|
||||
capitalize '-' = '_'
|
||||
capitalize c = toUpper c
|
||||
dashToUnderscore '-' = '_'
|
||||
dashToUnderscore c = c
|
||||
envVarName = "PGRST_" <> (toUpper . dashToUnderscore <$> toS key)
|
||||
reloadableDbSetting =
|
||||
if key `notElem` [
|
||||
"server-host", "server-port", "server-unix-socket", "server-unix-socket-mode", "log-level",
|
||||
"db-anon-role", "db-uri", "db-channel-enabled", "db-channel", "db-pool", "db-pool-timeout", "db-load-guc-config"]
|
||||
then lookup key dbSettings
|
||||
let dbSettingName = pack $ dashToUnderscore <$> toS key in
|
||||
if dbSettingName `notElem` [
|
||||
"server_host", "server_port", "server_unix_socket", "server_unix_socket_mode", "log_level",
|
||||
"db_anon_role", "db_uri", "db_channel_enabled", "db_channel", "db_pool", "db_pool_timeout", "db_load_guc_config"]
|
||||
then lookup dbSettingName dbSettings
|
||||
else Nothing
|
||||
|
||||
coerceText :: C.Value -> Text
|
||||
|
||||
Vendored
+38
-38
@@ -7,46 +7,46 @@ CREATE ROLE postgrest_test_author;
|
||||
GRANT postgrest_test_anonymous, postgrest_test_default_role, postgrest_test_author TO :USER;
|
||||
|
||||
-- reloadable config options for io tests
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt-aud" = 'https://example.org';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."openapi-server-proxy-uri" = 'https://example.org/api';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."raw-media-types" = 'application/vnd.pgrst.db-config';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt-secret" = 'REALLYREALLYREALLYREALLYVERYSAFE';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt-secret-is-base64" = 'true';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt-role-claim-key" = '."a"."role"';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-tx-end" = 'commit-allow-override';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-schemas" = 'test, tenant1, tenant2';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-root-spec" = 'root';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-prepared-statements" = 'false';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-pre-request" = 'test.custom_headers';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-max-rows" = '1000';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-extra-search-path" = 'public, extensions';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt_aud" = 'https://example.org';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."openapi_server_proxy_uri" = 'https://example.org/api';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."raw_media_types" = 'application/vnd.pgrst.db-config';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt_secret" = 'REALLYREALLYREALLYREALLYVERYSAFE';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt_secret_is_base64" = 'true';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."jwt_role_claim_key" = '."a"."role"';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_tx_end" = 'commit-allow-override';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_schemas" = 'test, tenant1, tenant2';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_root_spec" = 'root';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_prepared_statements" = 'false';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_pre_request" = 'test.custom_headers';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_max_rows" = '1000';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_extra_search_path" = 'public, extensions';
|
||||
|
||||
-- non-reloadable configs for io tests
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server-host" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server-port" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server-unix-socket" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server-unix-socket-mode" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."log-level" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-anon-role" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-uri" = 'postgresql://ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-channel-enabled" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-channel" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-pool" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-pool-timeout" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db-load-guc-config" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server_host" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server_port" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server_unix_socket" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."server_unix_socket_mode" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."log_level" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_anon_role" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_uri" = 'postgresql://ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_channel_enabled" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_channel" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_pool" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_pool_timeout" = 'ignored';
|
||||
ALTER ROLE postgrest_test_authenticator SET pgrst."db_load_guc_config" = 'ignored';
|
||||
|
||||
-- other authenticator reloadable config options for io tests
|
||||
CREATE ROLE other_authenticator LOGIN NOINHERIT;
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt-aud" = 'https://otherexample.org';
|
||||
ALTER ROLE other_authenticator SET pgrst."openapi-server-proxy-uri" = 'https://otherexample.org/api';
|
||||
ALTER ROLE other_authenticator SET pgrst."raw-media-types" = 'application/vnd.pgrst.other-db-config';
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt-secret" = 'ODERREALLYREALLYREALLYREALLYVERYSAFE';
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt-secret-is-base64" = 'true';
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt-role-claim-key" = '."other"."role"';
|
||||
ALTER ROLE other_authenticator SET pgrst."db-tx-end" = 'rollback-allow-override';
|
||||
ALTER ROLE other_authenticator SET pgrst."db-schemas" = 'test, other_tenant1, other_tenant2';
|
||||
ALTER ROLE other_authenticator SET pgrst."db-root-spec" = 'other_root';
|
||||
ALTER ROLE other_authenticator SET pgrst."db-prepared-statements" = 'false';
|
||||
ALTER ROLE other_authenticator SET pgrst."db-pre-request" = 'test.other_custom_headers';
|
||||
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."jwt_aud" = 'https://otherexample.org';
|
||||
ALTER ROLE other_authenticator SET pgrst."openapi_server_proxy_uri" = 'https://otherexample.org/api';
|
||||
ALTER ROLE other_authenticator SET pgrst."raw_media_types" = 'application/vnd.pgrst.other-db-config';
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt_secret" = 'ODERREALLYREALLYREALLYREALLYVERYSAFE';
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt_secret_is_base64" = 'true';
|
||||
ALTER ROLE other_authenticator SET pgrst."jwt_role_claim_key" = '."other"."role"';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_tx_end" = 'rollback-allow-override';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_schemas" = 'test, other_tenant1, other_tenant2';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_root_spec" = 'other_root';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_prepared_statements" = 'false';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_pre_request" = 'test.other_custom_headers';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_max_rows" = '100';
|
||||
ALTER ROLE other_authenticator SET pgrst."db_extra_search_path" = 'public, extensions, other';
|
||||
|
||||
Vendored
+6
-6
@@ -1928,7 +1928,7 @@ select * from pg_catalog.pg_prepared_statements;
|
||||
create or replace function change_max_rows_config(val int, notify bool default false) returns void as $_$
|
||||
begin
|
||||
execute format($$
|
||||
alter role postgrest_test_authenticator set pgrst."db-max-rows" = %L;
|
||||
alter role postgrest_test_authenticator set pgrst."db_max_rows" = %L;
|
||||
$$, val);
|
||||
if notify then
|
||||
perform pg_notify('pgrst', 'reload config');
|
||||
@@ -1937,13 +1937,13 @@ end $_$ volatile security definer language plpgsql ;
|
||||
|
||||
create or replace function reset_max_rows_config() returns void as $_$
|
||||
begin
|
||||
alter role postgrest_test_authenticator set pgrst."db-max-rows" = '1000';
|
||||
alter role postgrest_test_authenticator set pgrst."db_max_rows" = '1000';
|
||||
end $_$ volatile security definer language plpgsql ;
|
||||
|
||||
create or replace function change_db_schema_and_full_reload(schemas text) returns void as $_$
|
||||
begin
|
||||
execute format($$
|
||||
alter role postgrest_test_authenticator set pgrst."db-schemas" = %L;
|
||||
alter role postgrest_test_authenticator set pgrst."db_schemas" = %L;
|
||||
$$, schemas);
|
||||
perform pg_notify('pgrst', 'reload config');
|
||||
perform pg_notify('pgrst', 'reload schema');
|
||||
@@ -1951,19 +1951,19 @@ end $_$ volatile security definer language plpgsql ;
|
||||
|
||||
create or replace function v1.reset_db_schema_config() returns void as $_$
|
||||
begin
|
||||
alter role postgrest_test_authenticator set pgrst."db-schemas" = 'test';
|
||||
alter role postgrest_test_authenticator set pgrst."db_schemas" = 'test';
|
||||
perform pg_notify('pgrst', 'reload config');
|
||||
perform pg_notify('pgrst', 'reload schema');
|
||||
end $_$ volatile security definer language plpgsql ;
|
||||
|
||||
create or replace function test.invalid_role_claim_key_reload() returns void as $_$
|
||||
begin
|
||||
alter role postgrest_test_authenticator set pgrst."jwt-role-claim-key" = 'test';
|
||||
alter role postgrest_test_authenticator set pgrst."jwt_role_claim_key" = 'test';
|
||||
perform pg_notify('pgrst', 'reload config');
|
||||
end $_$ volatile security definer language plpgsql ;
|
||||
|
||||
create or replace function test.reset_invalid_role_claim_key() returns void as $_$
|
||||
begin
|
||||
alter role postgrest_test_authenticator set pgrst."jwt-role-claim-key" = '."a"."role"';
|
||||
alter role postgrest_test_authenticator set pgrst."jwt_role_claim_key" = '."a"."role"';
|
||||
perform pg_notify('pgrst', 'reload config');
|
||||
end $_$ volatile security definer language plpgsql ;
|
||||
|
||||
@@ -298,6 +298,23 @@ def test_expected_config_from_db_settings(defaultenv, role, expectedconfig):
|
||||
assert dumpconfig(configpath=config, env=env) == expected
|
||||
|
||||
|
||||
def test_read_db_setting(defaultenv):
|
||||
"""
|
||||
Should be able to read db settings with current_setting.
|
||||
|
||||
See: https://github.com/PostgREST/postgrest/pull/1729#discussion_r572946461
|
||||
"""
|
||||
env = {
|
||||
**defaultenv,
|
||||
"PGRST_DB_LOAD_GUC_CONFIG": "true",
|
||||
}
|
||||
with run(env=env) as postgrest:
|
||||
uri = "/rpc/get_guc_value?name=pgrst.db_max_rows"
|
||||
response = postgrest.session.get(uri)
|
||||
|
||||
assert response.text == '"1000"'
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"config",
|
||||
[conf for conf in CONFIGSDIR.iterdir() if conf.suffix == ".config"],
|
||||
|
||||
Reference in New Issue
Block a user