Fix the handling of smb.conf in libsmbclient.
[Samba/gbeck.git] / source3 / sam / get_set_account.c
blobacac281d21a42ae07a17db57b22a444eac19cd3a
1 /*
2 Unix SMB/CIFS implementation.
3 SAM_ACCOUNT_HANDLE access routines
4 Copyright (C) Andrew Bartlett 2002
5 Copyright (C) Stefan (metze) Metzmacher 2002
6 Copyright (C) Jelmer Vernooij 2002
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "includes.h"
25 #undef DBGC_CLASS
26 #define DBGC_CLASS DBGC_SAM
28 NTSTATUS sam_get_account_domain_sid(const SAM_ACCOUNT_HANDLE *sampass, const DOM_SID **sid)
30 NTSTATUS status;
31 SAM_DOMAIN_HANDLE *domain;
32 SAM_ASSERT(!sampass || !sid);
34 if (!NT_STATUS_IS_OK(status = sam_get_account_domain(sampass, &domain))){
35 DEBUG(0, ("sam_get_account_domain_sid: Can't get domain for account\n"));
36 return status;
39 return sam_get_domain_sid(domain, sid);
42 NTSTATUS sam_get_account_domain_name(const SAM_ACCOUNT_HANDLE *sampass, const char **domain_name)
44 NTSTATUS status;
45 SAM_DOMAIN_HANDLE *domain;
46 SAM_ASSERT(sampass && domain_name);
48 if (!NT_STATUS_IS_OK(status = sam_get_account_domain(sampass, &domain))){
49 DEBUG(0, ("sam_get_account_domain_name: Can't get domain for account\n"));
50 return status;
53 return sam_get_domain_name(domain, domain_name);
56 NTSTATUS sam_get_account_acct_ctrl(const SAM_ACCOUNT_HANDLE *sampass, uint16 *acct_ctrl)
58 SAM_ASSERT(sampass && acct_ctrl);
60 *acct_ctrl = sampass->private.acct_ctrl;
62 return NT_STATUS_OK;
65 NTSTATUS sam_get_account_logon_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *logon_time)
67 SAM_ASSERT(sampass && logon_time) ;
69 *logon_time = sampass->private.logon_time;
71 return NT_STATUS_OK;
74 NTSTATUS sam_get_account_logoff_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *logoff_time)
76 SAM_ASSERT(sampass && logoff_time) ;
78 *logoff_time = sampass->private.logoff_time;
80 return NT_STATUS_OK;
83 NTSTATUS sam_get_account_kickoff_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *kickoff_time)
85 SAM_ASSERT(sampass && kickoff_time);
87 *kickoff_time = sampass->private.kickoff_time;
89 return NT_STATUS_OK;
92 NTSTATUS sam_get_account_pass_last_set_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *pass_last_set_time)
94 SAM_ASSERT(sampass && pass_last_set_time);
96 *pass_last_set_time = sampass->private.pass_last_set_time;
98 return NT_STATUS_OK;
101 NTSTATUS sam_get_account_pass_can_change_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *pass_can_change_time)
103 SAM_ASSERT(sampass && pass_can_change_time);
105 *pass_can_change_time = sampass->private.pass_can_change_time;
107 return NT_STATUS_OK;
110 NTSTATUS sam_get_account_pass_must_change_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *pass_must_change_time)
112 SAM_ASSERT(sampass && pass_must_change_time);
114 *pass_must_change_time = sampass->private.pass_must_change_time;
116 return NT_STATUS_OK;
119 NTSTATUS sam_get_account_logon_divs(const SAM_ACCOUNT_HANDLE *sampass, uint16 *logon_divs)
121 SAM_ASSERT(sampass && logon_divs);
123 *logon_divs = sampass->private.logon_divs;
125 return NT_STATUS_OK;
128 NTSTATUS sam_get_account_hours_len(const SAM_ACCOUNT_HANDLE *sampass, uint32 *hours_len)
130 SAM_ASSERT(sampass && hours_len);
132 *hours_len = sampass->private.hours_len;
134 return NT_STATUS_OK;
137 NTSTATUS sam_get_account_hours(const SAM_ACCOUNT_HANDLE *sampass, const uint8 **hours)
139 SAM_ASSERT(sampass && hours);
141 *hours = sampass->private.hours;
143 return NT_STATUS_OK;
146 NTSTATUS sam_get_account_nt_pwd(const SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB *nt_pwd)
148 SAM_ASSERT(sampass);
150 SMB_ASSERT((!sampass->private.nt_pw.data)
151 || sampass->private.nt_pw.length == NT_HASH_LEN);
153 *nt_pwd = sampass->private.nt_pw;
155 return NT_STATUS_OK;
158 NTSTATUS sam_get_account_lm_pwd(const SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB *lm_pwd)
160 SAM_ASSERT(sampass);
162 SMB_ASSERT((!sampass->private.lm_pw.data)
163 || sampass->private.lm_pw.length == LM_HASH_LEN);
165 *lm_pwd = sampass->private.lm_pw;
167 return NT_STATUS_OK;
170 /* Return the plaintext password if known. Most of the time
171 it isn't, so don't assume anything magic about this function.
173 Used to pass the plaintext to sam backends that might
174 want to store more than just the NTLM hashes.
177 NTSTATUS sam_get_account_plaintext_pwd(const SAM_ACCOUNT_HANDLE *sampass, char **plain_pwd)
179 SAM_ASSERT(sampass && plain_pwd);
181 *plain_pwd = sampass->private.plaintext_pw;
183 return NT_STATUS_OK;
186 NTSTATUS sam_get_account_sid(const SAM_ACCOUNT_HANDLE *sampass, const DOM_SID **sid)
188 SAM_ASSERT(sampass);
190 *sid = &(sampass->private.account_sid);
192 return NT_STATUS_OK;
195 NTSTATUS sam_get_account_pgroup(const SAM_ACCOUNT_HANDLE *sampass, const DOM_SID **sid)
197 SAM_ASSERT(sampass);
199 *sid = &(sampass->private.group_sid);
201 return NT_STATUS_OK;
205 * Get flags showing what is initalised in the SAM_ACCOUNT_HANDLE
206 * @param sampass the SAM_ACCOUNT_HANDLE in question
207 * @return the flags indicating the members initialised in the struct.
210 NTSTATUS sam_get_account_init_flag(const SAM_ACCOUNT_HANDLE *sampass, uint32 *initflag)
212 SAM_ASSERT(sampass);
214 *initflag = sampass->private.init_flag;
216 return NT_STATUS_OK;
219 NTSTATUS sam_get_account_name(const SAM_ACCOUNT_HANDLE *sampass, char **account_name)
221 SAM_ASSERT(sampass);
223 *account_name = sampass->private.account_name;
225 return NT_STATUS_OK;
228 NTSTATUS sam_get_account_domain(const SAM_ACCOUNT_HANDLE *sampass, SAM_DOMAIN_HANDLE **domain)
230 SAM_ASSERT(sampass);
232 *domain = sampass->private.domain;
234 return NT_STATUS_OK;
237 NTSTATUS sam_get_account_fullname(const SAM_ACCOUNT_HANDLE *sampass, char **fullname)
239 SAM_ASSERT(sampass);
241 *fullname = sampass->private.full_name;
243 return NT_STATUS_OK;
246 NTSTATUS sam_get_account_homedir(const SAM_ACCOUNT_HANDLE *sampass, char **homedir)
248 SAM_ASSERT(sampass);
250 *homedir = sampass->private.home_dir;
252 return NT_STATUS_OK;
255 NTSTATUS sam_get_account_unix_home_dir(const SAM_ACCOUNT_HANDLE *sampass, char **uhomedir)
257 SAM_ASSERT(sampass);
259 *uhomedir = sampass->private.unix_home_dir;
261 return NT_STATUS_OK;
264 NTSTATUS sam_get_account_dir_drive(const SAM_ACCOUNT_HANDLE *sampass, char **dirdrive)
266 SAM_ASSERT(sampass);
268 *dirdrive = sampass->private.dir_drive;
270 return NT_STATUS_OK;
273 NTSTATUS sam_get_account_logon_script(const SAM_ACCOUNT_HANDLE *sampass, char **logon_script)
275 SAM_ASSERT(sampass);
277 *logon_script = sampass->private.logon_script;
279 return NT_STATUS_OK;
282 NTSTATUS sam_get_account_profile_path(const SAM_ACCOUNT_HANDLE *sampass, char **profile_path)
284 SAM_ASSERT(sampass);
286 *profile_path = sampass->private.profile_path;
288 return NT_STATUS_OK;
291 NTSTATUS sam_get_account_description(const SAM_ACCOUNT_HANDLE *sampass, char **description)
293 SAM_ASSERT(sampass);
295 *description = sampass->private.acct_desc;
297 return NT_STATUS_OK;
300 NTSTATUS sam_get_account_workstations(const SAM_ACCOUNT_HANDLE *sampass, char **workstations)
302 SAM_ASSERT(sampass);
304 *workstations = sampass->private.workstations;
306 return NT_STATUS_OK;
309 NTSTATUS sam_get_account_unknown_str(const SAM_ACCOUNT_HANDLE *sampass, char **unknown_str)
311 SAM_ASSERT(sampass);
313 *unknown_str = sampass->private.unknown_str;
315 return NT_STATUS_OK;
318 NTSTATUS sam_get_account_munged_dial(const SAM_ACCOUNT_HANDLE *sampass, char **munged_dial)
320 SAM_ASSERT(sampass);
322 *munged_dial = sampass->private.munged_dial;
324 return NT_STATUS_OK;
327 NTSTATUS sam_get_account_unknown_1(const SAM_ACCOUNT_HANDLE *sampass, uint32 *unknown1)
329 SAM_ASSERT(sampass && unknown1);
331 *unknown1 = sampass->private.unknown_1;
333 return NT_STATUS_OK;
336 NTSTATUS sam_get_account_unknown_2(const SAM_ACCOUNT_HANDLE *sampass, uint32 *unknown2)
338 SAM_ASSERT(sampass && unknown2);
340 *unknown2 = sampass->private.unknown_2;
342 return NT_STATUS_OK;
345 NTSTATUS sam_get_account_unknown_3(const SAM_ACCOUNT_HANDLE *sampass, uint32 *unknown3)
347 SAM_ASSERT(sampass && unknown3);
349 *unknown3 = sampass->private.unknown_3;
351 return NT_STATUS_OK;
354 /*********************************************************************
355 Collection of set...() functions for SAM_ACCOUNT_HANDLE_INFO.
356 ********************************************************************/
358 NTSTATUS sam_set_account_acct_ctrl(SAM_ACCOUNT_HANDLE *sampass, uint16 acct_ctrl)
360 SAM_ASSERT(sampass);
362 sampass->private.acct_ctrl = acct_ctrl;
364 return NT_STATUS_OK;
367 NTSTATUS sam_set_account_logon_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
369 SAM_ASSERT(sampass);
371 sampass->private.logon_time = mytime;
374 return NT_STATUS_UNSUCCESSFUL;
377 NTSTATUS sam_set_account_logoff_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
379 SAM_ASSERT(sampass);
381 sampass->private.logoff_time = mytime;
383 return NT_STATUS_OK;
386 NTSTATUS sam_set_account_kickoff_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
388 SAM_ASSERT(sampass);
390 sampass->private.kickoff_time = mytime;
393 return NT_STATUS_OK;
396 NTSTATUS sam_set_account_pass_can_change_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
398 SAM_ASSERT(sampass);
400 sampass->private.pass_can_change_time = mytime;
403 return NT_STATUS_OK;
406 NTSTATUS sam_set_account_pass_must_change_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
408 SAM_ASSERT(sampass);
410 sampass->private.pass_must_change_time = mytime;
412 return NT_STATUS_OK;
415 NTSTATUS sam_set_account_pass_last_set_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime)
417 SAM_ASSERT(sampass);
419 sampass->private.pass_last_set_time = mytime;
421 return NT_STATUS_OK;
424 NTSTATUS sam_set_account_hours_len(SAM_ACCOUNT_HANDLE *sampass, uint32 len)
426 SAM_ASSERT(sampass);
428 sampass->private.hours_len = len;
429 return NT_STATUS_OK;
432 NTSTATUS sam_set_account_logon_divs(SAM_ACCOUNT_HANDLE *sampass, uint16 hours)
434 SAM_ASSERT(sampass);
436 sampass->private.logon_divs = hours;
437 return NT_STATUS_OK;
441 * Set flags showing what is initalised in the SAM_ACCOUNT_HANDLE
442 * @param sampass the SAM_ACCOUNT_HANDLE in question
443 * @param flag The *new* flag to be set. Old flags preserved
444 * this flag is only added.
447 NTSTATUS sam_set_account_init_flag(SAM_ACCOUNT_HANDLE *sampass, uint32 flag)
449 SAM_ASSERT(sampass);
451 sampass->private.init_flag |= flag;
453 return NT_STATUS_OK;
456 NTSTATUS sam_set_account_sid(SAM_ACCOUNT_HANDLE *sampass, const DOM_SID *u_sid)
458 SAM_ASSERT(sampass && u_sid);
460 sid_copy(&sampass->private.account_sid, u_sid);
462 DEBUG(10, ("sam_set_account_sid: setting account sid %s\n",
463 sid_string_static(&sampass->private.account_sid)));
465 return NT_STATUS_OK;
468 NTSTATUS sam_set_account_sid_from_string(SAM_ACCOUNT_HANDLE *sampass, const char *u_sid)
470 DOM_SID new_sid;
471 SAM_ASSERT(sampass && u_sid);
473 DEBUG(10, ("sam_set_account_sid_from_string: setting account sid %s\n",
474 u_sid));
476 if (!string_to_sid(&new_sid, u_sid)) {
477 DEBUG(1, ("sam_set_account_sid_from_string: %s isn't a valid SID!\n", u_sid));
478 return NT_STATUS_UNSUCCESSFUL;
481 if (!NT_STATUS_IS_OK(sam_set_account_sid(sampass, &new_sid))) {
482 DEBUG(1, ("sam_set_account_sid_from_string: could not set sid %s on SAM_ACCOUNT_HANDLE!\n", u_sid));
483 return NT_STATUS_UNSUCCESSFUL;
486 return NT_STATUS_OK;
489 NTSTATUS sam_set_account_pgroup_sid(SAM_ACCOUNT_HANDLE *sampass, const DOM_SID *g_sid)
491 SAM_ASSERT(sampass && g_sid);
493 sid_copy(&sampass->private.group_sid, g_sid);
495 DEBUG(10, ("sam_set_group_sid: setting group sid %s\n",
496 sid_string_static(&sampass->private.group_sid)));
498 return NT_STATUS_OK;
501 NTSTATUS sam_set_account_pgroup_string(SAM_ACCOUNT_HANDLE *sampass, const char *g_sid)
503 DOM_SID new_sid;
504 SAM_ASSERT(sampass && g_sid);
506 DEBUG(10, ("sam_set_group_sid_from_string: setting group sid %s\n",
507 g_sid));
509 if (!string_to_sid(&new_sid, g_sid)) {
510 DEBUG(1, ("sam_set_group_sid_from_string: %s isn't a valid SID!\n", g_sid));
511 return NT_STATUS_UNSUCCESSFUL;
514 if (!NT_STATUS_IS_OK(sam_set_account_pgroup_sid(sampass, &new_sid))) {
515 DEBUG(1, ("sam_set_group_sid_from_string: could not set sid %s on SAM_ACCOUNT_HANDLE!\n", g_sid));
516 return NT_STATUS_UNSUCCESSFUL;
518 return NT_STATUS_OK;
521 /*********************************************************************
522 Set the domain name.
523 ********************************************************************/
525 NTSTATUS sam_set_account_domain(SAM_ACCOUNT_HANDLE *sampass, SAM_DOMAIN_HANDLE *domain)
527 SAM_ASSERT(sampass);
529 sampass->private.domain = domain;
531 return NT_STATUS_OK;
534 /*********************************************************************
535 Set the account's NT name.
536 ********************************************************************/
538 NTSTATUS sam_set_account_name(SAM_ACCOUNT_HANDLE *sampass, const char *account_name)
540 SAM_ASSERT(sampass);
542 DEBUG(10, ("sam_set_account_name: setting nt account_name %s, was %s\n", account_name, sampass->private.account_name));
544 sampass->private.account_name = talloc_strdup(sampass->mem_ctx, account_name);
546 return NT_STATUS_OK;
549 /*********************************************************************
550 Set the account's full name.
551 ********************************************************************/
553 NTSTATUS sam_set_account_fullname(SAM_ACCOUNT_HANDLE *sampass, const char *full_name)
555 SAM_ASSERT(sampass);
557 DEBUG(10, ("sam_set_account_fullname: setting full name %s, was %s\n", full_name, sampass->private.full_name));
559 sampass->private.full_name = talloc_strdup(sampass->mem_ctx, full_name);
561 return NT_STATUS_OK;
564 /*********************************************************************
565 Set the account's logon script.
566 ********************************************************************/
568 NTSTATUS sam_set_account_logon_script(SAM_ACCOUNT_HANDLE *sampass, const char *logon_script, BOOL store)
570 SAM_ASSERT(sampass);
572 DEBUG(10, ("sam_set_logon_script: from %s to %s\n", logon_script, sampass->private.logon_script));
574 sampass->private.logon_script = talloc_strdup(sampass->mem_ctx, logon_script);
577 return NT_STATUS_OK;
580 /*********************************************************************
581 Set the account's profile path.
582 ********************************************************************/
584 NTSTATUS sam_set_account_profile_path(SAM_ACCOUNT_HANDLE *sampass, const char *profile_path, BOOL store)
586 SAM_ASSERT(sampass);
588 DEBUG(10, ("sam_set_profile_path: setting profile path %s, was %s\n", profile_path, sampass->private.profile_path));
590 sampass->private.profile_path = talloc_strdup(sampass->mem_ctx, profile_path);
592 return NT_STATUS_OK;
595 /*********************************************************************
596 Set the account's directory drive.
597 ********************************************************************/
599 NTSTATUS sam_set_account_dir_drive(SAM_ACCOUNT_HANDLE *sampass, const char *dir_drive, BOOL store)
601 SAM_ASSERT(sampass);
603 DEBUG(10, ("sam_set_dir_drive: setting dir drive %s, was %s\n", dir_drive,
604 sampass->private.dir_drive));
606 sampass->private.dir_drive = talloc_strdup(sampass->mem_ctx, dir_drive);
608 return NT_STATUS_OK;
611 /*********************************************************************
612 Set the account's home directory.
613 ********************************************************************/
615 NTSTATUS sam_set_account_homedir(SAM_ACCOUNT_HANDLE *sampass, const char *home_dir, BOOL store)
617 SAM_ASSERT(sampass);
619 DEBUG(10, ("sam_set_homedir: setting home dir %s, was %s\n", home_dir,
620 sampass->private.home_dir));
622 sampass->private.home_dir = talloc_strdup(sampass->mem_ctx, home_dir);
624 return NT_STATUS_OK;
627 /*********************************************************************
628 Set the account's unix home directory.
629 ********************************************************************/
631 NTSTATUS sam_set_account_unix_homedir(SAM_ACCOUNT_HANDLE *sampass, const char *unix_home_dir)
633 SAM_ASSERT(sampass);
635 DEBUG(10, ("sam_set_unix_homedir: setting home dir %s, was %s\n", unix_home_dir,
636 sampass->private.unix_home_dir));
638 sampass->private.unix_home_dir = talloc_strdup(sampass->mem_ctx, unix_home_dir);
640 return NT_STATUS_OK;
643 /*********************************************************************
644 Set the account's account description.
645 ********************************************************************/
647 NTSTATUS sam_set_account_acct_desc(SAM_ACCOUNT_HANDLE *sampass, const char *acct_desc)
649 SAM_ASSERT(sampass);
651 sampass->private.acct_desc = talloc_strdup(sampass->mem_ctx, acct_desc);
653 return NT_STATUS_OK;
656 /*********************************************************************
657 Set the account's workstation allowed list.
658 ********************************************************************/
660 NTSTATUS sam_set_account_workstations(SAM_ACCOUNT_HANDLE *sampass, const char *workstations)
662 SAM_ASSERT(sampass);
664 DEBUG(10, ("sam_set_workstations: setting workstations %s, was %s\n", workstations,
665 sampass->private.workstations));
667 sampass->private.workstations = talloc_strdup(sampass->mem_ctx, workstations);
669 return NT_STATUS_OK;
672 /*********************************************************************
673 Set the account's 'unknown_str', whatever the heck this actually is...
674 ********************************************************************/
676 NTSTATUS sam_set_account_unknown_str(SAM_ACCOUNT_HANDLE *sampass, const char *unknown_str)
678 SAM_ASSERT(sampass);
680 sampass->private.unknown_str = talloc_strdup(sampass->mem_ctx, unknown_str);
682 return NT_STATUS_OK;
685 /*********************************************************************
686 Set the account's dial string.
687 ********************************************************************/
689 NTSTATUS sam_set_account_munged_dial(SAM_ACCOUNT_HANDLE *sampass, const char *munged_dial)
691 SAM_ASSERT(sampass);
693 sampass->private.munged_dial = talloc_strdup(sampass->mem_ctx, munged_dial);
695 return NT_STATUS_OK;
698 /*********************************************************************
699 Set the account's NT hash.
700 ********************************************************************/
702 NTSTATUS sam_set_account_nt_pwd(SAM_ACCOUNT_HANDLE *sampass, const DATA_BLOB data)
704 SAM_ASSERT(sampass);
706 sampass->private.nt_pw = data;
708 return NT_STATUS_OK;
711 /*********************************************************************
712 Set the account's LM hash.
713 ********************************************************************/
715 NTSTATUS sam_set_account_lm_pwd(SAM_ACCOUNT_HANDLE *sampass, const DATA_BLOB data)
717 SAM_ASSERT(sampass);
719 sampass->private.lm_pw = data;
721 return NT_STATUS_OK;
724 /*********************************************************************
725 Set the account's plaintext password only (base procedure, see helper
726 below)
727 ********************************************************************/
729 NTSTATUS sam_set_account_plaintext_pwd(SAM_ACCOUNT_HANDLE *sampass, const char *plain_pwd)
731 SAM_ASSERT(sampass);
733 sampass->private.plaintext_pw = talloc_strdup(sampass->mem_ctx, plain_pwd);
735 return NT_STATUS_OK;
738 NTSTATUS sam_set_account_unknown_1(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
740 SAM_ASSERT(sampass);
742 sampass->private.unknown_1 = unkn;
744 return NT_STATUS_OK;
747 NTSTATUS sam_set_account_unknown_2(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
749 SAM_ASSERT(sampass);
751 sampass->private.unknown_2 = unkn;
753 return NT_STATUS_OK;
756 NTSTATUS sam_set_account_unknown_3(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
758 SAM_ASSERT(sampass);
760 sampass->private.unknown_3 = unkn;
761 return NT_STATUS_OK;
764 NTSTATUS sam_set_account_hours(SAM_ACCOUNT_HANDLE *sampass, const uint8 *hours)
766 SAM_ASSERT(sampass);
768 if (!hours) {
769 memset ((char *)sampass->private.hours, 0, MAX_HOURS_LEN);
770 return NT_STATUS_OK;
773 memcpy(sampass->private.hours, hours, MAX_HOURS_LEN);
775 return NT_STATUS_OK;
778 /* Helpful interfaces to the above */
780 /*********************************************************************
781 Sets the last changed times and must change times for a normal
782 password change.
783 ********************************************************************/
785 NTSTATUS sam_set_account_pass_changed_now(SAM_ACCOUNT_HANDLE *sampass)
787 uint32 expire;
788 NTTIME temptime;
790 SAM_ASSERT(sampass);
792 unix_to_nt_time(&temptime, time(NULL));
793 if (!NT_STATUS_IS_OK(sam_set_account_pass_last_set_time(sampass, temptime)))
794 return NT_STATUS_UNSUCCESSFUL;
796 if (!account_policy_get(AP_MAX_PASSWORD_AGE, &expire)
797 || (expire==(uint32)-1)) {
799 get_nttime_max(&temptime);
800 if (!NT_STATUS_IS_OK(sam_set_account_pass_must_change_time(sampass, temptime, False)))
801 return NT_STATUS_UNSUCCESSFUL;
803 } else {
804 /* FIXME: Add expire to temptime */
806 if (!NT_STATUS_IS_OK(sam_get_account_pass_last_set_time(sampass,&temptime)) || !NT_STATUS_IS_OK(sam_set_account_pass_must_change_time(sampass, temptime,True)))
807 return NT_STATUS_UNSUCCESSFUL;
810 return NT_STATUS_OK;
813 /*********************************************************************
814 Set the account's PLAINTEXT password. Used as an interface to the above.
815 Also sets the last change time to NOW.
816 ********************************************************************/
818 NTSTATUS sam_set_account_passwd(SAM_ACCOUNT_HANDLE *sampass, const char *plaintext)
820 DATA_BLOB data;
821 uchar new_lanman_p16[16];
822 uchar new_nt_p16[16];
824 SAM_ASSERT(sampass && plaintext);
826 nt_lm_owf_gen(plaintext, new_nt_p16, new_lanman_p16);
828 data = data_blob(new_nt_p16, 16);
829 if (!NT_STATUS_IS_OK(sam_set_account_nt_pwd(sampass, data)))
830 return NT_STATUS_UNSUCCESSFUL;
832 data = data_blob(new_lanman_p16, 16);
834 if (!NT_STATUS_IS_OK(sam_set_account_lm_pwd(sampass, data)))
835 return NT_STATUS_UNSUCCESSFUL;
837 if (!NT_STATUS_IS_OK(sam_set_account_plaintext_pwd(sampass, plaintext)))
838 return NT_STATUS_UNSUCCESSFUL;
840 if (!NT_STATUS_IS_OK(sam_set_account_pass_changed_now(sampass)))
841 return NT_STATUS_UNSUCCESSFUL;
843 return NT_STATUS_OK;