--- passdb/pdb_pgsql.c.orig 2005-03-11 10:47:04.000000000 -0300 +++ passdb/pdb_pgsql.c 2005-04-07 09:16:00.000000000 -0300 @@ -32,6 +32,11 @@ PGconn *handle ; PGresult *pwent ; long currow ; + const char *db ; + const char *host ; + const char *port ; + const char *user ; + const char *pass ; const char *location ; } pdb_pgsql_data ; @@ -42,10 +47,6 @@ return NT_STATUS_INVALID_PARAMETER; \ } \ data = (struct pdb_pgsql_data *)methods->private_data; \ - if(!data || !(data->handle)){ \ - DEBUG(0, ("invalid handle!\n")); \ - return NT_STATUS_INVALID_HANDLE; \ - } \ } #define SET_DATA_QUIET(data,methods) { \ @@ -53,17 +54,51 @@ DEBUG(0, ("invalid methods!\n")); \ return ; \ } \ - data = (struct pdb_pgsql_data *)methods->private_data; \ - if(!data || !(data->handle)){ \ - DEBUG(0, ("invalid handle!\n")); \ - return ; \ - } \ + data = (struct pdb_pgsql_data *)methods->private_data;\ } - #define config_value( data, name, default_value ) \ lp_parm_const_string( GLOBAL_SECTION_SNUM, (data)->location, name, default_value ) +static PGconn *pgsqlsam_connect ( struct pdb_pgsql_data *data ) +{ + PGconn *handle; + + DEBUG + ( + 1, + ( + "Connecting to database server, host: %s, user: %s, password: XXXXXX, database: %s, port: %s\n", + data->host, data->user, data->db, data->port + ) + ) ; + + /* Do the pgsql initialization */ + handle = PQsetdbLogin( + data->host, + data->port, + NULL, + NULL, + data->db, + data->user, + data->pass + ) ; + + if ( handle != NULL && PQstatus( handle ) != CONNECTION_OK ) + { + DEBUG( 0, ("Failed to connect to pgsql database: error: %s\n", + (handle != NULL ? PQerrorMessage( handle ) : "")) ) ; + return NULL; + } + + DEBUG( 5, ("Connected to pgsql database\n") ) ; + return handle; +} + +#define END_CONNECTION( data ) \ + if ( (data)->pwent != NULL) PQclear( (data)->pwent ); \ + PQfinish( (data)->handle ); + static long PQgetlong( PGresult *r, long row, long col ) { if ( PQgetisnull( r, row, col ) ) return 0 ; @@ -130,6 +165,12 @@ NTSTATUS retval ; SET_DATA( data, methods ) ; + + /* Connect to the DB. */ + data->handle = pgsqlsam_connect ( data ); + if ( data->handle == NULL ) + return NT_STATUS_UNSUCCESSFUL ; + DEBUG( 5, ("CONNECTING pgsqlsam_setsampwent\n") ) ; query = sql_account_query_select(data->location, update, SQL_SEARCH_NONE, NULL); @@ -154,6 +195,9 @@ DEBUG( 5, ("pgsqlsam_setsampwent succeeded(%d results)!\n", PQntuples(data->pwent)) ) ; retval = NT_STATUS_OK ; } + + END_CONNECTION( data ); + DEBUG( 5, ("DISCONNECTING pgsqlsam_setsampwent\n") ) ; SAFE_FREE(query); return retval ; @@ -233,6 +277,12 @@ //tmp_sname = smb_xstrdup(sname); PQescapeString( esc, sname, strlen(sname) ) ; + + /* Connect to the DB. */ + data->handle = pgsqlsam_connect ( data ); + if ( data->handle == NULL ) + return NT_STATUS_UNSUCCESSFUL ; + DEBUG( 5, ("CONNECTING pgsqlsam_select_by_field\n") ) ; query = sql_account_query_select(data->location, True, field, esc); @@ -258,8 +308,11 @@ SAFE_FREE( esc ) ; SAFE_FREE( query ) ; - - PQclear( result ) ; + + if ( result != NULL ) + PQclear( result ) ; + END_CONNECTION( data ); + DEBUG( 5, ("DISCONNECTING pgsqlsam_select_by_field\n") ) ; return retval ; } @@ -271,6 +324,9 @@ static NTSTATUS pgsqlsam_getsampwnam ( struct pdb_methods *methods, SAM_ACCOUNT *user, const char *sname ) { struct pdb_pgsql_data *data; + size_t i, l; + char *lowercasename; + NTSTATUS result; SET_DATA(data, methods); @@ -279,8 +335,18 @@ DEBUG( 0, ("invalid name specified") ) ; return NT_STATUS_INVALID_PARAMETER; } + + lowercasename = smb_xstrdup(sname); + l = strlen(lowercasename); + for(i = 0; i < l; i++) { + lowercasename[i] = tolower(lowercasename[i]); + } - return pgsqlsam_select_by_field( methods, user, SQL_SEARCH_USER_NAME, sname ) ; + result = pgsqlsam_select_by_field( methods, user, SQL_SEARCH_USER_NAME, lowercasename ) ; + + SAFE_FREE( lowercasename ) ; + + return result; } @@ -332,6 +398,12 @@ } PQescapeString( esc, sname, strlen(sname) ) ; + + /* Connect to the DB. */ + data->handle = pgsqlsam_connect ( data ); + if ( data->handle == NULL ) + return NT_STATUS_UNSUCCESSFUL ; + DEBUG( 5, ("CONNECTING pgsqlsam_delete_sam_account\n") ) ; query = sql_account_query_delete(data->location, esc); @@ -354,8 +426,12 @@ retval = NT_STATUS_OK ; } + if ( result != NULL ) + PQclear( result ) ; SAFE_FREE( esc ) ; SAFE_FREE( query ) ; + END_CONNECTION( data ) ; + DEBUG( 5, ("DISCONNECTING pgsqlsam_delete_sam_account\n") ) ; return retval ; } @@ -365,6 +441,7 @@ struct pdb_pgsql_data *data ; char *query; PGresult *result ; + NTSTATUS retval ; if ( !methods ) { @@ -381,24 +458,39 @@ } query = sql_account_query_update(data->location, newpwd, isupdate); + if ( query == NULL ) /* Nothing to update. */ + return NT_STATUS_OK; - result = PQexec( data->handle, query ) ; + /* Connect to the DB. */ + data->handle = pgsqlsam_connect ( data ); + if ( data->handle == NULL ) + return NT_STATUS_UNSUCCESSFUL ; + DEBUG( 5, ("CONNECTING pgsqlsam_replace_sam_account\n") ) ; + result = PQexec( data->handle, query ) ; /* Execute the query */ if ( result == NULL ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( data->handle ) ) ) ; - return NT_STATUS_INVALID_PARAMETER; + retval = NT_STATUS_INVALID_PARAMETER; } else if ( PQresultStatus( result ) != PGRES_COMMAND_OK ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQresultErrorMessage( result ) ) ) ; - return NT_STATUS_INVALID_PARAMETER; + retval = NT_STATUS_INVALID_PARAMETER; + } + else + { + retval = NT_STATUS_OK; } + if ( result != NULL ) + PQclear( result ) ; SAFE_FREE(query); + END_CONNECTION( data ); + DEBUG( 5, ("DISCONNECTING pgsqlsam_replace_sam_account\n") ) ; - return NT_STATUS_OK; + return retval; } static NTSTATUS pgsqlsam_add_sam_account ( struct pdb_methods *methods, SAM_ACCOUNT *newpwd ) @@ -466,25 +558,15 @@ config_value( data, "pgsql port" , CONFIG_PORT_DEFAULT ) ) ) ; + + /* Save the parameters. */ + data->db = config_value( data, "pgsql database", CONFIG_DB_DEFAULT ); + data->host = config_value( data, "pgsql host" , CONFIG_HOST_DEFAULT ); + data->port = config_value( data, "pgsql port" , CONFIG_PORT_DEFAULT ); + data->user = config_value( data, "pgsql user" , CONFIG_USER_DEFAULT ); + data->pass = config_value( data, "pgsql password", CONFIG_PASS_DEFAULT ); - /* Do the pgsql initialization */ - data->handle = PQsetdbLogin( - config_value( data, "pgsql host" , CONFIG_HOST_DEFAULT ), - config_value( data, "pgsql port" , CONFIG_PORT_DEFAULT ), - NULL, - NULL, - config_value( data, "pgsql database", CONFIG_DB_DEFAULT ), - config_value( data, "pgsql user" , CONFIG_USER_DEFAULT ), - config_value( data, "pgsql password", CONFIG_PASS_DEFAULT ) - ) ; - - if ( PQstatus( data->handle ) != CONNECTION_OK ) - { - DEBUG( 0, ("Failed to connect to pgsql database: error: %s\n", PQerrorMessage( data->handle )) ) ; - return NT_STATUS_UNSUCCESSFUL; - } - - DEBUG( 5, ("Connected to pgsql database\n") ) ; + DEBUG( 5, ("Pgsql module intialized\n") ) ; return NT_STATUS_OK; } --- passdb/pdb_sql.c.orig 2005-03-11 10:47:04.000000000 -0300 +++ passdb/pdb_sql.c 2005-04-07 09:14:44.000000000 -0300 @@ -295,6 +295,7 @@ pstring temp; pdb_sql_query query; fstring sid_str; + int some_field_affected = 0; query.update = isupdate; @@ -316,6 +317,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_ACCTCTRL)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "acct ctrl column", CONFIG_ACCT_CTRL_DEFAULT), @@ -323,6 +325,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_LOGONTIME)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "logon time column", @@ -331,6 +334,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_LOGOFFTIME)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "logoff time column", @@ -339,6 +343,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_KICKOFFTIME)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "kickoff time column", @@ -347,6 +352,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_CANCHANGETIME)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "pass can change time column", @@ -355,6 +361,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_MUSTCHANGETIME)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "pass must change time column", @@ -363,6 +370,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_PASSLASTSET)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "pass last set time column", @@ -371,6 +379,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_HOURSLEN)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "hours len column", @@ -379,6 +388,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_LOGONDIVS)) { + some_field_affected = 1; pdb_sql_int_field(&query, config_value_write(location, "logon divs column", @@ -387,6 +397,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_USERSID)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "user sid column", CONFIG_USER_SID_DEFAULT), @@ -395,6 +406,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_GROUPSID)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "group sid column", CONFIG_GROUP_SID_DEFAULT), @@ -403,6 +415,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_USERNAME)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "username column", CONFIG_USERNAME_DEFAULT), @@ -410,6 +423,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_DOMAIN)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "domain column", CONFIG_DOMAIN_DEFAULT), @@ -417,6 +431,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_USERNAME)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "nt username column", @@ -425,6 +440,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_FULLNAME)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "fullname column", CONFIG_FULLNAME_DEFAULT), @@ -432,6 +448,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_LOGONSCRIPT)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "logon script column", @@ -440,6 +457,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_PROFILE)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "profile path column", @@ -448,6 +466,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_DRIVE)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "dir drive column", CONFIG_DIR_DRIVE_DEFAULT), @@ -455,6 +474,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_SMBHOME)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "home dir column", CONFIG_HOME_DIR_DEFAULT), @@ -462,6 +482,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_WORKSTATIONS)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "workstations column", @@ -470,6 +491,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_UNKNOWNSTR)) { + some_field_affected = 1; pdb_sql_string_field(&query, config_value_write(location, "unknown string column", @@ -478,6 +500,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_LMPASSWD)) { + some_field_affected = 1; pdb_sethexpwd(temp, pdb_get_lanman_passwd(newpwd), pdb_get_acct_ctrl(newpwd)); pdb_sql_string_field(&query, @@ -487,6 +510,7 @@ } if (IS_SAM_CHANGED(newpwd, PDB_NTPASSWD)) { + some_field_affected = 1; pdb_sethexpwd(temp, pdb_get_nt_passwd(newpwd), pdb_get_acct_ctrl(newpwd)); pdb_sql_string_field(&query, @@ -494,6 +518,11 @@ CONFIG_NT_PW_DEFAULT), temp); } + if (!some_field_affected) { + talloc_destroy(query.mem_ctx); + return NULL; + } + if (query.update) { query.part1[strlen(query.part1) - 1] = '\0'; query.part1 = @@ -503,7 +532,7 @@ "user sid column", CONFIG_USER_SID_DEFAULT), sid_to_string(sid_str, pdb_get_user_sid (newpwd))); - } else { + } else { query.part2[strlen(query.part2) - 1] = ')'; query.part1[strlen(query.part1) - 1] = ')'; query.part1 = --- passdb/pdb_mysql.c.orig 2005-02-25 14:59:36.000000000 -0300 +++ passdb/pdb_mysql.c 2005-04-07 09:14:44.000000000 -0300 @@ -382,6 +382,8 @@ } query = sql_account_query_update(data->location, newpwd, isupdate); + if ( query == NULL ) /* Nothing to update. */ + return NT_STATUS_OK; /* Execute the query */ if (mysql_query(data->handle, query)) {