2 * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup
3 * Copyright (C) Andrew Tridgell 1992-1998
4 * Copyright (C) Simo Sorce 2000
6 * This program is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc., 675
18 * Mass Ave, Cambridge, MA 02139, USA.
25 #define lp_tdb_passwd_file lp_smb_passwd_file
26 #define tdb_writelock(ptr)
27 #define tdb_writeunlock(ptr)
29 extern int DEBUGLEVEL
;
30 extern pstring samlogon_user
;
31 extern BOOL sam_logon_in_ssb
;
35 time_t logon_time
; /* logon time */
36 time_t logoff_time
; /* logoff time */
37 time_t kickoff_time
; /* kickoff time */
38 time_t pass_last_set_time
; /* password last set time */
39 time_t pass_can_change_time
; /* password can change time */
40 time_t pass_must_change_time
; /* password must change time */
42 uid_t smb_userid
; /* this is actually the unix uid_t */
43 gid_t smb_grpid
; /* this is actually the unix gid_t */
44 uint32 user_rid
; /* Primary User ID */
45 uint32 group_rid
; /* Primary Group ID */
47 char smb_passwd
[33]; /* Null if no password */
48 char smb_nt_passwd
[33]; /* Null if no password */
50 uint16 acct_ctrl
; /* account info (ACB_xxxx bit-mask) */
51 uint32 unknown_3
; /* 0x00ff ffff */
53 uint16 logon_divs
; /* 168 - number of hours in a week */
54 uint32 hours_len
; /* normally 21 bytes */
55 uint8 hours
[MAX_HOURS_LEN
];
57 uint32 unknown_5
; /* 0x0002 0000 */
58 uint32 unknown_6
; /* 0x0000 04ec */
60 /* relative pointers to dynamically allocated strings[] */
61 int smb_name_offset
; /* username string */
62 int full_name_offset
; /* user's full name string */
63 int home_dir_offset
; /* home directory string */
64 int dir_drive_offset
; /* home directory drive string */
65 int logon_script_offset
; /* logon script string */
66 int profile_path_offset
; /* profile path string */
67 int acct_desc_offset
; /* user description string */
68 int workstations_offset
; /* login from workstations string */
69 int unknown_str_offset
; /* don't know what this is, yet. */
70 int munged_dial_offset
; /* munged path name and dial-back tel number */
72 /* how to correctly declare this ?*/
78 TDB_CONTEXT
*passwd_tdb
;
82 static struct tdb_enum_info tdb_ent
;
84 /***************************************************************
85 Start to enumerate the TDB passwd list. Returns a void pointer
86 to ensure no modification outside this module.
87 ****************************************************************/
89 static void *startsamtdbpwent(BOOL update
)
92 if (!(tdb_ent
.passwd_tdb
= tdb_open(lp_tdb_passwd_file(), 0, 0, update
? O_RDWR
: O_RDONLY
, 0600)))
94 DEBUG(0, ("Unable to open TDB passwd, trying create new!\n"));
95 if (!(tdb_ent
.passwd_tdb
= tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDWR
| O_CREAT
| O_EXCL
, 0600)))
97 DEBUG(0, ("Unable to creat TDB passwd (smbpasswd.tdb) !!!"));
102 tdb_ent
.key
= tdb_firstkey(tdb_ent
.passwd_tdb
);
106 /***************************************************************
107 End enumeration of the TDB passwd list.
108 ****************************************************************/
110 static void endsamtdbpwent(void *vp
)
112 struct tdb_enum_info
*p_ent
= (struct tdb_enum_info
*)vp
;
114 tdb_close(p_ent
->passwd_tdb
);
115 DEBUG(7, ("endtdbpwent: closed password file.\n"));
118 static struct sam_passwd
*getsamtdb21pwent(void *vp
)
120 static struct sam_passwd sam_entry
;
121 static struct tdb_sam_entry
*tdb_entry
;
122 struct tdb_enum_info
*p_ent
= (struct tdb_enum_info
*)vp
;
126 DEBUG(0,("gettdbpwent: Bad TDB Context pointer.\n"));
130 data
= tdb_fetch (p_ent
->passwd_tdb
, p_ent
->key
);
133 DEBUG(5,("gettdbpwent: database entry not found.\n"));
137 tdb_entry
= (struct tdb_sam_entry
*)(data
.dptr
);
139 sam_entry
.logon_time
= tdb_entry
->logon_time
;
140 sam_entry
.logoff_time
= tdb_entry
->logoff_time
;
141 sam_entry
.kickoff_time
= tdb_entry
->kickoff_time
;
142 sam_entry
.pass_last_set_time
= tdb_entry
->pass_last_set_time
;
143 sam_entry
.pass_can_change_time
= tdb_entry
->pass_can_change_time
;
144 sam_entry
.pass_must_change_time
= tdb_entry
->pass_must_change_time
;
145 sam_entry
.smb_name
= tdb_entry
->strings
+ tdb_entry
->smb_name_offset
;
146 sam_entry
.full_name
= tdb_entry
->strings
+ tdb_entry
->full_name_offset
;
147 sam_entry
.home_dir
= tdb_entry
->strings
+ tdb_entry
->home_dir_offset
;
148 sam_entry
.dir_drive
= tdb_entry
->strings
+ tdb_entry
->dir_drive_offset
;
149 sam_entry
.logon_script
= tdb_entry
->strings
+ tdb_entry
->logon_script_offset
;
150 sam_entry
.profile_path
= tdb_entry
->strings
+ tdb_entry
->profile_path_offset
;
151 sam_entry
.acct_desc
= tdb_entry
->strings
+ tdb_entry
->acct_desc_offset
;
152 sam_entry
.workstations
= tdb_entry
->strings
+ tdb_entry
->workstations_offset
;
153 sam_entry
.unknown_str
= tdb_entry
->strings
+ tdb_entry
->unknown_str_offset
;
154 sam_entry
.munged_dial
= tdb_entry
->strings
+ tdb_entry
->munged_dial_offset
;
155 sam_entry
.smb_userid
= tdb_entry
->smb_userid
;
156 sam_entry
.smb_grpid
= tdb_entry
->smb_grpid
;
157 sam_entry
.user_rid
= tdb_entry
->user_rid
;
158 sam_entry
.group_rid
= tdb_entry
->group_rid
;
159 sam_entry
.smb_passwd
= tdb_entry
->smb_passwd
;
160 sam_entry
.smb_nt_passwd
= tdb_entry
->smb_nt_passwd
;
161 sam_entry
.acct_ctrl
= tdb_entry
->acct_ctrl
;
162 sam_entry
.unknown_3
= tdb_entry
->unknown_3
;
163 sam_entry
.logon_divs
= tdb_entry
->logon_divs
;
164 sam_entry
.hours_len
= tdb_entry
->hours_len
;
165 memcpy (sam_entry
.hours
, tdb_entry
->hours
, MAX_HOURS_LEN
);
166 sam_entry
.unknown_5
= tdb_entry
->unknown_5
;
167 sam_entry
.unknown_6
= tdb_entry
->unknown_6
;
169 p_ent
->key
= tdb_nextkey (p_ent
->passwd_tdb
, p_ent
->key
);
174 static BOOL
del_samtdbpwd_entry(const char *name
)
176 TDB_CONTEXT
*pwd_tdb
;
180 if (!(pwd_tdb
= tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDWR
, 0600)))
182 DEBUG(0, ("Unable to open TDB passwd!"));
186 slprintf(keystr
, sizeof(keystr
), "USER_%s", name
);
188 key
.dsize
= strlen (keystr
) + 1;
189 if (tdb_delete(pwd_tdb
, key
) != TDB_SUCCESS
)
191 DEBUG(5, ("Error deleting entry from tdb database!\n"));
192 DEBUGADD(5, (" Error: %s\n", tdb_error(pwd_tdb
)));
200 static BOOL
mod_samtdb21pwd_entry(struct sam_passwd
* newpwd
, BOOL override
)
202 TDB_CONTEXT
*pwd_tdb
;
205 struct tdb_sam_entry
*tdb_entry
;
208 int smb_name_len
= (newpwd
->smb_name
) ? (strlen (newpwd
->smb_name
) + 1) : 0;
209 int full_name_len
= (newpwd
->full_name
) ? (strlen (newpwd
->full_name
) + 1) : 0;
210 int home_dir_len
= (newpwd
->home_dir
) ? (strlen (newpwd
->home_dir
) + 1) : 0;
211 int dir_drive_len
= (newpwd
->dir_drive
) ? (strlen (newpwd
->dir_drive
) + 1) : 0;
212 int logon_script_len
= (newpwd
->logon_script
) ? (strlen (newpwd
->logon_script
) + 1) : 0;
213 int profile_path_len
= (newpwd
->profile_path
) ? (strlen (newpwd
->profile_path
) + 1) : 0;
214 int acct_desc_len
= (newpwd
->acct_desc
) ? (strlen (newpwd
->acct_desc
) + 1) : 0;
215 int workstations_len
= (newpwd
->workstations
) ? (strlen (newpwd
->workstations
) + 1) : 0;
216 int unknown_str_len
= (newpwd
->unknown_str
) ? (strlen (newpwd
->unknown_str
) + 1) : 0;
217 int munged_dial_len
= (newpwd
->munged_dial
) ? (strlen (newpwd
->munged_dial
) + 1) : 0;
219 if (!(pwd_tdb
= tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDWR
, 0600)))
221 DEBUG(0, ("Unable to open TDB passwd!"));
225 data
.dsize
= sizeof (struct tdb_sam_entry
) +
237 tdb_entry
= malloc (data
.dsize
);
238 data
.dptr
= tdb_entry
;
239 memset (data
.dptr
, 0, data
.dsize
);
241 tdb_entry
->logon_time
= newpwd
->logon_time
;
242 tdb_entry
->logoff_time
= newpwd
->logoff_time
;
243 tdb_entry
->kickoff_time
= newpwd
->kickoff_time
;
244 tdb_entry
->pass_last_set_time
= newpwd
->pass_last_set_time
;
245 tdb_entry
->pass_can_change_time
= newpwd
->pass_can_change_time
;
246 tdb_entry
->pass_must_change_time
= newpwd
->pass_must_change_time
;
247 tdb_entry
->smb_userid
= newpwd
->smb_userid
;
248 tdb_entry
->smb_grpid
= newpwd
->smb_grpid
;
249 tdb_entry
->user_rid
= newpwd
->user_rid
;
250 tdb_entry
->group_rid
= newpwd
->group_rid
;
251 memcpy (tdb_entry
->smb_passwd
, newpwd
->smb_passwd
, strlen (newpwd
->smb_passwd
) + 1);
252 memcpy (tdb_entry
->smb_nt_passwd
, newpwd
->smb_nt_passwd
, strlen (newpwd
->smb_nt_passwd
) + 1);
253 tdb_entry
->acct_ctrl
= newpwd
->acct_ctrl
;
254 tdb_entry
->unknown_3
= newpwd
->unknown_3
;
255 tdb_entry
->logon_divs
= newpwd
->logon_divs
;
256 tdb_entry
->hours_len
= newpwd
->hours_len
;
257 memcpy (tdb_entry
->hours
, newpwd
->hours
, MAX_HOURS_LEN
);
258 tdb_entry
->unknown_5
= newpwd
->unknown_5
;
259 tdb_entry
->unknown_6
= newpwd
->unknown_6
;
260 tdb_entry
->smb_name_offset
= 0;
261 tdb_entry
->full_name_offset
= smb_name_len
;
262 tdb_entry
->home_dir_offset
= tdb_entry
->full_name_offset
+ full_name_len
;
263 tdb_entry
->dir_drive_offset
= tdb_entry
->home_dir_offset
+ home_dir_len
;
264 tdb_entry
->logon_script_offset
= tdb_entry
->dir_drive_offset
+ dir_drive_len
;
265 tdb_entry
->profile_path_offset
= tdb_entry
->logon_script_offset
+ logon_script_len
;
266 tdb_entry
->acct_desc_offset
= tdb_entry
->profile_path_offset
+ profile_path_len
;
267 tdb_entry
->workstations_offset
= tdb_entry
->acct_desc_offset
+ acct_desc_len
;
268 tdb_entry
->unknown_str_offset
= tdb_entry
->workstations_offset
+ workstations_len
;
269 tdb_entry
->munged_dial_offset
= tdb_entry
->unknown_str_offset
+ unknown_str_len
;
270 if (newpwd
->smb_name
)
271 memcpy (tdb_entry
->strings
+ tdb_entry
->smb_name_offset
, newpwd
->smb_name
, smb_name_len
);
272 if (newpwd
->full_name
)
273 memcpy (tdb_entry
->strings
+ tdb_entry
->full_name_offset
, newpwd
->full_name
, full_name_len
);
274 if (newpwd
->home_dir
)
275 memcpy (tdb_entry
->strings
+ tdb_entry
->home_dir_offset
, newpwd
->home_dir
, home_dir_len
);
276 if (newpwd
->dir_drive
)
277 memcpy (tdb_entry
->strings
+ tdb_entry
->dir_drive_offset
, newpwd
->dir_drive
, dir_drive_len
);
278 if (newpwd
->logon_script
)
279 memcpy (tdb_entry
->strings
+ tdb_entry
->logon_script_offset
, newpwd
->logon_script
, logon_script_len
);
280 if (newpwd
->profile_path
)
281 memcpy (tdb_entry
->strings
+ tdb_entry
->profile_path_offset
, newpwd
->profile_path
, profile_path_len
);
282 if (newpwd
->acct_desc
)
283 memcpy (tdb_entry
->strings
+ tdb_entry
->acct_desc_offset
, newpwd
->acct_desc
, acct_desc_len
);
284 if (newpwd
->workstations
)
285 memcpy (tdb_entry
->strings
+ tdb_entry
->workstations_offset
, newpwd
->workstations
, workstations_len
);
286 if (newpwd
->unknown_str
)
287 memcpy (tdb_entry
->strings
+ tdb_entry
->unknown_str_offset
, newpwd
->unknown_str
, unknown_str_len
);
288 if (newpwd
->munged_dial
)
289 memcpy (tdb_entry
->strings
+ tdb_entry
->munged_dial_offset
, newpwd
->munged_dial
, munged_dial_len
);
291 slprintf(keystr
, sizeof(keystr
), "USER_%s", newpwd
->smb_name
);
293 key
.dsize
= strlen (keystr
) + 1;
295 tdb_writelock (pwd_tdb
);
296 if (tdb_store (pwd_tdb
, key
, data
, TDB_MODIFY
) != TDB_SUCCESS
)
298 DEBUG(0, ("Unable to modify TDB passwd!"));
299 DEBUGADD(0, (" Error: %s\n", tdb_error (pwd_tdb
)));
300 tdb_writeunlock (pwd_tdb
);
305 tdb_writeunlock (pwd_tdb
);
310 static BOOL
add_samtdb21pwd_entry(struct sam_passwd
*newpwd
)
312 TDB_CONTEXT
*pwd_tdb
;
315 struct tdb_sam_entry
*tdb_entry
;
318 int smb_name_len
= (newpwd
->smb_name
) ? (strlen (newpwd
->smb_name
) + 1) : 1;
319 int full_name_len
= (newpwd
->full_name
) ? (strlen (newpwd
->full_name
) + 1) : 1;
320 int home_dir_len
= (newpwd
->home_dir
) ? (strlen (newpwd
->home_dir
) + 1) : 1;
321 int dir_drive_len
= (newpwd
->dir_drive
) ? (strlen (newpwd
->dir_drive
) + 1) : 1;
322 int logon_script_len
= (newpwd
->logon_script
) ? (strlen (newpwd
->logon_script
) + 1) : 1;
323 int profile_path_len
= (newpwd
->profile_path
) ? (strlen (newpwd
->profile_path
) + 1) : 1;
324 int acct_desc_len
= (newpwd
->acct_desc
) ? (strlen (newpwd
->acct_desc
) + 1) : 1;
325 int workstations_len
= (newpwd
->workstations
) ? (strlen (newpwd
->workstations
) + 1) : 1;
326 int unknown_str_len
= (newpwd
->unknown_str
) ? (strlen (newpwd
->unknown_str
) + 1) : 1;
327 int munged_dial_len
= (newpwd
->munged_dial
) ? (strlen (newpwd
->munged_dial
) + 1) : 1;
329 if (!(pwd_tdb
= tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDWR
, 0600)))
331 DEBUG(0, ("Unable to open TDB passwd!"));
335 data
.dsize
= sizeof (struct tdb_sam_entry
) +
347 tdb_entry
= malloc (data
.dsize
);
348 data
.dptr
= tdb_entry
;
349 memset (data
.dptr
, 0, data
.dsize
);
351 tdb_entry
->logon_time
= newpwd
->logon_time
;
352 tdb_entry
->logoff_time
= newpwd
->logoff_time
;
353 tdb_entry
->kickoff_time
= newpwd
->kickoff_time
;
354 tdb_entry
->pass_last_set_time
= newpwd
->pass_last_set_time
;
355 tdb_entry
->pass_can_change_time
= newpwd
->pass_can_change_time
;
356 tdb_entry
->pass_must_change_time
= newpwd
->pass_must_change_time
;
357 tdb_entry
->smb_userid
= newpwd
->smb_userid
;
358 tdb_entry
->smb_grpid
= newpwd
->smb_grpid
;
359 tdb_entry
->user_rid
= newpwd
->user_rid
;
360 tdb_entry
->group_rid
= newpwd
->group_rid
;
361 memcpy (tdb_entry
->smb_passwd
, newpwd
->smb_passwd
, strlen (newpwd
->smb_passwd
) + 1);
362 memcpy (tdb_entry
->smb_nt_passwd
, newpwd
->smb_nt_passwd
, strlen (newpwd
->smb_nt_passwd
) + 1);
363 tdb_entry
->acct_ctrl
= newpwd
->acct_ctrl
;
364 tdb_entry
->unknown_3
= newpwd
->unknown_3
;
365 tdb_entry
->logon_divs
= newpwd
->logon_divs
;
366 tdb_entry
->hours_len
= newpwd
->hours_len
;
367 memcpy (tdb_entry
->hours
, newpwd
->hours
, MAX_HOURS_LEN
);
368 tdb_entry
->unknown_5
= newpwd
->unknown_5
;
369 tdb_entry
->unknown_6
= newpwd
->unknown_6
;
370 tdb_entry
->smb_name_offset
= 0;
371 tdb_entry
->full_name_offset
= smb_name_len
;
372 tdb_entry
->home_dir_offset
= tdb_entry
->full_name_offset
+ full_name_len
;
373 tdb_entry
->dir_drive_offset
= tdb_entry
->home_dir_offset
+ home_dir_len
;
374 tdb_entry
->logon_script_offset
= tdb_entry
->dir_drive_offset
+ dir_drive_len
;
375 tdb_entry
->profile_path_offset
= tdb_entry
->logon_script_offset
+ logon_script_len
;
376 tdb_entry
->acct_desc_offset
= tdb_entry
->profile_path_offset
+ profile_path_len
;
377 tdb_entry
->workstations_offset
= tdb_entry
->acct_desc_offset
+ acct_desc_len
;
378 tdb_entry
->unknown_str_offset
= tdb_entry
->workstations_offset
+ workstations_len
;
379 tdb_entry
->munged_dial_offset
= tdb_entry
->unknown_str_offset
+ unknown_str_len
;
380 if (newpwd
->smb_name
)
381 memcpy (tdb_entry
->strings
+ tdb_entry
->smb_name_offset
, newpwd
->smb_name
, smb_name_len
);
382 if (newpwd
->full_name
)
383 memcpy (tdb_entry
->strings
+ tdb_entry
->full_name_offset
, newpwd
->full_name
, full_name_len
);
384 if (newpwd
->home_dir
)
385 memcpy (tdb_entry
->strings
+ tdb_entry
->home_dir_offset
, newpwd
->home_dir
, home_dir_len
);
386 if (newpwd
->dir_drive
)
387 memcpy (tdb_entry
->strings
+ tdb_entry
->dir_drive_offset
, newpwd
->dir_drive
, dir_drive_len
);
388 if (newpwd
->logon_script
)
389 memcpy (tdb_entry
->strings
+ tdb_entry
->logon_script_offset
, newpwd
->logon_script
, logon_script_len
);
390 if (newpwd
->profile_path
)
391 memcpy (tdb_entry
->strings
+ tdb_entry
->profile_path_offset
, newpwd
->profile_path
, profile_path_len
);
392 if (newpwd
->acct_desc
)
393 memcpy (tdb_entry
->strings
+ tdb_entry
->acct_desc_offset
, newpwd
->acct_desc
, acct_desc_len
);
394 if (newpwd
->workstations
)
395 memcpy (tdb_entry
->strings
+ tdb_entry
->workstations_offset
, newpwd
->workstations
, workstations_len
);
396 if (newpwd
->unknown_str
)
397 memcpy (tdb_entry
->strings
+ tdb_entry
->unknown_str_offset
, newpwd
->unknown_str
, unknown_str_len
);
398 if (newpwd
->munged_dial
)
399 memcpy (tdb_entry
->strings
+ tdb_entry
->munged_dial_offset
, newpwd
->munged_dial
, munged_dial_len
);
401 slprintf(keystr
, sizeof(keystr
), "USER_%s", newpwd
->smb_name
);
403 key
.dsize
= strlen (keystr
) + 1;
405 tdb_writelock (pwd_tdb
);
406 if (tdb_store (pwd_tdb
, key
, data
, TDB_INSERT
) != TDB_SUCCESS
)
408 DEBUG(0, ("Unable to modify TDB passwd!"));
409 DEBUGADD(0, (" Error: %s\n", tdb_error (pwd_tdb
)));
410 tdb_writeunlock (pwd_tdb
);
415 tdb_writeunlock (pwd_tdb
);
420 static struct sam_passwd
*iterate_getsamtdb21pwrid(uint32 user_rid
)
422 struct sam_passwd
*pwd
= NULL
;
425 DEBUG(10, ("search by smb_userid: %x\n", (int)user_rid
));
427 /* Open the smb password database - not for update. */
428 fp
= startsamtdbpwent(False
);
432 DEBUG(0, ("unable to open smb password database.\n"));
436 while ((pwd
= getsamtdb21pwent(fp
)) != NULL
&& pwd
->user_rid
!= user_rid
);
440 DEBUG(10, ("found by user_rid: %x\n", (int)user_rid
));
447 static struct sam_passwd
*getsamtdb21pwnam(char *name
)
449 static struct sam_passwd sam_entry
;
450 static struct tdb_sam_entry
*tdb_entry
;
451 TDB_CONTEXT
*pwd_tdb
;
456 if (!(pwd_tdb
= tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDONLY
, 0600)))
458 DEBUG(0, ("Unable to open TDB passwd!"));
462 slprintf(keystr
, sizeof(keystr
), "USER_%s", name
);
464 key
.dsize
= strlen (keystr
) + 1;
466 data
= tdb_fetch (pwd_tdb
, key
);
469 DEBUG(5,("getsamtdbpwent: error fetching database.\n"));
470 DEBUGADD(5, (" Error: %s\n", tdb_error(pwd_tdb
)));
475 tdb_entry
= (struct tdb_sam_entry
*)(data
.dptr
);
477 sam_entry
.logon_time
= tdb_entry
->logon_time
;
478 sam_entry
.logoff_time
= tdb_entry
->logoff_time
;
479 sam_entry
.kickoff_time
= tdb_entry
->kickoff_time
;
480 sam_entry
.pass_last_set_time
= tdb_entry
->pass_last_set_time
;
481 sam_entry
.pass_can_change_time
= tdb_entry
->pass_can_change_time
;
482 sam_entry
.pass_must_change_time
= tdb_entry
->pass_must_change_time
;
483 sam_entry
.smb_name
= tdb_entry
->strings
+ tdb_entry
->smb_name_offset
;
484 sam_entry
.full_name
= tdb_entry
->strings
+ tdb_entry
->full_name_offset
;
485 sam_entry
.home_dir
= tdb_entry
->strings
+ tdb_entry
->home_dir_offset
;
486 sam_entry
.dir_drive
= tdb_entry
->strings
+ tdb_entry
->dir_drive_offset
;
487 sam_entry
.logon_script
= tdb_entry
->strings
+ tdb_entry
->logon_script_offset
;
488 sam_entry
.profile_path
= tdb_entry
->strings
+ tdb_entry
->profile_path_offset
;
489 sam_entry
.acct_desc
= tdb_entry
->strings
+ tdb_entry
->acct_desc_offset
;
490 sam_entry
.workstations
= tdb_entry
->strings
+ tdb_entry
->workstations_offset
;
491 sam_entry
.unknown_str
= tdb_entry
->strings
+ tdb_entry
->unknown_str_offset
;
492 sam_entry
.munged_dial
= tdb_entry
->strings
+ tdb_entry
->munged_dial_offset
;
493 sam_entry
.smb_userid
= tdb_entry
->smb_userid
;
494 sam_entry
.smb_grpid
= tdb_entry
->smb_grpid
;
495 sam_entry
.user_rid
= tdb_entry
->user_rid
;
496 sam_entry
.group_rid
= tdb_entry
->group_rid
;
497 sam_entry
.smb_passwd
= tdb_entry
->smb_passwd
;
498 sam_entry
.smb_nt_passwd
= tdb_entry
->smb_nt_passwd
;
499 sam_entry
.acct_ctrl
= tdb_entry
->acct_ctrl
;
500 sam_entry
.unknown_3
= tdb_entry
->unknown_3
;
501 sam_entry
.logon_divs
= tdb_entry
->logon_divs
;
502 sam_entry
.hours_len
= tdb_entry
->hours_len
;
503 memcpy (sam_entry
.hours
, tdb_entry
->hours
, MAX_HOURS_LEN
);
504 sam_entry
.unknown_5
= tdb_entry
->unknown_5
;
505 sam_entry
.unknown_6
= tdb_entry
->unknown_6
;
511 static SMB_BIG_UINT
getsamtdbpwpos(void *vp
)
513 return (SMB_BIG_UINT
)0;
516 static BOOL
setsamtdbpwpos(void *vp
, SMB_BIG_UINT tok
)
521 static struct smb_passwd
*getsamtdbpwent(void *vp
)
523 return pdb_sam_to_smb(getsamtdb21pwent(vp
));
526 static BOOL
add_samtdbpwd_entry(struct smb_passwd
*newpwd
)
528 return add_samtdb21pwd_entry(pdb_smb_to_sam(newpwd
));
531 static BOOL
mod_samtdbpwd_entry(struct smb_passwd
* pwd
, BOOL override
)
533 return mod_samtdb21pwd_entry(pdb_smb_to_sam(pwd
), override
);
536 static struct sam_disp_info
*getsamtdbdispnam(char *name
)
538 return pdb_sam_to_dispinfo(getsam21pwnam(name
));
541 static struct sam_disp_info
*getsamtdbdisprid(uint32 rid
)
543 return pdb_sam_to_dispinfo(getsam21pwrid(rid
));
546 static struct sam_disp_info
*getsamtdbdispent(void *vp
)
548 return pdb_sam_to_dispinfo(getsam21pwent(vp
));
551 static struct smb_passwd
*iterate_getsamtdbpwrid(uint32 user_rid
)
553 return pdb_sam_to_smb(iterate_getsamtdb21pwrid(user_rid
));
556 static struct smb_passwd
*getsamtdbpwnam(char *name
)
558 return pdb_sam_to_smb(getsamtdb21pwnam(name
));
561 static struct passdb_ops tdb_ops
= {
567 iterate_getsmbpwuid
, /* In passdb.c */
568 iterate_getsamtdbpwrid
,
576 /* TODO change get username from uid and then use
578 iterate_getsam21pwuid
,
580 iterate_getsamtdb21pwrid
,
581 add_samtdb21pwd_entry
,
582 mod_samtdb21pwd_entry
,
588 struct passdb_ops
*tdb_initialize_password_db(void)
594 /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */
595 void samtdb_dummy_function(void) { } /* stop some compilers complaining */
596 #endif /* WITH_TDBPWD */