Handle JSON scalar types in key provider options

Treat null as missing value, error out on boolean and make no change for
number or string.
This commit is contained in:
Anders Åstrand 2025-05-06 15:48:13 +02:00 committed by AndersAstrand
parent fe50a21b31
commit 4807e46b0b
3 changed files with 66 additions and 1 deletions

View File

@ -204,10 +204,16 @@ ERROR: key provider options must be an object
-- Creating key providers fails if an external value object doesn't have all required keys
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {}}');
ERROR: external value must contain "type" in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": null}}');
ERROR: external value must contain "type" in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "remote"}}');
ERROR: external remote value must contain "url" in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "remote", "url": null}}');
ERROR: external remote value must contain "url" in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file"}}');
ERROR: external file value must contain "path" in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": null}}');
ERROR: external file value must contain "path" in field "path"
-- Creating key providers fails if values are array instead of scalar
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": ["array"]}');
ERROR: unexpected array in field "path"
@ -215,6 +221,13 @@ SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": [
ERROR: unexpected array in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": ["array"]}}');
ERROR: unexpected array in field "path"
-- Creating key providers fails if values are boolean
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": true}');
ERROR: unexpected boolean in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": true}}');
ERROR: unexpected boolean in field "path"
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": true}}');
ERROR: unexpected boolean in field "path"
-- Modifying key providers fails if any required parameter is NULL
SELECT pg_tde_change_database_key_provider(NULL, 'file-keyring', '{}');
ERROR: provider type cannot be null
@ -245,10 +258,16 @@ ERROR: key provider options must be an object
-- Modifying key providers fails if an external value object doesn't have all required keys
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {}}');
ERROR: external value must contain "type" in field "path"
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": null}}');
ERROR: key provider "provider" does not exists
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": "remote"}}');
ERROR: external remote value must contain "url" in field "path"
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": "remote", "url": null}}');
ERROR: key provider "provider" does not exists
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": "file"}}');
ERROR: external file value must contain "path" in field "path"
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": null}}');
ERROR: key provider "provider" does not exists
-- Modifying key providers fails if values are array instead of scalar
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": ["array"]}');
ERROR: unexpected array in field "path"
@ -256,6 +275,13 @@ SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"
ERROR: unexpected array in field "path"
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": "file", "path": ["array"]}}');
ERROR: unexpected array in field "path"
-- Modifying key providers fails if values are boolean
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": true}');
ERROR: key provider "provider" does not exists
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": true}}');
ERROR: key provider "provider" does not exists
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": true}}');
ERROR: key provider "provider" does not exists
-- Deleting key providers fails if key name is NULL
SELECT pg_tde_delete_database_key_provider(NULL);
ERROR: provider_name cannot be null

View File

@ -83,14 +83,22 @@ SELECT pg_tde_add_database_key_provider('file', 'provider', 'null');
-- Creating key providers fails if an external value object doesn't have all required keys
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": null}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "remote"}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "remote", "url": null}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file"}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": null}}');
-- Creating key providers fails if values are array instead of scalar
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": ["array"]}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": ["array"]}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": ["array"]}}');
-- Creating key providers fails if values are boolean
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": true}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": true}}');
SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": true}}');
-- Modifying key providers fails if any required parameter is NULL
SELECT pg_tde_change_database_key_provider(NULL, 'file-keyring', '{}');
SELECT pg_tde_change_database_key_provider('file', NULL, '{}');
@ -111,14 +119,22 @@ SELECT pg_tde_change_database_key_provider('file', 'file-provider', 'null');
-- Modifying key providers fails if an external value object doesn't have all required keys
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {}}');
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": null}}');
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": "remote"}}');
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": "remote", "url": null}}');
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": "file"}}');
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": null}}');
-- Modifying key providers fails if values are array instead of scalar
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": ["array"]}');
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": ["array"]}}');
SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"type": "file", "path": ["array"]}}');
-- Modifying key providers fails if values are boolean
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": true}');
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": true}}');
SELECT pg_tde_change_database_key_provider('file', 'provider', '{"path": {"type": "file", "path": true}}');
-- Deleting key providers fails if key name is NULL
SELECT pg_tde_delete_database_key_provider(NULL);
SELECT pg_tde_delete_global_key_provider(NULL);

View File

@ -431,6 +431,7 @@ json_kring_scalar(void *state, char *token, JsonTokenType tokentype)
{
JsonKeyringState *parse = state;
JsonKeyringField *field = NULL;
char *value;
switch (parse->state)
{
@ -447,7 +448,29 @@ json_kring_scalar(void *state, char *token, JsonTokenType tokentype)
break;
}
return json_kring_assign_scalar(parse, *field, token);
switch (tokentype)
{
case JSON_TOKEN_STRING:
case JSON_TOKEN_NUMBER:
value = token;
break;
case JSON_TOKEN_TRUE:
case JSON_TOKEN_FALSE:
ereport(ERROR,
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("unexpected boolean in field \"%s\"", JK_FIELD_NAMES[parse->top_level_field]));
break;
case JSON_TOKEN_NULL:
value = NULL;
pfree(token);
break;
default:
ereport(ERROR,
errmsg("invalid token type"));
break;
}
return json_kring_assign_scalar(parse, *field, value);
}
static JsonParseErrorType