From: Arran Cudbard-Bell Date: Fri, 31 Jul 2015 15:16:54 +0000 (-0400) Subject: Be more careful about appending duplicate options to the pg connection string Closes... X-Git-Tag: release_3_0_10~271 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=891b2db301bdafefb3d9c16d54b4950985891989;p=thirdparty%2Ffreeradius-server.git Be more careful about appending duplicate options to the pg connection string Closes #1172 --- diff --git a/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c b/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c index 631361d7df7..369ceccba76 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c @@ -101,26 +101,6 @@ static int mod_instantiate(CONF_SECTION *conf, rlm_sql_config_t *config) return -1; } - db_string = strchr(config->sql_db, '=') ? - talloc_typed_strdup(driver, config->sql_db) : - talloc_typed_asprintf(driver, "dbname='%s'", config->sql_db); - - if (config->sql_server[0] != '\0') { - db_string = talloc_asprintf_append(db_string, " host='%s'", config->sql_server); - } - - if (config->sql_port) { - db_string = talloc_asprintf_append(db_string, " port=%i", config->sql_port); - } - - if (config->sql_login[0] != '\0') { - db_string = talloc_asprintf_append(db_string, " user='%s'", config->sql_login); - } - - if (config->sql_password[0] != '\0') { - db_string = talloc_asprintf_append(db_string, " password='%s'", config->sql_password); - } - /* * Allow the user to set their own, or disable it */ @@ -135,7 +115,63 @@ static int mod_instantiate(CONF_SECTION *conf, rlm_sql_config_t *config) snprintf(application_name, sizeof(application_name), "FreeRADIUS " RADIUSD_VERSION_STRING " - %s (%s)", progname, name); - db_string = talloc_asprintf_append(db_string, " application_name='%s'", application_name); + } + + /* + * Old style database name + * + * Append options if they were set in the config + */ + if (!strchr(config->sql_db, '=')) { + db_string = talloc_typed_asprintf(driver, "dbname='%s'", config->sql_db); + + if (config->sql_server[0] != '\0') { + db_string = talloc_asprintf_append(db_string, " host='%s'", config->sql_server); + } + + if (config->sql_port) { + db_string = talloc_asprintf_append(db_string, " port=%i", config->sql_port); + } + + if (config->sql_login[0] != '\0') { + db_string = talloc_asprintf_append(db_string, " user='%s'", config->sql_login); + } + + if (config->sql_password[0] != '\0') { + db_string = talloc_asprintf_append(db_string, " password='%s'", config->sql_password); + } + + if (driver->send_application_name) { + db_string = talloc_asprintf_append(db_string, " application_name='%s'", application_name); + } + + /* + * New style parameter string + * + * Only append options where are not already present + */ + } else { + db_string = talloc_typed_strdup(driver, config->sql_db); + + if ((config->sql_server[0] != '\0') && !strstr(db_string, "host=")) { + db_string = talloc_asprintf_append(db_string, " host='%s'", config->sql_server); + } + + if (config->sql_port && !strstr(db_string, "port=")) { + db_string = talloc_asprintf_append(db_string, " port=%i", config->sql_port); + } + + if ((config->sql_login[0] != '\0') && !strstr(db_string, "user=")) { + db_string = talloc_asprintf_append(db_string, " user='%s'", config->sql_login); + } + + if ((config->sql_password[0] != '\0') && !strstr(db_string, "password=")) { + db_string = talloc_asprintf_append(db_string, " password='%s'", config->sql_password); + } + + if (driver->send_application_name && !strstr(db_string, "application_name=")) { + db_string = talloc_asprintf_append(db_string, " application_name='%s'", application_name); + } } driver->db_string = db_string; diff --git a/src/modules/rlm_sql/rlm_sql.c b/src/modules/rlm_sql/rlm_sql.c index da415f01989..79e40e92fef 100644 --- a/src/modules/rlm_sql/rlm_sql.c +++ b/src/modules/rlm_sql/rlm_sql.c @@ -81,7 +81,7 @@ static const CONF_PARSER postauth_config[] = { static const CONF_PARSER module_config[] = { { "driver", FR_CONF_OFFSET(PW_TYPE_STRING, rlm_sql_config_t, sql_driver_name), "rlm_sql_null" }, - { "server", FR_CONF_OFFSET(PW_TYPE_STRING, rlm_sql_config_t, sql_server), "localhost" }, + { "server", FR_CONF_OFFSET(PW_TYPE_STRING, rlm_sql_config_t, sql_server), "" }, /* Must be zero length so drivers can determine if it was set */ { "port", FR_CONF_OFFSET(PW_TYPE_INTEGER, rlm_sql_config_t, sql_port), "0" }, { "login", FR_CONF_OFFSET(PW_TYPE_STRING, rlm_sql_config_t, sql_login), "" }, { "password", FR_CONF_OFFSET(PW_TYPE_STRING | PW_TYPE_SECRET, rlm_sql_config_t, sql_password), "" },