|
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: 4195 (0x1063) Types: TextFile Names: »pwck_lexical.c«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦123909933⟧ »./npasswd/npasswd.tar.Z« └─⟦22a202e7d⟧ └─⟦this⟧ »npass-new/npasswd_jpl/old.checkpasswd/pwck_lexical.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_lexical - Perform lexical analysis of password candidate. * * Things which are ok: * Mixed case * Digits * Punctutation * Control characters (except for those in the forbidden table) * * Things which are NOT ok: * Passwords less than 'min_length' characters * Runs of more than <run_length> of the same character * (e.g. 'zzz') * Single-case strings (selectable via the config file) * * Things NOT checked for: * Cycles of character groups (e.g. 'aabbcc' or 'ababab') * Sequential characters 'abcdef' or '123456' */ #ifndef lint static char sccsid[] = "@(#)pwck_lexical.c 1.3 11/7/89 (cc.utexas.edu)"; #endif #include "checkpasswd.h" #define P_U 0x1 /* Upper case in password */ #define P_L 0x2 /* Lower case in password */ #define P_C 0x4 /* Control chars in password */ #define P_D 0x8 /* Digits in password */ #define P_P 0x10 /* Punctutation chars in password */ #define hasone(P) (what |= (P)) #define hasany(P) ((what & (P)) == (P)) pwck_lexical(password, userid, mesg) char *password; /* Password to check */ int userid; /* NOTUSED */ char *mesg; /* Message buffer */ { int rc; /* Duplicate character run count */ char *p = password; /* Scratch */ char what = 0, /* Lexical analysis result flags */ last = 0; /* Last character seen (for run checks) */ mesg[0] = 0; #ifdef DEBUG printf("pwck_lexical: \"%s\"\n", password); #endif rc = strlen(password); if (min_length && rc < min_length) return(PWCK_SHORT); /* * Only the first <max_length> characters of a password are actually * used due to the limitations of crypt(3). If the given * password is longer than this, issue warning message. */ if (max_length && rc > max_length) { printf("WARNING: Only the first %d characters of this password will be used \n", max_length); } for (p = password; *p; p++) { if (*p != last) { last = *p; rc = 1; } else { /* Run of same characters */ if (run_length && ++rc >= run_length) { (void) sprintf(mesg, "This password has %d or more repeated characters", run_length); return(PWCK_OBVIOUS); } } if (*p < ' ' || *p > '~') { /* Non-printing character */ char *_ctran(); if (print_only) { (void) strcpy(mesg, "This password has non-printing characters"); return(PWCK_ILLCHAR); } if (index(illegalcc, *p)) { (void) sprintf(mesg, "Illegal character '%s' in this password", _ctran(*p)); return(PWCK_ILLCHAR); } hasone(P_C); } else if (isupper(*p)) hasone(P_U); else if (islower(*p)) hasone(P_L); else if (ispunct(*p)) hasone(P_P); else if (isdigit(*p)) hasone(P_D); } if (hasany(P_U | P_L)) return(PWCK_OK); /* UC+lc */ if (hasany(P_D)) return(PWCK_OK); /* Numbers */ if (hasany(P_P)) return(PWCK_OK); /* Punctutation chars */ if (hasany(P_C)) return(PWCK_OK); /* Control chars */ /* * Check for mono-case passwords */ if (!hasany(P_U) && single_case) /* All lower case alpha */ return(PWCK_OK); if (!hasany(P_L) && single_case) /* All upper case alpha */ return(PWCK_OK); if (!hasany(P_L)) (void) strcpy(mesg, "Upper-case only passwords not allowed"); if (!hasany(P_U)) (void) strcpy(mesg, "Lower-case only passwords not allowed"); return(PWCK_ILLCHAR); } /* End pwck_lexical.c */