/*
Bacula(R) - The Network Backup Solution
- Copyright (C) 2000-2015 Kern Sibbald
- Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2017 Kern Sibbald
The original author of Bacula is Kern Sibbald, with contributions
from many others, a complete list can be found in the file AUTHORS.
* change for a C++ programmer, nothing substantial was done, yet all the
* code was recommitted under this programmer's name. Consequently, we
* undo those changes here.
- *
*/
#include "bacula.h"
#include "cats.h"
#include <mysql.h>
-#define __BDB_MYSQL_H_ 1
+#define __BDB_MYSQL_H_ 1
#include "bdb_mysql.h"
/* -----------------------------------------------------------------------
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-BDB_MYSQL::BDB_MYSQL()
+BDB_MYSQL::BDB_MYSQL(): BDB()
{
BDB_MYSQL *mdb = this;
db_list->append(this);
}
-BDB_MYSQL::~BDB_MYSQL()
+BDB_MYSQL::~BDB_MYSQL()
{
}
*/
BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user,
const char *db_password, const char *db_address, int db_port, const char *db_socket,
+ const char *db_ssl_mode, const char *db_ssl_key,
+ const char *db_ssl_cert, const char *db_ssl_ca,
+ const char *db_ssl_capath, const char *db_ssl_cipher,
bool mult_db_connections, bool disable_batch_insert)
{
BDB_MYSQL *mdb = NULL;
if (db_address) {
mdb->m_db_address = bstrdup(db_address);
}
- if (db_socket) {
+ if (db_socket) {
mdb->m_db_socket = bstrdup(db_socket);
}
+ if (db_ssl_mode) {
+ mdb->m_db_ssl_mode = bstrdup(db_ssl_mode);
+ } else {
+ mdb->m_db_ssl_mode = bstrdup("preferred");
+ }
+ if (db_ssl_key) {
+ mdb->m_db_ssl_key = bstrdup(db_ssl_key);
+ }
+ if (db_ssl_cert) {
+ mdb->m_db_ssl_cert = bstrdup(db_ssl_cert);
+ }
+ if (db_ssl_ca) {
+ mdb->m_db_ssl_ca = bstrdup(db_ssl_ca);
+ }
+ if (db_ssl_capath) {
+ mdb->m_db_ssl_capath = bstrdup(db_ssl_capath);
+ }
+ if (db_ssl_cipher) {
+ mdb->m_db_ssl_cipher = bstrdup(db_ssl_cipher);
+ }
mdb->m_db_port = db_port;
if (disable_batch_insert) {
mysql_init(&mdb->m_instance);
Dmsg0(50, "mysql_init done\n");
+
+ /*
+ * Sets the appropriate certificate options for
+ * establishing secure connection using SSL to the database.
+ */
+ if (mdb->m_db_ssl_key) {
+ mysql_ssl_set(&(mdb->m_instance),
+ mdb->m_db_ssl_key,
+ mdb->m_db_ssl_cert,
+ mdb->m_db_ssl_ca,
+ mdb->m_db_ssl_capath,
+ mdb->m_db_ssl_cipher);
+ }
+
/*
* If connection fails, try at 5 sec intervals for 30 seconds.
*/
Dmsg0(50, "mysql_real_connect done\n");
Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", mdb->m_db_user, mdb->m_db_name,
(mdb->m_db_password == NULL) ? "(NULL)" : mdb->m_db_password);
-
+
if (mdb->m_db_handle == NULL) {
Mmsg2(&mdb->errmsg, _("Unable to connect to MySQL server.\n"
"Database=%s User=%s\n"
goto get_out;
}
+ /* get the current cipher used for SSL connection */
+ if (mdb->m_db_ssl_key) {
+ const char *cipher;
+ if (mdb->m_db_ssl_cipher) {
+ free(mdb->m_db_ssl_cipher);
+ }
+ cipher = (const char *)mysql_get_ssl_cipher(&(mdb->m_instance));
+ if (cipher) {
+ mdb->m_db_ssl_cipher = bstrdup(cipher);
+ }
+ Dmsg1(50, "db_ssl_ciper=%s\n", (mdb->m_db_ssl_cipher == NULL) ? "(NULL)" : mdb->m_db_ssl_cipher);
+ }
+
mdb->m_connected = true;
if (!bdb_check_version(jcr)) {
goto get_out;
}
if (mdb->m_db_socket) {
free(mdb->m_db_socket);
- }
+ }
+ if (mdb->m_db_ssl_mode) {
+ free(mdb->m_db_ssl_mode);
+ }
+ if (mdb->m_db_ssl_key) {
+ free(mdb->m_db_ssl_key);
+ }
+ if (mdb->m_db_ssl_cert) {
+ free(mdb->m_db_ssl_cert);
+ }
+ if (mdb->m_db_ssl_ca) {
+ free(mdb->m_db_ssl_ca);
+ }
+ if (mdb->m_db_ssl_capath) {
+ free(mdb->m_db_ssl_capath);
+ }
+ if (mdb->m_db_ssl_cipher) {
+ free(mdb->m_db_ssl_cipher);
+ }
delete mdb;
if (db_list->size() == 0) {
delete db_list;
}
if (!jcr->ar) {
jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR));
+ memset(jcr->ar, 0, sizeof(ATTR_DBR));
}
}