diff options
author | Simo Sorce <idra@samba.org> | 2005-12-26 17:22:46 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:05:58 -0500 |
commit | b7eec4e85693deedf14908cf909e39a2167558eb (patch) | |
tree | a0cf8a3e6afb62328a3d84d0ef7e62a36e306f7d | |
parent | c4ccc8f37ec4247a3a27277df14311389040fc25 (diff) | |
download | samba-b7eec4e85693deedf14908cf909e39a2167558eb.tar.gz samba-b7eec4e85693deedf14908cf909e39a2167558eb.tar.bz2 samba-b7eec4e85693deedf14908cf909e39a2167558eb.zip |
r12495: Crackcheck utility enhancement based on patch sent by Tom Geissler
(This used to be commit aa34304f61bd10cb1f80b4c0c27dd3834dc47fa3)
-rw-r--r-- | examples/auth/crackcheck/crackcheck.c | 73 |
1 files changed, 71 insertions, 2 deletions
diff --git a/examples/auth/crackcheck/crackcheck.c b/examples/auth/crackcheck/crackcheck.c index 338433779b..0636114a17 100644 --- a/examples/auth/crackcheck/crackcheck.c +++ b/examples/auth/crackcheck/crackcheck.c @@ -19,20 +19,81 @@ void usage(char *command) { exit(-1); } +int complexity(char* passwd) +{ + /* TG 26.10.2005 + * check password for complexity like MS Windows NT + */ + + int c_upper = 0; + int c_lower = 0; + int c_digit = 0; + int c_punct = 0; + int c_tot = 0; + int i, len; + + if (!passwd) goto fail; + len = strlen(passwd); + + for (i = 0; i < len; i++) { + + if (c_tot >= 3) break; + + if (isupper(passwd[i])) { + if (!c_upper) { + c_upper = 1; + c_tot += 1; + } + continue; + } + if (islower(passwd[i])) { + if (!c_lower) { + c_lower = 1; + c_tot += 1; + } + continue; + } + if (isdigit(passwd[i])) { + if (!c_digit) { + c_digit = 1; + c_tot += 1; + } + continue; + } + if (ispunct(passwd[i])) { + if (!c_punct) { + c_punct = 1; + c_tot += 1; + } + continue; + } + } + + if ((c_tot) < 3) goto fail; + return 0; + +fail: + fprintf(stderr, "ERR Complexity check failed\n\n"); + return -4; +} + int main(int argc, char **argv) { extern char *optarg; - int c; + int c, ret, complex_check = 0; char f[256]; char *dictionary = NULL; char *password; char *reply; - while ( (c = getopt(argc, argv, "d:")) != EOF){ + while ( (c = getopt(argc, argv, "d:c")) != EOF){ switch(c) { case 'd': dictionary = strdup(optarg); break; + case 'c': + complex_check = 1; + break; default: usage(argv[0]); } @@ -43,6 +104,7 @@ int main(int argc, char **argv) { usage(argv[0]); } + fflush(stdin); password = fgets(f, sizeof(f), stdin); if (password == NULL) { @@ -50,6 +112,13 @@ int main(int argc, char **argv) { exit(-2); } + if (complex_check) { + ret = complexity(password); + if (ret) { + exit(ret); + } + } + reply = FascistCheck(password, dictionary); if (reply != NULL) { fprintf(stderr, "ERR - %s\n\n", reply); |