diff options
Diffstat (limited to 'cracklib/lib/fascist.c')
-rw-r--r-- | cracklib/lib/fascist.c | 184 |
1 files changed, 95 insertions, 89 deletions
diff --git a/cracklib/lib/fascist.c b/cracklib/lib/fascist.c index 184469e..a142abc 100644 --- a/cracklib/lib/fascist.c +++ b/cracklib/lib/fascist.c @@ -491,82 +491,34 @@ GTry(rawtext, password) return (0); } -char * -FascistGecos(password, uid) - char *password; - int uid; +static char * +FascistGecosUser(char *password, const char *user, const char *gecos) { int i; int j; int wc; char *ptr; int gwords; - struct passwd *pwp, passwd; char gbuffer[STRINGSIZE]; char tbuffer[STRINGSIZE]; - char *sbuffer = NULL; -#ifdef HAVE_GETPWUID_R - size_t sbufferlen = LINE_MAX; -#endif char *uwords[STRINGSIZE]; char longbuffer[STRINGSIZE * 2]; -#ifdef HAVE_GETPWUID_R - sbuffer = malloc(sbufferlen); - if (sbuffer == NULL) - { - return ("memory allocation error"); - } - while ((i = getpwuid_r(uid, &passwd, sbuffer, sbufferlen, &pwp)) != 0) - { - if (i == ERANGE) - { - free(sbuffer); - - sbufferlen += LINE_MAX; - sbuffer = malloc(sbufferlen); - - if (sbuffer == NULL) - { - return ("memory allocation error"); - } - } else { - pwp = NULL; - break; - } - } -#else - /* Non-reentrant, but no choice since no _r routine */ - pwp = getpwuid(uid); -#endif - - if (pwp == NULL) - { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } - return _("you are not registered in the password file"); - } + if (gecos == NULL) + gecos = ""; /* lets get really paranoid and assume a dangerously long gecos entry */ - strncpy(tbuffer, pwp->pw_name, STRINGSIZE); + strncpy(tbuffer, user, STRINGSIZE); tbuffer[STRINGSIZE-1] = '\0'; if (GTry(tbuffer, password)) { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } return _("it is based on your username"); } /* it never used to be that you got passwd strings > 1024 chars, but now... */ - strncpy(tbuffer, pwp->pw_gecos, STRINGSIZE); + strncpy(tbuffer, gecos, STRINGSIZE); tbuffer[STRINGSIZE-1] = '\0'; strcpy(gbuffer, Lowercase(tbuffer)); @@ -621,11 +573,6 @@ FascistGecos(password, uid) { if (GTry(uwords[i], password)) { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } return _("it is based upon your password entry"); } } @@ -641,11 +588,6 @@ FascistGecos(password, uid) if (GTry(longbuffer, password)) { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } return _("it is derived from your password entry"); } @@ -654,11 +596,6 @@ FascistGecos(password, uid) if (GTry(longbuffer, password)) { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } return _("it's derived from your password entry"); } @@ -668,11 +605,6 @@ FascistGecos(password, uid) if (GTry(longbuffer, password)) { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } return _("it is derivable from your password entry"); } @@ -682,29 +614,80 @@ FascistGecos(password, uid) if (GTry(longbuffer, password)) { - if (sbuffer) - { - free(sbuffer); - sbuffer = NULL; - } return _("it's derivable from your password entry"); } } } + return ((char *) 0); +} + +char * +FascistGecos(password, uid) + char *password; + int uid; +{ + struct passwd *pwp; + char *sbuffer = NULL; + char *ptr; + +#ifdef HAVE_GETPWUID_R + size_t sbufferlen = LINE_MAX; + struct passwd passwd; + int i; + + sbuffer = malloc(sbufferlen); + if (sbuffer == NULL) + { + return ("memory allocation error"); + } + while ((i = getpwuid_r(uid, &passwd, sbuffer, sbufferlen, &pwp)) != 0) + { + if (i == ERANGE) + { + free(sbuffer); + + sbufferlen += LINE_MAX; + sbuffer = malloc(sbufferlen); + + if (sbuffer == NULL) + { + return ("memory allocation error"); + } + } else { + pwp = NULL; + break; + } + } +#else + /* Non-reentrant, but no choice since no _r routine */ + pwp = getpwuid(uid); +#endif + + if (pwp == NULL) + { + if (sbuffer) + { + free(sbuffer); + sbuffer = NULL; + } + return _("you are not registered in the password file"); + } + + ptr = FascistGecosUser(password, pwp->pw_name, pwp->pw_gecos); + if (sbuffer) { - free(sbuffer); - sbuffer = NULL; + free(sbuffer); + sbuffer = NULL; } - return ((char *) 0); + return ptr; } -char * -FascistLook(pwp, instring) - PWDICT *pwp; - char *instring; +static char * +FascistLookUser(PWDICT *pwp, char *instring, + const char *user, const char *gecos) { int i,maxrepeat; char *ptr; @@ -786,7 +769,12 @@ FascistLook(pwp, instring) return _("it looks like a National Insurance number."); } - if ((ptr = FascistGecos(password, getuid()))) + if (user != NULL) + ptr = FascistGecosUser(password, user, gecos); + else + ptr = FascistGecos(password, getuid()); + + if (ptr) { return (ptr); } @@ -836,10 +824,20 @@ FascistLook(pwp, instring) return ((char *) 0); } +char * +FascistLook(pwp, instring) + PWDICT *pwp; + char *instring; +{ + return FascistLookUser(pwp, instring, NULL, NULL); +} + const char * -FascistCheck(password, path) +FascistCheckUser(password, path, user, gecos) const char *password; const char *path; + const char *user; + const char *gecos; { PWDICT *pwp; char pwtrunced[STRINGSIZE]; @@ -868,7 +866,7 @@ FascistCheck(password, path) } /* sure seems like we should close the database, since we're only likely to check one password */ - res = FascistLook(pwp, pwtrunced); + res = FascistLookUser(pwp, pwtrunced, user, gecos); PWClose(pwp); pwp = (PWDICT *)0; @@ -877,6 +875,14 @@ FascistCheck(password, path) } const char * +FascistCheck(password, path) + const char *password; + const char *path; +{ + return FascistCheckUser(password, path, NULL, NULL); +} + +const char * GetDefaultCracklibDict() { return DEFAULT_CRACKLIB_DICT; |