Password generator: Difference between revisions

Content added Content deleted
(Added Wren)
Line 4,740: Line 4,740:


3- Excl_Similar_Chars (Boolean) : True if you want the option of excluding visually similar characters.
3- Excl_Similar_Chars (Boolean) : True if you want the option of excluding visually similar characters.
</pre>

=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-ioutil}}
{{libheader|Wren-fmt}}
<lang python>import "random" for Random
import "/ioutil" for FileUtil, File, Input
import "/fmt" for Fmt
import "os" for Process

var r = Random.new()
var rr = Random.new() // use a separate generator for shuffles
var lb = FileUtil.lineBreak

var lower = "abcdefghijklmnopqrstuvwxyz"
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var digit = "0123456789"
var other = """!"#$%&'()*+,-./:;<=>?@[]^_{|}~"""

var exclChars = [
"'I', 'l' and '1'",
"'O' and '0' ",
"'5' and 'S' ",
"'2' and 'Z' "
]

var shuffle = Fn.new { |s|
var sl = s.toList
rr.shuffle(sl)
return sl.join()
}

var generatePasswords = Fn.new { |pwdLen, pwdNum, toConsole, toFile|
var ll = lower.count
var ul = upper.count
var dl = digit.count
var ol = other.count
var tl = ll + ul + dl + ol
var fw = toFile ? File.create("pwds.txt") : null
if (toConsole) System.print("\nThe generated passwords are:")
for (i in 0...pwdNum) {
var pwd = lower[r.int(ll)] + upper[r.int(ul)] + digit[r.int(dl)] + other[r.int(ol)]
for (j in 0...pwdLen - 4) {
var k = r.int(tl)
pwd = pwd + ((k < ll) ? lower[k] :
(k < ll + ul) ? upper[k - ll] :
(k < tl - ol) ? digit[k - ll - ul] : other[tl - 1 - k])
}
for (i in 1..5) pwd = shuffle.call(pwd) // shuffle 5 times say
if (toConsole) Fmt.print(" $2d: $s", i + 1, pwd)
if (toFile) {
fw.writeBytes(pwd)
if (i < pwdNum - 1) fw.writeBytes(lb)
}
}
if (toFile) {
System.print("\nThe generated passwords have been written to the file pwds.txt")
fw.close()
}
}

var printHelp = Fn.new {
System.print("""
This program generates up to 99 passwords of between 5 and 20 characters in
length.

You will be prompted for the values of all parameters when the program is run
- there are no command line options to memorize.

The passwords can either be written to the console or to a file (pwds.txt),
or both.

The passwords must contain at least one each of the following character types:
lower-case letters : a -> z
upper-case letters : A -> Z
digits : 0 -> 9
other characters : !"#$%&'()*+,-./:;<=>?@[]^_{|}~

Optionally, a seed can be set for the random generator
(any non-zero number) otherwise the default seed will be used.
Even if the same seed is set, the passwords won't necessarily be exactly
the same on each run as additional random shuffles are always performed.

You can also specify that various sets of visually similar characters
will be excluded (or not) from the passwords, namely: Il1 O0 5S 2Z

Finally, the only command line options permitted are -h and -help which
will display this page and then exit.

Any other command line parameters will simply be ignored and the program
will be run normally.

""")
}

var args = Process.arguments
if (args.count == 1 && (args[0] == "-h" || args[0] == "-help")) {
printHelp.call()
return
}

System.print("Please enter the following and press return after each one")

var pwdLen = Input.integer(" Password length (5 to 20) : ", 5, 20)
var pwdNum = Input.integer(" Number to generate (1 to 99) : ", 1, 99)

var seed = Input.number (" Seed value (0 to use default) : ")
if (seed != 0) r = Random.new(seed)

System.print(" Exclude the following visually similar characters")
for (i in 0..3) {
var yn = Input.option(" %(exclChars[i]) y/n : ", "ynYN")
if (yn == "y" || yn == "Y") {
if (i == 0) {
upper = upper.replace("I", "")
lower = lower.replace("l", "")
digit = digit.replace("1", "")
} else if (i == 1) {
upper = upper.replace("O", "")
digit = digit.replace("0", "")
} else if (i == 2) {
upper = upper.replace("S", "")
digit = digit.replace("5", "")
} else if (i == 3) {
upper = upper.replace("Z", "")
digit = digit.replace("2", "")
}
}
}

var toConsole = Input.option(" Write to console y/n : ", "ynYN")
toConsole = toConsole == "y" || toConsole == "Y"
var toFile = true
if (toConsole) {
toFile = Input.option(" Write to file y/n : ", "ynYN")
toFile = toFile == "y" || toFile == "Y"
}

generatePasswords.call(pwdLen, pwdNum, toConsole, toFile)</lang>

{{out}}
Sample run:
<pre>
Please enter the following and press return after each one
Password length (5 to 20) : 8
Number to generate (1 to 99) : 10
Seed value (0 to use default) : 0
Exclude the following visually similar characters
'I', 'l' and '1' y/n : n
'O' and '0' y/n : n
'5' and 'S' y/n : n
'2' and 'Z' y/n : n
Write to console y/n : y
Write to file y/n : y

The generated passwords are:
1: 53oR=Y|#
2: LdT,[7x=
3: puQwj#0N
4: kY0:zL~m
5: 01BN!fqZ
6: +3Si33[}
7: !MV:9/wC
8: gcAY0m#_
9: h45R)A|c
10: SGrpk:86

The generated passwords have been written to the file pwds.txt
</pre>
</pre>