|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 4785 (0x12b1)
Types: TextFile
Names: »pwck_dict.c«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
└─⟦123909933⟧ »./npasswd/npasswd.tar.Z«
└─⟦22a202e7d⟧
└─⟦this⟧ »npass-new/npasswd_jpl/old.checkpasswd/pwck_dict.c«
/* -------------------------------------------------------------------- */
/* */
/* Author: Clyde Hoover */
/* Computation Center */
/* The University of Texas at Austin */
/* Austin, Texas 78712 */
/* clyde@emx.utexas.edu */
/* uunet!cs.utexas.edu!ut-emx!clyde */
/* */
/*This code may be distributed freely, provided this notice is retained. */
/* */
/* -------------------------------------------------------------------- */
/*
* pwck_dictionary - Look in the forbidden password dictionaries.
* Returns:
* PWCK_INDICT if <password> was in any dictionary
* PWCK_OK if not
*/
#ifndef lint
static char sccsid[] = "@(#)pwck_dict.c 1.2 11/26/90 (cc.utexas.edu)";
#endif
#include "checkpasswd.h"
dictionary *dictionaries = 0; /* List of dictionaries */
static char *egrep = "PATH=/bin:/usr/bin:/usr/ucb; egrep -s"; /* egrep */
pwck_dictionary(password, userid, mesgbuf)
char *password; /* Password to check */
int userid; /* NOTUSED */
char *mesgbuf; /* Message buffer */
{
int rcode; /* Return code temp */
char *p; /* Scratch */
dictionary *d; /* Current dictionary */
/*
* If there are any non-alpha characters
* don't bother with the dictionary checks.
*/
for (p = password; *p; p++) {
if (!isalpha(*p))
return(PWCK_OK);
}
#ifdef DEBUG
printf("pwck_dictionary: \"%s\"\n", password);
#endif
for (d = dictionaries; d; d = d->dict_next) {
#ifdef DEBUG
printf("\tdictionary '%s'\n", d->dict_path);
#endif
if ((rcode = InDictionary(d->dict_path, password)) != PWCK_OK){
(void) sprintf(mesgbuf,
"Password found in dictionary '%s'",
d->dict_path);
return(rcode);
}
}
return(PWCK_OK);
}
#ifdef MDBM
/*
* Use the 'mdbm' package by Chris Torek and others
*/
#include "mdbm.h"
#define DBM struct mdbm
#define DBM_FETCH mdbm_fetch
#define DBM_CLOSE mdbm_close
#endif
/*
* Using the 4.3BSD 'ndbm' routines
*/
#ifdef NDBM
#include <ndbm.h>
#define DBM_FETCH dbm_fetch
#define DBM_CLOSE dbm_close
#endif
/*
* InDictionary - look for <password> in <dictionary>
*
* Look in a DBM version of the dictionary if present,
* else use egrep to search the flat file.
*
* Look for <password>, then if the first letter
* is capitalized, force to lower and look again. I don't care
* if <password> is in the dictionary but has mixed case letters.
* BUT if the first letter has been capitalized, I care because
* that's not a sufficent permutation to be secure.
*
* If more than the first letter is capitalized, then the dictionary
* lookup will fail.
*
* Returns:
* PWCK_INDICT if <password> was found in <dictionary>
* PWCK_OK if not
*/
static
InDictionary(which_dictionary, password)
char *which_dictionary, /* Pathname of dictionary */
*password; /* Plaintext of password */
{
#if defined(NDBM) || defined(MDBM)
DBM *dbp; /* DBM database pointer */
datum k, /* DBM lookup key */
d; /* DBM lookup datum */
#endif
int uc = isupper(password[0]); /* Is first char UC? */
char pwtemp[BUFSIZ]; /* Scratch buffer */
#ifdef MDBM
if ((dbp = mdbm_open(which_dictionary, 0, 0,
(int *)0, (int *)0, (char *)0)) == (DBM *)0)
#endif
#ifdef NDBM
if ((dbp = dbm_open(which_dictionary, 0, 0)) == (DBM *)0)
#endif
{
char command[BUFSIZ]; /* Command build buffer */
int rc; /* Return code from sytem(3) */
if ((rc = open(which_dictionary, 0)) < 0)
return(PWCK_OK);
(void) close(rc);
/*
* If the first letter is capitalized, look for
* "[wW]ord" else look for "word"
*/
if (uc)
(void) sprintf(command,
"%s '^[%c%c]%s$' %s > /dev/null",
egrep, password[0], password[0] | 040,
&password[1], which_dictionary);
else
(void) sprintf(command, "%s '^%s$' %s > /dev/null",
egrep, password, which_dictionary);
rc = system(command);
if (rc == 0)
return(PWCK_INDICT);
else
return(PWCK_OK);
}
#if defined(NDBM) || defined(MDBM)
#define returnwith(code) { DBM_CLOSE(dbp); return(code); }
/*
* Look in the DBM version of the dictionary.
*/
(void) strcpy(pwtemp, password);
k.dptr = pwtemp;
k.dsize = strlen(pwtemp);
d = DBM_FETCH(dbp, k);
if (d.dptr)
returnwith(PWCK_INDICT);
if (uc) {
pwtemp[0] |= 040;
d = DBM_FETCH(dbp, k);
if (d.dptr)
returnwith(PWCK_INDICT);
}
returnwith(PWCK_OK);
#endif /* defined(NDBM) || defined(MDBM) */
}
/* End pwck_dict.c */