Fetch authentication info before actually using it.
[Samba.git] / source / passdb / tdbpass.c
blobc3afced2d49e27d05e83aec85c1b5d93f83be7ad
1 /*
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
5 *
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)
9 * any later version.
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
14 * more details.
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.
21 #include "includes.h"
23 #ifdef WITH_TDBPWD
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;
33 struct tdb_sam_entry
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 ?*/
73 char strings[1];
76 struct tdb_enum_info
78 TDB_CONTEXT *passwd_tdb;
79 TDB_DATA key;
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)
91 /* Open tdb passwd */
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) !!!"));
98 return NULL;
100 return &tdb_ent;
102 tdb_ent.key = tdb_firstkey(tdb_ent.passwd_tdb);
103 return &tdb_ent;
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;
123 TDB_DATA data;
125 if(p_ent == NULL) {
126 DEBUG(0,("gettdbpwent: Bad TDB Context pointer.\n"));
127 return NULL;
130 data = tdb_fetch (p_ent->passwd_tdb, p_ent->key);
131 if (!data.dptr)
133 DEBUG(5,("gettdbpwent: database entry not found.\n"));
134 return NULL;
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);
171 return &sam_entry;
174 static BOOL del_samtdbpwd_entry(const char *name)
176 TDB_CONTEXT *pwd_tdb;
177 TDB_DATA key;
178 fstring keystr;
180 if (!(pwd_tdb = tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDWR, 0600)))
182 DEBUG(0, ("Unable to open TDB passwd!"));
183 return False;
186 slprintf(keystr, sizeof(keystr), "USER_%s", name);
187 key.dptr = keystr;
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)));
193 tdb_close(pwd_tdb);
194 return False;
196 tdb_close(pwd_tdb);
197 return True;
200 static BOOL mod_samtdb21pwd_entry(struct sam_passwd* newpwd, BOOL override)
202 TDB_CONTEXT *pwd_tdb;
203 TDB_DATA key;
204 TDB_DATA data;
205 struct tdb_sam_entry *tdb_entry;
206 fstring keystr;
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!"));
222 return False;
225 data.dsize = sizeof (struct tdb_sam_entry) +
226 smb_name_len +
227 full_name_len +
228 home_dir_len +
229 dir_drive_len +
230 logon_script_len +
231 profile_path_len +
232 acct_desc_len +
233 workstations_len +
234 unknown_str_len +
235 munged_dial_len;
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);
292 key.dptr = keystr;
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);
301 tdb_close (pwd_tdb);
302 return False;
305 tdb_writeunlock (pwd_tdb);
306 tdb_close (pwd_tdb);
307 return True;
310 static BOOL add_samtdb21pwd_entry(struct sam_passwd *newpwd)
312 TDB_CONTEXT *pwd_tdb;
313 TDB_DATA key;
314 TDB_DATA data;
315 struct tdb_sam_entry *tdb_entry;
316 fstring keystr;
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!"));
332 return False;
335 data.dsize = sizeof (struct tdb_sam_entry) +
336 smb_name_len +
337 full_name_len +
338 home_dir_len +
339 dir_drive_len +
340 logon_script_len +
341 profile_path_len +
342 acct_desc_len +
343 workstations_len +
344 unknown_str_len +
345 munged_dial_len;
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);
402 key.dptr = keystr;
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);
411 tdb_close (pwd_tdb);
412 return False;
415 tdb_writeunlock (pwd_tdb);
416 tdb_close (pwd_tdb);
417 return True;
420 static struct sam_passwd *iterate_getsamtdb21pwrid(uint32 user_rid)
422 struct sam_passwd *pwd = NULL;
423 void *fp = 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);
430 if (fp == NULL)
432 DEBUG(0, ("unable to open smb password database.\n"));
433 return NULL;
436 while ((pwd = getsamtdb21pwent(fp)) != NULL && pwd->user_rid != user_rid);
438 if (pwd != NULL)
440 DEBUG(10, ("found by user_rid: %x\n", (int)user_rid));
443 endsamtdbpwent(fp);
444 return pwd;
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;
452 TDB_DATA data;
453 TDB_DATA key;
454 fstring keystr;
456 if (!(pwd_tdb = tdb_open(lp_tdb_passwd_file(), 0, 0, O_RDONLY, 0600)))
458 DEBUG(0, ("Unable to open TDB passwd!"));
459 return False;
462 slprintf(keystr, sizeof(keystr), "USER_%s", name);
463 key.dptr = keystr;
464 key.dsize = strlen (keystr) + 1;
466 data = tdb_fetch (pwd_tdb, key);
467 if (!data.dptr)
469 DEBUG(5,("getsamtdbpwent: error fetching database.\n"));
470 DEBUGADD(5, (" Error: %s\n", tdb_error(pwd_tdb)));
471 tdb_close (pwd_tdb);
472 return NULL;
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;
507 tdb_close (pwd_tdb);
508 return &sam_entry;
511 static SMB_BIG_UINT getsamtdbpwpos(void *vp)
513 return (SMB_BIG_UINT)0;
516 static BOOL setsamtdbpwpos(void *vp, SMB_BIG_UINT tok)
518 return False;
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 = {
562 startsamtdbpwent,
563 endsamtdbpwent,
564 getsamtdbpwpos,
565 setsamtdbpwpos,
566 getsamtdbpwnam,
567 iterate_getsmbpwuid, /* In passdb.c */
568 iterate_getsamtdbpwrid,
569 getsamtdbpwent,
570 add_samtdbpwd_entry,
571 mod_samtdbpwd_entry,
572 del_samtdbpwd_entry,
573 getsamtdb21pwent,
574 getsamtdb21pwnam,
576 /* TODO change get username from uid and then use
577 getsamtdb21pwnam */
578 iterate_getsam21pwuid,
580 iterate_getsamtdb21pwrid,
581 add_samtdb21pwd_entry,
582 mod_samtdb21pwd_entry,
583 getsamtdbdispnam,
584 getsamtdbdisprid,
585 getsamtdbdispent
588 struct passdb_ops *tdb_initialize_password_db(void)
590 return &tdb_ops;
593 #else
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 */