2 Unix SMB/CIFS implementation.
3 SAMR Pipe utility functions.
5 Copyright (C) Luke Kenneth Casson Leighton 1996-1998
6 Copyright (C) Gerald (Jerry) Carter 2000-2001
7 Copyright (C) Andrew Bartlett 2001-2002
8 Copyright (C) Stefan (metze) Metzmacher 2002
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_SRV
30 #define STRING_CHANGED (old_string && !new_string) ||\
31 (!old_string && new_string) ||\
32 (old_string && new_string && (strcmp(old_string, new_string) != 0))
34 #define STRING_CHANGED_NC(s1,s2) ((s1) && !(s2)) ||\
36 ((s1) && (s2) && (strcmp((s1), (s2)) != 0))
38 /*************************************************************
39 Copies a SAM_USER_INFO_20 to a SAM_ACCOUNT
40 **************************************************************/
42 void copy_id20_to_sam_passwd(SAM_ACCOUNT
*to
, SAM_USER_INFO_20
*from
)
44 const char *old_string
;
48 if (from
== NULL
|| to
== NULL
)
51 if (from
->hdr_munged_dial
.buffer
) {
52 old_string
= pdb_get_munged_dial(to
);
53 mung
.length
= from
->hdr_munged_dial
.uni_str_len
;
54 mung
.data
= (uint8
*) from
->uni_munged_dial
.buffer
;
55 new_string
= (mung
.length
== 0) ?
56 NULL
: base64_encode_data_blob(mung
);
57 DEBUG(10,("INFO_20 UNI_MUNGED_DIAL: %s -> %s\n",old_string
, new_string
));
58 if (STRING_CHANGED_NC(old_string
,new_string
))
59 pdb_set_munged_dial(to
, new_string
, PDB_CHANGED
);
61 SAFE_FREE(new_string
);
65 /*************************************************************
66 Copies a SAM_USER_INFO_21 to a SAM_ACCOUNT
67 **************************************************************/
69 void copy_id21_to_sam_passwd(SAM_ACCOUNT
*to
, SAM_USER_INFO_21
*from
)
71 time_t unix_time
, stored_time
;
72 const char *old_string
, *new_string
;
75 if (from
== NULL
|| to
== NULL
)
78 if (from
->fields_present
& ACCT_LAST_LOGON
) {
79 unix_time
=nt_time_to_unix(&from
->logon_time
);
80 stored_time
= pdb_get_logon_time(to
);
81 DEBUG(10,("INFO_21 LOGON_TIME: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
82 if (stored_time
!= unix_time
)
83 pdb_set_logon_time(to
, unix_time
, PDB_CHANGED
);
86 if (from
->fields_present
& ACCT_LAST_LOGOFF
) {
87 unix_time
=nt_time_to_unix(&from
->logoff_time
);
88 stored_time
= pdb_get_logoff_time(to
);
89 DEBUG(10,("INFO_21 LOGOFF_TIME: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
90 if (stored_time
!= unix_time
)
91 pdb_set_logoff_time(to
, unix_time
, PDB_CHANGED
);
94 if (from
->fields_present
& ACCT_EXPIRY
) {
95 unix_time
=nt_time_to_unix(&from
->kickoff_time
);
96 stored_time
= pdb_get_kickoff_time(to
);
97 DEBUG(10,("INFO_21 KICKOFF_TIME: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
98 if (stored_time
!= unix_time
)
99 pdb_set_kickoff_time(to
, unix_time
, PDB_CHANGED
);
102 if (from
->fields_present
& ACCT_ALLOW_PWD_CHANGE
) {
103 unix_time
=nt_time_to_unix(&from
->pass_can_change_time
);
104 stored_time
= pdb_get_pass_can_change_time(to
);
105 DEBUG(10,("INFO_21 PASS_CAN_CH: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
106 if (stored_time
!= unix_time
)
107 pdb_set_pass_can_change_time(to
, unix_time
, PDB_CHANGED
);
110 if (from
->fields_present
& ACCT_LAST_PWD_CHANGE
) {
111 unix_time
=nt_time_to_unix(&from
->pass_last_set_time
);
112 stored_time
= pdb_get_pass_last_set_time(to
);
113 DEBUG(10,("INFO_21 PASS_LAST_SET: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
114 if (stored_time
!= unix_time
)
115 pdb_set_pass_last_set_time(to
, unix_time
, PDB_CHANGED
);
118 if (from
->fields_present
& ACCT_FORCE_PWD_CHANGE
) {
119 unix_time
=nt_time_to_unix(&from
->pass_must_change_time
);
120 stored_time
=pdb_get_pass_must_change_time(to
);
121 DEBUG(10,("INFO_21 PASS_MUST_CH: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
122 if (stored_time
!= unix_time
)
123 pdb_set_pass_must_change_time(to
, unix_time
, PDB_CHANGED
);
126 if ((from
->fields_present
& ACCT_USERNAME
) &&
127 (from
->hdr_user_name
.buffer
)) {
128 old_string
= pdb_get_username(to
);
129 new_string
= unistr2_static(&from
->uni_user_name
);
130 DEBUG(10,("INFO_21 UNI_USER_NAME: %s -> %s\n", old_string
, new_string
));
132 pdb_set_username(to
, new_string
, PDB_CHANGED
);
135 if ((from
->fields_present
& ACCT_FULL_NAME
) &&
136 (from
->hdr_full_name
.buffer
)) {
137 old_string
= pdb_get_fullname(to
);
138 new_string
= unistr2_static(&from
->uni_full_name
);
139 DEBUG(10,("INFO_21 UNI_FULL_NAME: %s -> %s\n",old_string
, new_string
));
141 pdb_set_fullname(to
, new_string
, PDB_CHANGED
);
144 if ((from
->fields_present
& ACCT_HOME_DIR
) &&
145 (from
->hdr_home_dir
.buffer
)) {
146 old_string
= pdb_get_homedir(to
);
147 new_string
= unistr2_static(&from
->uni_home_dir
);
148 DEBUG(10,("INFO_21 UNI_HOME_DIR: %s -> %s\n",old_string
,new_string
));
150 pdb_set_homedir(to
, new_string
, PDB_CHANGED
);
153 if ((from
->fields_present
& ACCT_HOME_DRIVE
) &&
154 (from
->hdr_dir_drive
.buffer
)) {
155 old_string
= pdb_get_dir_drive(to
);
156 new_string
= unistr2_static(&from
->uni_dir_drive
);
157 DEBUG(10,("INFO_21 UNI_DIR_DRIVE: %s -> %s\n",old_string
,new_string
));
159 pdb_set_dir_drive(to
, new_string
, PDB_CHANGED
);
162 if ((from
->fields_present
& ACCT_LOGON_SCRIPT
) &&
163 (from
->hdr_logon_script
.buffer
)) {
164 old_string
= pdb_get_logon_script(to
);
165 new_string
= unistr2_static(&from
->uni_logon_script
);
166 DEBUG(10,("INFO_21 UNI_LOGON_SCRIPT: %s -> %s\n",old_string
,new_string
));
168 pdb_set_logon_script(to
, new_string
, PDB_CHANGED
);
171 if ((from
->fields_present
& ACCT_PROFILE
) &&
172 (from
->hdr_profile_path
.buffer
)) {
173 old_string
= pdb_get_profile_path(to
);
174 new_string
= unistr2_static(&from
->uni_profile_path
);
175 DEBUG(10,("INFO_21 UNI_PROFILE_PATH: %s -> %s\n",old_string
, new_string
));
177 pdb_set_profile_path(to
, new_string
, PDB_CHANGED
);
180 if ((from
->fields_present
& ACCT_DESCRIPTION
) &&
181 (from
->hdr_acct_desc
.buffer
)) {
182 old_string
= pdb_get_acct_desc(to
);
183 new_string
= unistr2_static(&from
->uni_acct_desc
);
184 DEBUG(10,("INFO_21 UNI_ACCT_DESC: %s -> %s\n",old_string
,new_string
));
186 pdb_set_acct_desc(to
, new_string
, PDB_CHANGED
);
189 if ((from
->fields_present
& ACCT_WORKSTATIONS
) &&
190 (from
->hdr_workstations
.buffer
)) {
191 old_string
= pdb_get_workstations(to
);
192 new_string
= unistr2_static(&from
->uni_workstations
);
193 DEBUG(10,("INFO_21 UNI_WORKSTATIONS: %s -> %s\n",old_string
, new_string
));
195 pdb_set_workstations(to
, new_string
, PDB_CHANGED
);
199 if ((from
->fields_present
& ACCT_ADMIN_DESC
) &&
200 (from
->hdr_unknown_str
.buffer
)) {
201 old_string
= pdb_get_unknown_str(to
);
202 new_string
= unistr2_static(&from
->uni_unknown_str
);
203 DEBUG(10,("INFO_21 UNI_UNKNOWN_STR: %s -> %s\n",old_string
, new_string
));
205 pdb_set_unknown_str(to
, new_string
, PDB_CHANGED
);
208 if ((from
->fields_present
& ACCT_CALLBACK
) &&
209 (from
->hdr_munged_dial
.buffer
)) {
211 old_string
= pdb_get_munged_dial(to
);
212 mung
.length
= from
->hdr_munged_dial
.uni_str_len
;
213 mung
.data
= (uint8
*) from
->uni_munged_dial
.buffer
;
214 newstr
= (mung
.length
== 0) ?
215 NULL
: base64_encode_data_blob(mung
);
216 DEBUG(10,("INFO_21 UNI_MUNGED_DIAL: %s -> %s\n",old_string
, newstr
));
217 if (STRING_CHANGED_NC(old_string
,newstr
))
218 pdb_set_munged_dial(to
, newstr
, PDB_CHANGED
);
223 if (from
->fields_present
& ACCT_RID
) {
224 if (from
->user_rid
== 0) {
225 DEBUG(10, ("INFO_21: Asked to set User RID to 0 !? Skipping change!\n"));
226 } else if (from
->user_rid
!= pdb_get_user_rid(to
)) {
227 DEBUG(10,("INFO_21 USER_RID: %u -> %u NOT UPDATED!\n",pdb_get_user_rid(to
),from
->user_rid
));
231 if (from
->fields_present
& ACCT_PRIMARY_GID
) {
232 if (from
->group_rid
== 0) {
233 DEBUG(10, ("INFO_21: Asked to set Group RID to 0 !? Skipping change!\n"));
234 } else if (from
->group_rid
!= pdb_get_group_rid(to
)) {
235 DEBUG(10,("INFO_21 GROUP_RID: %u -> %u\n",pdb_get_group_rid(to
),from
->group_rid
));
236 pdb_set_group_sid_from_rid(to
, from
->group_rid
, PDB_CHANGED
);
240 if (from
->fields_present
& ACCT_FLAGS
) {
241 DEBUG(10,("INFO_21 ACCT_CTRL: %08X -> %08X\n",pdb_get_acct_ctrl(to
),from
->acb_info
));
242 if (from
->acb_info
!= pdb_get_acct_ctrl(to
)) {
243 if (!(from
->acb_info
& ACB_AUTOLOCK
) && (pdb_get_acct_ctrl(to
) & ACB_AUTOLOCK
)) {
244 /* We're unlocking a previously locked user. Reset bad password counts.
245 Patch from Jianliang Lu. <Jianliang.Lu@getronics.com> */
246 pdb_set_bad_password_count(to
, 0, PDB_CHANGED
);
247 pdb_set_bad_password_time(to
, 0, PDB_CHANGED
);
249 pdb_set_acct_ctrl(to
, from
->acb_info
, PDB_CHANGED
);
253 if (from
->fields_present
& ACCT_LOGON_HOURS
) {
254 pstring oldstr
, newstr
;
255 DEBUG(15,("INFO_21 LOGON_DIVS: %08X -> %08X\n",pdb_get_logon_divs(to
),from
->logon_divs
));
256 if (from
->logon_divs
!= pdb_get_logon_divs(to
)) {
257 pdb_set_logon_divs(to
, from
->logon_divs
, PDB_CHANGED
);
260 DEBUG(15,("INFO_21 LOGON_HRS.LEN: %08X -> %08X\n",pdb_get_hours_len(to
),from
->logon_hrs
.len
));
261 if (from
->logon_hrs
.len
!= pdb_get_hours_len(to
)) {
262 pdb_set_hours_len(to
, from
->logon_hrs
.len
, PDB_CHANGED
);
265 DEBUG(15,("INFO_21 LOGON_HRS.HOURS: %s -> %s\n",pdb_get_hours(to
),from
->logon_hrs
.hours
));
266 pdb_sethexhours(oldstr
, pdb_get_hours(to
));
267 pdb_sethexhours(newstr
, from
->logon_hrs
.hours
);
268 if (!strequal(oldstr
, newstr
)) {
269 pdb_set_hours(to
, from
->logon_hrs
.hours
, PDB_CHANGED
);
273 if (from
->fields_present
& ACCT_BAD_PWD_COUNT
) {
274 DEBUG(10,("INFO_21 BAD_PASSWORD_COUNT: %08X -> %08X\n",pdb_get_bad_password_count(to
),from
->bad_password_count
));
275 if (from
->bad_password_count
!= pdb_get_bad_password_count(to
)) {
276 pdb_set_bad_password_count(to
, from
->bad_password_count
, PDB_CHANGED
);
280 if (from
->fields_present
& ACCT_NUM_LOGONS
) {
281 DEBUG(10,("INFO_21 LOGON_COUNT: %08X -> %08X\n",pdb_get_logon_count(to
),from
->logon_count
));
282 if (from
->logon_count
!= pdb_get_logon_count(to
)) {
283 pdb_set_logon_count(to
, from
->logon_count
, PDB_CHANGED
);
287 DEBUG(10,("INFO_21 PASS_MUST_CHANGE_AT_NEXT_LOGON: %02X\n",from
->passmustchange
));
288 if (from
->passmustchange
==PASS_MUST_CHANGE_AT_NEXT_LOGON
) {
289 pdb_set_pass_must_change_time(to
,0, PDB_CHANGED
);
293 if (pdb_get_pass_must_change_time(to
) == 0) {
294 if (!account_policy_get(AP_MAX_PASSWORD_AGE
, &expire
)
295 || expire
== (uint32
)-1) {
296 new_time
= get_time_t_max();
298 time_t old_time
= pdb_get_pass_last_set_time(to
);
299 new_time
= old_time
+ expire
;
300 if ((new_time
) < time(0)) {
301 new_time
= time(0) + expire
;
304 if (!pdb_set_pass_must_change_time (to
, new_time
, PDB_CHANGED
)) {
305 DEBUG (0, ("pdb_set_pass_must_change_time failed!\n"));
310 DEBUG(10,("INFO_21 PADDING_2: %02X\n",from
->padding2
));
314 /*************************************************************
315 Copies a SAM_USER_INFO_23 to a SAM_ACCOUNT
316 **************************************************************/
318 void copy_id23_to_sam_passwd(SAM_ACCOUNT
*to
, SAM_USER_INFO_23
*from
)
320 time_t unix_time
, stored_time
;
321 const char *old_string
, *new_string
;
324 if (from
== NULL
|| to
== NULL
)
327 if (from
->fields_present
& ACCT_LAST_LOGON
) {
328 unix_time
=nt_time_to_unix(&from
->logon_time
);
329 stored_time
= pdb_get_logon_time(to
);
330 DEBUG(10,("INFO_23 LOGON_TIME: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
331 if (stored_time
!= unix_time
)
332 pdb_set_logon_time(to
, unix_time
, PDB_CHANGED
);
335 if (from
->fields_present
& ACCT_LAST_LOGOFF
) {
336 unix_time
=nt_time_to_unix(&from
->logoff_time
);
337 stored_time
= pdb_get_logoff_time(to
);
338 DEBUG(10,("INFO_23 LOGOFF_TIME: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
339 if (stored_time
!= unix_time
)
340 pdb_set_logoff_time(to
, unix_time
, PDB_CHANGED
);
343 if (from
->fields_present
& ACCT_EXPIRY
) {
344 unix_time
=nt_time_to_unix(&from
->kickoff_time
);
345 stored_time
= pdb_get_kickoff_time(to
);
346 DEBUG(10,("INFO_23 KICKOFF_TIME: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
347 if (stored_time
!= unix_time
)
348 pdb_set_kickoff_time(to
, unix_time
, PDB_CHANGED
);
351 if (from
->fields_present
& ACCT_ALLOW_PWD_CHANGE
) {
352 unix_time
=nt_time_to_unix(&from
->pass_can_change_time
);
353 stored_time
= pdb_get_pass_can_change_time(to
);
354 DEBUG(10,("INFO_23 PASS_CAN_CH: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
355 if (stored_time
!= unix_time
)
356 pdb_set_pass_can_change_time(to
, unix_time
, PDB_CHANGED
);
359 if (from
->fields_present
& ACCT_LAST_PWD_CHANGE
) {
360 unix_time
=nt_time_to_unix(&from
->pass_last_set_time
);
361 stored_time
= pdb_get_pass_last_set_time(to
);
362 DEBUG(10,("INFO_23 PASS_LAST_SET: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
363 if (stored_time
!= unix_time
)
364 pdb_set_pass_last_set_time(to
, unix_time
, PDB_CHANGED
);
367 if (from
->fields_present
& ACCT_FORCE_PWD_CHANGE
) {
368 unix_time
=nt_time_to_unix(&from
->pass_must_change_time
);
369 stored_time
=pdb_get_pass_must_change_time(to
);
370 DEBUG(10,("INFO_23 PASS_MUST_CH: %lu -> %lu\n",(long unsigned int)stored_time
, (long unsigned int)unix_time
));
371 if (stored_time
!= unix_time
)
372 pdb_set_pass_must_change_time(to
, unix_time
, PDB_CHANGED
);
375 /* Backend should check this for sanity */
376 if ((from
->fields_present
& ACCT_USERNAME
) &&
377 (from
->hdr_user_name
.buffer
)) {
378 old_string
= pdb_get_username(to
);
379 new_string
= unistr2_static(&from
->uni_user_name
);
380 DEBUG(10,("INFO_23 UNI_USER_NAME: %s -> %s\n", old_string
, new_string
));
382 pdb_set_username(to
, new_string
, PDB_CHANGED
);
385 if ((from
->fields_present
& ACCT_FULL_NAME
) &&
386 (from
->hdr_full_name
.buffer
)) {
387 old_string
= pdb_get_fullname(to
);
388 new_string
= unistr2_static(&from
->uni_full_name
);
389 DEBUG(10,("INFO_23 UNI_FULL_NAME: %s -> %s\n",old_string
, new_string
));
391 pdb_set_fullname(to
, new_string
, PDB_CHANGED
);
394 if ((from
->fields_present
& ACCT_HOME_DIR
) &&
395 (from
->hdr_home_dir
.buffer
)) {
396 old_string
= pdb_get_homedir(to
);
397 new_string
= unistr2_static(&from
->uni_home_dir
);
398 DEBUG(10,("INFO_23 UNI_HOME_DIR: %s -> %s\n",old_string
,new_string
));
400 pdb_set_homedir(to
, new_string
, PDB_CHANGED
);
403 if ((from
->fields_present
& ACCT_HOME_DRIVE
) &&
404 (from
->hdr_dir_drive
.buffer
)) {
405 old_string
= pdb_get_dir_drive(to
);
406 new_string
= unistr2_static(&from
->uni_dir_drive
);
407 DEBUG(10,("INFO_23 UNI_DIR_DRIVE: %s -> %s\n",old_string
,new_string
));
409 pdb_set_dir_drive(to
, new_string
, PDB_CHANGED
);
412 if ((from
->fields_present
& ACCT_LOGON_SCRIPT
) &&
413 (from
->hdr_logon_script
.buffer
)) {
414 old_string
= pdb_get_logon_script(to
);
415 new_string
= unistr2_static(&from
->uni_logon_script
);
416 DEBUG(10,("INFO_23 UNI_LOGON_SCRIPT: %s -> %s\n",old_string
,new_string
));
418 pdb_set_logon_script(to
, new_string
, PDB_CHANGED
);
421 if ((from
->fields_present
& ACCT_PROFILE
) &&
422 (from
->hdr_profile_path
.buffer
)) {
423 old_string
= pdb_get_profile_path(to
);
424 new_string
= unistr2_static(&from
->uni_profile_path
);
425 DEBUG(10,("INFO_23 UNI_PROFILE_PATH: %s -> %s\n",old_string
, new_string
));
427 pdb_set_profile_path(to
, new_string
, PDB_CHANGED
);
430 if ((from
->fields_present
& ACCT_DESCRIPTION
) &&
431 (from
->hdr_acct_desc
.buffer
)) {
432 old_string
= pdb_get_acct_desc(to
);
433 new_string
= unistr2_static(&from
->uni_acct_desc
);
434 DEBUG(10,("INFO_23 UNI_ACCT_DESC: %s -> %s\n",old_string
,new_string
));
436 pdb_set_acct_desc(to
, new_string
, PDB_CHANGED
);
439 if ((from
->fields_present
& ACCT_WORKSTATIONS
) &&
440 (from
->hdr_workstations
.buffer
)) {
441 old_string
= pdb_get_workstations(to
);
442 new_string
= unistr2_static(&from
->uni_workstations
);
443 DEBUG(10,("INFO_23 UNI_WORKSTATIONS: %s -> %s\n",old_string
, new_string
));
445 pdb_set_workstations(to
, new_string
, PDB_CHANGED
);
449 if ((from
->fields_present
& ACCT_ADMIN_DESC
) &&
450 (from
->hdr_unknown_str
.buffer
)) {
451 old_string
= pdb_get_unknown_str(to
);
452 new_string
= unistr2_static(&from
->uni_unknown_str
);
453 DEBUG(10,("INFO_23 UNI_UNKNOWN_STR: %s -> %s\n",old_string
, new_string
));
455 pdb_set_unknown_str(to
, new_string
, PDB_CHANGED
);
458 if ((from
->fields_present
& ACCT_CALLBACK
) &&
459 (from
->hdr_munged_dial
.buffer
)) {
461 old_string
= pdb_get_munged_dial(to
);
462 mung
.length
= from
->hdr_munged_dial
.uni_str_len
;
463 mung
.data
= (uint8
*) from
->uni_munged_dial
.buffer
;
464 newstr
= (mung
.length
== 0) ?
465 NULL
: base64_encode_data_blob(mung
);
466 DEBUG(10,("INFO_23 UNI_MUNGED_DIAL: %s -> %s\n",old_string
, newstr
));
467 if (STRING_CHANGED_NC(old_string
, newstr
))
468 pdb_set_munged_dial(to
, newstr
, PDB_CHANGED
);
473 if (from
->fields_present
& ACCT_RID
) {
474 if (from
->user_rid
== 0) {
475 DEBUG(10, ("INFO_23: Asked to set User RID to 0 !? Skipping change!\n"));
476 } else if (from
->user_rid
!= pdb_get_user_rid(to
)) {
477 DEBUG(10,("INFO_23 USER_RID: %u -> %u NOT UPDATED!\n",pdb_get_user_rid(to
),from
->user_rid
));
481 if (from
->fields_present
& ACCT_PRIMARY_GID
) {
482 if (from
->group_rid
== 0) {
483 DEBUG(10, ("INFO_23: Asked to set Group RID to 0 !? Skipping change!\n"));
484 } else if (from
->group_rid
!= pdb_get_group_rid(to
)) {
485 DEBUG(10,("INFO_23 GROUP_RID: %u -> %u\n",pdb_get_group_rid(to
),from
->group_rid
));
486 pdb_set_group_sid_from_rid(to
, from
->group_rid
, PDB_CHANGED
);
490 if (from
->fields_present
& ACCT_FLAGS
) {
491 DEBUG(10,("INFO_23 ACCT_CTRL: %08X -> %08X\n",pdb_get_acct_ctrl(to
),from
->acb_info
));
492 if (from
->acb_info
!= pdb_get_acct_ctrl(to
)) {
493 pdb_set_acct_ctrl(to
, from
->acb_info
, PDB_CHANGED
);
497 if (from
->fields_present
& ACCT_LOGON_HOURS
) {
498 DEBUG(15,("INFO_23 LOGON_DIVS: %08X -> %08X\n",pdb_get_logon_divs(to
),from
->logon_divs
));
499 if (from
->logon_divs
!= pdb_get_logon_divs(to
)) {
500 pdb_set_logon_divs(to
, from
->logon_divs
, PDB_CHANGED
);
503 DEBUG(15,("INFO_23 LOGON_HRS.LEN: %08X -> %08X\n",pdb_get_hours_len(to
),from
->logon_hrs
.len
));
504 if (from
->logon_hrs
.len
!= pdb_get_hours_len(to
)) {
505 pdb_set_hours_len(to
, from
->logon_hrs
.len
, PDB_CHANGED
);
508 DEBUG(15,("INFO_23 LOGON_HRS.HOURS: %s -> %s\n",pdb_get_hours(to
),from
->logon_hrs
.hours
));
509 /* Fix me: only update if it changes --metze */
510 pdb_set_hours(to
, from
->logon_hrs
.hours
, PDB_CHANGED
);
513 if (from
->fields_present
& ACCT_BAD_PWD_COUNT
) {
514 DEBUG(10,("INFO_23 BAD_PASSWORD_COUNT: %08X -> %08X\n",pdb_get_bad_password_count(to
),from
->bad_password_count
));
515 if (from
->bad_password_count
!= pdb_get_bad_password_count(to
)) {
516 pdb_set_bad_password_count(to
, from
->bad_password_count
, PDB_CHANGED
);
520 if (from
->fields_present
& ACCT_NUM_LOGONS
) {
521 DEBUG(10,("INFO_23 LOGON_COUNT: %08X -> %08X\n",pdb_get_logon_count(to
),from
->logon_count
));
522 if (from
->logon_count
!= pdb_get_logon_count(to
)) {
523 pdb_set_logon_count(to
, from
->logon_count
, PDB_CHANGED
);
527 DEBUG(10,("INFO_23 PASS_MUST_CHANGE_AT_NEXT_LOGON: %02X\n",from
->passmustchange
));
528 if (from
->passmustchange
==PASS_MUST_CHANGE_AT_NEXT_LOGON
) {
529 pdb_set_pass_must_change_time(to
,0, PDB_CHANGED
);
533 if (pdb_get_pass_must_change_time(to
) == 0) {
534 if (!account_policy_get(AP_MAX_PASSWORD_AGE
, &expire
)
535 || expire
== (uint32
)-1) {
536 new_time
= get_time_t_max();
538 time_t old_time
= pdb_get_pass_last_set_time(to
);
539 new_time
= old_time
+ expire
;
540 if ((new_time
) < time(0)) {
541 new_time
= time(0) + expire
;
544 if (!pdb_set_pass_must_change_time (to
, new_time
, PDB_CHANGED
)) {
545 DEBUG (0, ("pdb_set_pass_must_change_time failed!\n"));
550 DEBUG(10,("INFO_23 PADDING_2: %02X\n",from
->padding2
));