1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-26 10:04:02 +03:00

r7787: Fix from Fernando Schapachnik <fernando@mecon.gov.ar> to add logon hours

support for the Postgres backend.
Jeremy.
(This used to be commit dd5d36c95f97356be1b76c1ace641861022e2aa3)
This commit is contained in:
Jeremy Allison 2005-06-20 19:36:12 +00:00 committed by Gerald (Jerry) Carter
parent b62247f1ee
commit aeb3e96cdb
3 changed files with 213 additions and 58 deletions

View File

@ -391,6 +391,8 @@ static NTSTATUS mysqlsam_replace_sam_account(struct pdb_methods *methods,
}
query = sql_account_query_update(NULL, data->location, newpwd, isupdate);
if ( query == NULL ) /* Nothing to update. */
return NT_STATUS_OK;
/* Execute the query */
if (mysql_query(data->handle, query)) {

View File

@ -29,41 +29,99 @@
/* handles for doing db transactions */
typedef struct pdb_pgsql_data {
PGconn *master_handle ;
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 ;
struct pdb_context *the_pdb_context;
#define SET_DATA(data,methods) { \
if(!methods){ \
DEBUG(0, ("invalid methods!\n")); \
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) { \
if(!methods){ \
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;
}
/* The assumption here is that the master process will get connection 0,
* and all the renaining ones just one connection for their etire life span.
*/
static PGconn *choose_connection( struct pdb_pgsql_data *data )
{
if ( data->master_handle == NULL )
{
data->master_handle = pgsqlsam_connect( data );
return data->master_handle ;
}
/* Master connection != NULL, so we are just another process. */
/* If we didn't connect yet, do it now. */
if ( data->handle == NULL )
{
data->handle = pgsqlsam_connect( data );
}
return data->handle ;
}
static long PQgetlong( PGresult *r, long row, long col )
{
if ( PQgetisnull( r, row, col ) ) return 0 ;
@ -75,6 +133,8 @@ static NTSTATUS row_to_sam_account ( PGresult *r, long row, SAM_ACCOUNT *u )
{
pstring temp ;
DOM_SID sid ;
unsigned char *hours ;
size_t hours_len = 0 ;
if ( row >= PQntuples( r ) ) return NT_STATUS_INVALID_PARAMETER ;
@ -100,9 +160,16 @@ static NTSTATUS row_to_sam_account ( PGresult *r, long row, SAM_ACCOUNT *u )
pdb_set_acct_ctrl ( u, PQgetlong ( r, row, 23 ), PDB_SET ) ;
pdb_set_logon_divs ( u, PQgetlong ( r, row, 24 ), PDB_SET ) ;
pdb_set_hours_len ( u, PQgetlong ( r, row, 25 ), PDB_SET ) ;
pdb_set_bad_password_count ( u, PQgetlong (r, row, 26 ), PDB_SET ) ;
pdb_set_logon_count ( u, PQgetlong ( r, row, 27 ), PDB_SET ) ;
pdb_set_bad_password_count ( u, PQgetlong ( r, row, 26 ), PDB_SET ) ;
pdb_set_logon_count ( u, PQgetlong ( r, row, 27 ), PDB_SET ) ;
pdb_set_unknown_6 ( u, PQgetlong ( r, row, 28 ), PDB_SET ) ;
hours = PQgetvalue ( r, row, 29 );
if ( hours != NULL ) {
hours = PQunescapeBytea ( hours, &hours_len ) ;
if ( hours_len > 0 )
pdb_set_hours ( u, hours, PDB_SET ) ;
free ( hours );
}
if ( !PQgetisnull( r, row, 18 ) ) {
string_to_sid( &sid, PQgetvalue( r, row, 18 ) ) ;
@ -126,22 +193,29 @@ static NTSTATUS row_to_sam_account ( PGresult *r, long row, SAM_ACCOUNT *u )
static NTSTATUS pgsqlsam_setsampwent(struct pdb_methods *methods, BOOL update, uint16 acb_mask)
{
struct pdb_pgsql_data *data ;
PGconn *handle ;
char *query ;
NTSTATUS retval ;
SET_DATA( data, methods ) ;
/* Connect to the DB. */
handle = choose_connection( data );
if ( handle == NULL )
return NT_STATUS_UNSUCCESSFUL ;
DEBUG( 5, ("CONNECTING pgsqlsam_setsampwent\n") ) ;
query = sql_account_query_select(NULL, data->location, update, SQL_SEARCH_NONE, NULL);
/* Do it */
DEBUG( 5, ("Executing query %s\n", query) ) ;
data->pwent = PQexec( data->handle, query ) ;
data->pwent = PQexec( handle, query ) ;
data->currow = 0 ;
/* Result? */
if ( data->pwent == NULL )
{
DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( data->handle ) ) ) ;
DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( handle ) ) ) ;
retval = NT_STATUS_UNSUCCESSFUL ;
}
else if ( PQresultStatus( data->pwent ) != PGRES_TUPLES_OK )
@ -154,8 +228,10 @@ static NTSTATUS pgsqlsam_setsampwent(struct pdb_methods *methods, BOOL update, u
DEBUG( 5, ("pgsqlsam_setsampwent succeeded(%d results)!\n", PQntuples(data->pwent)) ) ;
retval = NT_STATUS_OK ;
}
talloc_free(query);
if ( data->pwent != NULL )
PQclear( data->pwent ) ;
return retval ;
}
@ -206,6 +282,7 @@ static NTSTATUS pgsqlsam_getsampwent( struct pdb_methods *methods, SAM_ACCOUNT *
static NTSTATUS pgsqlsam_select_by_field ( struct pdb_methods *methods, SAM_ACCOUNT *user, enum sql_search_field field, const char *sname )
{
struct pdb_pgsql_data *data ;
PGconn *handle ;
char *esc ;
char *query ;
@ -233,17 +310,22 @@ static NTSTATUS pgsqlsam_select_by_field ( struct pdb_methods *methods, SAM_ACCO
//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( data->handle, query ) ;
result = PQexec( handle, query ) ;
/* Result? */
if ( result == NULL )
{
DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( data->handle ) ) ) ;
DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( handle ) ) ) ;
retval = NT_STATUS_UNSUCCESSFUL ;
}
else if ( PQresultStatus( result ) != PGRES_TUPLES_OK )
@ -258,8 +340,9 @@ static NTSTATUS pgsqlsam_select_by_field ( struct pdb_methods *methods, SAM_ACCO
talloc_free( esc ) ;
talloc_free( query ) ;
PQclear( result ) ;
if ( result != NULL )
PQclear( result ) ;
return retval ;
}
@ -271,6 +354,9 @@ static NTSTATUS pgsqlsam_select_by_field ( struct pdb_methods *methods, SAM_ACCO
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 +365,18 @@ static NTSTATUS pgsqlsam_getsampwnam ( struct pdb_methods *methods, SAM_ACCOUNT
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;
}
@ -307,6 +403,7 @@ static NTSTATUS pgsqlsam_getsampwsid ( struct pdb_methods *methods, 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 ;
@ -332,15 +429,20 @@ static NTSTATUS pgsqlsam_delete_sam_account( struct pdb_methods *methods, SAM_AC
}
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( data->handle, query ) ;
result = PQexec( handle, query ) ;
if ( result == NULL )
{
DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( data->handle ) ) ) ;
DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( handle ) ) ) ;
retval = NT_STATUS_UNSUCCESSFUL ;
}
else if ( PQresultStatus( result ) != PGRES_COMMAND_OK )
@ -354,6 +456,8 @@ static NTSTATUS pgsqlsam_delete_sam_account( struct pdb_methods *methods, SAM_AC
retval = NT_STATUS_OK ;
}
if ( result != NULL )
PQclear( result ) ;
talloc_free( esc ) ;
talloc_free( query ) ;
@ -363,8 +467,10 @@ static NTSTATUS pgsqlsam_delete_sam_account( struct pdb_methods *methods, SAM_AC
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 )
{
@ -374,31 +480,43 @@ static NTSTATUS pgsqlsam_replace_sam_account( struct pdb_methods *methods, const
data = (struct pdb_pgsql_data *) methods->private_data ;
if ( data == NULL || data->handle == NULL )
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;
result = PQexec( data->handle, query ) ;
/* 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( data->handle ) ) ) ;
return NT_STATUS_INVALID_PARAMETER;
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 ) ) ) ;
return NT_STATUS_INVALID_PARAMETER;
retval = NT_STATUS_INVALID_PARAMETER;
}
else
{
retval = NT_STATUS_OK;
}
if ( result != NULL )
PQclear( result ) ;
talloc_free(query);
return NT_STATUS_OK;
return retval;
}
static NTSTATUS pgsqlsam_add_sam_account ( struct pdb_methods *methods, SAM_ACCOUNT *newpwd )
@ -422,6 +540,8 @@ static NTSTATUS pgsqlsam_init ( struct pdb_context *pdb_context, struct pdb_meth
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;
@ -440,7 +560,9 @@ static NTSTATUS pgsqlsam_init ( struct pdb_context *pdb_context, struct pdb_meth
data = talloc( pdb_context->mem_ctx, struct pdb_pgsql_data ) ;
(*pdb_method)->private_data = data ;
data->handle = NULL ;
data->master_handle = NULL;
data->handle = NULL;
data->pwent = NULL ;
if ( !location )
@ -448,43 +570,33 @@ static NTSTATUS pgsqlsam_init ( struct pdb_context *pdb_context, struct pdb_meth
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;
return NT_STATUS_INVALID_PARAMETER;
}
DEBUG
(
1,
1,
(
"Connecting to database server, host: %s, user: %s, password: XXXXXX, 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 )
"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 )
)
) ;
/* 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") ) ;
/* 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;
}

View File

@ -49,6 +49,7 @@
#define CONFIG_BAD_PASSWORD_COUNT_DEFAULT "bad_password_count"
#define CONFIG_LOGON_COUNT_DEFAULT "logon_count"
#define CONFIG_UNKNOWN_6_DEFAULT "unknown_6"
#define CONFIG_LOGON_HOURS "logon_hours"
/* Used to construct insert and update queries */
@ -212,7 +213,7 @@ char *sql_account_query_select(TALLOC_CTX *mem_ctx, const char *data, BOOL updat
}
query = talloc_asprintf(mem_ctx,
"SELECT %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s FROM %s WHERE %s = '%s'",
"SELECT %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s FROM %s WHERE %s = '%s'",
config_value_read(data, "logon time column",
CONFIG_LOGON_TIME_DEFAULT),
config_value_read(data, "logoff time column",
@ -271,6 +272,8 @@ char *sql_account_query_select(TALLOC_CTX *mem_ctx, const char *data, BOOL updat
CONFIG_LOGON_COUNT_DEFAULT),
config_value_read(data, "unknown 6 column",
CONFIG_UNKNOWN_6_DEFAULT),
config_value_read(data, "logon hours column",
CONFIG_LOGON_HOURS),
config_value(data, "table", CONFIG_TABLE_DEFAULT),
field_string, value
);
@ -294,6 +297,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
pstring temp;
fstring sid_str;
pdb_sql_query *query;
int some_field_affected = 0;
query = talloc(mem_ctx, pdb_sql_query);
query->update = isupdate;
@ -315,6 +319,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -322,6 +327,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_LOGONTIME)) {
some_field_affected = 1;
pdb_sql_int_field(query,
config_value_write(location,
"logon time column",
@ -330,6 +336,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_LOGOFFTIME)) {
some_field_affected = 1;
pdb_sql_int_field(query,
config_value_write(location,
"logoff time column",
@ -338,6 +345,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_KICKOFFTIME)) {
some_field_affected = 1;
pdb_sql_int_field(query,
config_value_write(location,
"kickoff time column",
@ -346,6 +354,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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",
@ -354,6 +363,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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",
@ -362,6 +372,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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",
@ -370,6 +381,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_HOURSLEN)) {
some_field_affected = 1;
pdb_sql_int_field(query,
config_value_write(location,
"hours len column",
@ -378,6 +390,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_LOGONDIVS)) {
some_field_affected = 1;
pdb_sql_int_field(query,
config_value_write(location,
"logon divs column",
@ -386,6 +399,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -394,6 +408,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -402,6 +417,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -409,6 +425,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -416,6 +433,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_USERNAME)) {
some_field_affected = 1;
pdb_sql_string_field(query,
config_value_write(location,
"nt username column",
@ -424,6 +442,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -431,6 +450,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_LOGONSCRIPT)) {
some_field_affected = 1;
pdb_sql_string_field(query,
config_value_write(location,
"logon script column",
@ -439,6 +459,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_PROFILE)) {
some_field_affected = 1;
pdb_sql_string_field(query,
config_value_write(location,
"profile path column",
@ -447,6 +468,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -454,6 +476,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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),
@ -461,6 +484,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_WORKSTATIONS)) {
some_field_affected = 1;
pdb_sql_string_field(query,
config_value_write(location,
"workstations column",
@ -469,6 +493,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
if (IS_SAM_CHANGED(newpwd, PDB_UNKNOWNSTR)) {
some_field_affected = 1;
pdb_sql_string_field(query,
config_value_write(location,
"unknown string column",
@ -477,6 +502,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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,
@ -486,6 +512,7 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
}
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,
@ -493,6 +520,20 @@ char *sql_account_query_update(TALLOC_CTX *mem_ctx, const char *location, const
CONFIG_NT_PW_DEFAULT), temp);
}
if (IS_SAM_CHANGED(newpwd, PDB_HOURS)) {
some_field_affected = 1;
pdb_sql_string_field(query,
config_value_write(location,
"logon hours column",
CONFIG_LOGON_HOURS),
pdb_get_hours(newpwd));
}
if (!some_field_affected) {
talloc_free(query);
return NULL;
}
if (query->update) {
query->part1[strlen(query->part1) - 1] = '\0';
query->part1 =