/* Unix SMB/Netbios implementation. Version 1.9. Password and authentication handling Copyright (C) Jeremy Allison 1996-1998 Copyright (C) Luke Kenneth Casson Leighton 1996-1998 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" /* * NOTE. All these functions are abstracted into a structure * that points to the correct function for the selected database. JRA. * * the API does NOT fill in the gaps if you set an API function * to NULL: it will deliberately attempt to call the NULL function. * */ static struct passgrp_ops *pwgrp_ops; /*************************************************************** Initialise the passgrp operations. ***************************************************************/ BOOL initialise_passgrp_db(void) { if (pwgrp_ops) { return True; } #ifdef WITH_NISPLUS pwgrp_ops = nisplus_initialise_password_grp(); #elif defined(WITH_LDAP) pwgrp_ops = ldap_initialize_password_grp(); #else pwgrp_ops = file_initialise_password_grp(); #endif return (pwgrp_ops != NULL); } /* * Functions that return/manipulate a struct smb_passwd. */ /************************************************************************ Utility function to search smb passwd by rid. *************************************************************************/ struct smb_passwd *iterate_getsmbgrprid(uint32 user_rid, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { return iterate_getsmbgrpuid(pwdb_user_rid_to_uid(user_rid), grps, num_grps, alss, num_alss); } /************************************************************************ Utility function to search smb passwd by uid. use this if your database does not have search facilities. *************************************************************************/ struct smb_passwd *iterate_getsmbgrpuid(uid_t smb_userid, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { struct smb_passwd *pwd = NULL; void *fp = NULL; DEBUG(10, ("search by smb_userid: %x\n", (int)smb_userid)); /* Open the smb password database - not for update. */ fp = startsmbgrpent(False); if (fp == NULL) { DEBUG(0, ("unable to open smb passgrp database.\n")); return NULL; } while ((pwd = getsmbgrpent(fp, grps, num_grps, alss, num_alss)) != NULL && pwd->smb_userid != smb_userid) ; if (pwd != NULL) { DEBUG(10, ("found by smb_userid: %x\n", (int)smb_userid)); } endsmbgrpent(fp); return pwd; } /************************************************************************ Utility function to search smb passwd by name. use this if your database does not have search facilities. *************************************************************************/ struct smb_passwd *iterate_getsmbgrpnam(char *name, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { struct smb_passwd *pwd = NULL; void *fp = NULL; DEBUG(10, ("search by name: %s\n", name)); /* Open the passgrp file - not for update. */ fp = startsmbgrpent(False); if (fp == NULL) { DEBUG(0, ("unable to open smb passgrp database.\n")); return NULL; } while ((pwd = getsmbgrpent(fp, grps, num_grps, alss, num_alss)) != NULL && !strequal(pwd->smb_name, name)) ; if (pwd != NULL) { DEBUG(10, ("found by name: %s\n", name)); } endsmbgrpent(fp); return pwd; } /*************************************************************** Start to enumerate the smb or sam passwd list. Returns a void pointer to ensure no modification outside this module. Note that currently it is being assumed that a pointer returned from this function may be used to enumerate struct sam_passwd entries as well as struct smb_passwd entries. This may need to change. JRA. ****************************************************************/ void *startsmbgrpent(BOOL update) { return pwgrp_ops->startsmbgrpent(update); } /*************************************************************** End enumeration of the smb or sam passwd list. Note that currently it is being assumed that a pointer returned from this function may be used to enumerate struct sam_passwd entries as well as struct smb_passwd entries. This may need to change. JRA. ****************************************************************/ void endsmbgrpent(void *vp) { pwgrp_ops->endsmbgrpent(vp); } /************************************************************************* Routine to return the next entry in the smb passwd list. *************************************************************************/ struct smb_passwd *getsmbgrpent(void *vp, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { return pwgrp_ops->getsmbgrpent(vp, grps, num_grps, alss, num_alss); } /************************************************************************ Routine to search smb passwd by name. *************************************************************************/ struct smb_passwd *getsmbgrpnam(char *name, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { return pwgrp_ops->getsmbgrpnam(name, grps, num_grps, alss, num_alss); } /************************************************************************ Routine to search smb passwd by user rid. *************************************************************************/ struct smb_passwd *getsmbgrprid(uint32 user_rid, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { return pwgrp_ops->getsmbgrprid(user_rid, grps, num_grps, alss, num_alss); } /************************************************************************ Routine to search smb passwd by uid. *************************************************************************/ struct smb_passwd *getsmbgrpuid(uid_t smb_userid, uint32 **grps, int *num_grps, uint32 **alss, int *num_alss) { return pwgrp_ops->getsmbgrpuid(smb_userid, grps, num_grps, alss, num_alss); }