summaryrefslogtreecommitdiff
path: root/source3/passdb/passdb.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1998-05-18 23:57:28 +0000
committerJeremy Allison <jra@samba.org>1998-05-18 23:57:28 +0000
commit118827376f8ccedb455e81b7d2b3bff029cde457 (patch)
tree2d30e099e7d04926af763ec530cdbd281ce6fafd /source3/passdb/passdb.c
parentffab54750f0eec202895670dd9293ee4aa3eb475 (diff)
downloadsamba-118827376f8ccedb455e81b7d2b3bff029cde457.tar.gz
samba-118827376f8ccedb455e81b7d2b3bff029cde457.tar.bz2
samba-118827376f8ccedb455e81b7d2b3bff029cde457.zip
Abstracted all the crappy password interfaces through an indirect
function table, selectable at compile time. This should make the code that implements all the password functions much cleaner, as it's now very clear exactly what a particular password database needs to provide to Samba. Jeremy. (This used to be commit 27ca536ad974242524c12f7100e419d9e7f9647f)
Diffstat (limited to 'source3/passdb/passdb.c')
-rw-r--r--source3/passdb/passdb.c353
1 files changed, 113 insertions, 240 deletions
diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c
index 90cb9d4de9..acc8d1c609 100644
--- a/source3/passdb/passdb.c
+++ b/source3/passdb/passdb.c
@@ -33,32 +33,34 @@ extern int DEBUGLEVEL;
DOM_SID global_machine_sid;
/*
- * TODO NOTE. All these functions will be abstracted into a structure
+ * NOTE. All these functions are abstracted into a structure
* that points to the correct function for the selected database. JRA.
*/
+static struct passdb_ops *pdb_ops;
+
/*
* Functions that return/manipulate a struct smb_passwd.
*/
/************************************************************************
- Routine to search smb passwd by uid. use this if your database
+ Utility function to search smb passwd by uid. use this if your database
does not have search facilities.
*************************************************************************/
-static struct smb_passwd *_getsmbpwuid(uid_t smb_userid)
+struct smb_passwd *iterate_getsmbpwuid(uid_t smb_userid)
{
struct smb_passwd *pwd = NULL;
void *fp = NULL;
- DEBUG(10, ("getsmbpwuid: search by smb_userid: %x\n", smb_userid));
+ DEBUG(10, ("iterate_getsmbpwuid: search by smb_userid: %x\n", smb_userid));
/* Open the smb password database - not for update. */
fp = startsmbpwent(False);
if (fp == NULL)
{
- DEBUG(0, ("getsmbpwuid: unable to open smb password database.\n"));
+ DEBUG(0, ("iterate_getsmbpwuid: unable to open smb password database.\n"));
return NULL;
}
@@ -67,7 +69,7 @@ static struct smb_passwd *_getsmbpwuid(uid_t smb_userid)
if (pwd != NULL)
{
- DEBUG(10, ("getsmbpwuid: found by smb_userid: %x\n", smb_userid));
+ DEBUG(10, ("iterate_getsmbpwuid: found by smb_userid: %x\n", smb_userid));
}
endsmbpwent(fp);
@@ -75,23 +77,23 @@ static struct smb_passwd *_getsmbpwuid(uid_t smb_userid)
}
/************************************************************************
- Routine to search smb passwd by name. use this if your database
+ Utility function to search smb passwd by name. use this if your database
does not have search facilities.
*************************************************************************/
-static struct smb_passwd *_getsmbpwnam(char *name)
+struct smb_passwd *iterate_getsmbpwnam(char *name)
{
struct smb_passwd *pwd = NULL;
void *fp = NULL;
- DEBUG(10, ("getsmbpwnam: search by name: %s\n", name));
+ DEBUG(10, ("iterate_getsmbpwnam: search by name: %s\n", name));
/* Open the sam password file - not for update. */
fp = startsmbpwent(False);
if (fp == NULL)
{
- DEBUG(0, ("_getsmbpwnam: unable to open smb password database.\n"));
+ DEBUG(0, ("iterate_getsmbpwnam: unable to open smb password database.\n"));
return NULL;
}
@@ -100,7 +102,7 @@ static struct smb_passwd *_getsmbpwnam(char *name)
if (pwd != NULL)
{
- DEBUG(10, ("_getsmbpwnam: found by name: %s\n", name));
+ DEBUG(10, ("iterate_getsmbpwnam: found by name: %s\n", name));
}
endsmbpwent(fp);
@@ -108,6 +110,30 @@ static struct smb_passwd *_getsmbpwnam(char *name)
}
/***************************************************************
+ Initialize the password db operations.
+***************************************************************/
+
+BOOL initialize_password_db(void)
+{
+ if(pdb_ops)
+ return True;
+
+#ifdef USE_NISPLUS_DB
+ pdb_ops = nisplus_initialize_password_db();
+#endif /* USE_NISPLUS_DB */
+
+#ifdef USE_LDAP_DB
+ pdb_ops = ldap_initialize_password_db();
+#endif /* USE_LDAP_DB */
+
+#ifdef USE_SMBPASS_DB
+ pdb_ops = file_initialize_password_db();
+#endif /* USE_SMBPASS_DB */
+
+ return (pdb_ops != NULL);
+}
+
+/***************************************************************
Start to enumerate the smb or sam passwd list. Returns a void pointer
to ensure no modification outside this module.
@@ -119,17 +145,7 @@ static struct smb_passwd *_getsmbpwnam(char *name)
void *startsmbpwent(BOOL update)
{
-#ifdef USE_NISPLUS_DB
- return startnisppwent(update);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return startldappwent(update);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return startsmbfilepwent(update);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->startsmbpwent(update);
}
/***************************************************************
@@ -144,37 +160,16 @@ void *startsmbpwent(BOOL update)
void endsmbpwent(void *vp)
{
-#ifdef USE_NISPLUS_DB
- endnisppwent(vp);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- endldappwent(vp);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- endsmbfilepwent(vp);
-#endif /* USE_SMBPASS_DB */
+ pdb_ops->endsmbpwent(vp);
}
/*************************************************************************
- Routine to return the next entry in the sam passwd list.
+ Routine to return the next entry in the smb passwd list.
*************************************************************************/
struct smb_passwd *getsmbpwent(void *vp)
{
-#ifdef USE_NISPLUS_DB
- return pdb_sam_to_smb(getnisp21pwent(vp));
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return pdb_sam_to_smb(getldap21pwent(vp));
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return getsmbfilepwent(vp);
-#endif /* USE_SMBPASS_DB */
- return NULL;
+ return pdb_ops->getsmbpwent(vp);
}
/*************************************************************************
@@ -190,17 +185,7 @@ struct smb_passwd *getsmbpwent(void *vp)
unsigned long getsmbpwpos(void *vp)
{
-#ifdef USE_NISPLUS_DB
- return getnisppwpos(vp);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return getldappwpos(vp);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return getsmbfilepwpos(vp);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->getsmbpwpos(vp);
}
/*************************************************************************
@@ -216,17 +201,7 @@ unsigned long getsmbpwpos(void *vp)
BOOL setsmbpwpos(void *vp, unsigned long tok)
{
-#ifdef USE_NISPLUS_DB
- return setnisppwpos(vp, tok);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return setldappwpos(vp, tok);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return setsmbfilepwpos(vp, tok);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->setsmbpwpos(vp, tok);
}
/************************************************************************
@@ -235,17 +210,7 @@ BOOL setsmbpwpos(void *vp, unsigned long tok)
BOOL add_smbpwd_entry(struct smb_passwd *newpwd)
{
-#ifdef USE_NISPLUS_DB
- return add_nisp21pwd_entry(pdb_smb_to_sam(newpwd));
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return add_ldap21pwd_entry(pdb_smb_to_sam(newpwd));
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return add_smbfilepwd_entry(newpwd);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->add_smbpwd_entry(newpwd);
}
/************************************************************************
@@ -259,17 +224,7 @@ BOOL add_smbpwd_entry(struct smb_passwd *newpwd)
BOOL mod_smbpwd_entry(struct smb_passwd* pwd, BOOL override)
{
-#ifdef USE_NISPLUS_DB
- return mod_nisp21pwd_entry(pdb_smb_to_sam(pwd), override);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return mod_ldap21pwd_entry(pdb_smb_to_sam(pwd), override);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return mod_smbfilepwd_entry(pwd, override);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->mod_smbpwd_entry(pwd, override);
}
/************************************************************************
@@ -278,17 +233,7 @@ BOOL mod_smbpwd_entry(struct smb_passwd* pwd, BOOL override)
struct smb_passwd *getsmbpwnam(char *name)
{
-#ifdef USE_NISPLUS_DB
- return pdb_sam_to_smb(_getsam21pwnam(name));
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return pdb_sam_to_smb(_getsam21pwnam(name));
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return _getsmbpwnam(name);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->getsmbpwnam(name);
}
/************************************************************************
@@ -297,178 +242,64 @@ struct smb_passwd *getsmbpwnam(char *name)
struct smb_passwd *getsmbpwuid(uid_t smb_userid)
{
-#ifdef USE_NISPLUS_DB
- return pdb_sam_to_smb(_getsam21pwrid(smb_userid));
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return pdb_sam_to_smb(_getsam21pwrid(smb_userid));
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return _getsmbpwuid(smb_userid);
-#endif /* USE_SMBPASS_DB */
+ return pdb_ops->getsmbpwuid(smb_userid);
}
/*
* Functions that manupulate a struct sam_passwd.
*/
-/*************************************************************************
- Routine to return the next entry in the sam passwd list.
- *************************************************************************/
-
-struct sam_disp_info *getsamdispent(void *vp)
-{
-#ifdef USE_NISPLUS_DB
- return pdb_sam_to_dispinfo(getnisp21pwent(vp));
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return pdb_sam_to_dispinfo(getldap21pwent(vp));
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return pdb_sam_to_dispinfo(getsmbfile21pwent(vp));
-#endif /* USE_SMBPASS_DB */
-
- return NULL;
-}
-
-/*************************************************************************
- Routine to return the next entry in the sam passwd list.
- *************************************************************************/
-
-struct sam_passwd *getsam21pwent(void *vp)
-{
-#ifdef USE_NISPLUS_DB
- return getnisp21pwent(vp);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return getldap21pwent(vp);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return getsmbfile21pwent(vp);
-#endif /* USE_SMBPASS_DB */
-
- return NULL;
-}
-
-/************************************************************************
- Routine to add an entry to the sam passwd file.
-*************************************************************************/
-
-BOOL add_sam21pwd_entry(struct sam_passwd *newpwd)
-{
-#ifdef USE_NISPLUS_DB
- return add_nisp21pwd_entry(newpwd);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return add_ldap21pwd_entry(newpwd);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return add_smbfile21pwd_entry(newpwd);
-#endif /* USE_SMBPASS_DB */
-}
-
/************************************************************************
- Routine to search the sam passwd database for an entry matching the username.
- and then modify its password entry. We can't use the startsampwent()/
- getsampwent()/endsampwent() interfaces here as we depend on looking
- in the actual file to decide how much room we have to write data.
- override = False, normal
- override = True, override XXXXXXXX'd out password or NO PASS
-************************************************************************/
-
-BOOL mod_sam21pwd_entry(struct sam_passwd* pwd, BOOL override)
-{
-#ifdef USE_NISPLUS_DB
- return mod_nisp21pwd_entry(pwd, override);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return mod_ldap21pwd_entry(pwd, override);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return mod_smbfile21pwd_entry(pwd, override);
-#endif /* USE_SMBPASS_DB */
-}
-
-/************************************************************************
- Routine to search sam passwd by name. use this if your database
+ Utility function to search sam passwd by name. use this if your database
does not have search facilities.
*************************************************************************/
-static struct sam_passwd *_getsam21pwnam(char *name)
+struct sam_passwd *iterate_getsam21pwnam(char *name)
{
struct sam_passwd *pwd = NULL;
void *fp = NULL;
- DEBUG(10, ("_getsam21pwnam: search by name: %s\n", name));
+ DEBUG(10, ("iterate_getsam21pwnam: search by name: %s\n", name));
/* Open the smb password database - not for update. */
fp = startsmbpwent(False);
if (fp == NULL)
{
- DEBUG(0, ("_getsam21pwnam: unable to open sam password database.\n"));
+ DEBUG(0, ("iterate_getsam21pwnam: unable to open sam password database.\n"));
return NULL;
}
- while ((pwd = getsam21pwent(fp)) != NULL && !strequal(pwd->smb_name, name));
+ while ((pwd = getsam21pwent(fp)) != NULL && !strequal(pwd->smb_name, name))
+ ;
if (pwd != NULL)
{
- DEBUG(10, ("_getsam21pwnam: found by name: %s\n", name));
+ DEBUG(10, ("iterate_getsam21pwnam: found by name: %s\n", name));
}
endsmbpwent(fp);
return pwd;
}
-
/************************************************************************
- Routine to search sam passwd by name.
-*************************************************************************/
-
-struct sam_passwd *getsam21pwnam(char *name)
-{
-#ifdef USE_NISPLUS_DB
- return _getsam21pwnam(name);
-#endif /* USE_NISPLUS_DB */
-
-#ifdef USE_LDAP_DB
- return _getsam21pwnam(name);
-#endif /* USE_LDAP_DB */
-
-#ifdef USE_SMBPASS_DB
- return _getsam21pwnam(name);
-#endif /* USE_SMBPASS_DB */
-}
-
-/************************************************************************
- Routine to search sam passwd by uid. use this if your database
+ Utility function to search sam passwd by uid. use this if your database
does not have search facilities.
*************************************************************************/
-static struct sam_passwd *_getsam21pwuid(uint32 uid)
+struct sam_passwd *iterate_getsam21pwuid(uint32 uid)
{
struct sam_passwd *pwd = NULL;
void *fp = NULL;
- DEBUG(10, ("_getsam21pwuid: search by uid: %x\n", uid));
+ DEBUG(10, ("iterate_getsam21pwuid: search by uid: %x\n", uid));
/* Open the smb password file - not for update. */
fp = startsmbpwent(False);
if (fp == NULL)
{
- DEBUG(0, ("_getsam21pwuid: unable to open sam password database.\n"));
+ DEBUG(0, ("iterate_getsam21pwuid: unable to open sam password database.\n"));
return NULL;
}
@@ -477,30 +308,71 @@ static struct sam_passwd *_getsam21pwuid(uint32 uid)
if (pwd != NULL)
{
- DEBUG(10, ("_getsam21pwuid: found by smb_userid: %x\n", uid));
+ DEBUG(10, ("iterate_getsam21pwuid: found by smb_userid: %x\n", uid));
}
endsmbpwent(fp);
return pwd;
}
+/*************************************************************************
+ Routine to return the next entry in the sam passwd list.
+ *************************************************************************/
+
+struct sam_disp_info *getsamdispent(void *vp)
+{
+ return pdb_sam_to_dispinfo(pdb_ops->getsam21pwent(vp));
+}
+
+/*************************************************************************
+ Routine to return the next entry in the sam passwd list.
+ *************************************************************************/
+
+struct sam_passwd *getsam21pwent(void *vp)
+{
+ return pdb_ops->getsam21pwent(vp);
+}
+
/************************************************************************
- Routine to search sam passwd by uid.
+ Routine to add an entry to the sam passwd file.
*************************************************************************/
-struct sam_passwd *getsam21pwuid(uint32 uid)
+BOOL add_sam21pwd_entry(struct sam_passwd *newpwd)
{
-#ifdef USE_NISPLUS_DB
- return _getsam21pwuid(uid);
-#endif /* USE_NISPLUS_DB */
+ return pdb_ops->add_sam21pwd_entry(newpwd);
+}
-#ifdef USE_LDAP_DB
- return _getsam21pwuid(uid);
-#endif /* USE_LDAP_DB */
+/************************************************************************
+ Routine to search the sam passwd database for an entry matching the username.
+ and then modify its password entry. We can't use the startsampwent()/
+ getsampwent()/endsampwent() interfaces here as we depend on looking
+ in the actual file to decide how much room we have to write data.
+ override = False, normal
+ override = True, override XXXXXXXX'd out password or NO PASS
+************************************************************************/
-#ifdef USE_SMBPASS_DB
- return _getsam21pwuid(uid);
-#endif /* USE_SMBPASS_DB */
+BOOL mod_sam21pwd_entry(struct sam_passwd* pwd, BOOL override)
+{
+ return pdb_ops->mod_sam21pwd_entry(pwd, override);
+}
+
+
+/************************************************************************
+ Routine to search sam passwd by name.
+*************************************************************************/
+
+struct sam_passwd *getsam21pwnam(char *name)
+{
+ return pdb_ops->getsam21pwnam(name);
+}
+
+/************************************************************************
+ Routine to search sam passwd by uid.
+*************************************************************************/
+
+struct sam_passwd *getsam21pwuid(uint32 uid)
+{
+ return pdb_ops->getsam21pwuid(uid);
}
@@ -552,6 +424,7 @@ void pdb_init_sam(struct sam_passwd *user)
/*************************************************************************
Routine to return the next entry in the sam passwd list.
*************************************************************************/
+
struct sam_disp_info *pdb_sam_to_dispinfo(struct sam_passwd *user)
{
static struct sam_disp_info disp_info;
@@ -1051,5 +924,5 @@ uint32 pdb_gid_to_group_rid(uint32 gid)
BOOL pdb_rid_is_user(uint32 rid)
{
/* Punt for now - we need to look at the encoding here. JRA. */
- return False;
+ return True;
}