Skip to content

Commit 226dd2e

Browse files
committed
PG-1592 Return all nulls for key info when no key
Since no key being configured is not an error we instead of raising the error we return a tuple with all fields set to NULL. This is a pattern used by other PostgreSQL functions. Also add a more explicit test for pg_tde_verify_server_key().
1 parent dc84908 commit 226dd2e

File tree

6 files changed

+96
-55
lines changed

6 files changed

+96
-55
lines changed

contrib/pg_tde/expected/default_principal_key.out

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ ERROR: principal key not configured for current database
1212
-- Should fail: no default principal key for the server yet
1313
SELECT key_provider_id, key_provider_name, key_name
1414
FROM pg_tde_default_key_info();
15-
ERROR: Principal key does not exists for the database
16-
HINT: Use set_key interface to set the principal key
15+
key_provider_id | key_provider_name | key_name
16+
-----------------+-------------------+----------
17+
| |
18+
(1 row)
19+
1720
SELECT pg_tde_set_default_key_using_global_key_provider('default-key', 'file-provider', false);
1821
pg_tde_set_default_key_using_global_key_provider
1922
--------------------------------------------------
@@ -48,8 +51,11 @@ SELECT id, provider_name FROM pg_tde_list_all_global_key_providers();
4851
-- Should fail: no principal key for the database yet
4952
SELECT key_provider_id, key_provider_name, key_name
5053
FROM pg_tde_key_info();
51-
ERROR: Principal key does not exists for the database
52-
HINT: Use set_key interface to set the principal key
54+
key_provider_id | key_provider_name | key_name
55+
-----------------+-------------------+----------
56+
| |
57+
(1 row)
58+
5359
-- Should succeed: "localizes" the default principal key for the database
5460
CREATE TABLE test_enc(
5561
id SERIAL,
@@ -74,8 +80,11 @@ CREATE EXTENSION pg_buffercache;
7480
-- Should fail: no principal key for the database yet
7581
SELECT key_provider_id, key_provider_name, key_name
7682
FROM pg_tde_key_info();
77-
ERROR: Principal key does not exists for the database
78-
HINT: Use set_key interface to set the principal key
83+
key_provider_id | key_provider_name | key_name
84+
-----------------+-------------------+----------
85+
| |
86+
(1 row)
87+
7988
-- Should succeed: "localizes" the default principal key for the database
8089
CREATE TABLE test_enc(
8190
id SERIAL,

contrib/pg_tde/expected/key_provider.out

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
CREATE EXTENSION IF NOT EXISTS pg_tde;
22
SELECT * FROM pg_tde_key_info();
3-
ERROR: Principal key does not exists for the database
4-
HINT: Use set_key interface to set the principal key
3+
key_name | key_provider_name | key_provider_id | key_creation_time
4+
----------+-------------------+-----------------+-------------------
5+
| | |
6+
(1 row)
7+
58
SELECT pg_tde_add_database_key_provider_file('incorrect-file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per'));
69
ERROR: key provider value cannot be an object
710
SELECT pg_tde_add_database_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per');

contrib/pg_tde/src/catalog/tde_principal_key.c

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -625,64 +625,55 @@ pg_tde_get_key_info(PG_FUNCTION_ARGS, Oid dbOid)
625625
Datum values[6];
626626
bool isnull[6];
627627
HeapTuple tuple;
628-
Datum result;
629628
TDEPrincipalKey *principal_key;
630-
TimestampTz ts;
631-
GenericKeyring *keyring;
632629

633-
/* Build a tuple descriptor for our result type */
634630
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
635631
ereport(ERROR,
636632
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
637633
errmsg("function returning record called in context that cannot accept type record"));
638634

639635
LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED);
636+
640637
principal_key = GetPrincipalKeyNoDefault(dbOid, LW_SHARED);
638+
641639
if (principal_key == NULL)
642640
{
643-
ereport(ERROR,
644-
errmsg("Principal key does not exists for the database"),
645-
errhint("Use set_key interface to set the principal key"));
641+
memset(isnull, true, sizeof(isnull));
646642
}
643+
else
644+
{
645+
GenericKeyring *keyring = GetKeyProviderByID(principal_key->keyInfo.keyringId, principal_key->keyInfo.databaseId);
646+
TimestampTz ts;
647647

648-
keyring = GetKeyProviderByID(principal_key->keyInfo.keyringId, principal_key->keyInfo.databaseId);
648+
values[0] = CStringGetTextDatum(principal_key->keyInfo.name);
649+
isnull[0] = false;
649650

650-
/* Initialize the values and null flags */
651+
if (keyring)
652+
{
653+
values[1] = CStringGetTextDatum(keyring->provider_name);
654+
isnull[1] = false;
655+
}
656+
else
657+
isnull[1] = true;
651658

652-
/* TEXT: Principal key name */
653-
values[0] = CStringGetTextDatum(principal_key->keyInfo.name);
654-
isnull[0] = false;
655-
/* TEXT: Keyring provider name */
656-
if (keyring)
657-
{
658-
values[1] = CStringGetTextDatum(keyring->provider_name);
659-
isnull[1] = false;
660-
}
661-
else
662-
isnull[1] = true;
659+
values[2] = Int32GetDatum(principal_key->keyInfo.keyringId);
660+
isnull[2] = false;
663661

664-
/* INTEGERT: key provider id */
665-
values[2] = Int32GetDatum(principal_key->keyInfo.keyringId);
666-
isnull[2] = false;
662+
ts = (TimestampTz) principal_key->keyInfo.creationTime.tv_sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
663+
ts = (ts * USECS_PER_SEC) + principal_key->keyInfo.creationTime.tv_usec;
664+
values[3] = TimestampTzGetDatum(ts);
665+
isnull[3] = false;
667666

668-
/* TIMESTAMP TZ: Principal key creation time */
669-
ts = (TimestampTz) principal_key->keyInfo.creationTime.tv_sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
670-
ts = (ts * USECS_PER_SEC) + principal_key->keyInfo.creationTime.tv_usec;
671-
values[3] = TimestampTzGetDatum(ts);
672-
isnull[3] = false;
667+
pfree(keyring);
668+
}
673669

