@@ -19,29 +19,30 @@ def get_args():
1919 parser .add_argument ('file' ,
2020 metavar = 'FILE' ,
2121 type = argparse .FileType ('r' ),
22- nargs = '+' ,
23- help = 'Input file(s)' )
22+ nargs = '*' ,
23+ help = 'Input file(s)' ,
24+ default = [open ('/usr/share/dict/words' )])
2425
2526 parser .add_argument ('-n' ,
2627 '--num' ,
2728 metavar = 'INT' ,
2829 type = int ,
29- default = 20 ,
30+ default = 3 ,
3031 help = 'Number of passwords to generate' )
3132
32- parser .add_argument ('-m ' ,
33- '--min_length ' ,
33+ parser .add_argument ('-w ' ,
34+ '--num_words ' ,
3435 metavar = 'INT' ,
3536 type = int ,
36- default = 8 ,
37- help = 'Minimum password length ' )
37+ default = 4 ,
38+ help = 'Number of words to use for password ' )
3839
39- parser .add_argument ('-x ' ,
40- '--max_length ' ,
40+ parser .add_argument ('-m ' ,
41+ '--min_word_len ' ,
4142 metavar = 'INT' ,
4243 type = int ,
43- default = 20 ,
44- help = 'Maximum password length' )
44+ default = 3 ,
45+ help = 'Minimum word length' )
4546
4647 parser .add_argument ('-s' ,
4748 '--seed' ,
@@ -65,32 +66,50 @@ def main():
6566 random .seed (args .seed )
6667 words = set ()
6768
69+ clean = lambda word : re .sub ('[^a-zA-Z]' , '' , word )
6870 for fh in args .file :
69- for word in fh .read ().split ():
70- words .add (re .sub ('[^a-zA-Z]' , '' , word ))
71+ for word in filter (lambda w : len (w ) > args .min_word_len ,
72+ map (clean ,
73+ fh .read ().lower ().split ())):
74+ words .add (word .title ())
7175
72- words = list (words )
76+ words = sorted ( list (words ) )
7377
74- for i in range (args .num ):
75- password = ''
76- while len (password ) < args .max_length :
77- password += random .choice (words )
78+ for _ in range (args .num ):
79+ password = '' .join (random .sample (words , args .num_words ))
80+ print (l33t (password ) if args .l33t else password )
7881
79- if args .l33t :
80- password = l33t (password )
81-
82- print (password )
8382
8483# --------------------------------------------------
8584def l33t (text ):
8685 """l33t"""
8786
88- xform = {'a' : '@' , 'A' : '4' , 'o' : '0' , 'O' : '0' }
87+ text = ransom (text )
88+ xform = {
89+ 'a' : '@' ,
90+ 'A' : '4' ,
91+ 'o' : '0' ,
92+ 'O' : '0' ,
93+ 't' : '+' ,
94+ 'e' : '3' ,
95+ 'E' : '3' ,
96+ 'I' : '1' ,
97+ 'S' : '5'
98+ }
8999 for x , y in xform .items ():
90100 text = text .replace (x , y )
91101
92102 return text
93103
104+
105+ # --------------------------------------------------
106+ def ransom (text ):
107+ """Randomly choose an upper or lowercase letter to return"""
108+
109+ return '' .join (
110+ map (lambda c : c .upper () if random .choice ([0 , 1 ]) else c .lower (), text ))
111+
112+
94113# --------------------------------------------------
95114if __name__ == '__main__' :
96115 main ()
0 commit comments