Be more careful about appending duplicate options to the pg connection string Closes...
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 31 Jul 2015 15:16:54 +0000 (11:16 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 31 Jul 2015 15:17:02 +0000 (11:17 -0400)
src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c
src/modules/rlm_sql/rlm_sql.c

index 631361d..369cecc 100644 (file)
@@ -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;
 
index da415f0..79e40e9 100644 (file)
@@ -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), "" },