Move key provider deletion functions

Seems like these should belong in the same file as the functions for
creating and modifying these entries.
pull/220/head
Anders Åstrand 5 months ago committed by AndersAstrand
parent d0ff80452d
commit 0ac9bc0837
  1. 50
      contrib/pg_tde/src/catalog/tde_keyring.c
  2. 54
      contrib/pg_tde/src/catalog/tde_principal_key.c
  3. 1
      contrib/pg_tde/src/include/catalog/tde_principal_key.h

@ -75,6 +75,8 @@ PG_FUNCTION_INFO_V1(pg_tde_add_database_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_add_global_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_change_database_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_change_global_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_delete_database_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_delete_global_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_list_all_database_key_providers);
PG_FUNCTION_INFO_V1(pg_tde_list_all_global_key_providers);
@ -85,6 +87,7 @@ static Size initialize_shared_state(void *start_address);
static void key_provider_startup_cleanup(int tde_tbl_count, XLogExtensionInstall *ext_info, bool redo, void *arg);
static Datum pg_tde_add_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid);
static Datum pg_tde_change_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid);
static Datum pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid);
static Datum pg_tde_list_all_key_providers_internal(const char *fname, bool global, PG_FUNCTION_ARGS);
static Size required_shared_mem_size(void);
static List *scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid);
@ -293,6 +296,53 @@ pg_tde_add_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid)
PG_RETURN_INT32(provider.provider_id);
}
Datum
pg_tde_delete_database_key_provider(PG_FUNCTION_ARGS)
{
return pg_tde_delete_key_provider_internal(fcinfo, MyDatabaseId);
}
Datum
pg_tde_delete_global_key_provider(PG_FUNCTION_ARGS)
{
if (!superuser())
ereport(ERROR,
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("must be superuser to modify global key providers"));
return pg_tde_delete_key_provider_internal(fcinfo, GLOBAL_DATA_TDE_OID);
}
Datum
pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, Oid db_oid)
{
char *provider_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
GenericKeyring *provider = GetKeyProviderByName(provider_name, db_oid);
int provider_id;
bool provider_used;
if (provider == NULL)
{
ereport(ERROR, errmsg("Keyring provider not found"));
}
provider_id = provider->keyring_id;
provider_used = pg_tde_is_provider_used(db_oid, provider_id);
pfree(provider);
if (provider_used)
{
ereport(ERROR,
errmsg("Can't delete a provider which is currently in use"));
}
delete_key_provider_info(provider_name, db_oid, true);
PG_RETURN_VOID();
}
Datum
pg_tde_list_all_database_key_providers(PG_FUNCTION_ARGS)
{

@ -49,9 +49,6 @@
#ifndef FRONTEND
PG_FUNCTION_INFO_V1(pg_tde_delete_database_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_delete_global_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_verify_key);
PG_FUNCTION_INFO_V1(pg_tde_verify_server_key);
PG_FUNCTION_INFO_V1(pg_tde_verify_default_key);
@ -106,11 +103,8 @@ static void set_principal_key_with_keyring(const char *key_name,
Oid providerOid,
Oid dbOid,
bool ensure_new_key);
static bool pg_tde_is_provider_used(Oid databaseOid, Oid providerId);
static bool pg_tde_verify_principal_key_internal(Oid databaseOid);
static Datum pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, Oid db_oid);
PG_FUNCTION_INFO_V1(pg_tde_set_default_key_using_global_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_set_key_using_database_key_provider);
PG_FUNCTION_INFO_V1(pg_tde_set_key_using_global_key_provider);
@ -902,7 +896,7 @@ pg_tde_principal_key_configured(Oid databaseId)
return principalKey != NULL;
}
static bool
bool
pg_tde_is_provider_used(Oid databaseOid, Oid providerId)
{
bool is_global = (databaseOid == GLOBAL_DATA_TDE_OID);
@ -1051,52 +1045,6 @@ pg_tde_update_global_principal_key_everywhere(TDEPrincipalKey *oldKey, TDEPrinci
table_close(rel, RowExclusiveLock);
}
Datum
pg_tde_delete_database_key_provider(PG_FUNCTION_ARGS)
{
return pg_tde_delete_key_provider_internal(fcinfo, MyDatabaseId);
}
Datum
pg_tde_delete_global_key_provider(PG_FUNCTION_ARGS)
{
if (!superuser())
ereport(ERROR,
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("must be superuser to modify global key providers"));
return pg_tde_delete_key_provider_internal(fcinfo, GLOBAL_DATA_TDE_OID);
}
Datum
pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, Oid db_oid)
{
char *provider_name = text_to_cstring(PG_GETARG_TEXT_PP(0));
GenericKeyring *provider = GetKeyProviderByName(provider_name, db_oid);
int provider_id;
bool provider_used;
if (provider == NULL)
{
ereport(ERROR, errmsg("Keyring provider not found"));
}
provider_id = provider->keyring_id;
provider_used = pg_tde_is_provider_used(db_oid, provider_id);
pfree(provider);
if (provider_used)
{
ereport(ERROR,
errmsg("Can't delete a provider which is currently in use"));
}
delete_key_provider_info(provider_name, db_oid, true);
PG_RETURN_VOID();
}
static bool
pg_tde_verify_principal_key_internal(Oid databaseOid)
{

@ -54,5 +54,6 @@ extern TDEPrincipalKey *GetPrincipalKey(Oid dbOid, void *lockMode);
#endif
extern void xl_tde_perform_rotate_key(XLogPrincipalKeyRotate *xlrec);
extern bool pg_tde_is_provider_used(Oid databaseOid, Oid providerId);
#endif /* PG_TDE_PRINCIPAL_KEY_H */

Loading…
Cancel
Save