r12495: Crackcheck utility enhancement based on patch sent by Tom Geissler
authorSimo Sorce <idra@samba.org>
Mon, 26 Dec 2005 17:22:46 +0000 (17:22 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:05:58 +0000 (11:05 -0500)
examples/auth/crackcheck/crackcheck.c

index 338433779b0d6b0bbe99d881e1734cc215aa54c2..0636114a17cfb3700f5ebe3f30618c6da51ca2d8 100644 (file)
@@ -19,20 +19,81 @@ void usage(char *command) {
        exit(-1);
 }
 
        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 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;
 
 
        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;
                switch(c) {
                case 'd':
                        dictionary = strdup(optarg);
                        break;
+               case 'c':
+                       complex_check = 1;
+                       break;
                default:
                        usage(argv[0]);
                }
                default:
                        usage(argv[0]);
                }
@@ -43,6 +104,7 @@ int main(int argc, char **argv) {
                usage(argv[0]);
        } 
 
                usage(argv[0]);
        } 
 
+       fflush(stdin);
        password = fgets(f, sizeof(f), stdin);
 
        if (password == NULL) {
        password = fgets(f, sizeof(f), stdin);
 
        if (password == NULL) {
@@ -50,6 +112,13 @@ int main(int argc, char **argv) {
                exit(-2);
        }
 
                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);
        reply = FascistCheck(password, dictionary);
        if (reply != NULL) {
                fprintf(stderr, "ERR - %s\n\n", reply);