📄 pdb_pgsql.c
字号:
if ( !esc ) { DEBUG(0, ("Can't allocate memory to store escaped name\n")); return NT_STATUS_NO_MEMORY; } //tmp_sname = smb_xstrdup(sname); PQescapeString( esc, sname, strlen(sname) ) ; /* Connect to the DB. */ handle = choose_connection( data ); if ( handle == NULL ) return NT_STATUS_UNSUCCESSFUL ; query = sql_account_query_select(NULL, data->location, True, field, esc); /* Do it */ DEBUG( 5, ("Executing query %s\n", query) ) ; result = PQexec( handle, query ) ; /* Result? */ if ( result == NULL ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( handle ) ) ) ; retval = NT_STATUS_UNSUCCESSFUL ; } else if ( PQresultStatus( result ) != PGRES_TUPLES_OK ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQresultErrorMessage( result ) ) ) ; retval = NT_STATUS_UNSUCCESSFUL ; } else { retval = row_to_sam_account( result, 0, user ) ; } talloc_free( esc ) ; talloc_free( query ) ; if ( result != NULL ) PQclear( result ) ; return retval ;}/****************************************************************** Lookup a name in the SAM database ******************************************************************/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); if ( !sname ) { 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_ascii(lowercasename[i]); } result = pgsqlsam_select_by_field( methods, user, SQL_SEARCH_USER_NAME, lowercasename ) ; SAFE_FREE( lowercasename ) ; return result;}/*************************************************************************** Search by sid **************************************************************************/static NTSTATUS pgsqlsam_getsampwsid ( struct pdb_methods *methods, SAM_ACCOUNT *user, const DOM_SID *sid ){ struct pdb_pgsql_data *data; fstring sid_str; SET_DATA( data, methods ) ; sid_to_string( sid_str, sid ) ; return pgsqlsam_select_by_field( methods, user, SQL_SEARCH_USER_SID, sid_str ) ;}/*************************************************************************** Delete a SAM_ACCOUNT ****************************************************************************/static NTSTATUS pgsqlsam_delete_sam_account( struct pdb_methods *methods, SAM_ACCOUNT *sam_pass ){ struct pdb_pgsql_data *data ; PGconn *handle ; const char *sname = pdb_get_username( sam_pass ) ; char *esc ; char *query ; PGresult *result ; NTSTATUS retval ; SET_DATA(data, methods); if ( !sname ) { DEBUG( 0, ("invalid name specified\n") ) ; return NT_STATUS_INVALID_PARAMETER ; } /* Escape sname */ esc = talloc_array(NULL, char, strlen(sname) * 2 + 1); if ( !esc ) { DEBUG(0, ("Can't allocate memory to store escaped name\n")); return NT_STATUS_NO_MEMORY; } PQescapeString( esc, sname, strlen(sname) ) ; /* Connect to the DB. */ handle = choose_connection( data ); if ( handle == NULL ) return NT_STATUS_UNSUCCESSFUL ; query = sql_account_query_delete(NULL, data->location, esc); /* Do it */ result = PQexec( handle, query ) ; if ( result == NULL ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( handle ) ) ) ; retval = NT_STATUS_UNSUCCESSFUL ; } else if ( PQresultStatus( result ) != PGRES_COMMAND_OK ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQresultErrorMessage( result ) ) ) ; retval = NT_STATUS_UNSUCCESSFUL ; } else { DEBUG( 5, ("User '%s' deleted\n", sname) ) ; retval = NT_STATUS_OK ; } if ( result != NULL ) PQclear( result ) ; talloc_free( esc ) ; talloc_free( query ) ; return retval ;}static NTSTATUS pgsqlsam_replace_sam_account( struct pdb_methods *methods, const SAM_ACCOUNT *newpwd, char isupdate ){ struct pdb_pgsql_data *data ; PGconn *handle ; char *query; PGresult *result ; NTSTATUS retval ; if ( !methods ) { DEBUG( 0, ("invalid methods!\n") ) ; return NT_STATUS_INVALID_PARAMETER ; } data = (struct pdb_pgsql_data *) methods->private_data ; if ( data == NULL || handle == NULL ) { DEBUG( 0, ("invalid handle!\n") ) ; return NT_STATUS_INVALID_HANDLE ; } query = sql_account_query_update(NULL, data->location, newpwd, isupdate); if ( query == NULL ) /* Nothing to update. */ return NT_STATUS_OK; /* Connect to the DB. */ handle = choose_connection( data ); if ( handle == NULL ) return NT_STATUS_UNSUCCESSFUL ; result = PQexec( handle, query ) ; /* Execute the query */ if ( result == NULL ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( handle ) ) ) ; retval = NT_STATUS_INVALID_PARAMETER; } else if ( PQresultStatus( result ) != PGRES_COMMAND_OK ) { DEBUG( 0, ("Error executing %s, %s\n", query, PQresultErrorMessage( result ) ) ) ; retval = NT_STATUS_INVALID_PARAMETER; } else { retval = NT_STATUS_OK; } if ( result != NULL ) PQclear( result ) ; talloc_free(query); return retval;}static NTSTATUS pgsqlsam_add_sam_account ( struct pdb_methods *methods, SAM_ACCOUNT *newpwd ){ return pgsqlsam_replace_sam_account( methods, newpwd, 0 ) ;}static NTSTATUS pgsqlsam_update_sam_account ( struct pdb_methods *methods, SAM_ACCOUNT *newpwd ){ return pgsqlsam_replace_sam_account( methods, newpwd, 1 ) ;}static NTSTATUS pgsqlsam_init ( struct pdb_context *pdb_context, struct pdb_methods **pdb_method, const char *location ){ NTSTATUS nt_status ; struct pdb_pgsql_data *data ; if ( !pdb_context ) { DEBUG( 0, ("invalid pdb_methods specified\n") ) ; return NT_STATUS_UNSUCCESSFUL; } the_pdb_context = pdb_context; if (!NT_STATUS_IS_OK (nt_status = make_pdb_methods(pdb_context->mem_ctx, pdb_method))) { return nt_status; } (*pdb_method)->name = "pgsqlsam" ; (*pdb_method)->setsampwent = pgsqlsam_setsampwent ; (*pdb_method)->endsampwent = pgsqlsam_endsampwent ; (*pdb_method)->getsampwent = pgsqlsam_getsampwent ; (*pdb_method)->getsampwnam = pgsqlsam_getsampwnam ; (*pdb_method)->getsampwsid = pgsqlsam_getsampwsid ; (*pdb_method)->add_sam_account = pgsqlsam_add_sam_account ; (*pdb_method)->update_sam_account = pgsqlsam_update_sam_account ; (*pdb_method)->delete_sam_account = pgsqlsam_delete_sam_account ; data = talloc( pdb_context->mem_ctx, struct pdb_pgsql_data ) ; (*pdb_method)->private_data = data ; data->master_handle = NULL; data->handle = NULL; data->pwent = NULL ; if ( !location ) { DEBUG( 0, ("No identifier specified. Check the Samba HOWTO Collection for details\n") ) ; return NT_STATUS_INVALID_PARAMETER; } data->location = smb_xstrdup( location ) ; if(!sql_account_config_valid(data->location)) { return NT_STATUS_INVALID_PARAMETER; } DEBUG ( 1, ( "Database server parameters: host: %s, user: %s, password: XXXX, database: %s, port: %s\n", config_value( data, "pgsql host" , CONFIG_HOST_DEFAULT ), config_value( data, "pgsql user" , CONFIG_USER_DEFAULT ), config_value( data, "pgsql database", CONFIG_DB_DEFAULT ), 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 ); DEBUG( 5, ("Pgsql module intialized\n") ) ; return NT_STATUS_OK;}NTSTATUS pdb_pgsql_init(void) { return smb_register_passdb( PASSDB_INTERFACE_VERSION, "pgsql", pgsqlsam_init ) ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -