@@ -70,10 +70,12 @@ static bool curl_perform(VaultV2Keyring *keyring, const char *url, CurlString *o
70
70
71
71
static void set_key_by_name (GenericKeyring * keyring , KeyInfo * key );
72
72
static KeyInfo * get_key_by_name (GenericKeyring * keyring , const char * key_name , KeyringReturnCodes * return_code );
73
+ static void validate (GenericKeyring * keyring );
73
74
74
75
const TDEKeyringRoutine keyringVaultV2Routine = {
75
76
.keyring_get_key = get_key_by_name ,
76
- .keyring_store_key = set_key_by_name
77
+ .keyring_store_key = set_key_by_name ,
78
+ .keyring_validate = validate ,
77
79
};
78
80
79
81
void
@@ -300,6 +302,41 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode
300
302
return key ;
301
303
}
302
304
305
+ static void
306
+ validate (GenericKeyring * keyring )
307
+ {
308
+ VaultV2Keyring * vault_keyring = (VaultV2Keyring * ) keyring ;
309
+ char url [VAULT_URL_MAX_LEN ];
310
+ CurlString str ;
311
+ long httpCode = 0 ;
312
+
313
+ /*
314
+ * Validate connection by listing available keys at the root level of the
315
+ * mount point
316
+ */
317
+ snprintf (url , VAULT_URL_MAX_LEN , "%s/v1/%s/metadata/?list=true" ,
318
+ vault_keyring -> vault_url , vault_keyring -> vault_mount_path );
319
+
320
+ if (!curl_perform (vault_keyring , url , & str , & httpCode , NULL ))
321
+ {
322
+ ereport (ERROR ,
323
+ errmsg ("HTTP(S) request to keyring provider \"%s\" failed" ,
324
+ vault_keyring -> keyring .provider_name ));
325
+ }
326
+
327
+ /* If the mount point doesn't have any secrets yet, we'll get a 404. */
328
+ if (httpCode != 200 && httpCode != 404 )
329
+ {
330
+ ereport (ERROR ,
331
+ errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
332
+ errmsg ("Listing secrets of \"%s\" at mountpoint \"%s\" failed" ,
333
+ vault_keyring -> vault_url , vault_keyring -> vault_mount_path ));
334
+ }
335
+
336
+ if (str .ptr != NULL )
337
+ pfree (str .ptr );
338
+ }
339
+
303
340
/*
304
341
* JSON parser routines
305
342
*
0 commit comments