From 243fb02d80ffc1597877829e4daf07d690587353 Mon Sep 17 00:00:00 2001 From: Mahmoud Galal Date: Mon, 16 Sep 2024 03:40:36 +0300 Subject: [PATCH] finial code --- onboardbase_key_management.so | Bin 0 -> 220264 bytes onboardbase_key_management_plugin.cc | 698 +++++++++------------------ 2 files changed, 232 insertions(+), 466 deletions(-) create mode 100755 onboardbase_key_management.so diff --git a/onboardbase_key_management.so b/onboardbase_key_management.so new file mode 100755 index 0000000000000000000000000000000000000000..f600aa6cb04ec6d8341a5ef120e96bf99b3c71c7 GIT binary patch literal 220264 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 T)1FSg{DbFf?4^+m5zzZTuMqG$ literal 0 HcmV?d00001 diff --git a/onboardbase_key_management_plugin.cc b/onboardbase_key_management_plugin.cc index 4c57aa8..640dfd6 100644 --- a/onboardbase_key_management_plugin.cc +++ b/onboardbase_key_management_plugin.cc @@ -1,18 +1,3 @@ -/* Copyright (C) 2019-2022 MariaDB Corporation - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ - #include #include #include @@ -28,530 +13,311 @@ #include #include -#define ONBOARDBASE_DEBUG_LOGGING 0 - #define PLUGIN_ERROR_HEADER "onboardbase: " +#define MAX_RESPONSE_SIZE 131072 +#define MAX_URL_SIZE 32768 class OBData { private: - struct curl_slist *slist; - char *vault_url_data; - size_t vault_url_len; - char *local_token; - char *token_header; - bool curl_inited; + struct curl_slist *slist; + char *vault_url_data; + size_t vault_url_len; + char *local_token; + char *token_header; + bool curl_inited; + public: - OBData() - :slist(NULL), - vault_url_data(NULL), - vault_url_len(0), - local_token(NULL), - token_header(NULL), - curl_inited(false) - {} - unsigned int get_key_from_vault (unsigned int key_id, - unsigned char *dstbuf, - unsigned int *buflen); - int init (); - void deinit () - { - if (slist) - { - curl_slist_free_all(slist); - slist = NULL; - } - if (curl_inited) - { - curl_global_cleanup(); - curl_inited = false; - } - vault_url_len = 0; - if (vault_url_data) - { - free(vault_url_data); - vault_url_data = NULL; - } - if (token_header) - { - free(token_header); - token_header = NULL; - } - if (local_token) - { - free(local_token); - local_token = NULL; - } - } + OBData(); + ~OBData(); + unsigned int get_key_from_vault(unsigned int version, unsigned int key_id, unsigned char *dstbuf, unsigned int *buflen); + int init(); + void deinit(); private: - int curl_run (const char *url, std::string *response) const; - void *alloc (size_t nbytes) const - { - void *res = (char *) malloc(nbytes); - if (!res) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Memory allocation error", 0); - } - return res; - } + int curl_run(const char *url, std::string *response) const; + void *alloc(size_t nbytes) const; + static size_t write_response_memory(void *contents, size_t size, size_t nmemb, void *userp); + static std::string extract_value(const std::string &json_str, const std::string &key); }; static OBData data; - static char* vault_url; static char* token; static int timeout; static int max_retries; - +// System variables definitions static MYSQL_SYSVAR_STR(vault_url, vault_url, - PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, - "HTTP[s] URL that is used to connect to the Onboardbase Store server", - NULL, NULL, ""); + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "HTTP[s] URL that is used to connect to the Onboardbase Store server", + NULL, NULL, ""); static MYSQL_SYSVAR_STR(token, token, - PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR, - "Authentication token that passed to the Onboardbase Store " - "in the request header", - NULL, NULL, ""); + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR, + "Authentication token that passed to the Onboardbase Store in the request header", + NULL, NULL, ""); static MYSQL_SYSVAR_INT(timeout, timeout, - PLUGIN_VAR_RQCMDARG, - "Duration (in seconds) for the Onboardbase Store server " - "connection timeout", - NULL, NULL, 15, 0, 86400, 1); + PLUGIN_VAR_RQCMDARG, + "Duration (in seconds) for the Onboardbase Store server connection timeout", + NULL, NULL, 15, 0, 86400, 1); static MYSQL_SYSVAR_INT(max_retries, max_retries, - PLUGIN_VAR_RQCMDARG, - "Number of server request retries in case of timeout", - NULL, NULL, 3, 0, INT_MAX, 1); - + PLUGIN_VAR_RQCMDARG, + "Number of server request retries in case of timeout", + NULL, NULL, 3, 0, INT_MAX, 1); static struct st_mysql_sys_var *settings[] = { - MYSQL_SYSVAR(vault_url), - MYSQL_SYSVAR(token), - MYSQL_SYSVAR(timeout), - MYSQL_SYSVAR(max_retries), - NULL + MYSQL_SYSVAR(vault_url), + MYSQL_SYSVAR(token), + MYSQL_SYSVAR(timeout), + MYSQL_SYSVAR(max_retries), + NULL }; -/* - Reasonable length limit to protect against accidentally reading - the wrong key or from trying to overload the server with unnecessary - work to receive too long responses to requests: -*/ -#define MAX_RESPONSE_SIZE 131072 +OBData::OBData() + : slist(NULL), vault_url_data(NULL), vault_url_len(0), + local_token(NULL), token_header(NULL), curl_inited(false) {} -static size_t write_response_memory (void *contents, size_t size, size_t nmemb, - void *userp) -{ - size_t realsize = size * nmemb; - std::ostringstream *read_data = static_cast(userp); - size_t current_length = read_data->tellp(); - if (current_length + realsize > MAX_RESPONSE_SIZE) - return 0; // response size limit exceeded - read_data->write(static_cast(contents), realsize); - if (!read_data->good()) - return 0; - return realsize; +OBData::~OBData() { + deinit(); } -enum { - OPERATION_OK, - OPERATION_TIMEOUT, - OPERATION_ERROR -}; - -static CURLcode - perform_with_retries (CURL *curl, std::ostringstream *read_data_stream) -{ - int retries= max_retries; - CURLcode curl_res; - do { - curl_res= curl_easy_perform(curl); - if (curl_res != CURLE_OPERATION_TIMEDOUT) - { - break; +void OBData::deinit() { + if (slist) { + curl_slist_free_all(slist); + slist = NULL; + } + if (curl_inited) { + curl_global_cleanup(); + curl_inited = false; } - read_data_stream->clear(); - read_data_stream->str(""); - } while (retries--); - return curl_res; + free(vault_url_data); + free(token_header); + free(local_token); + vault_url_data = NULL; + token_header = NULL; + local_token = NULL; + vault_url_len = 0; } -int OBData::curl_run (const char *url, std::string *response, - bool soft_timeout) const -{ - char curl_errbuf[CURL_ERROR_SIZE]; - std::ostringstream read_data_stream; - long http_code = 0; - CURLcode curl_res = CURLE_OK; - CURL *curl = curl_easy_init(); - if (curl == NULL) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Cannot initialize curl session", - ME_ERROR_LOG_ONLY); - return OPERATION_ERROR; - } - curl_errbuf[0] = '\0'; - if ((curl_res= curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf)) != - CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, - write_response_memory)) != CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_WRITEDATA, - &read_data_stream)) != - CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist)) != - CURLE_OK || - /* - The options CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST are - set explicitly to withstand possible future changes in curl defaults: - */ - (curl_res= curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1)) != - CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L)) != - CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL)) != - CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L)) != - CURLE_OK || - (timeout && - ((curl_res= curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout)) != - CURLE_OK || - (curl_res= curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout)) != - CURLE_OK)) || - (curl_res = curl_easy_setopt(curl, CURLOPT_URL, url)) != CURLE_OK || - (curl_res = perform_with_retries(curl, &read_data_stream)) != CURLE_OK || - (curl_res = curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, - &http_code)) != CURLE_OK) - { - curl_easy_cleanup(curl); - if (soft_timeout && curl_res == CURLE_OPERATION_TIMEDOUT) - { - return OPERATION_TIMEOUT; - } - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "curl returned this error code: %u " - "with the following error message: %s", 0, curl_res, - curl_errbuf[0] ? curl_errbuf : - curl_easy_strerror(curl_res)); - return OPERATION_ERROR; - } - curl_easy_cleanup(curl); - *response = read_data_stream.str(); - bool is_error = http_code < 200 || http_code >= 300; - if (is_error) - { - const char *res = response->c_str(); - /* - Error 404 requires special handling - we should ignore this - error at this level, since this means the missing key (this - problem is handled at a higher level) - */ - if (http_code == 404) - { - *response = std::string(""); - is_error = false; - } - else if (is_error) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Onboardbase server error: %d, response: %s", - ME_ERROR_LOG_ONLY | ME_WARNING, http_code, res); +void *OBData::alloc(size_t nbytes) const { + void *res = malloc(nbytes); + if (!res) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER + "Memory allocation error", 0); } - } - return is_error ? OPERATION_ERROR : OPERATION_OK; + return res; } -static int get_data(const std::string &response_str, - const char **js, int *js_len, - unsigned int key_id) -{ - // Extract the "data" object from the response - std::string data_value = extract_value(response_str, "data"); - if (data_value.empty()) - { +size_t OBData::write_response_memory(void *contents, size_t size, size_t nmemb, void *userp) { + size_t realsize = size * nmemb; + std::ostringstream *read_data = static_cast(userp); + size_t current_length = read_data->tellp(); + if (current_length + realsize > MAX_RESPONSE_SIZE) + return 0; // response size limit exceeded + read_data->write(static_cast(contents), realsize); + return read_data->good() ? realsize : 0; +} + +int OBData::curl_run(const char *url, std::string *response) const { + CURL *curl = curl_easy_init(); + if (!curl) { my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Unable to get data object (http response is: %s)", - 0, response_str.c_str()); - return 2; + "Cannot initialize curl session", ME_ERROR_LOG_ONLY); + return 1; } - *js = data_value.c_str(); - *js_len = data_value.length(); - return 0; -} + std::ostringstream read_data_stream; + char curl_errbuf[CURL_ERROR_SIZE] = {0}; + + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response_memory); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_data_stream); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); + + CURLcode res; + int retries = max_retries; + do { + res = curl_easy_perform(curl); + if (res != CURLE_OPERATION_TIMEDOUT) break; + read_data_stream.str(""); + read_data_stream.clear(); + } while (--retries >= 0); + + long http_code = 0; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + curl_easy_cleanup(curl); -static int get_key_data(const char *js, int js_len, - const char **key, int *key_len, - const std::string &response_str) -{ - // Extract the "value" field from the "data" object - std::string value = extract_value(std::string(js, js_len), "value"); - if (value.empty()) - { + if (res != CURLE_OK) { my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Unable to get value string (http response is: %s)", - 0, response_str.c_str()); + "curl error: %s", ME_ERROR_LOG_ONLY, curl_errbuf[0] ? curl_errbuf : curl_easy_strerror(res)); return 1; } - *key = value.c_str(); - *key_len = value.length(); + if (http_code < 200 || http_code >= 300) { + if (http_code != 404) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER + "HTTP error: %ld, response: %s", ME_ERROR_LOG_ONLY | ME_WARNING, + http_code, read_data_stream.str().c_str()); + return 1; + } + read_data_stream.str(""); + } + + *response = read_data_stream.str(); return 0; } -// Function to extract value from JSON-like string -std::string extract_value(const std::string &json_str, const std::string &key) -{ +std::string OBData::extract_value(const std::string &json_str, const std::string &key) { std::string search_key = "\"" + key + "\":\""; size_t start = json_str.find(search_key); - if (start == std::string::npos) - { - return ""; // Key not found - } + if (start == std::string::npos) return ""; start += search_key.length(); size_t end = json_str.find("\"", start); - if (end == std::string::npos) - { - return ""; // Malformed JSON - } + if (end == std::string::npos) return ""; return json_str.substr(start, end - start); } -unsigned int OBData::get_key_from_vault (unsigned int key_id, - unsigned char *dstbuf, - unsigned int *buflen) -{ - std::string response_str; - - // Construct the Onboardbase URL directly - size_t buf_len = vault_url_len + 20 + 1; // URL + key_id + null terminator - char *url = (char *) alloca(buf_len); - snprintf(url, buf_len, "%s%u", vault_url_data, key_id); - - int rc; - if ((rc = curl_run(url, &response_str)) != OPERATION_OK) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Unable to get key data", 0); - return ENCRYPTION_KEY_VERSION_INVALID; - } - - const char *js; - int js_len; - if (get_data(response_str, &js, &js_len, key_id)) - { - return ENCRYPTION_KEY_VERSION_INVALID; - } - - const char *key; - int key_len; - if (get_key_data(js, js_len, &key, &key_len, response_str)) - { - return ENCRYPTION_KEY_VERSION_INVALID; - } - - memcpy(dstbuf, key, key_len); - *buflen = key_len; - return 0; -} +unsigned int OBData::get_key_from_vault(unsigned int version, unsigned int key_id, unsigned char *dstbuf, unsigned int *buflen) { + // The implementation remains largely the same, but we'll add a version check + if (version != 1) { + // Handle unsupported version + return ENCRYPTION_KEY_VERSION_INVALID; + } + std::string url = std::string(vault_url_data) + std::to_string(key_id); + std::string response; -static unsigned int get_key_from_vault(unsigned int key_id, - unsigned char *dstbuf, - unsigned int *buflen) -{ - return data.get_key_from_vault(key_id, dstbuf, buflen); + if (curl_run(url.c_str(), &response) != 0) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER + "Unable to get key data", 0); + return ENCRYPTION_KEY_VERSION_INVALID; + } + + std::string data_value = extract_value(response, "data"); + if (data_value.empty()) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER + "Unable to get data object (http response is: %s)", 0, response.c_str()); + return ENCRYPTION_KEY_VERSION_INVALID; + } + + std::string key_value = extract_value(data_value, "value"); + if (key_value.empty()) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER + "Unable to get value string (http response is: %s)", 0, response.c_str()); + return ENCRYPTION_KEY_VERSION_INVALID; + } + + *buflen = key_value.length(); + memcpy(dstbuf, key_value.c_str(), *buflen); + return 0; } -struct st_mariadb_encryption onboardbase_key_management_plugin= { - MariaDB_ENCRYPTION_INTERFACE_VERSION, - get_latest_version, - get_key_from_vault, - 0, 0, 0, 0, 0 -}; +int OBData::init() { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Starting init function", ME_ERROR_LOG_ONLY); -#define MAX_URL_SIZE 32768 + const char *x_vault_token = "store_key:"; + size_t token_len = strlen(token); -int OBData::init () -{ - const static char *x_vault_token = "store_key:"; - const static size_t x_vault_token_len = strlen(x_vault_token); - char *token_env= getenv("VAULT_TOKEN"); - size_t token_len = strlen(token); - if (token_len == 0) - { - if (token_env) - { - token_len = strlen(token_env); - if (token_len != 0) - { - /* - The value of the token parameter obtained using the getenv() - system call, which does not guarantee that the memory pointed - to by the returned pointer can be read in the long term (for - example, after changing the values of the environment variables - of the current process). Therefore, we need to copy the token - value to the working buffer: - */ - if (!(token = (char *) alloc(token_len + 1))) - { - return 1; + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Checking token length", ME_ERROR_LOG_ONLY); + + if (token_len == 0) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Token is empty, checking VAULT_TOKEN environment variable", ME_ERROR_LOG_ONLY); + + char *token_env = getenv("VAULT_TOKEN"); + if (token_env) { + token_len = strlen(token_env); + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Found VAULT_TOKEN in environment", ME_ERROR_LOG_ONLY); + + if (token_len != 0) { + local_token = strdup(token_env); + if (!local_token) return 1; + token = local_token; + } + } + + if (token_len == 0) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Both token and VAULT_TOKEN environment variable are empty", 0); + return 1; } - memcpy(token, token_env, token_len + 1); - local_token = token; - } } - if (token_len == 0) { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "The --onboardbase-key-management-token option value " - "or the value of the corresponding parameter in the " - "configuration file must be specified, otherwise the " - "VAULT_TOKEN environment variable must be set", - 0); - return 1; + + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Constructing token header", ME_ERROR_LOG_ONLY); + + size_t buf_len = strlen(x_vault_token) + token_len + 1; + token_header = (char *)alloc(buf_len); + if (!token_header) return 1; + snprintf(token_header, buf_len, "%s%s", x_vault_token, token); + + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Token header constructed successfully", ME_ERROR_LOG_ONLY); + + vault_url_len = strlen(vault_url); + vault_url_data = (char *)alloc(vault_url_len + 1); + if (!vault_url_data) return 1; + snprintf(vault_url_data, vault_url_len + 1, "%s", vault_url); + + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Vault URL prepared", ME_ERROR_LOG_ONLY); + + if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Unable to initialize curl library", 0); + return 1; } - } - else - { - /* - If the VAULT_TOKEN environment variable is not set or - is not equal to the value of the token parameter, then - we must set (overwrite) it for correct operation of - the mariabackup: - */ - bool not_equal= token_env != NULL && strcmp(token_env, token) != 0; - if (token_env == NULL || not_equal) - { -#if defined(HAVE_SETENV) || !defined(_WIN32) - setenv("VAULT_TOKEN", token, 1); -#else - _putenv_s("VAULT_TOKEN", token); -#endif - if (not_equal) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "The --onboardbase-key-management-token option value " - "or the value of the corresponding parameter is not " - "equal to the value of the VAULT_TOKEN environment " - "variable", - ME_ERROR_LOG_ONLY | ME_WARNING); - } + curl_inited = true; + + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "cURL library initialized", ME_ERROR_LOG_ONLY); + + slist = curl_slist_append(NULL, token_header); + if (!slist) { + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "curl: unable to construct slist", 0); + return 1; } - } -#if ONBOARDBASE_DEBUG_LOGGING - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "plugin_init: token = %s, token_len = %d", - ME_ERROR_LOG_ONLY | ME_NOTE, token, (int) token_len); -#endif - size_t buf_len = x_vault_token_len + token_len + 1; - if (!(token_header = (char *) alloc(buf_len))) - { - return 1; - } - snprintf(token_header, buf_len, "%s%s", x_vault_token, token); - /* - In advance, we create a buffer containing the URL for vault - + the "/data/" suffix (7 characters): - */ - if (!(vault_url_data = (char *) alloc(vault_url_len + 7))) - { - return 1; - } - memcpy(vault_url_data, vault_url, vault_url_len); - memcpy(vault_url_data + vault_url_len, "/data/", 7); - /* Initialize curl: */ - CURLcode curl_res = curl_global_init(CURL_GLOBAL_ALL); - if (curl_res != CURLE_OK) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "unable to initialize curl library, " - "curl returned this error code: %u " - "with the following error message: %s", - 0, curl_res, curl_easy_strerror(curl_res)); - return 1; - } - curl_inited = true; - slist = curl_slist_append(slist, token_header); - if (slist == NULL) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "curl: unable to construct slist", 0); - return 1; - } - /* - If we do not need to check the key-value storage version, - then we immediately return from this function: - */ - if (check_kv_version == 0) { + + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Header list constructed successfully", ME_ERROR_LOG_ONLY); + + my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Init function completed", ME_ERROR_LOG_ONLY); return 0; - } - /* - Let's construct a URL to check the version of the key-value storage: - */ - char *mount_url = (char *) alloc(vault_url_len + 11 + 6); - if (mount_url == NULL) - { - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "Memory allocation error", 0); - return 1; - } - /* - The prefix length must be recalculated, as it may have - changed in the process of discarding trailing slashes: - */ - prefix_len = vault_url_len - suffix_len; - memcpy(mount_url, vault_url_data, prefix_len); - memcpy(mount_url + prefix_len, "sys/mounts/", 11); - memcpy(mount_url + prefix_len + 11, vault_url_data + prefix_len, suffix_len); - memcpy(mount_url + prefix_len + 11 + suffix_len, "/tune", 6); -#if ONBOARDBASE_DEBUG_LOGGING - my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER - "storage mount url: [%s]", - ME_ERROR_LOG_ONLY | ME_NOTE, mount_url); -#endif - free(mount_url); - return rc; +} +static unsigned int get_key_from_vault(unsigned int version, unsigned int key_id, unsigned char *dstbuf, unsigned int *buflen) { + return data.get_key_from_vault(version, key_id, dstbuf, buflen); } -static int onboardbase_key_management_plugin_init(void *p) -{ - int rc = data.init(); - if (rc) - { - data.deinit(); - } - return rc; +struct st_mariadb_encryption onboardbase_key_management_plugin = { + MariaDB_ENCRYPTION_INTERFACE_VERSION, + NULL, // get_latest_version is not implemented + get_key_from_vault, + NULL, NULL, NULL, NULL, NULL +}; + +static int onboardbase_key_management_plugin_init(void *p) { + return data.init(); } -static int onboardbase_key_management_plugin_deinit(void *p) -{ - data.deinit(); - return 0; +static int onboardbase_key_management_plugin_deinit(void *p) { + data.deinit(); + return 0; } -/* - Plugin library descriptor -*/ maria_declare_plugin(onboardbase_key_management) { - MariaDB_ENCRYPTION_PLUGIN, - &onboardbase_key_management_plugin, - "onboardbase_key_management", - "Onboardbase", - "Onboardbase Store key management plugin", - PLUGIN_LICENSE_GPL, - onboardbase_key_management_plugin_init, - onboardbase_key_management_plugin_deinit, - 0x0100 /* 1.0 */, - NULL, /* status variables */ - settings, - "1.0", - MariaDB_PLUGIN_MATURITY_STABLE + MariaDB_ENCRYPTION_PLUGIN, + &onboardbase_key_management_plugin, + "onboardbase_key_management", + "Onboardbase", + "Onboardbase Store key management plugin", + PLUGIN_LICENSE_GPL, + onboardbase_key_management_plugin_init, + onboardbase_key_management_plugin_deinit, + 0x0100, /* 1.0 */ + NULL, /* status variables */ + settings, + "1.0", + MariaDB_PLUGIN_MATURITY_STABLE } maria_declare_plugin_end; \ No newline at end of file