Password Generator in tk/tcl

The basis for this program was written in another lifetime to create basically pronouncable passwords for students.


#!/bin/sh
# pass_gen - create pronouncable passwords with 4-20 characters, 1-10 numbers
# and optional symbol
# author:Morpheus Being
# licence: GPL
# tested on
# puppy linux - initial development and testing
# xubutu
# windows xp
#
# changelog
# 1.5 - Added capital letters
# 1.4 - added template for different forms of password
# 1.3
# 1.2 - fixed random problem not choosing z u 9 etc
# 1.1 - mods to allow different lengths of vowels, letters, digits, symbols
# 1.0 - initial development
#
#\
exec wish "$0" "$@"

package require BWidget

set version "1.5"
set licence "G.P.L"
set author "Morpheus Being"
set dupdate "August 2018"

# data sets used for creating the password
set vowels { a e i o u 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 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 { ! @ # $ % ^ & * ( ) _ - + }

# -----------------------------------------------------------------------------
# appCreate - create window frame and all its contents, spinboxes, buttons,
# display elements
#
proc appCreate { } {
variable version

# menu description
set descmenu {
"&File" all file 0 {
{command "E&xit" {} "exit application" {} \
-command appExit }
}
"&Help" all help 0 {
{command "H&ow To Use" {} "how to use" {} \
-command appHelpHow }
{command "&About" {} "about the application" {} \
-command appHelpAbout }
}
}

# create the main menu
wm title . "Password Generator $version"
set wid [expr {25*[font measure mydefault 0]}]
set mainframe [MainFrame .mainframe -menu $descmenu -width $wid]

# create spinboxes for number of letters and numbers
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

# create radio button (yes/no choice) for symbols
set titf3 [TitleFrame $mainframe.titf3 -text "Symbol"]
set subf3 [$titf3 getframe]
set rad1 [radiobutton $subf3.rad1 -text "Yes" \
-variable wantsymbol -value 1 -relief "flat"]
set rad2 [radiobutton $subf3.rad2 -text "No" \
-variable wantsymbol -value 0 -relief "flat"]

pack $rad1 $rad2 -side left
pack $titf3 -fill x -pady 2 -padx 2

# create radiobutton for format type
set titf4 [TitleFrame $mainframe.titf4 -text "Format - symbol is optional"]
set subf4 [$titf4 getframe]
set rad3 [radiobutton $subf4.rad3 -text "w(s)nw" \
-variable ftype -value 0 ]
set rad4 [radiobutton $subf4.rad4 -text "ww(s)n" \
-variable ftype -value 1 ]

pack $rad3 $rad4 -side left
pack $titf4 -fill x -pady 2 -padx 2

# create display box for generated passwords
set titf5 [TitleFrame $mainframe.titf5 -text "Password"]
set subf5 [$titf5 getframe]
set ent1 [Entry $subf5.entry -textvariable genpassword]

pack $ent1 -pady 4 -anchor w -side left
pack $titf5

# create button for generating new password
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
}

#
# newPass - determine how many letters, vowels, digits, symbols and display the
# created password
#
proc newPass { } {
global genpassword alpha numeric wantsymbol ftype

set fpl [ expr $alpha / 2 ]

if { $alpha % 2 } {
set fpl [ expr int($alpha / 2) + 1]
}

set lpl [ expr $alpha - $fpl ]

# to change format of password edit following lines
set start [ aPart $fpl ]
set mid [ nPart $numeric ]
set end [aPart $lpl ]

# want symbol in password
if { $wantsymbol == 1 } {
set sym [ sPart ]
}

# which type of format to display
switch $ftype {
0 {
if { $wantsymbol == 1} {
set genpassword [ format "%s%s%s%s" $start $sym $mid $end ]
} else {
set genpassword [format "%s%s%s" $start $mid $end ]
}
}
1 {
if { $wantsymbol == 1} {
set genpassword [ format "%s%s%s%s" $start $end $sym $mid ]
} else {
set genpassword [format "%s%s%s" $start $end $mid ]
}
}
}
}

#
# aPart - return randomly selected letters and vowels from the lists
#
proc aPart { slen } {
global vowels letters

set vlen [ expr [ llength $vowels ] ]
set llen [ expr [ llength $letters ] ]

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 } # # nPart - return randomly selected digit(s) from the digit list # proc nPart { slen } { global digits set dlen [ expr [ llength $digits] ] for { set i 0 } { $i < $slen } { incr i } { set randid [ expr int( rand() * $dlen ) ] append ret [ lindex $digits $randid ] } return $ret } # # sPart - return randonly selected symbol from the list # proc sPart { } { global symbols set sylen [ expr [ llength $symbols ] ] set randid [ expr int( rand() * $sylen ) ] append ret [ lindex $symbols $randid ] return $ret } # # appExit - selected from menu # proc appExit { } { set choice [ tk_messageBox -message "Are you sure you want to exit?"\ -icon question -type yesnocancel ] if {$choice == "yes" } { exit } } # appHelpHow proc appHelpHow { } { tk_messageBox -message "Select the number of\n\ - letters\n\ - numbers\n\Aug 2018 - optional symbol\n\ - format\n\ before pressing the \bNew\b button.\n" } # # appHelpAbout - display info about the program in new disposable window # proc appHelpAbout { } { global version licence author dupdate tk_messageBox -message "Written in tk/tcl.\n\ Author: $author. \n\ Date: $dupdate \n\ Updated: $update. \n\ Version: $version.\n\ Licence: $licence." } # # main procedure to manage window creation and destruction # proc main { } { wm withdraw . appCreate wm deiconify . } main #---------------------------- end of program ----------------------------------

My New .vimrc

Recently rebuilt my laptop with latest Debian Testing after HDD failure. While I was at it, I redid my .vimrc file to suit new activities better. Remember to have git installed along with vundle from github first, ignore errors, then once vim/gvim loaded run :PluginInstall.

set nocompatible " required
filetype off " required

" set the run time path and initialise vundle
set rtp+=~/.vim/bundle/Vundle.vim

call vundle#begin()

" let Vundle manage itself
Plugin 'VundleVim/Vundle.vim'

" Now do the extras
Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-git'
Plugin 'tpope/vim-obsession'
Plugin 'tpope/vim-sleuth'

" Plugin 'vimoutliner'
Plugin 'scrooloose/syntastic'
Plugin 'scrooloose/nerdtree'

" statusbar
Plugin 'vim-airline/vim-airline'
Plugin 'ervandew/supertab'
Plugin 'majutsushi/tagbar'
Plugin 'lervag/vimtex'
Plugin 'airblade/vim-gitgutter'
Plugin 'tpope/vim-surround'
Plugin 'vim-pandoc/vim-pandoc'
Plugin 'vim-pandoc/vim-pandoc-syntax'

" Plugin 'LaTeX-Box-Team/LaTeX-Box'
" Colourscheme stuff
Plugin 'nightsense/night-and-day'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tpope/vim-vividchalk'
Plugin 'gkjgh/cobalt'

" all plugins must be installed before this line

call vundle#end() " required

" now able to turn filetype back on
filetype plugin indent on " required
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
"------------------------------------------------------------
" Other settings
"------------------------------------------------------------
set encoding=utf-8 " handle all characters
set mouse=a " mouse every where
set ff=unix " set file format to unix
set spelllang=en_au " set spellcheck language to english
syntax enable " syntax highlighting with current colour scheme
set termguicolors

"------------------------------------------------------------
" tree view
"------------------------------------------------------------
let g:netrw_liststyle=3

"------------------------------------------------------------
" Console UI and Text Display
"------------------------------------------------------------
set vb t_vb =
set ruler
set noerrorbells
set scrolloff=5
set number " line numbering
set smartindent autoindent " smart indent and autoindenting
set showmatch " show matches

"------------------------------------------------------------
" TAB specific options
"------------------------------------------------------------
set tabstop=4
set expandtab
set softtabstop=4
set shiftwidth=4
set smarttab
set shiftround
set nojoinspaces

"------------------------------------------------------------
" colourscheme settings
"------------------------------------------------------------

let g:nd_themes = [
\ ['07:00', 'solarized', 'light' ],
\ ['18:00', 'cobalt', 'dark' ],
\ ]

"if &t_Co >= 256 || has("gui_running")
" set lines=35 columns=100
" set background=light
" colorscheme solarized
"colorscheme calmar256-dark
"else
" set t_Co=256
" " set background=dark
" colorscheme solorized
"endif

set wildmenu
set wildmode=list:longest

set fileformats=unix,dos,mac
filetype plugin indent on "

"------------------------------------------------------------
" gui font settings
" -----------------------------------------------------------
if has('gui_running')
set guifont=Lucida_Console:h11
endif

"------------------------------------------------------------
" Search settings
"------------------------------------------------------------
set incsearch
set ignorecase
set smartcase

"------------------------------------------------------------
" check for custom .vim.custom in a folder
"------------------------------------------------------------
if filereadable(".vim.custom")
so .vim.custom
endif

"------------------------------------------------------------
" vim-airline
" -----------------------------------------------------
" enable/disable fugitive/lawrencium integration
let g:airline#extensions#branch#enabled = 1
" change the text for when no branch is detected
let g:airline#extensions#branch#empty_message = ''
" enable/disable syntastic integration
let g:airline#extensions#branch#syntastic#enabled = 1
let g:airline#extensions#tabline#enabled = 1

"-----------------------------------------------------------
" syntastic extensions
"------------------------------------------------------------
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1 " always show error list
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
" to toggle between active/passive type checking
map e :Errors
map s :SyntasticToggleMode

nmap :TagbarToggle

"-----------------------------------------------------
" doxygen settings
"----------------------------------------------------
" nmap :Dox
" nmap :DocLic

"----------------------------------------------------
" statusline
"----------------------------------------------------
set statusline=%-5.3n\ %F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]%=\ [ASCII=\03.3b]\ [HEX=\02.2B]\ [POS=%04l,%04v][%p%%]\ [LEN=%L]
set laststatus=2
set cmdheight=1

"---------------------------------------------------
" hdevtools
" --------------------------------------------------
au FileType haskell nnoremap :HdevtoolsType
au FileType haskell nnoremap :HdevtoolsClear

"-------------------------------------------------------------
" Word processing mode
"
function! WordProcessorMode()
setlocal formatoptions=1
setlocal noexpandtab
map j gj
map k gk
setlocal spell spelllang=en_gb
set thesaurus+=/home/robin/.vimrc/thesaurus/mythesaur.txt
set complete+=s
set formatprg=par
setlocal wrap
setlocal linebreak
endfunction
com! WP call WordProcessorMode()

" ---------------------------------------------------------------------------
" latex stuff
"----------------------------------------------------------------------------

"
" Nerdtree settings
"
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif

autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif

map :NERDTreeToggle

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif