r505: Break out algorithmic_gid_to_sid so that those of us who need it can use it.
[Samba.git] / source3 / passdb / passdb.c
blob8313a259bd2b9b53ed7db04fa8dd0eb82c2760b7
1 /*
2 Unix SMB/CIFS implementation.
3 Password and authentication handling
4 Copyright (C) Jeremy Allison 1996-2001
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) Simo Sorce 2003
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.
25 #include "includes.h"
27 #undef DBGC_CLASS
28 #define DBGC_CLASS DBGC_PASSDB
30 /******************************************************************
31 get the default domain/netbios name to be used when
32 testing authentication. For example, if you connect
33 to a Windows member server using a bogus domain name, the
34 Windows box will map the BOGUS\user to DOMAIN\user. A
35 standalone box will map to WKS\user.
36 ******************************************************************/
38 const char *get_default_sam_name(void)
40 /* standalone servers can only use the local netbios name */
41 if ( lp_server_role() == ROLE_STANDALONE )
42 return global_myname();
44 /* Windows domain members default to the DOMAIN
45 name when not specified */
46 return lp_workgroup();
49 /************************************************************
50 Fill the SAM_ACCOUNT with default values.
51 ***********************************************************/
53 void pdb_fill_default_sam(SAM_ACCOUNT *user)
55 ZERO_STRUCT(user->private); /* Don't touch the talloc context */
57 /* no initial methods */
58 user->methods = NULL;
60 /* Don't change these timestamp settings without a good reason.
61 They are important for NT member server compatibility. */
63 user->private.logon_time = (time_t)0;
64 user->private.pass_last_set_time = (time_t)0;
65 user->private.pass_can_change_time = (time_t)0;
66 user->private.logoff_time =
67 user->private.kickoff_time =
68 user->private.pass_must_change_time = get_time_t_max();
69 user->private.fields_present = 0x00ffffff;
70 user->private.logon_divs = 168; /* hours per week */
71 user->private.hours_len = 21; /* 21 times 8 bits = 168 */
72 memset(user->private.hours, 0xff, user->private.hours_len); /* available at all hours */
73 user->private.bad_password_count = 0;
74 user->private.logon_count = 0;
75 user->private.unknown_6 = 0x000004ec; /* don't know */
77 /* Some parts of samba strlen their pdb_get...() returns,
78 so this keeps the interface unchanged for now. */
80 user->private.username = "";
81 user->private.domain = "";
82 user->private.nt_username = "";
83 user->private.full_name = "";
84 user->private.home_dir = "";
85 user->private.logon_script = "";
86 user->private.profile_path = "";
87 user->private.acct_desc = "";
88 user->private.workstations = "";
89 user->private.unknown_str = "";
90 user->private.munged_dial = "";
92 user->private.plaintext_pw = NULL;
94 /*
95 Unless we know otherwise have a Account Control Bit
96 value of 'normal user'. This helps User Manager, which
97 asks for a filtered list of users.
100 user->private.acct_ctrl = ACB_NORMAL;
103 static void destroy_pdb_talloc(SAM_ACCOUNT **user)
105 if (*user) {
106 data_blob_clear_free(&((*user)->private.lm_pw));
107 data_blob_clear_free(&((*user)->private.nt_pw));
109 if((*user)->private.plaintext_pw!=NULL)
110 memset((*user)->private.plaintext_pw,'\0',strlen((*user)->private.plaintext_pw));
111 talloc_destroy((*user)->mem_ctx);
112 *user = NULL;
117 /**********************************************************************
118 Allocates memory and initialises a struct sam_passwd on supplied mem_ctx.
119 ***********************************************************************/
121 NTSTATUS pdb_init_sam_talloc(TALLOC_CTX *mem_ctx, SAM_ACCOUNT **user)
123 if (*user != NULL) {
124 DEBUG(0,("pdb_init_sam_talloc: SAM_ACCOUNT was non NULL\n"));
125 #if 0
126 smb_panic("non-NULL pointer passed to pdb_init_sam\n");
127 #endif
128 return NT_STATUS_UNSUCCESSFUL;
131 if (!mem_ctx) {
132 DEBUG(0,("pdb_init_sam_talloc: mem_ctx was NULL!\n"));
133 return NT_STATUS_UNSUCCESSFUL;
136 *user=(SAM_ACCOUNT *)talloc(mem_ctx, sizeof(SAM_ACCOUNT));
138 if (*user==NULL) {
139 DEBUG(0,("pdb_init_sam_talloc: error while allocating memory\n"));
140 return NT_STATUS_NO_MEMORY;
143 (*user)->mem_ctx = mem_ctx;
145 (*user)->free_fn = NULL;
147 pdb_fill_default_sam(*user);
149 return NT_STATUS_OK;
153 /*************************************************************
154 Allocates memory and initialises a struct sam_passwd.
155 ************************************************************/
157 NTSTATUS pdb_init_sam(SAM_ACCOUNT **user)
159 TALLOC_CTX *mem_ctx;
160 NTSTATUS nt_status;
162 mem_ctx = talloc_init("passdb internal SAM_ACCOUNT allocation");
164 if (!mem_ctx) {
165 DEBUG(0,("pdb_init_sam: error while doing talloc_init()\n"));
166 return NT_STATUS_NO_MEMORY;
169 if (!NT_STATUS_IS_OK(nt_status = pdb_init_sam_talloc(mem_ctx, user))) {
170 talloc_destroy(mem_ctx);
171 return nt_status;
174 (*user)->free_fn = destroy_pdb_talloc;
176 return NT_STATUS_OK;
179 /**************************************************************************
180 * This function will take care of all the steps needed to correctly
181 * allocate and set the user SID, please do use this function to create new
182 * users, messing with SIDs is not good.
184 * account_data must be provided initialized, pwd may be null.
185 * SSS
186 ***************************************************************************/
188 static NTSTATUS pdb_set_sam_sids(SAM_ACCOUNT *account_data, const struct passwd *pwd)
190 const char *guest_account = lp_guestaccount();
191 GROUP_MAP map;
192 BOOL ret;
194 if (!account_data || !pwd) {
195 return NT_STATUS_INVALID_PARAMETER;
198 /* this is a hack this thing should not be set
199 this way --SSS */
200 if (!(guest_account && *guest_account)) {
201 DEBUG(1, ("NULL guest account!?!?\n"));
202 return NT_STATUS_UNSUCCESSFUL;
203 } else {
204 /* Ensure this *must* be set right */
205 if (strcmp(pwd->pw_name, guest_account) == 0) {
206 if (!pdb_set_user_sid_from_rid(account_data, DOMAIN_USER_RID_GUEST, PDB_DEFAULT)) {
207 return NT_STATUS_UNSUCCESSFUL;
209 if (!pdb_set_group_sid_from_rid(account_data, DOMAIN_GROUP_RID_GUESTS, PDB_DEFAULT)) {
210 return NT_STATUS_UNSUCCESSFUL;
212 return NT_STATUS_OK;
216 if (!pdb_set_user_sid_from_rid(account_data, fallback_pdb_uid_to_user_rid(pwd->pw_uid), PDB_SET)) {
217 DEBUG(0,("Can't set User SID from RID!\n"));
218 return NT_STATUS_INVALID_PARAMETER;
221 /* call the mapping code here */
222 become_root();
223 ret = pdb_getgrgid(&map, pwd->pw_gid);
224 unbecome_root();
226 if( ret ) {
227 if (!pdb_set_group_sid(account_data, &map.sid, PDB_SET)){
228 DEBUG(0,("Can't set Group SID!\n"));
229 return NT_STATUS_INVALID_PARAMETER;
232 else {
233 if (!pdb_set_group_sid_from_rid(account_data, pdb_gid_to_group_rid(pwd->pw_gid), PDB_SET)) {
234 DEBUG(0,("Can't set Group SID\n"));
235 return NT_STATUS_INVALID_PARAMETER;
239 return NT_STATUS_OK;
242 /*************************************************************
243 Initialises a struct sam_passwd with sane values.
244 ************************************************************/
246 NTSTATUS pdb_fill_sam_pw(SAM_ACCOUNT *sam_account, const struct passwd *pwd)
248 NTSTATUS ret;
250 if (!pwd) {
251 return NT_STATUS_UNSUCCESSFUL;
254 pdb_fill_default_sam(sam_account);
256 pdb_set_username(sam_account, pwd->pw_name, PDB_SET);
257 pdb_set_fullname(sam_account, pwd->pw_gecos, PDB_SET);
259 pdb_set_unix_homedir(sam_account, pwd->pw_dir, PDB_SET);
261 pdb_set_domain (sam_account, get_global_sam_name(), PDB_DEFAULT);
263 /* When we get a proper uid -> SID and SID -> uid allocation
264 mechinism, we should call it here.
266 We can't just set this to 0 or allow it only to be filled
267 in when added to the backend, because the user's SID
268 may already be in security descriptors etc.
270 -- abartlet 11-May-02
273 ret = pdb_set_sam_sids(sam_account, pwd);
274 if (!NT_STATUS_IS_OK(ret)) return ret;
276 /* check if this is a user account or a machine account */
277 if (pwd->pw_name[strlen(pwd->pw_name)-1] != '$')
279 pdb_set_profile_path(sam_account,
280 talloc_sub_specified((sam_account)->mem_ctx,
281 lp_logon_path(),
282 pwd->pw_name, global_myname(),
283 pwd->pw_uid, pwd->pw_gid),
284 PDB_DEFAULT);
286 pdb_set_homedir(sam_account,
287 talloc_sub_specified((sam_account)->mem_ctx,
288 lp_logon_home(),
289 pwd->pw_name, global_myname(),
290 pwd->pw_uid, pwd->pw_gid),
291 PDB_DEFAULT);
293 pdb_set_dir_drive(sam_account,
294 talloc_sub_specified((sam_account)->mem_ctx,
295 lp_logon_drive(),
296 pwd->pw_name, global_myname(),
297 pwd->pw_uid, pwd->pw_gid),
298 PDB_DEFAULT);
300 pdb_set_logon_script(sam_account,
301 talloc_sub_specified((sam_account)->mem_ctx,
302 lp_logon_script(),
303 pwd->pw_name, global_myname(),
304 pwd->pw_uid, pwd->pw_gid),
305 PDB_DEFAULT);
306 if (!pdb_set_acct_ctrl(sam_account, ACB_NORMAL, PDB_DEFAULT)) {
307 DEBUG(1, ("Failed to set 'normal account' flags for user %s.\n", pwd->pw_name));
308 return NT_STATUS_UNSUCCESSFUL;
310 } else {
311 if (!pdb_set_acct_ctrl(sam_account, ACB_WSTRUST, PDB_DEFAULT)) {
312 DEBUG(1, ("Failed to set 'trusted workstation account' flags for user %s.\n", pwd->pw_name));
313 return NT_STATUS_UNSUCCESSFUL;
316 return NT_STATUS_OK;
320 /*************************************************************
321 Initialises a struct sam_passwd with sane values.
322 ************************************************************/
324 NTSTATUS pdb_init_sam_pw(SAM_ACCOUNT **new_sam_acct, const struct passwd *pwd)
326 NTSTATUS nt_status;
328 if (!pwd) {
329 new_sam_acct = NULL;
330 return NT_STATUS_INVALID_PARAMETER;
333 if (!NT_STATUS_IS_OK(nt_status = pdb_init_sam(new_sam_acct))) {
334 new_sam_acct = NULL;
335 return nt_status;
338 if (!NT_STATUS_IS_OK(nt_status = pdb_fill_sam_pw(*new_sam_acct, pwd))) {
339 pdb_free_sam(new_sam_acct);
340 new_sam_acct = NULL;
341 return nt_status;
344 return NT_STATUS_OK;
348 /*************************************************************
349 Initialises a SAM_ACCOUNT ready to add a new account, based
350 on the UNIX user. Pass in a RID if you have one
351 ************************************************************/
353 NTSTATUS pdb_init_sam_new(SAM_ACCOUNT **new_sam_acct, const char *username,
354 uint32 rid)
356 NTSTATUS nt_status = NT_STATUS_NO_MEMORY;
357 struct passwd *pwd;
358 BOOL ret;
360 pwd = Get_Pwnam(username);
362 if (!pwd)
363 return NT_STATUS_NO_SUCH_USER;
365 if (!NT_STATUS_IS_OK(nt_status = pdb_init_sam_pw(new_sam_acct, pwd))) {
366 *new_sam_acct = NULL;
367 return nt_status;
370 /* see if we need to generate a new rid using the 2.2 algorithm */
371 if ( rid == 0 && lp_enable_rid_algorithm() ) {
372 DEBUG(10,("pdb_init_sam_new: no RID specified. Generating one via old algorithm\n"));
373 rid = fallback_pdb_uid_to_user_rid(pwd->pw_uid);
376 /* set the new SID */
378 ret = pdb_set_user_sid_from_rid( *new_sam_acct, rid, PDB_SET );
380 return (ret ? NT_STATUS_OK : NT_STATUS_NO_SUCH_USER);
385 * Free the contets of the SAM_ACCOUNT, but not the structure.
387 * Also wipes the LM and NT hashes and plaintext password from
388 * memory.
390 * @param user SAM_ACCOUNT to free members of.
393 static void pdb_free_sam_contents(SAM_ACCOUNT *user)
396 /* Kill off sensitive data. Free()ed by the
397 talloc mechinism */
399 data_blob_clear_free(&(user->private.lm_pw));
400 data_blob_clear_free(&(user->private.nt_pw));
401 if (user->private.plaintext_pw!=NULL)
402 memset(user->private.plaintext_pw,'\0',strlen(user->private.plaintext_pw));
404 if (user->private.backend_private_data && user->private.backend_private_data_free_fn) {
405 user->private.backend_private_data_free_fn(&user->private.backend_private_data);
410 /************************************************************
411 Reset the SAM_ACCOUNT and free the NT/LM hashes.
412 ***********************************************************/
414 NTSTATUS pdb_reset_sam(SAM_ACCOUNT *user)
416 if (user == NULL) {
417 DEBUG(0,("pdb_reset_sam: SAM_ACCOUNT was NULL\n"));
418 #if 0
419 smb_panic("NULL pointer passed to pdb_free_sam\n");
420 #endif
421 return NT_STATUS_UNSUCCESSFUL;
424 pdb_free_sam_contents(user);
426 pdb_fill_default_sam(user);
428 return NT_STATUS_OK;
432 /************************************************************
433 Free the SAM_ACCOUNT and the member pointers.
434 ***********************************************************/
436 NTSTATUS pdb_free_sam(SAM_ACCOUNT **user)
438 if (*user == NULL) {
439 DEBUG(0,("pdb_free_sam: SAM_ACCOUNT was NULL\n"));
440 #if 0
441 smb_panic("NULL pointer passed to pdb_free_sam\n");
442 #endif
443 return NT_STATUS_UNSUCCESSFUL;
446 pdb_free_sam_contents(*user);
448 if ((*user)->free_fn) {
449 (*user)->free_fn(user);
452 return NT_STATUS_OK;
455 /**********************************************************
456 Encode the account control bits into a string.
457 length = length of string to encode into (including terminating
458 null). length *MUST BE MORE THAN 2* !
459 **********************************************************/
461 char *pdb_encode_acct_ctrl(uint16 acct_ctrl, size_t length)
463 static fstring acct_str;
465 size_t i = 0;
467 SMB_ASSERT(length <= sizeof(acct_str));
469 acct_str[i++] = '[';
471 if (acct_ctrl & ACB_PWNOTREQ ) acct_str[i++] = 'N';
472 if (acct_ctrl & ACB_DISABLED ) acct_str[i++] = 'D';
473 if (acct_ctrl & ACB_HOMDIRREQ) acct_str[i++] = 'H';
474 if (acct_ctrl & ACB_TEMPDUP ) acct_str[i++] = 'T';
475 if (acct_ctrl & ACB_NORMAL ) acct_str[i++] = 'U';
476 if (acct_ctrl & ACB_MNS ) acct_str[i++] = 'M';
477 if (acct_ctrl & ACB_WSTRUST ) acct_str[i++] = 'W';
478 if (acct_ctrl & ACB_SVRTRUST ) acct_str[i++] = 'S';
479 if (acct_ctrl & ACB_AUTOLOCK ) acct_str[i++] = 'L';
480 if (acct_ctrl & ACB_PWNOEXP ) acct_str[i++] = 'X';
481 if (acct_ctrl & ACB_DOMTRUST ) acct_str[i++] = 'I';
483 for ( ; i < length - 2 ; i++ )
484 acct_str[i] = ' ';
486 i = length - 2;
487 acct_str[i++] = ']';
488 acct_str[i++] = '\0';
490 return acct_str;
493 /**********************************************************
494 Decode the account control bits from a string.
495 **********************************************************/
497 uint16 pdb_decode_acct_ctrl(const char *p)
499 uint16 acct_ctrl = 0;
500 BOOL finished = False;
503 * Check if the account type bits have been encoded after the
504 * NT password (in the form [NDHTUWSLXI]).
507 if (*p != '[')
508 return 0;
510 for (p++; *p && !finished; p++) {
511 switch (*p) {
512 case 'N': { acct_ctrl |= ACB_PWNOTREQ ; break; /* 'N'o password. */ }
513 case 'D': { acct_ctrl |= ACB_DISABLED ; break; /* 'D'isabled. */ }
514 case 'H': { acct_ctrl |= ACB_HOMDIRREQ; break; /* 'H'omedir required. */ }
515 case 'T': { acct_ctrl |= ACB_TEMPDUP ; break; /* 'T'emp account. */ }
516 case 'U': { acct_ctrl |= ACB_NORMAL ; break; /* 'U'ser account (normal). */ }
517 case 'M': { acct_ctrl |= ACB_MNS ; break; /* 'M'NS logon user account. What is this ? */ }
518 case 'W': { acct_ctrl |= ACB_WSTRUST ; break; /* 'W'orkstation account. */ }
519 case 'S': { acct_ctrl |= ACB_SVRTRUST ; break; /* 'S'erver account. */ }
520 case 'L': { acct_ctrl |= ACB_AUTOLOCK ; break; /* 'L'ocked account. */ }
521 case 'X': { acct_ctrl |= ACB_PWNOEXP ; break; /* No 'X'piry on password */ }
522 case 'I': { acct_ctrl |= ACB_DOMTRUST ; break; /* 'I'nterdomain trust account. */ }
523 case ' ': { break; }
524 case ':':
525 case '\n':
526 case '\0':
527 case ']':
528 default: { finished = True; }
532 return acct_ctrl;
535 /*************************************************************
536 Routine to set 32 hex password characters from a 16 byte array.
537 **************************************************************/
539 void pdb_sethexpwd(char *p, const unsigned char *pwd, uint16 acct_ctrl)
541 if (pwd != NULL) {
542 int i;
543 for (i = 0; i < 16; i++)
544 slprintf(&p[i*2], 3, "%02X", pwd[i]);
545 } else {
546 if (acct_ctrl & ACB_PWNOTREQ)
547 safe_strcpy(p, "NO PASSWORDXXXXXXXXXXXXXXXXXXXXX", 33);
548 else
549 safe_strcpy(p, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 33);
553 /*************************************************************
554 Routine to get the 32 hex characters and turn them
555 into a 16 byte array.
556 **************************************************************/
558 BOOL pdb_gethexpwd(const char *p, unsigned char *pwd)
560 int i;
561 unsigned char lonybble, hinybble;
562 const char *hexchars = "0123456789ABCDEF";
563 char *p1, *p2;
565 if (!p)
566 return (False);
568 for (i = 0; i < 32; i += 2) {
569 hinybble = toupper(p[i]);
570 lonybble = toupper(p[i + 1]);
572 p1 = strchr(hexchars, hinybble);
573 p2 = strchr(hexchars, lonybble);
575 if (!p1 || !p2)
576 return (False);
578 hinybble = PTR_DIFF(p1, hexchars);
579 lonybble = PTR_DIFF(p2, hexchars);
581 pwd[i / 2] = (hinybble << 4) | lonybble;
583 return (True);
586 int algorithmic_rid_base(void)
588 static int rid_offset = 0;
590 if (rid_offset != 0)
591 return rid_offset;
593 rid_offset = lp_algorithmic_rid_base();
595 if (rid_offset < BASE_RID) {
596 /* Try to prevent admin foot-shooting, we can't put algorithmic
597 rids below 1000, that's the 'well known RIDs' on NT */
598 DEBUG(0, ("'algorithmic rid base' must be equal to or above %ld\n", BASE_RID));
599 rid_offset = BASE_RID;
601 if (rid_offset & 1) {
602 DEBUG(0, ("algorithmic rid base must be even\n"));
603 rid_offset += 1;
605 return rid_offset;
608 /*******************************************************************
609 Converts NT user RID to a UNIX uid.
610 ********************************************************************/
612 uid_t fallback_pdb_user_rid_to_uid(uint32 user_rid)
614 int rid_offset = algorithmic_rid_base();
615 return (uid_t)(((user_rid & (~USER_RID_TYPE)) - rid_offset)/RID_MULTIPLIER);
618 /*******************************************************************
619 converts UNIX uid to an NT User RID.
620 ********************************************************************/
622 uint32 fallback_pdb_uid_to_user_rid(uid_t uid)
624 int rid_offset = algorithmic_rid_base();
625 return (((((uint32)uid)*RID_MULTIPLIER) + rid_offset) | USER_RID_TYPE);
628 /*******************************************************************
629 Converts NT group RID to a UNIX gid.
630 ********************************************************************/
632 gid_t pdb_group_rid_to_gid(uint32 group_rid)
634 int rid_offset = algorithmic_rid_base();
635 return (gid_t)(((group_rid & (~GROUP_RID_TYPE))- rid_offset)/RID_MULTIPLIER);
638 /*******************************************************************
639 converts NT Group RID to a UNIX uid.
641 warning: you must not call that function only
642 you must do a call to the group mapping first.
643 there is not anymore a direct link between the gid and the rid.
644 ********************************************************************/
646 uint32 pdb_gid_to_group_rid(gid_t gid)
648 int rid_offset = algorithmic_rid_base();
649 return (((((uint32)gid)*RID_MULTIPLIER) + rid_offset) | GROUP_RID_TYPE);
652 /*******************************************************************
653 Decides if a RID is a well known RID.
654 ********************************************************************/
656 static BOOL pdb_rid_is_well_known(uint32 rid)
658 /* Not using rid_offset here, because this is the actual
659 NT fixed value (1000) */
661 return (rid < BASE_RID);
664 /*******************************************************************
665 Decides if a RID is a user or group RID.
666 ********************************************************************/
668 BOOL fallback_pdb_rid_is_user(uint32 rid)
670 /* lkcl i understand that NT attaches an enumeration to a RID
671 * such that it can be identified as either a user, group etc
672 * type. there are 5 such categories, and they are documented.
674 /* However, they are not in the RID, just somthing you can query
675 seperatly. Sorry luke :-) */
677 if(pdb_rid_is_well_known(rid)) {
679 * The only well known user RIDs are DOMAIN_USER_RID_ADMIN
680 * and DOMAIN_USER_RID_GUEST.
682 if(rid == DOMAIN_USER_RID_ADMIN || rid == DOMAIN_USER_RID_GUEST)
683 return True;
684 } else if((rid & RID_TYPE_MASK) == USER_RID_TYPE) {
685 return True;
687 return False;
690 /*******************************************************************
691 Convert a rid into a name. Used in the lookup SID rpc.
692 ********************************************************************/
694 BOOL local_lookup_sid(const DOM_SID *sid, char *name, enum SID_NAME_USE *psid_name_use)
696 uint32 rid;
697 SAM_ACCOUNT *sam_account = NULL;
698 GROUP_MAP map;
699 BOOL ret;
701 if (!sid_peek_check_rid(get_global_sam_sid(), sid, &rid)){
702 DEBUG(0,("local_lookup_sid: sid_peek_check_rid return False! SID: %s\n",
703 sid_string_static(&map.sid)));
704 return False;
706 *psid_name_use = SID_NAME_UNKNOWN;
708 DEBUG(5,("local_lookup_sid: looking up RID %u.\n", (unsigned int)rid));
710 if (rid == DOMAIN_USER_RID_ADMIN) {
711 const char **admin_list = lp_admin_users(-1);
712 *psid_name_use = SID_NAME_USER;
713 if (admin_list) {
714 const char *p = *admin_list;
715 if(!next_token(&p, name, NULL, sizeof(fstring)))
716 fstrcpy(name, "Administrator");
717 } else {
718 fstrcpy(name, "Administrator");
720 return True;
723 if (!NT_STATUS_IS_OK(pdb_init_sam(&sam_account))) {
724 return False;
727 /* see if the passdb can help us with the name of the user */
729 /* BEING ROOT BLLOCK */
730 become_root();
731 if (pdb_getsampwsid(sam_account, sid)) {
732 unbecome_root(); /* -----> EXIT BECOME_ROOT() */
733 fstrcpy(name, pdb_get_username(sam_account));
734 *psid_name_use = SID_NAME_USER;
736 pdb_free_sam(&sam_account);
738 return True;
740 pdb_free_sam(&sam_account);
742 ret = pdb_getgrsid(&map, *sid);
743 unbecome_root();
744 /* END BECOME_ROOT BLOCK */
746 if ( ret ) {
747 if (map.gid!=(gid_t)-1) {
748 DEBUG(5,("local_lookup_sid: mapped group %s to gid %u\n", map.nt_name, (unsigned int)map.gid));
749 } else {
750 DEBUG(5,("local_lookup_sid: mapped group %s to no unix gid. Returning name.\n", map.nt_name));
753 fstrcpy(name, map.nt_name);
754 *psid_name_use = map.sid_name_use;
755 return True;
758 if (fallback_pdb_rid_is_user(rid)) {
759 uid_t uid;
760 struct passwd *pw = NULL;
762 DEBUG(5, ("assuming RID %u is a user\n", (unsigned)rid));
764 uid = fallback_pdb_user_rid_to_uid(rid);
765 pw = sys_getpwuid( uid );
767 DEBUG(5,("local_lookup_sid: looking up uid %u %s\n", (unsigned int)uid,
768 pw ? "succeeded" : "failed" ));
770 if ( !pw )
771 fstr_sprintf(name, "unix_user.%u", (unsigned int)uid);
772 else
773 fstrcpy( name, pw->pw_name );
775 DEBUG(5,("local_lookup_sid: found user %s for rid %u\n", name,
776 (unsigned int)rid ));
778 *psid_name_use = SID_NAME_USER;
780 return ( pw != NULL );
781 } else {
782 gid_t gid;
783 struct group *gr;
785 DEBUG(5, ("assuming RID %u is a group\n", (unsigned)rid));
787 gid = pdb_group_rid_to_gid(rid);
788 gr = getgrgid(gid);
790 *psid_name_use = SID_NAME_ALIAS;
792 DEBUG(5,("local_lookup_sid: looking up gid %u %s\n", (unsigned int)gid,
793 gr ? "succeeded" : "failed" ));
795 if( !gr )
796 fstr_sprintf(name, "unix_group.%u", (unsigned int)gid);
797 else
798 fstrcpy( name, gr->gr_name);
800 DEBUG(5,("local_lookup_sid: found group %s for rid %u\n", name,
801 (unsigned int)rid ));
803 /* assume fallback groups aer domain global groups */
805 *psid_name_use = SID_NAME_DOM_GRP;
807 return ( gr != NULL );
811 /*******************************************************************
812 Convert a name into a SID. Used in the lookup name rpc.
813 ********************************************************************/
815 BOOL local_lookup_name(const char *c_user, DOM_SID *psid, enum SID_NAME_USE *psid_name_use)
817 extern DOM_SID global_sid_World_Domain;
818 DOM_SID local_sid;
819 fstring user;
820 SAM_ACCOUNT *sam_account = NULL;
821 struct group *grp;
822 GROUP_MAP map;
824 *psid_name_use = SID_NAME_UNKNOWN;
827 * user may be quoted a const string, and map_username and
828 * friends can modify it. Make a modifiable copy. JRA.
831 fstrcpy(user, c_user);
833 sid_copy(&local_sid, get_global_sam_sid());
836 * Special case for MACHINE\Everyone. Map to the world_sid.
839 if(strequal(user, "Everyone")) {
840 sid_copy( psid, &global_sid_World_Domain);
841 sid_append_rid(psid, 0);
842 *psid_name_use = SID_NAME_ALIAS;
843 return True;
846 (void)map_username(user);
848 if (!NT_STATUS_IS_OK(pdb_init_sam(&sam_account))) {
849 return False;
852 /* BEGIN ROOT BLOCK */
854 become_root();
855 if (pdb_getsampwnam(sam_account, user)) {
856 unbecome_root();
857 sid_copy(psid, pdb_get_user_sid(sam_account));
858 *psid_name_use = SID_NAME_USER;
860 pdb_free_sam(&sam_account);
861 return True;
864 pdb_free_sam(&sam_account);
867 * Maybe it was a group ?
870 /* check if it's a mapped group */
871 if (pdb_getgrnam(&map, user)) {
872 /* yes it's a mapped group */
873 sid_copy(&local_sid, &map.sid);
874 *psid_name_use = map.sid_name_use;
875 } else {
876 /* it's not a mapped group */
877 grp = getgrnam(user);
878 if(!grp) {
879 unbecome_root(); /* ---> exit form block */
880 return False;
884 *check if it's mapped, if it is reply it doesn't exist
886 * that's to prevent this case:
888 * unix group ug is mapped to nt group ng
889 * someone does a lookup on ug
890 * we must not reply as it doesn't "exist" anymore
891 * for NT. For NT only ng exists.
892 * JFM, 30/11/2001
895 if (pdb_getgrgid(&map, grp->gr_gid)){
896 unbecome_root(); /* ---> exit form block */
897 return False;
900 sid_append_rid( &local_sid, pdb_gid_to_group_rid(grp->gr_gid));
901 *psid_name_use = SID_NAME_ALIAS;
903 unbecome_root();
904 /* END ROOT BLOCK */
906 sid_copy( psid, &local_sid);
908 return True;
911 /*************************************************************
912 Change a password entry in the local smbpasswd file.
913 *************************************************************/
915 BOOL local_password_change(const char *user_name, int local_flags,
916 const char *new_passwd,
917 char *err_str, size_t err_str_len,
918 char *msg_str, size_t msg_str_len)
920 SAM_ACCOUNT *sam_pass=NULL;
921 uint16 other_acb;
923 *err_str = '\0';
924 *msg_str = '\0';
926 /* Get the smb passwd entry for this user */
927 pdb_init_sam(&sam_pass);
929 become_root();
930 if(!pdb_getsampwnam(sam_pass, user_name)) {
931 unbecome_root();
932 pdb_free_sam(&sam_pass);
934 if ((local_flags & LOCAL_ADD_USER) || (local_flags & LOCAL_DELETE_USER)) {
935 /* Might not exist in /etc/passwd. Use rid algorithm here */
936 if (!NT_STATUS_IS_OK(pdb_init_sam_new(&sam_pass, user_name, 0))) {
937 slprintf(err_str, err_str_len-1, "Failed to initialise SAM_ACCOUNT for user %s.\n", user_name);
938 return False;
940 } else {
941 slprintf(err_str, err_str_len-1,"Failed to find entry for user %s.\n", user_name);
942 return False;
944 } else {
945 unbecome_root();
946 /* the entry already existed */
947 local_flags &= ~LOCAL_ADD_USER;
950 /* the 'other' acb bits not being changed here */
951 other_acb = (pdb_get_acct_ctrl(sam_pass) & (!(ACB_WSTRUST|ACB_DOMTRUST|ACB_SVRTRUST|ACB_NORMAL)));
952 if (local_flags & LOCAL_TRUST_ACCOUNT) {
953 if (!pdb_set_acct_ctrl(sam_pass, ACB_WSTRUST | other_acb, PDB_CHANGED) ) {
954 slprintf(err_str, err_str_len - 1, "Failed to set 'trusted workstation account' flags for user %s.\n", user_name);
955 pdb_free_sam(&sam_pass);
956 return False;
958 } else if (local_flags & LOCAL_INTERDOM_ACCOUNT) {
959 if (!pdb_set_acct_ctrl(sam_pass, ACB_DOMTRUST | other_acb, PDB_CHANGED)) {
960 slprintf(err_str, err_str_len - 1, "Failed to set 'domain trust account' flags for user %s.\n", user_name);
961 pdb_free_sam(&sam_pass);
962 return False;
964 } else {
965 if (!pdb_set_acct_ctrl(sam_pass, ACB_NORMAL | other_acb, PDB_CHANGED)) {
966 slprintf(err_str, err_str_len - 1, "Failed to set 'normal account' flags for user %s.\n", user_name);
967 pdb_free_sam(&sam_pass);
968 return False;
973 * We are root - just write the new password
974 * and the valid last change time.
977 if (local_flags & LOCAL_DISABLE_USER) {
978 if (!pdb_set_acct_ctrl (sam_pass, pdb_get_acct_ctrl(sam_pass)|ACB_DISABLED, PDB_CHANGED)) {
979 slprintf(err_str, err_str_len-1, "Failed to set 'disabled' flag for user %s.\n", user_name);
980 pdb_free_sam(&sam_pass);
981 return False;
983 } else if (local_flags & LOCAL_ENABLE_USER) {
984 if (!pdb_set_acct_ctrl (sam_pass, pdb_get_acct_ctrl(sam_pass)&(~ACB_DISABLED), PDB_CHANGED)) {
985 slprintf(err_str, err_str_len-1, "Failed to unset 'disabled' flag for user %s.\n", user_name);
986 pdb_free_sam(&sam_pass);
987 return False;
991 if (local_flags & LOCAL_SET_NO_PASSWORD) {
992 if (!pdb_set_acct_ctrl (sam_pass, pdb_get_acct_ctrl(sam_pass)|ACB_PWNOTREQ, PDB_CHANGED)) {
993 slprintf(err_str, err_str_len-1, "Failed to set 'no password required' flag for user %s.\n", user_name);
994 pdb_free_sam(&sam_pass);
995 return False;
997 } else if (local_flags & LOCAL_SET_PASSWORD) {
999 * If we're dealing with setting a completely empty user account
1000 * ie. One with a password of 'XXXX', but not set disabled (like
1001 * an account created from scratch) then if the old password was
1002 * 'XX's then getsmbpwent will have set the ACB_DISABLED flag.
1003 * We remove that as we're giving this user their first password
1004 * and the decision hasn't really been made to disable them (ie.
1005 * don't create them disabled). JRA.
1007 if ((pdb_get_lanman_passwd(sam_pass)==NULL) && (pdb_get_acct_ctrl(sam_pass)&ACB_DISABLED)) {
1008 if (!pdb_set_acct_ctrl (sam_pass, pdb_get_acct_ctrl(sam_pass)&(~ACB_DISABLED), PDB_CHANGED)) {
1009 slprintf(err_str, err_str_len-1, "Failed to unset 'disabled' flag for user %s.\n", user_name);
1010 pdb_free_sam(&sam_pass);
1011 return False;
1014 if (!pdb_set_acct_ctrl (sam_pass, pdb_get_acct_ctrl(sam_pass)&(~ACB_PWNOTREQ), PDB_CHANGED)) {
1015 slprintf(err_str, err_str_len-1, "Failed to unset 'no password required' flag for user %s.\n", user_name);
1016 pdb_free_sam(&sam_pass);
1017 return False;
1020 if (!pdb_set_plaintext_passwd (sam_pass, new_passwd)) {
1021 slprintf(err_str, err_str_len-1, "Failed to set password for user %s.\n", user_name);
1022 pdb_free_sam(&sam_pass);
1023 return False;
1027 if (local_flags & LOCAL_ADD_USER) {
1028 if (pdb_add_sam_account(sam_pass)) {
1029 slprintf(msg_str, msg_str_len-1, "Added user %s.\n", user_name);
1030 pdb_free_sam(&sam_pass);
1031 return True;
1032 } else {
1033 slprintf(err_str, err_str_len-1, "Failed to add entry for user %s.\n", user_name);
1034 pdb_free_sam(&sam_pass);
1035 return False;
1037 } else if (local_flags & LOCAL_DELETE_USER) {
1038 if (!pdb_delete_sam_account(sam_pass)) {
1039 slprintf(err_str,err_str_len-1, "Failed to delete entry for user %s.\n", user_name);
1040 pdb_free_sam(&sam_pass);
1041 return False;
1043 slprintf(msg_str, msg_str_len-1, "Deleted user %s.\n", user_name);
1044 } else {
1045 if(!pdb_update_sam_account(sam_pass)) {
1046 slprintf(err_str, err_str_len-1, "Failed to modify entry for user %s.\n", user_name);
1047 pdb_free_sam(&sam_pass);
1048 return False;
1050 if(local_flags & LOCAL_DISABLE_USER)
1051 slprintf(msg_str, msg_str_len-1, "Disabled user %s.\n", user_name);
1052 else if (local_flags & LOCAL_ENABLE_USER)
1053 slprintf(msg_str, msg_str_len-1, "Enabled user %s.\n", user_name);
1054 else if (local_flags & LOCAL_SET_NO_PASSWORD)
1055 slprintf(msg_str, msg_str_len-1, "User %s password set to none.\n", user_name);
1058 pdb_free_sam(&sam_pass);
1059 return True;
1062 /****************************************************************************
1063 Convert a uid to SID - algorithmic.
1064 ****************************************************************************/
1066 DOM_SID *algorithmic_uid_to_sid(DOM_SID *psid, uid_t uid)
1068 if ( !lp_enable_rid_algorithm() )
1069 return NULL;
1071 DEBUG(8,("algorithmic_uid_to_sid: falling back to RID algorithm\n"));
1072 sid_copy( psid, get_global_sam_sid() );
1073 sid_append_rid( psid, fallback_pdb_uid_to_user_rid(uid) );
1074 DEBUG(10,("algorithmic_uid_to_sid: uid (%d) -> SID %s.\n",
1075 (unsigned int)uid, sid_string_static(psid) ));
1077 return psid;
1080 /****************************************************************************
1081 Convert a uid to SID - locally.
1082 ****************************************************************************/
1084 DOM_SID *local_uid_to_sid(DOM_SID *psid, uid_t uid)
1086 SAM_ACCOUNT *sampw = NULL;
1087 struct passwd *unix_pw;
1088 BOOL ret;
1090 unix_pw = sys_getpwuid( uid );
1092 if ( !unix_pw ) {
1093 DEBUG(4,("local_uid_to_sid: host has no idea of uid %lu\n", (unsigned long)uid));
1094 return algorithmic_uid_to_sid( psid, uid);
1097 if ( !NT_STATUS_IS_OK(pdb_init_sam(&sampw)) ) {
1098 DEBUG(0,("local_uid_to_sid: failed to allocate SAM_ACCOUNT object\n"));
1099 return NULL;
1102 become_root();
1103 ret = pdb_getsampwnam( sampw, unix_pw->pw_name );
1104 unbecome_root();
1106 if ( ret )
1107 sid_copy( psid, pdb_get_user_sid(sampw) );
1108 else {
1109 DEBUG(4,("local_uid_to_sid: User %s [uid == %lu] has no samba account\n",
1110 unix_pw->pw_name, (unsigned long)uid));
1112 return algorithmic_uid_to_sid( psid, uid);
1115 DEBUG(10,("local_uid_to_sid: uid (%d) -> SID %s (%s).\n",
1116 (unsigned int)uid, sid_string_static(psid), unix_pw->pw_name));
1118 return psid;
1121 /****************************************************************************
1122 Convert a SID to uid - locally.
1123 ****************************************************************************/
1125 BOOL local_sid_to_uid(uid_t *puid, const DOM_SID *psid, enum SID_NAME_USE *name_type)
1127 SAM_ACCOUNT *sampw = NULL;
1128 struct passwd *unix_pw;
1129 const char *user_name;
1131 *name_type = SID_NAME_UNKNOWN;
1134 * We can only convert to a uid if this is our local
1135 * Domain SID (ie. we are the controling authority).
1137 if (!sid_check_is_in_our_domain(psid) ) {
1138 DEBUG(5,("local_sid_to_uid: this SID (%s) is not from our domain\n", sid_string_static(psid)));
1139 return False;
1142 /* lookup the user account */
1144 if ( !NT_STATUS_IS_OK(pdb_init_sam(&sampw)) ) {
1145 DEBUG(0,("local_sid_to_uid: Failed to allocate memory for SAM_ACCOUNT object\n"));
1146 return False;
1149 become_root();
1150 if ( !pdb_getsampwsid(sampw, psid) ) {
1151 unbecome_root();
1152 DEBUG(8,("local_sid_to_uid: Could not find SID %s in passdb\n",
1153 sid_string_static(psid)));
1154 return False;
1156 unbecome_root();
1158 user_name = pdb_get_username(sampw);
1160 unix_pw = sys_getpwnam( user_name );
1162 if ( !unix_pw ) {
1163 DEBUG(0,("local_sid_to_uid: %s found in passdb but getpwnam() return NULL!\n",
1164 user_name));
1165 pdb_free_sam( &sampw );
1166 return False;
1169 *puid = unix_pw->pw_uid;
1171 DEBUG(10,("local_sid_to_uid: SID %s -> uid (%u) (%s).\n", sid_string_static(psid),
1172 (unsigned int)*puid, user_name ));
1174 *name_type = SID_NAME_USER;
1176 return True;
1179 /****************************************************************************
1180 Convert a gid to SID - algorithmic.
1181 ****************************************************************************/
1183 DOM_SID *algorithmic_gid_to_sid(DOM_SID *psid, uid_t gid)
1185 if ( !lp_enable_rid_algorithm() )
1186 return NULL;
1188 DEBUG(8,("algorithmic_gid_to_sid: falling back to RID algorithm\n"));
1189 sid_copy( psid, get_global_sam_sid() );
1190 sid_append_rid( psid, pdb_gid_to_group_rid(gid) );
1191 DEBUG(10,("algorithmic_gid_to_sid: gid (%d) -> SID %s.\n",
1192 (unsigned int)gid, sid_string_static(psid) ));
1194 return psid;
1197 /****************************************************************************
1198 Convert a gid to SID - locally.
1199 ****************************************************************************/
1201 DOM_SID *local_gid_to_sid(DOM_SID *psid, gid_t gid)
1203 GROUP_MAP group;
1204 BOOL ret;
1206 /* we don't need to disable winbindd since the gid is stored in
1207 the GROUP_MAP object */
1209 /* done as root since ldap backend requires root to open a connection */
1211 become_root();
1212 ret = pdb_getgrgid( &group, gid );
1213 unbecome_root();
1215 if ( !ret ) {
1217 /* fallback to rid mapping if enabled */
1219 if ( lp_enable_rid_algorithm() ) {
1221 DEBUG(10,("local_gid_to_sid: Fall back to algorithmic mapping: %u -> %s\n",
1222 (unsigned int)gid, sid_string_static(psid)));
1224 return algorithmic_gid_to_sid(psid, gid);
1226 else
1227 return NULL;
1230 sid_copy( psid, &group.sid );
1232 DEBUG(10,("local_gid_to_sid: gid (%d) -> SID %s.\n",
1233 (unsigned int)gid, sid_string_static(psid)));
1235 return psid;
1238 /****************************************************************************
1239 Convert a SID to gid - locally.
1240 ****************************************************************************/
1242 BOOL local_sid_to_gid(gid_t *pgid, const DOM_SID *psid, enum SID_NAME_USE *name_type)
1244 uint32 rid;
1245 GROUP_MAP group;
1246 BOOL ret;
1248 *name_type = SID_NAME_UNKNOWN;
1250 /* This call can enumerate group mappings for foreign sids as well.
1251 So don't check for a match against our domain SID */
1253 /* we don't need to disable winbindd since the gid is stored in
1254 the GROUP_MAP object */
1256 become_root();
1257 ret = pdb_getgrsid(&group, *psid);
1258 unbecome_root();
1260 if ( !ret ) {
1262 /* fallback to rid mapping if enabled */
1264 if ( lp_enable_rid_algorithm() ) {
1266 if (!sid_check_is_in_our_domain(psid) ) {
1267 DEBUG(5,("local_sid_to_gid: RID algorithm only supported for our domain (%s is not)\n", sid_string_static(psid)));
1268 return False;
1271 if (!sid_peek_rid(psid, &rid)) {
1272 DEBUG(10,("local_sid_to_gid: invalid SID!\n"));
1273 return False;
1276 DEBUG(10,("local_sid_to_gid: Fall back to algorithmic mapping\n"));
1278 if (fallback_pdb_rid_is_user(rid)) {
1279 DEBUG(3, ("local_sid_to_gid: SID %s is *NOT* a group\n", sid_string_static(psid)));
1280 return False;
1281 } else {
1282 *pgid = pdb_group_rid_to_gid(rid);
1283 DEBUG(10,("local_sid_to_gid: mapping: %s -> %u\n", sid_string_static(psid), (unsigned int)(*pgid)));
1284 return True;
1288 return False;
1291 *pgid = group.gid;
1293 DEBUG(10,("local_sid_to_gid: SID %s -> gid (%u)\n", sid_string_static(psid),
1294 (unsigned int)*pgid));
1296 return True;
1299 /**********************************************************************
1300 Marshall/unmarshall SAM_ACCOUNT structs.
1301 *********************************************************************/
1303 #define TDB_FORMAT_STRING_V0 "ddddddBBBBBBBBBBBBddBBwdwdBwwd"
1304 #define TDB_FORMAT_STRING_V1 "dddddddBBBBBBBBBBBBddBBwdwdBwwd"
1306 /**********************************************************************
1307 Intialize a SAM_ACCOUNT struct from a BYTE buffer of size len
1308 *********************************************************************/
1310 BOOL init_sam_from_buffer(SAM_ACCOUNT *sampass, uint8 *buf, uint32 buflen)
1312 return(init_sam_from_buffer_v1(sampass, buf, buflen));
1315 /**********************************************************************
1316 Intialize a BYTE buffer from a SAM_ACCOUNT struct
1317 *********************************************************************/
1319 uint32 init_buffer_from_sam (uint8 **buf, const SAM_ACCOUNT *sampass, BOOL size_only)
1321 return(init_buffer_from_sam_v1(buf, sampass, size_only));
1325 BOOL init_sam_from_buffer_v0(SAM_ACCOUNT *sampass, uint8 *buf, uint32 buflen)
1328 /* times are stored as 32bit integer
1329 take care on system with 64bit wide time_t
1330 --SSS */
1331 uint32 logon_time,
1332 logoff_time,
1333 kickoff_time,
1334 pass_last_set_time,
1335 pass_can_change_time,
1336 pass_must_change_time;
1337 char *username;
1338 char *domain;
1339 char *nt_username;
1340 char *dir_drive;
1341 char *unknown_str;
1342 char *munged_dial;
1343 char *fullname;
1344 char *homedir;
1345 char *logon_script;
1346 char *profile_path;
1347 char *acct_desc;
1348 char *workstations;
1349 uint32 username_len, domain_len, nt_username_len,
1350 dir_drive_len, unknown_str_len, munged_dial_len,
1351 fullname_len, homedir_len, logon_script_len,
1352 profile_path_len, acct_desc_len, workstations_len;
1354 uint32 user_rid, group_rid, remove_me, hours_len, unknown_6;
1355 uint16 acct_ctrl, logon_divs;
1356 uint16 bad_password_count, logon_count;
1357 uint8 *hours;
1358 static uint8 *lm_pw_ptr, *nt_pw_ptr;
1359 uint32 len = 0;
1360 uint32 lm_pw_len, nt_pw_len, hourslen;
1361 BOOL ret = True;
1363 if(sampass == NULL || buf == NULL) {
1364 DEBUG(0, ("init_sam_from_buffer: NULL parameters found!\n"));
1365 return False;
1368 /* unpack the buffer into variables */
1369 len = tdb_unpack ((char *)buf, buflen, TDB_FORMAT_STRING_V0,
1370 &logon_time,
1371 &logoff_time,
1372 &kickoff_time,
1373 &pass_last_set_time,
1374 &pass_can_change_time,
1375 &pass_must_change_time,
1376 &username_len, &username,
1377 &domain_len, &domain,
1378 &nt_username_len, &nt_username,
1379 &fullname_len, &fullname,
1380 &homedir_len, &homedir,
1381 &dir_drive_len, &dir_drive,
1382 &logon_script_len, &logon_script,
1383 &profile_path_len, &profile_path,
1384 &acct_desc_len, &acct_desc,
1385 &workstations_len, &workstations,
1386 &unknown_str_len, &unknown_str,
1387 &munged_dial_len, &munged_dial,
1388 &user_rid,
1389 &group_rid,
1390 &lm_pw_len, &lm_pw_ptr,
1391 &nt_pw_len, &nt_pw_ptr,
1392 &acct_ctrl,
1393 &remove_me, /* remove on the next TDB_FORMAT upgarde */
1394 &logon_divs,
1395 &hours_len,
1396 &hourslen, &hours,
1397 &bad_password_count,
1398 &logon_count,
1399 &unknown_6);
1401 if (len == (uint32) -1) {
1402 ret = False;
1403 goto done;
1406 pdb_set_logon_time(sampass, logon_time, PDB_SET);
1407 pdb_set_logoff_time(sampass, logoff_time, PDB_SET);
1408 pdb_set_kickoff_time(sampass, kickoff_time, PDB_SET);
1409 pdb_set_pass_can_change_time(sampass, pass_can_change_time, PDB_SET);
1410 pdb_set_pass_must_change_time(sampass, pass_must_change_time, PDB_SET);
1411 pdb_set_pass_last_set_time(sampass, pass_last_set_time, PDB_SET);
1413 pdb_set_username(sampass, username, PDB_SET);
1414 pdb_set_domain(sampass, domain, PDB_SET);
1415 pdb_set_nt_username(sampass, nt_username, PDB_SET);
1416 pdb_set_fullname(sampass, fullname, PDB_SET);
1418 if (homedir) {
1419 pdb_set_homedir(sampass, homedir, PDB_SET);
1421 else {
1422 pdb_set_homedir(sampass,
1423 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_home()),
1424 PDB_DEFAULT);
1427 if (dir_drive)
1428 pdb_set_dir_drive(sampass, dir_drive, PDB_SET);
1429 else {
1430 pdb_set_dir_drive(sampass,
1431 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_drive()),
1432 PDB_DEFAULT);
1435 if (logon_script)
1436 pdb_set_logon_script(sampass, logon_script, PDB_SET);
1437 else {
1438 pdb_set_logon_script(sampass,
1439 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_script()),
1440 PDB_DEFAULT);
1443 if (profile_path) {
1444 pdb_set_profile_path(sampass, profile_path, PDB_SET);
1445 } else {
1446 pdb_set_profile_path(sampass,
1447 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_path()),
1448 PDB_DEFAULT);
1451 pdb_set_acct_desc(sampass, acct_desc, PDB_SET);
1452 pdb_set_workstations(sampass, workstations, PDB_SET);
1453 pdb_set_munged_dial(sampass, munged_dial, PDB_SET);
1455 if (lm_pw_ptr && lm_pw_len == LM_HASH_LEN) {
1456 if (!pdb_set_lanman_passwd(sampass, lm_pw_ptr, PDB_SET)) {
1457 ret = False;
1458 goto done;
1462 if (nt_pw_ptr && nt_pw_len == NT_HASH_LEN) {
1463 if (!pdb_set_nt_passwd(sampass, nt_pw_ptr, PDB_SET)) {
1464 ret = False;
1465 goto done;
1469 pdb_set_user_sid_from_rid(sampass, user_rid, PDB_SET);
1470 pdb_set_group_sid_from_rid(sampass, group_rid, PDB_SET);
1471 pdb_set_hours_len(sampass, hours_len, PDB_SET);
1472 pdb_set_bad_password_count(sampass, bad_password_count, PDB_SET);
1473 pdb_set_logon_count(sampass, logon_count, PDB_SET);
1474 pdb_set_unknown_6(sampass, unknown_6, PDB_SET);
1475 pdb_set_acct_ctrl(sampass, acct_ctrl, PDB_SET);
1476 pdb_set_logon_divs(sampass, logon_divs, PDB_SET);
1477 pdb_set_hours(sampass, hours, PDB_SET);
1479 done:
1481 SAFE_FREE(username);
1482 SAFE_FREE(domain);
1483 SAFE_FREE(nt_username);
1484 SAFE_FREE(fullname);
1485 SAFE_FREE(homedir);
1486 SAFE_FREE(dir_drive);
1487 SAFE_FREE(logon_script);
1488 SAFE_FREE(profile_path);
1489 SAFE_FREE(acct_desc);
1490 SAFE_FREE(workstations);
1491 SAFE_FREE(munged_dial);
1492 SAFE_FREE(unknown_str);
1493 SAFE_FREE(hours);
1495 return ret;
1499 uint32 init_buffer_from_sam_v0 (uint8 **buf, const SAM_ACCOUNT *sampass, BOOL size_only)
1501 size_t len, buflen;
1503 /* times are stored as 32bit integer
1504 take care on system with 64bit wide time_t
1505 --SSS */
1506 uint32 logon_time,
1507 logoff_time,
1508 kickoff_time,
1509 pass_last_set_time,
1510 pass_can_change_time,
1511 pass_must_change_time;
1513 uint32 user_rid, group_rid;
1515 const char *username;
1516 const char *domain;
1517 const char *nt_username;
1518 const char *dir_drive;
1519 const char *unknown_str;
1520 const char *munged_dial;
1521 const char *fullname;
1522 const char *homedir;
1523 const char *logon_script;
1524 const char *profile_path;
1525 const char *acct_desc;
1526 const char *workstations;
1527 uint32 username_len, domain_len, nt_username_len,
1528 dir_drive_len, unknown_str_len, munged_dial_len,
1529 fullname_len, homedir_len, logon_script_len,
1530 profile_path_len, acct_desc_len, workstations_len;
1532 const uint8 *lm_pw;
1533 const uint8 *nt_pw;
1534 uint32 lm_pw_len = 16;
1535 uint32 nt_pw_len = 16;
1537 /* do we have a valid SAM_ACCOUNT pointer? */
1538 if (sampass == NULL) {
1539 DEBUG(0, ("init_buffer_from_sam: SAM_ACCOUNT is NULL!\n"));
1540 return -1;
1543 *buf = NULL;
1544 buflen = 0;
1546 logon_time = (uint32)pdb_get_logon_time(sampass);
1547 logoff_time = (uint32)pdb_get_logoff_time(sampass);
1548 kickoff_time = (uint32)pdb_get_kickoff_time(sampass);
1549 pass_can_change_time = (uint32)pdb_get_pass_can_change_time(sampass);
1550 pass_must_change_time = (uint32)pdb_get_pass_must_change_time(sampass);
1551 pass_last_set_time = (uint32)pdb_get_pass_last_set_time(sampass);
1553 user_rid = pdb_get_user_rid(sampass);
1554 group_rid = pdb_get_group_rid(sampass);
1556 username = pdb_get_username(sampass);
1557 if (username)
1558 username_len = strlen(username) +1;
1559 else
1560 username_len = 0;
1562 domain = pdb_get_domain(sampass);
1563 if (domain)
1564 domain_len = strlen(domain) +1;
1565 else
1566 domain_len = 0;
1568 nt_username = pdb_get_nt_username(sampass);
1569 if (nt_username)
1570 nt_username_len = strlen(nt_username) +1;
1571 else
1572 nt_username_len = 0;
1574 fullname = pdb_get_fullname(sampass);
1575 if (fullname)
1576 fullname_len = strlen(fullname) +1;
1577 else
1578 fullname_len = 0;
1581 * Only updates fields which have been set (not defaults from smb.conf)
1584 if (!IS_SAM_DEFAULT(sampass, PDB_DRIVE))
1585 dir_drive = pdb_get_dir_drive(sampass);
1586 else
1587 dir_drive = NULL;
1588 if (dir_drive)
1589 dir_drive_len = strlen(dir_drive) +1;
1590 else
1591 dir_drive_len = 0;
1593 if (!IS_SAM_DEFAULT(sampass, PDB_SMBHOME))
1594 homedir = pdb_get_homedir(sampass);
1595 else
1596 homedir = NULL;
1597 if (homedir)
1598 homedir_len = strlen(homedir) +1;
1599 else
1600 homedir_len = 0;
1602 if (!IS_SAM_DEFAULT(sampass, PDB_LOGONSCRIPT))
1603 logon_script = pdb_get_logon_script(sampass);
1604 else
1605 logon_script = NULL;
1606 if (logon_script)
1607 logon_script_len = strlen(logon_script) +1;
1608 else
1609 logon_script_len = 0;
1611 if (!IS_SAM_DEFAULT(sampass, PDB_PROFILE))
1612 profile_path = pdb_get_profile_path(sampass);
1613 else
1614 profile_path = NULL;
1615 if (profile_path)
1616 profile_path_len = strlen(profile_path) +1;
1617 else
1618 profile_path_len = 0;
1620 lm_pw = pdb_get_lanman_passwd(sampass);
1621 if (!lm_pw)
1622 lm_pw_len = 0;
1624 nt_pw = pdb_get_nt_passwd(sampass);
1625 if (!nt_pw)
1626 nt_pw_len = 0;
1628 acct_desc = pdb_get_acct_desc(sampass);
1629 if (acct_desc)
1630 acct_desc_len = strlen(acct_desc) +1;
1631 else
1632 acct_desc_len = 0;
1634 workstations = pdb_get_workstations(sampass);
1635 if (workstations)
1636 workstations_len = strlen(workstations) +1;
1637 else
1638 workstations_len = 0;
1640 unknown_str = NULL;
1641 unknown_str_len = 0;
1643 munged_dial = pdb_get_munged_dial(sampass);
1644 if (munged_dial)
1645 munged_dial_len = strlen(munged_dial) +1;
1646 else
1647 munged_dial_len = 0;
1649 /* one time to get the size needed */
1650 len = tdb_pack(NULL, 0, TDB_FORMAT_STRING_V0,
1651 logon_time,
1652 logoff_time,
1653 kickoff_time,
1654 pass_last_set_time,
1655 pass_can_change_time,
1656 pass_must_change_time,
1657 username_len, username,
1658 domain_len, domain,
1659 nt_username_len, nt_username,
1660 fullname_len, fullname,
1661 homedir_len, homedir,
1662 dir_drive_len, dir_drive,
1663 logon_script_len, logon_script,
1664 profile_path_len, profile_path,
1665 acct_desc_len, acct_desc,
1666 workstations_len, workstations,
1667 unknown_str_len, unknown_str,
1668 munged_dial_len, munged_dial,
1669 user_rid,
1670 group_rid,
1671 lm_pw_len, lm_pw,
1672 nt_pw_len, nt_pw,
1673 pdb_get_acct_ctrl(sampass),
1674 0, /* was: fileds_present, to be removed on format change */
1675 pdb_get_logon_divs(sampass),
1676 pdb_get_hours_len(sampass),
1677 MAX_HOURS_LEN, pdb_get_hours(sampass),
1678 pdb_get_bad_password_count(sampass),
1679 pdb_get_logon_count(sampass),
1680 pdb_get_unknown_6(sampass));
1683 if (size_only)
1684 return buflen;
1686 /* malloc the space needed */
1687 if ( (*buf=(uint8*)malloc(len)) == NULL) {
1688 DEBUG(0,("init_buffer_from_sam: Unable to malloc() memory for buffer!\n"));
1689 return (-1);
1692 /* now for the real call to tdb_pack() */
1693 buflen = tdb_pack((char *)*buf, len, TDB_FORMAT_STRING_V0,
1694 logon_time,
1695 logoff_time,
1696 kickoff_time,
1697 pass_last_set_time,
1698 pass_can_change_time,
1699 pass_must_change_time,
1700 username_len, username,
1701 domain_len, domain,
1702 nt_username_len, nt_username,
1703 fullname_len, fullname,
1704 homedir_len, homedir,
1705 dir_drive_len, dir_drive,
1706 logon_script_len, logon_script,
1707 profile_path_len, profile_path,
1708 acct_desc_len, acct_desc,
1709 workstations_len, workstations,
1710 unknown_str_len, unknown_str,
1711 munged_dial_len, munged_dial,
1712 user_rid,
1713 group_rid,
1714 lm_pw_len, lm_pw,
1715 nt_pw_len, nt_pw,
1716 pdb_get_acct_ctrl(sampass),
1717 0, /* was: fileds_present, to be removed on format change */
1718 pdb_get_logon_divs(sampass),
1719 pdb_get_hours_len(sampass),
1720 MAX_HOURS_LEN, pdb_get_hours(sampass),
1721 pdb_get_bad_password_count(sampass),
1722 pdb_get_logon_count(sampass),
1723 pdb_get_unknown_6(sampass));
1726 /* check to make sure we got it correct */
1727 if (buflen != len) {
1728 DEBUG(0, ("init_buffer_from_sam: somthing odd is going on here: bufflen (%lu) != len (%lu) in tdb_pack operations!\n",
1729 (unsigned long)buflen, (unsigned long)len));
1730 /* error */
1731 SAFE_FREE (*buf);
1732 return (-1);
1735 return (buflen);
1739 BOOL init_sam_from_buffer_v1(SAM_ACCOUNT *sampass, uint8 *buf, uint32 buflen)
1742 /* times are stored as 32bit integer
1743 take care on system with 64bit wide time_t
1744 --SSS */
1745 uint32 logon_time,
1746 logoff_time,
1747 kickoff_time,
1748 bad_password_time,
1749 pass_last_set_time,
1750 pass_can_change_time,
1751 pass_must_change_time;
1752 char *username;
1753 char *domain;
1754 char *nt_username;
1755 char *dir_drive;
1756 char *unknown_str;
1757 char *munged_dial;
1758 char *fullname;
1759 char *homedir;
1760 char *logon_script;
1761 char *profile_path;
1762 char *acct_desc;
1763 char *workstations;
1764 uint32 username_len, domain_len, nt_username_len,
1765 dir_drive_len, unknown_str_len, munged_dial_len,
1766 fullname_len, homedir_len, logon_script_len,
1767 profile_path_len, acct_desc_len, workstations_len;
1769 uint32 user_rid, group_rid, remove_me, hours_len, unknown_6;
1770 uint16 acct_ctrl, logon_divs;
1771 uint16 bad_password_count, logon_count;
1772 uint8 *hours;
1773 static uint8 *lm_pw_ptr, *nt_pw_ptr;
1774 uint32 len = 0;
1775 uint32 lm_pw_len, nt_pw_len, hourslen;
1776 BOOL ret = True;
1778 if(sampass == NULL || buf == NULL) {
1779 DEBUG(0, ("init_sam_from_buffer: NULL parameters found!\n"));
1780 return False;
1783 /* unpack the buffer into variables */
1784 len = tdb_unpack ((char *)buf, buflen, TDB_FORMAT_STRING_V1,
1785 &logon_time,
1786 &logoff_time,
1787 &kickoff_time,
1788 &bad_password_time,
1789 &pass_last_set_time,
1790 &pass_can_change_time,
1791 &pass_must_change_time,
1792 &username_len, &username,
1793 &domain_len, &domain,
1794 &nt_username_len, &nt_username,
1795 &fullname_len, &fullname,
1796 &homedir_len, &homedir,
1797 &dir_drive_len, &dir_drive,
1798 &logon_script_len, &logon_script,
1799 &profile_path_len, &profile_path,
1800 &acct_desc_len, &acct_desc,
1801 &workstations_len, &workstations,
1802 &unknown_str_len, &unknown_str,
1803 &munged_dial_len, &munged_dial,
1804 &user_rid,
1805 &group_rid,
1806 &lm_pw_len, &lm_pw_ptr,
1807 &nt_pw_len, &nt_pw_ptr,
1808 &acct_ctrl,
1809 &remove_me,
1810 &logon_divs,
1811 &hours_len,
1812 &hourslen, &hours,
1813 &bad_password_count,
1814 &logon_count,
1815 &unknown_6);
1817 if (len == (uint32) -1) {
1818 ret = False;
1819 goto done;
1822 pdb_set_logon_time(sampass, logon_time, PDB_SET);
1823 pdb_set_logoff_time(sampass, logoff_time, PDB_SET);
1824 pdb_set_kickoff_time(sampass, kickoff_time, PDB_SET);
1825 pdb_set_bad_password_time(sampass, bad_password_time, PDB_SET);
1826 pdb_set_pass_can_change_time(sampass, pass_can_change_time, PDB_SET);
1827 pdb_set_pass_must_change_time(sampass, pass_must_change_time, PDB_SET);
1828 pdb_set_pass_last_set_time(sampass, pass_last_set_time, PDB_SET);
1830 pdb_set_username(sampass, username, PDB_SET);
1831 pdb_set_domain(sampass, domain, PDB_SET);
1832 pdb_set_nt_username(sampass, nt_username, PDB_SET);
1833 pdb_set_fullname(sampass, fullname, PDB_SET);
1835 if (homedir) {
1836 pdb_set_homedir(sampass, homedir, PDB_SET);
1838 else {
1839 pdb_set_homedir(sampass,
1840 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_home()),
1841 PDB_DEFAULT);
1844 if (dir_drive)
1845 pdb_set_dir_drive(sampass, dir_drive, PDB_SET);
1846 else {
1847 pdb_set_dir_drive(sampass,
1848 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_drive()),
1849 PDB_DEFAULT);
1852 if (logon_script)
1853 pdb_set_logon_script(sampass, logon_script, PDB_SET);
1854 else {
1855 pdb_set_logon_script(sampass,
1856 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_script()),
1857 PDB_DEFAULT);
1860 if (profile_path) {
1861 pdb_set_profile_path(sampass, profile_path, PDB_SET);
1862 } else {
1863 pdb_set_profile_path(sampass,
1864 talloc_sub_basic(sampass->mem_ctx, username, lp_logon_path()),
1865 PDB_DEFAULT);
1868 pdb_set_acct_desc(sampass, acct_desc, PDB_SET);
1869 pdb_set_workstations(sampass, workstations, PDB_SET);
1870 pdb_set_munged_dial(sampass, munged_dial, PDB_SET);
1872 if (lm_pw_ptr && lm_pw_len == LM_HASH_LEN) {
1873 if (!pdb_set_lanman_passwd(sampass, lm_pw_ptr, PDB_SET)) {
1874 ret = False;
1875 goto done;
1879 if (nt_pw_ptr && nt_pw_len == NT_HASH_LEN) {
1880 if (!pdb_set_nt_passwd(sampass, nt_pw_ptr, PDB_SET)) {
1881 ret = False;
1882 goto done;
1886 pdb_set_user_sid_from_rid(sampass, user_rid, PDB_SET);
1887 pdb_set_group_sid_from_rid(sampass, group_rid, PDB_SET);
1888 pdb_set_hours_len(sampass, hours_len, PDB_SET);
1889 pdb_set_bad_password_count(sampass, bad_password_count, PDB_SET);
1890 pdb_set_logon_count(sampass, logon_count, PDB_SET);
1891 pdb_set_unknown_6(sampass, unknown_6, PDB_SET);
1892 pdb_set_acct_ctrl(sampass, acct_ctrl, PDB_SET);
1893 pdb_set_logon_divs(sampass, logon_divs, PDB_SET);
1894 pdb_set_hours(sampass, hours, PDB_SET);
1896 done:
1898 SAFE_FREE(username);
1899 SAFE_FREE(domain);
1900 SAFE_FREE(nt_username);
1901 SAFE_FREE(fullname);
1902 SAFE_FREE(homedir);
1903 SAFE_FREE(dir_drive);
1904 SAFE_FREE(logon_script);
1905 SAFE_FREE(profile_path);
1906 SAFE_FREE(acct_desc);
1907 SAFE_FREE(workstations);
1908 SAFE_FREE(munged_dial);
1909 SAFE_FREE(unknown_str);
1910 SAFE_FREE(hours);
1912 return ret;
1916 uint32 init_buffer_from_sam_v1 (uint8 **buf, const SAM_ACCOUNT *sampass, BOOL size_only)
1918 size_t len, buflen;
1920 /* times are stored as 32bit integer
1921 take care on system with 64bit wide time_t
1922 --SSS */
1923 uint32 logon_time,
1924 logoff_time,
1925 kickoff_time,
1926 bad_password_time,
1927 pass_last_set_time,
1928 pass_can_change_time,
1929 pass_must_change_time;
1931 uint32 user_rid, group_rid;
1933 const char *username;
1934 const char *domain;
1935 const char *nt_username;
1936 const char *dir_drive;
1937 const char *unknown_str;
1938 const char *munged_dial;
1939 const char *fullname;
1940 const char *homedir;
1941 const char *logon_script;
1942 const char *profile_path;
1943 const char *acct_desc;
1944 const char *workstations;
1945 uint32 username_len, domain_len, nt_username_len,
1946 dir_drive_len, unknown_str_len, munged_dial_len,
1947 fullname_len, homedir_len, logon_script_len,
1948 profile_path_len, acct_desc_len, workstations_len;
1950 const uint8 *lm_pw;
1951 const uint8 *nt_pw;
1952 uint32 lm_pw_len = 16;
1953 uint32 nt_pw_len = 16;
1955 /* do we have a valid SAM_ACCOUNT pointer? */
1956 if (sampass == NULL) {
1957 DEBUG(0, ("init_buffer_from_sam: SAM_ACCOUNT is NULL!\n"));
1958 return -1;
1961 *buf = NULL;
1962 buflen = 0;
1964 logon_time = (uint32)pdb_get_logon_time(sampass);
1965 logoff_time = (uint32)pdb_get_logoff_time(sampass);
1966 kickoff_time = (uint32)pdb_get_kickoff_time(sampass);
1967 bad_password_time = (uint32)pdb_get_bad_password_time(sampass);
1968 pass_can_change_time = (uint32)pdb_get_pass_can_change_time(sampass);
1969 pass_must_change_time = (uint32)pdb_get_pass_must_change_time(sampass);
1970 pass_last_set_time = (uint32)pdb_get_pass_last_set_time(sampass);
1972 user_rid = pdb_get_user_rid(sampass);
1973 group_rid = pdb_get_group_rid(sampass);
1975 username = pdb_get_username(sampass);
1976 if (username)
1977 username_len = strlen(username) +1;
1978 else
1979 username_len = 0;
1981 domain = pdb_get_domain(sampass);
1982 if (domain)
1983 domain_len = strlen(domain) +1;
1984 else
1985 domain_len = 0;
1987 nt_username = pdb_get_nt_username(sampass);
1988 if (nt_username)
1989 nt_username_len = strlen(nt_username) +1;
1990 else
1991 nt_username_len = 0;
1993 fullname = pdb_get_fullname(sampass);
1994 if (fullname)
1995 fullname_len = strlen(fullname) +1;
1996 else
1997 fullname_len = 0;
2000 * Only updates fields which have been set (not defaults from smb.conf)
2003 if (!IS_SAM_DEFAULT(sampass, PDB_DRIVE))
2004 dir_drive = pdb_get_dir_drive(sampass);
2005 else
2006 dir_drive = NULL;
2007 if (dir_drive)
2008 dir_drive_len = strlen(dir_drive) +1;
2009 else
2010 dir_drive_len = 0;
2012 if (!IS_SAM_DEFAULT(sampass, PDB_SMBHOME))
2013 homedir = pdb_get_homedir(sampass);
2014 else
2015 homedir = NULL;
2016 if (homedir)
2017 homedir_len = strlen(homedir) +1;
2018 else
2019 homedir_len = 0;
2021 if (!IS_SAM_DEFAULT(sampass, PDB_LOGONSCRIPT))
2022 logon_script = pdb_get_logon_script(sampass);
2023 else
2024 logon_script = NULL;
2025 if (logon_script)
2026 logon_script_len = strlen(logon_script) +1;
2027 else
2028 logon_script_len = 0;
2030 if (!IS_SAM_DEFAULT(sampass, PDB_PROFILE))
2031 profile_path = pdb_get_profile_path(sampass);
2032 else
2033 profile_path = NULL;
2034 if (profile_path)
2035 profile_path_len = strlen(profile_path) +1;
2036 else
2037 profile_path_len = 0;
2039 lm_pw = pdb_get_lanman_passwd(sampass);
2040 if (!lm_pw)
2041 lm_pw_len = 0;
2043 nt_pw = pdb_get_nt_passwd(sampass);
2044 if (!nt_pw)
2045 nt_pw_len = 0;
2047 acct_desc = pdb_get_acct_desc(sampass);
2048 if (acct_desc)
2049 acct_desc_len = strlen(acct_desc) +1;
2050 else
2051 acct_desc_len = 0;
2053 workstations = pdb_get_workstations(sampass);
2054 if (workstations)
2055 workstations_len = strlen(workstations) +1;
2056 else
2057 workstations_len = 0;
2059 unknown_str = NULL;
2060 unknown_str_len = 0;
2062 munged_dial = pdb_get_munged_dial(sampass);
2063 if (munged_dial)
2064 munged_dial_len = strlen(munged_dial) +1;
2065 else
2066 munged_dial_len = 0;
2068 /* one time to get the size needed */
2069 len = tdb_pack(NULL, 0, TDB_FORMAT_STRING_V1,
2070 logon_time,
2071 logoff_time,
2072 kickoff_time,
2073 bad_password_time,
2074 pass_last_set_time,
2075 pass_can_change_time,
2076 pass_must_change_time,
2077 username_len, username,
2078 domain_len, domain,
2079 nt_username_len, nt_username,
2080 fullname_len, fullname,
2081 homedir_len, homedir,
2082 dir_drive_len, dir_drive,
2083 logon_script_len, logon_script,
2084 profile_path_len, profile_path,
2085 acct_desc_len, acct_desc,
2086 workstations_len, workstations,
2087 unknown_str_len, unknown_str,
2088 munged_dial_len, munged_dial,
2089 user_rid,
2090 group_rid,
2091 lm_pw_len, lm_pw,
2092 nt_pw_len, nt_pw,
2093 pdb_get_acct_ctrl(sampass),
2095 pdb_get_logon_divs(sampass),
2096 pdb_get_hours_len(sampass),
2097 MAX_HOURS_LEN, pdb_get_hours(sampass),
2098 pdb_get_bad_password_count(sampass),
2099 pdb_get_logon_count(sampass),
2100 pdb_get_unknown_6(sampass));
2103 if (size_only)
2104 return buflen;
2106 /* malloc the space needed */
2107 if ( (*buf=(uint8*)malloc(len)) == NULL) {
2108 DEBUG(0,("init_buffer_from_sam: Unable to malloc() memory for buffer!\n"));
2109 return (-1);
2112 /* now for the real call to tdb_pack() */
2113 buflen = tdb_pack((char *)*buf, len, TDB_FORMAT_STRING_V1,
2114 logon_time,
2115 logoff_time,
2116 kickoff_time,
2117 bad_password_time,
2118 pass_last_set_time,
2119 pass_can_change_time,
2120 pass_must_change_time,
2121 username_len, username,
2122 domain_len, domain,
2123 nt_username_len, nt_username,
2124 fullname_len, fullname,
2125 homedir_len, homedir,
2126 dir_drive_len, dir_drive,
2127 logon_script_len, logon_script,
2128 profile_path_len, profile_path,
2129 acct_desc_len, acct_desc,
2130 workstations_len, workstations,
2131 unknown_str_len, unknown_str,
2132 munged_dial_len, munged_dial,
2133 user_rid,
2134 group_rid,
2135 lm_pw_len, lm_pw,
2136 nt_pw_len, nt_pw,
2137 pdb_get_acct_ctrl(sampass),
2139 pdb_get_logon_divs(sampass),
2140 pdb_get_hours_len(sampass),
2141 MAX_HOURS_LEN, pdb_get_hours(sampass),
2142 pdb_get_bad_password_count(sampass),
2143 pdb_get_logon_count(sampass),
2144 pdb_get_unknown_6(sampass));
2147 /* check to make sure we got it correct */
2148 if (buflen != len) {
2149 DEBUG(0, ("init_buffer_from_sam: somthing odd is going on here: bufflen (%lu) != len (%lu) in tdb_pack operations!\n",
2150 (unsigned long)buflen, (unsigned long)len));
2151 /* error */
2152 SAFE_FREE (*buf);
2153 return (-1);
2156 return (buflen);
2160 /**********************************************************************
2161 **********************************************************************/
2163 static BOOL get_free_ugid_range(uint32 *low, uint32 *high)
2165 uid_t u_low, u_high;
2166 gid_t g_low, g_high;
2168 if (!lp_idmap_uid(&u_low, &u_high) || !lp_idmap_gid(&g_low, &g_high)) {
2169 return False;
2172 *low = (u_low < g_low) ? u_low : g_low;
2173 *high = (u_high < g_high) ? u_high : g_high;
2175 return True;
2178 /******************************************************************
2179 Get the the non-algorithmic RID range if idmap range are defined
2180 ******************************************************************/
2182 BOOL get_free_rid_range(uint32 *low, uint32 *high)
2184 uint32 id_low, id_high;
2186 if (!lp_enable_rid_algorithm()) {
2187 *low = BASE_RID;
2188 *high = (uint32)-1;
2191 if (!get_free_ugid_range(&id_low, &id_high)) {
2192 return False;
2195 *low = fallback_pdb_uid_to_user_rid(id_low);
2196 if (fallback_pdb_user_rid_to_uid((uint32)-1) < id_high) {
2197 *high = (uint32)-1;
2198 } else {
2199 *high = fallback_pdb_uid_to_user_rid(id_high);
2202 return True;
2205 /*********************************************************************
2206 Update the bad password count checking the AP_RESET_COUNT_TIME
2207 *********************************************************************/
2209 BOOL pdb_update_bad_password_count(SAM_ACCOUNT *sampass, BOOL *updated)
2211 time_t LastBadPassword;
2212 uint16 BadPasswordCount;
2213 uint32 resettime;
2215 if (!sampass) return False;
2217 BadPasswordCount = pdb_get_bad_password_count(sampass);
2218 if (!BadPasswordCount) {
2219 DEBUG(9, ("No bad password attempts.\n"));
2220 return True;
2223 if (!account_policy_get(AP_RESET_COUNT_TIME, &resettime)) {
2224 DEBUG(0, ("pdb_update_bad_password_count: account_policy_get failed.\n"));
2225 return False;
2228 /* First, check if there is a reset time to compare */
2229 if ((resettime == (uint32) -1) || (resettime == 0)) {
2230 DEBUG(9, ("No reset time, can't reset bad pw count\n"));
2231 return True;
2234 LastBadPassword = pdb_get_bad_password_time(sampass);
2235 DEBUG(7, ("LastBadPassword=%d, resettime=%d, current time=%d.\n",
2236 (uint32) LastBadPassword, resettime, (uint32)time(NULL)));
2237 if (time(NULL) > (LastBadPassword + (time_t)resettime*60)){
2238 pdb_set_bad_password_count(sampass, 0, PDB_CHANGED);
2239 pdb_set_bad_password_time(sampass, 0, PDB_CHANGED);
2240 if (updated) *updated = True;
2243 return True;
2246 /*********************************************************************
2247 Update the ACB_AUTOLOCK flag checking the AP_LOCK_ACCOUNT_DURATION
2248 *********************************************************************/
2250 BOOL pdb_update_autolock_flag(SAM_ACCOUNT *sampass, BOOL *updated)
2252 uint32 duration;
2253 time_t LastBadPassword;
2255 if (!sampass) return False;
2257 if (!(pdb_get_acct_ctrl(sampass) & ACB_AUTOLOCK)) {
2258 DEBUG(9, ("Account not autolocked, no check needed\n"));
2259 return True;
2262 if (!account_policy_get(AP_LOCK_ACCOUNT_DURATION, &duration)) {
2263 DEBUG(0, ("pdb_update_autolock_flag: account_policy_get failed.\n"));
2264 return False;
2267 /* First, check if there is a duration to compare */
2268 if ((duration == (uint32) -1) || (duration == 0)) {
2269 DEBUG(9, ("No reset duration, can't reset autolock\n"));
2270 return True;
2273 LastBadPassword = pdb_get_bad_password_time(sampass);
2274 DEBUG(7, ("LastBadPassword=%d, duration=%d, current time =%d.\n",
2275 (uint32)LastBadPassword, duration*60, (uint32)time(NULL)));
2276 if ((time(NULL) > (LastBadPassword + (time_t) duration * 60))) {
2277 pdb_set_acct_ctrl(sampass,
2278 pdb_get_acct_ctrl(sampass) & ~ACB_AUTOLOCK,
2279 PDB_CHANGED);
2280 pdb_set_bad_password_count(sampass, 0, PDB_CHANGED);
2281 pdb_set_bad_password_time(sampass, 0, PDB_CHANGED);
2282 if (updated) *updated = True;
2285 return True;
2288 /*********************************************************************
2289 Increment the bad_password_count
2290 *********************************************************************/
2292 BOOL pdb_increment_bad_password_count(SAM_ACCOUNT *sampass)
2294 uint32 account_policy_lockout;
2295 BOOL autolock_updated = False, badpw_updated = False;
2297 if (!sampass)
2298 return False;
2300 /* Retrieve the account lockout policy */
2301 if (!account_policy_get(AP_BAD_ATTEMPT_LOCKOUT,
2302 &account_policy_lockout)) {
2303 DEBUG(0, ("pdb_increment_bad_password_count: account_policy_get failed.\n"));
2304 return False;
2307 /* If there is no policy, we don't need to continue checking */
2308 if (!account_policy_lockout) {
2309 DEBUG(9, ("No lockout policy, don't track bad passwords\n"));
2310 return True;
2313 /* Check if the autolock needs to be cleared */
2314 if (!pdb_update_autolock_flag(sampass, &autolock_updated))
2315 return False;
2317 /* Check if the badpw count needs to be reset */
2318 if (!pdb_update_bad_password_count(sampass, &badpw_updated))
2319 return False;
2322 Ok, now we can assume that any resetting that needs to be
2323 done has been done, and just get on with incrementing
2324 and autolocking if necessary
2327 pdb_set_bad_password_count(sampass,
2328 pdb_get_bad_password_count(sampass)+1,
2329 PDB_CHANGED);
2330 pdb_set_bad_password_time(sampass, time(NULL), PDB_CHANGED);
2333 if (pdb_get_bad_password_count(sampass) < account_policy_lockout)
2334 return True;
2336 if (!pdb_set_acct_ctrl(sampass,
2337 pdb_get_acct_ctrl(sampass) | ACB_AUTOLOCK,
2338 PDB_CHANGED)) {
2339 DEBUG(1, ("pdb_increment_bad_password_count:failed to set 'autolock' flag. \n"));
2340 return False;
2343 return True;