1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-12 12:23:50 +03:00
Files
samba-mirror/source/passdb/sampass.c

200 lines
5.7 KiB
C

/*
* Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup
* Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 675
* Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#ifdef USE_SMBPASS_DB
extern int DEBUGLEVEL;
extern pstring samlogon_user;
extern BOOL sam_logon_in_ssb;
extern DOM_SID global_sam_sid;
/***************************************************************
Start to enumerate the smbpasswd list. Returns a void pointer
to ensure no modification outside this module.
****************************************************************/
void *startsamfilepwent(BOOL update)
{
return startsmbpwent(update);
}
/***************************************************************
End enumeration of the smbpasswd list.
****************************************************************/
void endsamfilepwent(void *vp)
{
endsmbpwent(vp);
}
/*************************************************************************
Return the current position in the smbpasswd list as an SMB_BIG_UINT.
This must be treated as an opaque token.
*************************************************************************/
SMB_BIG_UINT getsamfilepwpos(void *vp)
{
return getsmbpwpos(vp);
}
/*************************************************************************
Set the current position in the smbpasswd list from an SMB_BIG_UINT.
This must be treated as an opaque token.
*************************************************************************/
BOOL setsamfilepwpos(void *vp, SMB_BIG_UINT tok)
{
return setsmbpwpos(vp, tok);
}
/*************************************************************************
Routine to return the next entry in the smbpasswd list.
this function is a nice, messy combination of reading:
- the smbpasswd file
- the unix password database
- smb.conf options (not done at present).
*************************************************************************/
static struct sam_passwd *getsamfile21pwent(void *vp)
{
struct sam_passwd *user;
static pstring full_name;
static pstring home_dir;
static pstring home_drive;
static pstring logon_script;
static pstring profile_path;
static pstring acct_desc;
static pstring workstations;
DEBUG(5,("getsamfile21pwent\n"));
user = pwdb_smb_to_sam(getsmbpwent(vp));
if (user == NULL)
{
return NULL;
}
/*
* get all the other gubbins we need. substitute unix name for %U
* as putting the nt name in is a bit meaningless.
*/
pstrcpy(samlogon_user, user->unix_name);
if (samlogon_user[strlen(samlogon_user)-1] == '$' &&
user->group_rid != DOMAIN_GROUP_RID_USERS)
{
DEBUG(0,("trust account %s should be in DOMAIN_GROUP_RID_USERS\n",
samlogon_user));
}
/* XXXX hack to get standard_sub_basic() to use sam logon username */
/* possibly a better way would be to do a become_user() call */
sam_logon_in_ssb = True;
pstrcpy(full_name , "");
pstrcpy(logon_script , lp_logon_script ());
pstrcpy(profile_path , lp_logon_path ());
pstrcpy(home_drive , lp_logon_drive ());
pstrcpy(home_dir , lp_logon_home ());
pstrcpy(acct_desc , "");
pstrcpy(workstations , "");
sam_logon_in_ssb = False;
user->full_name = full_name;
user->home_dir = home_dir;
user->dir_drive = home_drive;
user->logon_script = logon_script;
user->profile_path = profile_path;
user->acct_desc = acct_desc;
user->workstations = workstations;
user->unknown_str = NULL; /* don't know, yet! */
user->munged_dial = NULL; /* "munged" dial-back telephone number */
user->unknown_3 = 0xffffff; /* don't know */
user->logon_divs = 168; /* hours per week */
user->hours_len = 21; /* 21 times 8 bits = 168 */
memset(user->hours, 0xff, user->hours_len); /* available at all hours */
user->unknown_5 = 0x00020000; /* don't know */
user->unknown_6 = 0x000004ec; /* don't know */
return user;
}
/*
* Stub functions - implemented in terms of others.
*/
static BOOL mod_samfile21pwd_entry(struct sam_passwd* pwd, BOOL override)
{
return mod_smbpwd_entry(pwdb_sam_to_smb(pwd), override);
}
static BOOL add_samfile21pwd_entry(struct sam_passwd *newpwd)
{
return add_smbpwd_entry(pwdb_sam_to_smb(newpwd));
}
static struct sam_disp_info *getsamfiledispntnam(const char *ntname)
{
return pwdb_sam_to_dispinfo(getsam21pwntnam(ntname));
}
static struct sam_disp_info *getsamfiledisprid(uint32 rid)
{
return pwdb_sam_to_dispinfo(getsam21pwrid(rid));
}
static struct sam_disp_info *getsamfiledispent(void *vp)
{
return pwdb_sam_to_dispinfo(getsam21pwent(vp));
}
static struct sam_passdb_ops file_ops = {
startsamfilepwent,
endsamfilepwent,
getsamfilepwpos,
setsamfilepwpos,
iterate_getsam21pwntnam,
iterate_getsam21pwuid,
iterate_getsam21pwrid,
getsamfile21pwent,
add_samfile21pwd_entry,
mod_samfile21pwd_entry,
getsamfiledispntnam,
getsamfiledisprid,
getsamfiledispent
};
struct sam_passdb_ops *file_initialise_sam_password_db(void)
{
return &file_ops;
}
#else
/* Do *NOT* make this function static. It breaks the compile on gcc. JRA */
void sampass_dummy_function(void) { } /* stop some compilers complaining */
#endif /* USE_SMBPASS_DB */