0,0 → 1,66 |
#!/usr/bin/env python |
|
""" |
Simplistic Password Generator. |
""" |
|
# This file is released under the CC0 license (CC equivalent of Public Domain). |
# |
# License details: |
# http://creativecommons.org/publicdomain/zero/1.0/legalcode |
|
import random |
import string |
import locale |
import sys |
|
DEFAULT_RESULTS = 20 |
DEFAULT_LENGTH = 8 |
#Letters and digits are repeated to favour them |
FAVOURED_SET = string.lowercase + string.digits #string.letters |
STDSET = string.uppercase + string.punctuation |
DEFAULT_CSET = FAVOURED_SET * 8 + STDSET |
|
REJECTS_SET = [ 'l', '1', 'I', '0', 'O' ] # FIXME: What else? |
|
def pwgen(length=DEFAULT_LENGTH, possible=DEFAULT_CSET, reject_ambiguous=False): |
pw = '' |
rejects = [] |
if reject_ambiguous: |
rejects = REJECTS_SET |
for i in range(length): |
pick = random.choice(possible) |
while pick in rejects: |
pick = random.choice(possible) |
pw += pick |
return pw |
|
def main(argv): |
rounds = DEFAULT_RESULTS |
length = DEFAULT_LENGTH |
cset = DEFAULT_CSET |
reject_ambiguous = False |
|
# No need to use getopt or anything like it |
positional = [] |
for arg in argv: |
if arg in ( '-B', '--ambiguous' ): |
reject_ambiguous = True |
else: |
positional.append(arg) |
try: |
if len(positional) > 0: |
length = int(positional[0]) |
if len(positional) > 1: |
rounds = int(positional[1]) |
except ValueError: |
sys.stderr.write('Usage: pwgen [-B] [length] [num pw]\n'); |
sys.exit(2); |
|
for i in range(rounds): |
print pwgen(length=length, reject_ambiguous=reject_ambiguous) |
|
if __name__ == '__main__': |
locale.setlocale(locale.LC_ALL, 'C') |
main(sys.argv[1:]) |
|