MySQL 9.5.0
Source Code Documentation
keyring_reader_service_impl_template.h
Go to the documentation of this file.
1/* Copyright (c) 2021, 2025, Oracle and/or its affiliates.
2
3This program is free software; you can redistribute it and/or modify
4it under the terms of the GNU General Public License, version 2.0,
5as published by the Free Software Foundation.
6
7This program is designed to work with certain software (including
8but not limited to OpenSSL) that is licensed under separate terms,
9as designated in a particular file or component or in included license
10documentation. The authors of MySQL hereby grant you an additional
11permission to link the program and your derivative works with the
12separately licensed software that they have either included with
13the program or referenced in the documentation.
14
15This program is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18GNU General Public License, version 2.0, for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
22Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef KEYRING_READER_SERVICE_IMPL_TEMPLATE_INCLUDED
25#define KEYRING_READER_SERVICE_IMPL_TEMPLATE_INCLUDED
26
27#include <functional> /* std::function */
28#include <sstream>
29
30#include <my_dbug.h>
31#include <mysql/components/services/log_builtins.h> /* LogComponentErr */
32#include <mysqld_error.h>
33
39
44
46
47/**
48 Initialize reader
49
50 @param [in] data_id Data Identifier
51 @param [in] auth_id Authorization ID
52 @param [out] it Iterator
53 @param [in] keyring_operations Reference to the object
54 that handles cache and backend
55 @param [in] callbacks Handle to component specific callbacks
56
57 @returns status of the operation
58 @retval -1 Keyring error. reader_object will not be created.
59 @retval 0 Key not found OR error fetching keys.
60 reader_object will not be created.
61 @retval 1 Key found, check out parameters
62*/
63template <typename Backend, typename Data_extension = data::Data>
65 const char *data_id, const char *auth_id,
68 Component_callbacks &callbacks) {
69 try {
70 if (!callbacks.keyring_initialized()) {
71 LogComponentErr(INFORMATION_LEVEL,
72 ER_NOTE_KEYRING_COMPONENT_NOT_INITIALIZED);
73 return -1;
74 }
75
76 if (data_id == nullptr || !*data_id) {
77 LogComponentErr(INFORMATION_LEVEL,
78 ER_NOTE_KEYRING_COMPONENT_EMPTY_DATA_ID);
79 return 0;
80 }
81
82 Metadata metadata(data_id, auth_id);
83 if (keyring_operations.init_read_iterator(it, metadata)) {
84 LogComponentErr(INFORMATION_LEVEL,
85 ER_NOTE_KEYRING_COMPONENT_KEY_READ_ITERATOR_INIT_FAILED);
86 return 0;
87 }
88
89 if (!keyring_operations.is_valid(it)) {
90 LogComponentErr(INFORMATION_LEVEL,
91 ER_NOTE_KEYRING_COMPONENT_READ_DATA_NOT_FOUND, data_id,
92 (auth_id == nullptr || !*auth_id) ? "NULL" : auth_id);
93 keyring_operations.deinit_forward_iterator(it);
94 return 0;
95 }
96
97 return 1;
98 } catch (...) {
99 LogComponentErr(ERROR_LEVEL, ER_KEYRING_COMPONENT_EXCEPTION, "init",
100 "keyring_reader_with_status");
101 return -1;
102 }
103}
104
105/**
106 Deinitialize reader
107
108 @param [in, out] it Iterator
109 @param [in] keyring_operations Reference to the object
110 that handles cache and backend
111 @param [in] callbacks Handle to component specific callbacks
112
113 @returns status of the operation
114 @retval false Success
115 @retval true Failure
116*/
117
118template <typename Backend, typename Data_extension = data::Data>
122 Component_callbacks &callbacks) {
123 try {
124 if (!callbacks.keyring_initialized()) {
125 LogComponentErr(INFORMATION_LEVEL,
126 ER_NOTE_KEYRING_COMPONENT_NOT_INITIALIZED);
127 return true;
128 }
129 keyring_operations.deinit_forward_iterator(it);
130 return false;
131 } catch (...) {
132 LogComponentErr(ERROR_LEVEL, ER_KEYRING_COMPONENT_EXCEPTION, "deinit",
133 "keyring_reader_with_status");
134 return true;
135 }
136}
137
138/**
139 Fetch length of the data
140
141 @param [in] it Iterator
142 @param [out] data_size Size of fetched data
143 @param [out] data_type_size Size of data type
144 @param [in] keyring_operations Reference to the object
145 that handles cache and backend
146 @param [in] callbacks Handle to component specific callbacks
147 @returns status of the operation
148 @retval false Success
149 @retval true Failure
150*/
151template <typename Backend, typename Data_extension = data::Data>
153 std::unique_ptr<Iterator<Data_extension>> &it, size_t *data_size,
154 size_t *data_type_size,
156 Component_callbacks &callbacks) {
157 try {
158 if (!callbacks.keyring_initialized()) {
159 LogComponentErr(INFORMATION_LEVEL,
160 ER_NOTE_KEYRING_COMPONENT_NOT_INITIALIZED);
161 return true;
162 }
163
164 if (data_size == nullptr || data_type_size == nullptr) {
165 assert(false);
166 return true;
167 }
168
169 Data_extension data;
170 Metadata metadata;
171 if (keyring_operations.get_iterator_data(it, metadata, data)) {
172 LogComponentErr(INFORMATION_LEVEL,
173 ER_NOTE_KEYRING_COMPONENT_KEY_READ_ITERATOR_FETCH_FAILED);
174 return true;
175 }
176
177 *data_size = data.data().length();
178 *data_type_size = data.type().length();
179 return false;
180 } catch (...) {
181 LogComponentErr(ERROR_LEVEL, ER_KEYRING_COMPONENT_EXCEPTION, "fetch_length",
182 "keyring_reader_with_status");
183 return true;
184 }
185}
186
187/**
188 Fetches data from keyring
189
190 @param [in] it Iterator
191 @param [out] data_buffer Out buffer for data
192 @param [in] data_buffer_length Length of out buffer
193 @param [out] data_size Size of fetched data
194 @param [out] data_type_buffer Type of data
195 @param [in] data_type_buffer_length Length of data type buffer
196 @param [out] data_type_size Size of data type
197 @param [in] keyring_operations Reference to the object
198 that handles cache and backend
199 @param [in] callbacks Handle to component specific callbacks
200
201 @returns status of the operation
202 @retval false Success
203 @retval true Failure
204*/
205template <typename Backend, typename Data_extension = data::Data>
207 std::unique_ptr<Iterator<Data_extension>> &it, unsigned char *data_buffer,
208 size_t data_buffer_length, size_t *data_size, char *data_type_buffer,
209 size_t data_type_buffer_length, size_t *data_type_size,
211 Component_callbacks &callbacks) {
212 try {
213 if (!callbacks.keyring_initialized()) {
214 LogComponentErr(INFORMATION_LEVEL,
215 ER_NOTE_KEYRING_COMPONENT_NOT_INITIALIZED);
216 return true;
217 }
218
219 Data_extension data;
220 Metadata metadata;
221 if (keyring_operations.get_iterator_data(it, metadata, data)) {
222 LogComponentErr(INFORMATION_LEVEL,
223 ER_NOTE_KEYRING_COMPONENT_KEY_READ_ITERATOR_FETCH_FAILED);
224 return true;
225 }
226
227 if (data_buffer_length < data.data().length() || data_buffer == nullptr) {
228 assert(false);
229 return true;
230 }
231
232 if (data_type_buffer_length < data.type().length() ||
233 data_type_buffer == nullptr) {
234 assert(false);
235 return true;
236 }
237
238 memset(data_buffer, 0, data_buffer_length);
239 memset(data_type_buffer, 0, data_type_buffer_length);
240
241 memcpy(data_buffer, data.data().c_str(), data.data().length());
242 *data_size = data.data().length();
243
244 memcpy(data_type_buffer, data.type().c_str(), data.type().length());
245 *data_type_size = data.type().length();
246
247 return false;
248 } catch (...) {
249 memset(data_buffer, 0, data_buffer_length);
250 memset(data_type_buffer, 0, data_type_buffer_length);
251 LogComponentErr(ERROR_LEVEL, ER_KEYRING_COMPONENT_EXCEPTION, "fetch",
252 "keyring_reader_with_status");
253 return true;
254 }
255}
256
257} // namespace keyring_common::service_implementation
258
259#endif // KEYRING_READER_SERVICE_IMPL_TEMPLATE_INCLUDED
Sensitive data storage.
Definition: data.h:39
Definition: iterator.h:32
Common metadata.
Definition: meta.h:38
Keyring operations A class to perform operations on keyring.
Definition: operations.h:482
bool get_iterator_data(std::unique_ptr< iterator::Iterator< Data_extension > > &it, meta::Metadata &metadata, Data_extension &data)
Get data from iterator.
Definition: operations.h:744
void deinit_forward_iterator(std::unique_ptr< iterator::Iterator< Data_extension > > &it)
Iterator destruction.
Definition: operations.h:701
bool is_valid(std::unique_ptr< iterator::Iterator< Data_extension > > &it)
Check iterator validity.
Definition: operations.h:715
bool init_read_iterator(std::unique_ptr< iterator::Iterator< Data_extension > > &it, const meta::Metadata &metadata)
Iterator creation for read.
Definition: operations.h:669
bool keyring_initialized()
Keyring component status.
Definition: component_callbacks.cc:28
@ ERROR_LEVEL
Definition: my_loglevel.h:43
@ INFORMATION_LEVEL
Definition: my_loglevel.h:45
Definition: keyring_encryption_service_impl_template.h:56
int init_reader_template(const char *data_id, const char *auth_id, std::unique_ptr< Iterator< Data_extension > > &it, Keyring_operations< Backend, Data_extension > &keyring_operations, Component_callbacks &callbacks)
Initialize reader.
Definition: keyring_reader_service_impl_template.h:64
bool fetch_template(std::unique_ptr< Iterator< Data_extension > > &it, unsigned char *data_buffer, size_t data_buffer_length, size_t *data_size, char *data_type_buffer, size_t data_type_buffer_length, size_t *data_type_size, Keyring_operations< Backend, Data_extension > &keyring_operations, Component_callbacks &callbacks)
Fetches data from keyring.
Definition: keyring_reader_service_impl_template.h:206
bool fetch_length_template(std::unique_ptr< Iterator< Data_extension > > &it, size_t *data_size, size_t *data_type_size, Keyring_operations< Backend, Data_extension > &keyring_operations, Component_callbacks &callbacks)
Fetch length of the data.
Definition: keyring_reader_service_impl_template.h:152
bool deinit_reader_template(std::unique_ptr< Iterator< Data_extension > > &it, Keyring_operations< Backend, Data_extension > &keyring_operations, Component_callbacks &callbacks)
Deinitialize reader.
Definition: keyring_reader_service_impl_template.h:119
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr
The following is a common type that is returned by all the ut::make_unique (non-aligned) specializati...
Definition: ut0new.h:2444