674670
LWLockRelease(tde_lwlock_enc_keys());
675671

676-
/* Form the tuple */
677672
tuple = heap_form_tuple(tupdesc, values, isnull);
678673

679-
/* Make the tuple into a datum */
680-
result = HeapTupleGetDatum(tuple);
681-
682-
pfree(keyring);
683-
684-
PG_RETURN_DATUM(result);
674+
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
685675
}
676+
686677
#endif /* FRONTEND */
687678

688679
/*

contrib/pg_tde/t/expected/rotate_key.out

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,11 @@ SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_key_info();
6666
(1 row)
6767

6868
SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_server_key_info();
69-
psql:<stdin>:1: ERROR: Principal key does not exists for the database
70-
HINT: Use set_key interface to set the principal key
69+
key_provider_id | key_provider_name | key_name
70+
-----------------+-------------------+----------
71+
| |
72+
(1 row)
73+
7174
SELECT * FROM test_enc ORDER BY id;
7275
id | k
7376
----+---
@@ -96,8 +99,11 @@ SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_key_info();
9699
(1 row)
97100

98101
SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_server_key_info();
99-
psql:<stdin>:1: ERROR: Principal key does not exists for the database
100-
HINT: Use set_key interface to set the principal key
102+
key_provider_id | key_provider_name | key_name
103+
-----------------+-------------------+----------
104+
| |
105+
(1 row)
106+
101107
SELECT * FROM test_enc ORDER BY id;
102108
id | k
103109
----+---
@@ -126,8 +132,11 @@ SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_key_info();
126132
(1 row)
127133

128134
SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_server_key_info();
129-
psql:<stdin>:1: ERROR: Principal key does not exists for the database
130-
HINT: Use set_key interface to set the principal key
135+
key_provider_id | key_provider_name | key_name
136+
-----------------+-------------------+----------
137+
| |
138+
(1 row)
139+
131140
SELECT * FROM test_enc ORDER BY id;
132141
id | k
133142
----+---
@@ -156,8 +165,11 @@ SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_key_info();
156165
(1 row)
157166

158167
SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_server_key_info();
159-
psql:<stdin>:1: ERROR: Principal key does not exists for the database
160-
HINT: Use set_key interface to set the principal key
168+
key_provider_id | key_provider_name | key_name
169+
-----------------+-------------------+----------
170+
| |
171+
(1 row)
172+
161173
SELECT * FROM test_enc ORDER BY id;
162174
id | k
163175
----+---
@@ -176,8 +188,11 @@ SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_key_info();
176188
(1 row)
177189

178190
SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_server_key_info();
179-
psql:<stdin>:1: ERROR: Principal key does not exists for the database
180-
HINT: Use set_key interface to set the principal key
191+
key_provider_id | key_provider_name | key_name
192+
-----------------+-------------------+----------
193+
| |
194+
(1 row)
195+
181196
SELECT pg_tde_set_key_using_database_key_provider('rotated-key2', 'file-2');
182197
pg_tde_set_key_using_database_key_provider
183198
--------------------------------------------
@@ -191,8 +206,11 @@ SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_key_info();
191206
(1 row)
192207

193208
SELECT key_provider_id, key_provider_name, key_name FROM pg_tde_server_key_info();
194-
psql:<stdin>:1: ERROR: Principal key does not exists for the database
195-
HINT: Use set_key interface to set the principal key
209+
key_provider_id | key_provider_name | key_name
210+
-----------------+-------------------+----------
211+
| |
212+
(1 row)
213+
196214
DROP TABLE test_enc;
197215
ALTER SYSTEM RESET pg_tde.inherit_global_providers;
198216
-- server restart

contrib/pg_tde/t/expected/wal_encrypt.out

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ SELECT pg_tde_add_global_key_provider_file('file-keyring-010', '/tmp/pg_tde_test
77

88
SELECT pg_tde_verify_server_key();
99
psql:<stdin>:1: ERROR: principal key not configured for current database
10+
SELECT key_name, key_provider_name, key_provider_id FROM pg_tde_server_key_info();
11+
key_name | key_provider_name | key_provider_id
12+
----------+-------------------+-----------------
13+
| |
14+
(1 row)
15+
1016
SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-010');
1117
pg_tde_set_server_key_using_global_key_provider
1218
-------------------------------------------------
@@ -19,6 +25,12 @@ SELECT pg_tde_verify_server_key();
1925

2026
(1 row)
2127

28+
SELECT key_name, key_provider_name, key_provider_id FROM pg_tde_server_key_info();
29+
key_name | key_provider_name | key_provider_id
30+
------------+-------------------+-----------------
31+
server-key | file-keyring-010 | -1
32+
(1 row)
33+
2234
ALTER SYSTEM SET pg_tde.wal_encrypt = on;
2335
-- server restart with wal encryption
2436
SHOW pg_tde.wal_encrypt;

contrib/pg_tde/t/wal_encrypt.pl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,20 @@
2525

2626
PGTDE::psql($node, 'postgres', 'SELECT pg_tde_verify_server_key();');
2727

28+
PGTDE::psql($node, 'postgres',
29+
'SELECT key_name, key_provider_name, key_provider_id FROM pg_tde_server_key_info();'
30+
);
31+
2832
PGTDE::psql($node, 'postgres',
2933
"SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-010');"
3034
);
3135

3236
PGTDE::psql($node, 'postgres', 'SELECT pg_tde_verify_server_key();');
3337

38+
PGTDE::psql($node, 'postgres',
39+
'SELECT key_name, key_provider_name, key_provider_id FROM pg_tde_server_key_info();'
40+
);
41+
3442
PGTDE::psql($node, 'postgres', 'ALTER SYSTEM SET pg_tde.wal_encrypt = on;');
3543

3644
PGTDE::append_to_result_file("-- server restart with wal encryption");

0 commit comments

Comments
 (0)