mysql5/mysql-5.7.27/sql/keyring_service.cc

161 lines
5.2 KiB
C++

/* Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved.
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-1301 USA */
#include "m_ctype.h" /* my_charset_utf8_bin */
#include <mysql/plugin_keyring.h> /* keyring plugin */
#include "set_var.h"
#include "strfunc.h"
#include "sql_string.h"
#include "sql_plugin.h"
#include "mysqld.h"
struct Key_data
{
Key_data() : result(TRUE)
{}
const char *key_id;
const char *key_type_to_store;
char **key_type_to_fetch;
const char *user_id;
const void *key_to_store;
void **key_to_fetch;
size_t key_len_to_store;
size_t *key_len_to_fetch;
my_bool result;
};
static my_bool key_fetch(THD *thd, plugin_ref plugin, void *arg)
{
Key_data *key_data= reinterpret_cast<Key_data*>(arg);
plugin= my_plugin_lock(NULL, &plugin);
if (plugin)
{
st_mysql_keyring *keyring=
(st_mysql_keyring *) plugin_decl(plugin)->info;
key_data->result= keyring->mysql_key_fetch(key_data->key_id, key_data->key_type_to_fetch,
key_data->user_id, key_data->key_to_fetch, key_data->key_len_to_fetch);
}
//this function should get executed only for the first plugin. This is why
//it always returns error. plugin_foreach will stop after first iteration.
plugin_unlock(NULL, plugin);
return TRUE;
}
static my_bool key_store(THD *thd, plugin_ref plugin, void *arg)
{
Key_data *key_data= reinterpret_cast<Key_data*>(arg);
plugin= my_plugin_lock(NULL, &plugin);
if (plugin)
{
st_mysql_keyring *keyring=
(st_mysql_keyring *) plugin_decl(plugin)->info;
key_data->result= keyring->mysql_key_store(key_data->key_id, key_data->key_type_to_store,
key_data->user_id, key_data->key_to_store, key_data->key_len_to_store);
}
//this function should get executed only for the first plugin. This is why
//it always returns error. plugin_foreach will stop after first iteration.
plugin_unlock(NULL, plugin);
return TRUE;
}
static my_bool key_remove(THD *thd, plugin_ref plugin, void *arg)
{
Key_data *key_data= reinterpret_cast<Key_data*>(arg);
plugin= my_plugin_lock(NULL, &plugin);
if (plugin)
{
st_mysql_keyring *keyring=
(st_mysql_keyring *) plugin_decl(plugin)->info;
key_data->result= keyring->mysql_key_remove(key_data->key_id, key_data->user_id);
}
//this function should get executed only for the first plugin. This is why
//it always returns error. plugin_foreach will stop after first iteration.
plugin_unlock(NULL, plugin);
return TRUE;
}
static my_bool key_generate(THD *thd, plugin_ref plugin, void *arg)
{
Key_data *key_data= reinterpret_cast<Key_data*>(arg);
plugin= my_plugin_lock(NULL, &plugin);
if (plugin)
{
st_mysql_keyring *keyring=
(st_mysql_keyring *) plugin_decl(plugin)->info;
key_data->result= keyring->mysql_key_generate(key_data->key_id,
key_data->key_type_to_store, key_data->user_id, key_data->key_len_to_store);
}
//this function should get executed only for the first plugin. This is why
//it always returns error. plugin_foreach will stop after first iteration.
plugin_unlock(NULL, plugin);
return TRUE;
}
int my_key_fetch(const char *key_id, char **key_type, const char *user_id,
void **key, size_t *key_len)
{
Key_data key_data;
key_data.key_id= key_id;
key_data.key_type_to_fetch= key_type;
key_data.user_id= user_id;
key_data.key_to_fetch= key;
key_data.key_len_to_fetch= key_len;
plugin_foreach(current_thd, key_fetch, MYSQL_KEYRING_PLUGIN, &key_data);
return key_data.result;
}
int my_key_store(const char *key_id, const char *key_type, const char *user_id,
const void *key, size_t key_len)
{
Key_data key_data;
key_data.key_id= key_id;
key_data.key_type_to_store= key_type;
key_data.user_id= user_id;
key_data.key_to_store= key;
key_data.key_len_to_store= key_len;
if (keyring_access_test())
return 1;
plugin_foreach(current_thd, key_store, MYSQL_KEYRING_PLUGIN, &key_data);
return key_data.result;
}
int my_key_remove(const char *key_id, const char *user_id)
{
Key_data key_data;
key_data.key_id= key_id;
key_data.user_id= user_id;
if (keyring_access_test())
return 1;
plugin_foreach(current_thd, key_remove, MYSQL_KEYRING_PLUGIN, &key_data);
return key_data.result;
}
int my_key_generate(const char *key_id, const char *key_type,
const char *user_id, size_t key_len)
{
Key_data key_data;
key_data.key_id= key_id;
key_data.key_type_to_store= key_type;
key_data.user_id= user_id;
key_data.key_len_to_store= key_len;
if (keyring_access_test())
return 1;
plugin_foreach(current_thd, key_generate, MYSQL_KEYRING_PLUGIN, &key_data);
return key_data.result;
}