refactor(conninfo): add append_conninfo_param helper

Centralize escaping/formatting of connection parameters (key='value').
Replace duplicate escape/append/free sequences in connect_start and PgSQL_backend_kill_thread.
pull/5137/head
Rahim Kanji 7 months ago
parent 9cb605f4fb
commit 84389b71b9

@ -916,6 +916,15 @@ handler_again:
return async_state_machine;
}
static void append_conninfo_param(std::ostringstream& conninfo, const char* key, char* val) {
if (!val) return;
char* escaped_str = escape_string_single_quotes_and_backslashes(val, false);
conninfo << key << "='" << escaped_str << "' ";
if (escaped_str != val) {
free(escaped_str);
}
}
void PgSQL_Connection::connect_start() {
PROXY_TRACE();
assert(pgsql_conn == NULL); // already there is a connection
@ -923,57 +932,20 @@ void PgSQL_Connection::connect_start() {
async_exit_status = PG_EVENT_NONE;
std::ostringstream conninfo;
char* escaped_str = escape_string_single_quotes_and_backslashes(userinfo->username, false);
conninfo << "user='" << escaped_str << "' "; // username
if (escaped_str != userinfo->username)
free(escaped_str);
escaped_str = escape_string_single_quotes_and_backslashes(userinfo->password, false);
conninfo << "password='" << escaped_str << "' "; // password
if (escaped_str != userinfo->password)
free(escaped_str);
escaped_str = escape_string_single_quotes_and_backslashes(userinfo->dbname, false);
conninfo << "dbname='" << escaped_str << "' ";
if (escaped_str != userinfo->dbname)
free(escaped_str);
conninfo << "host='" << parent->address << "' "; // backend address
append_conninfo_param(conninfo, "user", userinfo->username); // username
append_conninfo_param(conninfo, "password", userinfo->password); // password
append_conninfo_param(conninfo, "dbname", userinfo->dbname); // dbname
append_conninfo_param(conninfo, "host", parent->address); // backend address
conninfo << "port=" << parent->port << " "; // backend port
conninfo << "application_name=proxysql "; // application name
//conninfo << "require_auth=" << AUTHENTICATION_METHOD_STR[pgsql_thread___authentication_method]; // authentication method
if (parent->use_ssl) {
conninfo << "sslmode=require "; // SSL required
if (pgsql_thread___ssl_p2s_key) {
escaped_str = escape_string_single_quotes_and_backslashes(pgsql_thread___ssl_p2s_key, false);
conninfo << "sslkey='" << escaped_str << "' ";
if (escaped_str != pgsql_thread___ssl_p2s_key)
free(escaped_str);
}
if (pgsql_thread___ssl_p2s_cert) {
escaped_str = escape_string_single_quotes_and_backslashes(pgsql_thread___ssl_p2s_cert, false);
conninfo << "sslcert='" << escaped_str << "' ";
if (escaped_str != pgsql_thread___ssl_p2s_cert)
free(escaped_str);
}
if (pgsql_thread___ssl_p2s_ca) {
escaped_str = escape_string_single_quotes_and_backslashes(pgsql_thread___ssl_p2s_ca, false);
conninfo << "sslrootcert='" << escaped_str << "' ";
if (escaped_str != pgsql_thread___ssl_p2s_ca)
free(escaped_str);
}
if (pgsql_thread___ssl_p2s_crl) {
escaped_str = escape_string_single_quotes_and_backslashes(pgsql_thread___ssl_p2s_crl, false);
conninfo << "sslcrl='" << escaped_str << "' ";
if (escaped_str != pgsql_thread___ssl_p2s_crl)
free(escaped_str);
}
if (pgsql_thread___ssl_p2s_crlpath) {
escaped_str = escape_string_single_quotes_and_backslashes(pgsql_thread___ssl_p2s_crlpath, false);
conninfo << "sslcrldir='" << escaped_str << "' ";
if (escaped_str != pgsql_thread___ssl_p2s_crlpath)
free(escaped_str);
}
conninfo << "sslmode='require' "; // SSL required
append_conninfo_param(conninfo, "sslkey", pgsql_thread___ssl_p2s_key);
append_conninfo_param(conninfo, "sslcert", pgsql_thread___ssl_p2s_cert);
append_conninfo_param(conninfo, "sslrootcert", pgsql_thread___ssl_p2s_ca);
append_conninfo_param(conninfo, "sslcrl", pgsql_thread___ssl_p2s_crl);
append_conninfo_param(conninfo, "sslcrldir", pgsql_thread___ssl_p2s_crlpath);
// Only supported in PostgreSQL Server
// if (pgsql_thread___ssl_p2s_cipher)
// conninfo << "sslcipher=" << pgsql_thread___ssl_p2s_cipher << " ";
@ -2966,59 +2938,21 @@ void* PgSQL_backend_kill_thread(void* arg) {
} else if (backend_kill_args->type == PgSQL_Backend_Kill_Args::TYPE::TERMINATE_CONNECTION) {
std::ostringstream conninfo;
char* escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->username, false);
conninfo << "user='" << escaped_str << "' "; // username
if (escaped_str != backend_kill_args->username)
free(escaped_str);
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->password, false);
conninfo << "password='" << escaped_str << "' "; // password
if (escaped_str != backend_kill_args->password)
free(escaped_str);
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->dbname, false);
conninfo << "dbname='" << escaped_str << "' ";
if (escaped_str != backend_kill_args->dbname)
free(escaped_str);
conninfo << "host='" << backend_kill_args->hostname << "' "; // backend address
append_conninfo_param(conninfo, "user", backend_kill_args->username); // username
append_conninfo_param(conninfo, "password", backend_kill_args->password); // password
append_conninfo_param(conninfo, "dbname", backend_kill_args->dbname); // dbname
append_conninfo_param(conninfo, "host", backend_kill_args->hostname); // backend address
conninfo << "port=" << backend_kill_args->port << " "; // backend port
conninfo << "application_name=proxysql "; // application name
if (backend_kill_args->ssl_config.use_ssl) {
conninfo << "sslmode=require "; // SSL required
if (backend_kill_args->ssl_config.sslkey) {
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->ssl_config.sslkey, false);
conninfo << "sslkey='" << escaped_str << "' ";
if (escaped_str != backend_kill_args->ssl_config.sslkey)
free(escaped_str);
}
if (backend_kill_args->ssl_config.sslcert) {
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->ssl_config.sslcert, false);
conninfo << "sslcert='" << escaped_str << "' ";
if (escaped_str != backend_kill_args->ssl_config.sslcert)
free(escaped_str);
}
if (backend_kill_args->ssl_config.sslrootcert) {
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->ssl_config.sslrootcert, false);
conninfo << "sslrootcert='" << escaped_str << "' ";
if (escaped_str != backend_kill_args->ssl_config.sslrootcert)
free(escaped_str);
}
if (backend_kill_args->ssl_config.sslcrl) {
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->ssl_config.sslcrl, false);
conninfo << "sslcrl='" << escaped_str << "' ";
if (escaped_str != backend_kill_args->ssl_config.sslcrl)
free(escaped_str);
}
if (backend_kill_args->ssl_config.sslcrldir) {
escaped_str = escape_string_single_quotes_and_backslashes(backend_kill_args->ssl_config.sslcrldir, false);
conninfo << "sslcrldir='" << escaped_str << "' ";
if (escaped_str != backend_kill_args->ssl_config.sslcrldir)
free(escaped_str);
}
}
else {
conninfo << "sslmode='require' "; // SSL required
append_conninfo_param(conninfo, "sslkey", backend_kill_args->ssl_config.sslkey);
append_conninfo_param(conninfo, "sslcert", backend_kill_args->ssl_config.sslcert);
append_conninfo_param(conninfo, "sslrootcert", backend_kill_args->ssl_config.sslrootcert);
append_conninfo_param(conninfo, "sslcrl", backend_kill_args->ssl_config.sslcrl);
append_conninfo_param(conninfo, "sslcrldir", backend_kill_args->ssl_config.sslcrldir);
} else {
conninfo << "sslmode='disable' "; // not supporting SSL
}

Loading…
Cancel
Save