diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2012-11-25 15:51:10 +0000 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2012-11-25 15:51:10 +0000 |
commit | ea55c22e2fd1872dffabc615e20cdf740f1558cb (patch) | |
tree | 0333a460302788a51f8dbd817e753e8ee2915b34 | |
parent | eefe25d027eb38328e8eaeec92d90fabacc149be (diff) |
move all nsswitch-parsing related functions to nsswitch.c
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1840 ef36b2f9-881f-0410-afb5-c4e39611909c
-rw-r--r-- | nslcd/common.h | 5 | ||||
-rw-r--r-- | nslcd/nsswitch.c | 61 | ||||
-rw-r--r-- | nslcd/passwd.c | 59 |
3 files changed, 61 insertions, 64 deletions
diff --git a/nslcd/common.h b/nslcd/common.h index 3ca77f8..a7be8c5 100644 --- a/nslcd/common.h +++ b/nslcd/common.h @@ -127,8 +127,11 @@ void get_shadow_properties(MYLDAP_ENTRY *entry,long *lastchangedate, long *inactdays,long *expiredate,unsigned long *flag); +/* check whether the nsswitch file should be reloaded */ +void nsswitch_check_reload(void); + /* check whether the nsswitch.conf file has LDAP as a naming source for db */ -int nsswitch_db_uses_ldap(const char *filename,const char *db); +int nsswitch_shadow_uses_ldap(void); /* fallback definition of HOST_NAME_MAX */ #ifndef HOST_NAME_MAX diff --git a/nslcd/nsswitch.c b/nslcd/nsswitch.c index 69905a6..7d488ff 100644 --- a/nslcd/nsswitch.c +++ b/nslcd/nsswitch.c @@ -25,16 +25,49 @@ #include <string.h> #include <ctype.h> #include <errno.h> +#include <sys/stat.h> +#include <unistd.h> +#include <time.h> #include "common.h" #include "log.h" +/* the cached value of whether shadow lookups use LDAP in nsswitch.conf */ +#define NSSWITCH_FILE "/etc/nsswitch.conf" +#define CACHED_UNKNOWN 22 +static int cached_shadow_uses_ldap=CACHED_UNKNOWN; +static time_t cached_shadow_lastcheck=0; +#define CACHED_SHADOW_TIMEOUT (60) +static time_t nsswitch_mtime=0; + /* the maximum line length supported of nsswitch.conf */ #define MAX_LINE_LENGTH 4096 - -/* TODO: store mtime of file and use it to check reparse */ -/* TODO: cache entries for x minutes */ +/* check whether /etc/nsswitch.conf should be related to update + cached_shadow_uses_ldap */ +void nsswitch_check_reload(void) +{ + struct stat buf; + time_t t; + if ((cached_shadow_uses_ldap!=CACHED_UNKNOWN)&& + ((t=time(NULL)) > (cached_shadow_lastcheck+CACHED_SHADOW_TIMEOUT))) + { + cached_shadow_lastcheck=t; + if (stat(NSSWITCH_FILE,&buf)) + { + log_log(LOG_ERR,"stat(%s) failed: %s",NSSWITCH_FILE,strerror(errno)); + /* trigger a recheck anyway */ + cached_shadow_uses_ldap=CACHED_UNKNOWN; + return; + } + /* trigger a recheck if file changed */ + if (buf.st_mtime!=nsswitch_mtime) + { + nsswitch_mtime=buf.st_mtime; + cached_shadow_uses_ldap=CACHED_UNKNOWN; + } + } +} /* see if the line is a service definition for db and return a pointer to the beginning of the services list if it is */ @@ -89,24 +122,24 @@ static int has_service(const char *services,const char *service, return 0; } -int nsswitch_db_uses_ldap(const char *filename,const char *db) +static int shadow_uses_ldap(void) { FILE *fp; int lnr=0; char linebuf[MAX_LINE_LENGTH]; const char *services; /* open config file */ - if ((fp=fopen(filename,"r"))==NULL) + if ((fp=fopen(NSSWITCH_FILE,"r"))==NULL) { - log_log(LOG_ERR,"cannot open %s: %s",filename,strerror(errno)); + log_log(LOG_ERR,"cannot open %s: %s",NSSWITCH_FILE,strerror(errno)); return 0; } /* read file and parse lines */ while (fgets(linebuf,sizeof(linebuf),fp)!=NULL) { lnr++; - services=find_db(linebuf,db); - if ((services!=NULL)&&has_service(services,"ldap",filename,lnr)) + services=find_db(linebuf,"shadow"); + if ((services!=NULL)&&has_service(services,"ldap",NSSWITCH_FILE,lnr)) { fclose(fp); return 1; @@ -115,3 +148,15 @@ int nsswitch_db_uses_ldap(const char *filename,const char *db) fclose(fp); return 0; } + +/* check whether shadow lookups are configured to use ldap */ +inline int nsswitch_shadow_uses_ldap(void) +{ + if (cached_shadow_uses_ldap==CACHED_UNKNOWN) + { + log_log(LOG_INFO,"(re)loading %s",NSSWITCH_FILE); + cached_shadow_uses_ldap=shadow_uses_ldap(); + cached_shadow_lastcheck=time(NULL); + } + return cached_shadow_uses_ldap; +} diff --git a/nslcd/passwd.c b/nslcd/passwd.c index 31485d6..cdeb814 100644 --- a/nslcd/passwd.c +++ b/nslcd/passwd.c @@ -28,7 +28,6 @@ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> -#include <sys/stat.h> #include <unistd.h> #include <string.h> #include <pthread.h> @@ -386,59 +385,9 @@ char *uid2dn(MYLDAP_SESSION *session,const char *uid,char *buf,size_t buflen) } #ifndef NSS_FLAVOUR_GLIBC - /* only check nsswitch.conf for glibc */ #define check_nsswitch_reload() #define shadow_uses_ldap() (1) - -#else /* NSS_FLAVOUR_GLIBC */ - -/* the cached value of whether shadow lookups use LDAP in nsswitch.conf */ -#define NSSWITCH_FILE "/etc/nsswitch.conf" -#define CACHED_UNKNOWN 22 -static int cached_shadow_uses_ldap=CACHED_UNKNOWN; -static time_t cached_shadow_lastcheck=0; -#define CACHED_SHADOW_TIMEOUT (60) -static time_t nsswitch_mtime=0; - -/* check whether /etc/nsswitch.conf should be related to update - cached_shadow_uses_ldap */ -static inline void check_nsswitch_reload(void) -{ - struct stat buf; - time_t t; - if ((cached_shadow_uses_ldap!=CACHED_UNKNOWN)&& - ((t=time(NULL)) > (cached_shadow_lastcheck+CACHED_SHADOW_TIMEOUT))) - { - cached_shadow_lastcheck=t; - if (stat(NSSWITCH_FILE,&buf)) - { - log_log(LOG_ERR,"stat(%s) failed: %s",NSSWITCH_FILE,strerror(errno)); - /* trigger a recheck anyway */ - cached_shadow_uses_ldap=CACHED_UNKNOWN; - return; - } - /* trigger a recheck if file changed */ - if (buf.st_mtime!=nsswitch_mtime) - { - nsswitch_mtime=buf.st_mtime; - cached_shadow_uses_ldap=CACHED_UNKNOWN; - } - } -} - -/* check whether shadow lookups are configured to use ldap */ -static inline int shadow_uses_ldap(void) -{ - if (cached_shadow_uses_ldap==CACHED_UNKNOWN) - { - log_log(LOG_INFO,"(re)loading %s",NSSWITCH_FILE); - cached_shadow_uses_ldap=nsswitch_db_uses_ldap(NSSWITCH_FILE,"shadow"); - cached_shadow_lastcheck=time(NULL); - } - return cached_shadow_uses_ldap; -} - #endif /* NSS_FLAVOUR_GLIBC */ /* the maximum number of uidNumber attributes per entry */ @@ -471,7 +420,7 @@ static int write_passwd(TFILE *fp,MYLDAP_ENTRY *entry,const char *requser, } /* if we are using shadow maps and this entry looks like it would return shadow information, make the passwd entry indicate it */ - if (myldap_has_objectclass(entry,"shadowAccount")&&shadow_uses_ldap()) + if (myldap_has_objectclass(entry,"shadowAccount")&&nsswitch_shadow_uses_ldap()) { passwd="x"; } @@ -604,7 +553,7 @@ NSLCD_HANDLE_UID( log_log(LOG_WARNING,"request denied by validnames option"); return -1; } - check_nsswitch_reload();, + nsswitch_check_reload();, NSLCD_ACTION_PASSWD_BYNAME, mkfilter_passwd_byname(name,filter,sizeof(filter)), write_passwd(fp,entry,name,NULL,calleruid) @@ -623,7 +572,7 @@ NSLCD_HANDLE_UID( WRITE_INT32(fp,NSLCD_ACTION_PASSWD_BYUID); WRITE_INT32(fp,NSLCD_RESULT_END); } - check_nsswitch_reload();, + nsswitch_check_reload();, NSLCD_ACTION_PASSWD_BYUID, mkfilter_passwd_byuid(uid,filter,sizeof(filter)), write_passwd(fp,entry,NULL,&uid,calleruid) @@ -633,7 +582,7 @@ NSLCD_HANDLE_UID( passwd,all, const char *filter; log_setrequest("passwd(all)"); - check_nsswitch_reload();, + nsswitch_check_reload();, NSLCD_ACTION_PASSWD_ALL, (filter=passwd_filter,0), write_passwd(fp,entry,NULL,NULL,calleruid) |