|
Description:
I wanted a GUI pronouncable password generator that was not Internet based, that would meet the password rules required by the various systems that I work with. I've used a basic python program (non-GUI) modified to tcl/tk.
Source: Text Source
exec wish "$0" $(1+"$@")
package require BWidget
set version "1.1"
set licence "G.P.L"
set vowels { a e i o u }
set letters { b c d f g h j k l m n p q r s t v w x y z }
set digits { 0 1 2 3 4 5 6 7 8 9 }
set symbols { ! @ # $ % ^ & * ( ) _ - + }
proc appCreate { } {
set descmenu {
"&File" all file 0 {
{command "E&xit" {} "exit application" {} \
-command appExit }
}
"&Help" all help 0 {
{command "&About" {} "about the application" {} \
-command appHelpAbout }
}
}
wm title . "pass_gen"
set mainframe [MainFrame .mainframe -menu $descmenu ]
set titf1 [TitleFrame $mainframe.titf1 -text "Number of Characters" ]
set subf1 [$titf1 getframe]
set spin1 [SpinBox $subf1.spin -range { 4 20 1 } -textvariable alpha ]
pack $spin1 -side right
pack $titf1 -fill x -pady 2 -padx 2
set titf2 [TitleFrame $mainframe.titf2 -text "Number of Numbers" ]
set subf2 [$titf2 getframe]
set spin2 [SpinBox $subf2.spin -range { 1 10 1 } -textvariable numeric ]
pack $spin2 -side right
pack $titf2 -fill x -pady 2 -padx 2
set titf3 [TitleFrame $mainframe.titf3 -text "Symbol"]
set subf3 [$titf3 getframe]
set rad1 [radiobutton $subf3.rad1 -text "Yes" \
-variable wantsymbol -value 1]
set rad2 [radiobutton $subf3.rad2 -text "No" \
-variable wantsymbol -value 0]
pack $rad1 $rad2 -side left
pack $titf3 -fill x -pady 2 -padx 2
set titf4 [TitleFrame $mainframe.titf4 -text "Password"]
set subf4 [$titf4 getframe]
set ent1 [Entry $subf4.entry -textvariable genpassword]
pack $ent1 -pady 4 -anchor w -side left
pack $titf4
set but [Button $mainframe.but -text "New" \
-command "newPass" -helptext "create new password" ]
pack $but -side left -padx 4
wm protocol . WM_DELETE_WINDOW { appExit }
pack $mainframe -fill both -expand yes
update idletasks
}
proc newPass { } {
global genpassword alpha numeric wantsymbol
set fpl [ expr $alpha / 2 ]
if { $alpha % 2 } {
set fpl [ expr int(alpha / 2) + 1]
}
set lpl [ expr $alpha - $fpl ]
set start [ aPart $fpl ]
set mid [ nPart $numeric ]
set end [aPart $lpl ]
if { $wantsymbol == 1} {
set sym [ sPart ]
set genpassword [ format "%s%s%s%s" $start $mid $end $sym ]
} else {
set genpassword [format "%s%s%s" $start $mid $end ]
}
}
proc aPart { slen } {
global vowels letters
set vlen [ expr [ llength $vowels ] - 1 ]
set llen [ expr [ llength $letters ] - 1 ]
for { set i 0 } { $i < $slen } { incr i } {
if { $i % 2 == 0 } {
set randid [ expr int( rand() * $llen ) ]
append ret [ lindex $letters $randid ]
} else {
set randid [ expr int( rand() * $vlen ) ]
append ret [ lindex $vowels $randid ]
}
}
return $ret
}
proc nPart { slen } {
global digits
set dlen [ expr [ llength $digits] - 1 ]
for { set i 0 } { $i < $slen } { incr i } {
set randid [ expr int( rand() * $dlen ) ]
append ret [ lindex $digits $randid ]
}
return $ret
}
proc sPart { } {
global symbols
set sylen [ expr [ llength $symbols ] - 1 ]
set randid [ expr int( rand() * $sylen ) ]
append ret [ lindex $symbols $randid ]
return $ret
}
proc appExit { } {
exit
}
proc appHelpAbout { } {
global version licence
tk_messageBox -message "Generate pronouncable passwords in form of \n\
- word, \n\
- number, \n \
- word, \n \
- optional symbol.\n\
Author: Rob Haeusler.\n\
Version: $version.\n\
Licence: $licence."
}
proc main { } {
wm withdraw .
appCreate
wm deiconify .
}
main
The license for this recipe is available here.
Discussion:
We all need random passwords. This recipe is a basic one to meet the rules of smeserver and other systems that I work with
|