• Roman Perepelitsa's avatar
    fix(genpass): improve performance and usability and fix bugs (#9520) · b28665ae
    Roman Perepelitsa authored
    *Bugs*
    
    The following bugs have been fixed:
    
    - All generators ignored errors from external commands. For example,
      if `/usr/share/dict/words` was unreadable, `genpass-xkcd` would
      print "0-" as a password and return success.
    - All generators silently ignored the argument if it wasn't a number.
      For example, `genpass-apple -2` was generating one password and
      not printing any errors.
    - All generators silently ignored extra arguments. For example,
      `genpass-apple -n 2` was generating one password and not printing
      any errors.
    - `genpass-xkcd` was generating passwords with less than 128 bits of
      security margin in contradiction to documentation. The smaller the
      dictionary size, the weaker the passwords it was generating. For a
      dictionary with 27 words, `genpass-xkcd` was generating passwords
      with 93 bits of security margin (`log2(27!)`).
    - The source of random data used by `genpass-xkcd` was not
      cryptographically secure in contradiction to documentation. See:
      https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html
    - `genpass-apple` could generate a password with non-ascii characters
      depending on user locale. For example, passwords could contain 'İ'
      for users with Turkish locale.
    - `genpass-apple` didn't work with `ksh_arrays` shell option.
    - `genpass-xkcd` was printing spurious errors with `ksh_arrays` shell
      option.
    - `genpass-xkcd` was producing too short (weak) or too strong (long)
      and/or printing errors when `IFS` was set to non-default value.
    - All generators were printing fewer passwords than requested and
      returning success when passed a very large number as an argument.
    
    *Usability*
    
    Generators are now implemented as self-contained executable files.
    They can be invoked from scripts with no additional setup.
    
    Generators no longer depend on external commands. The only dependencies
    are `/dev/urandom` and, for `genpass-xkcd`, `/usr/share/dict/words`.
    
    All generators used to silently ignore all arguments after the first
    and the first argument if it wasn't a number. For example, both
    `genpass-apple -2` and `genpass-apple -n 2` were generating one password
    and not printing any errors. Now these print an error and fail.
    
    *Performance*
    
    The time it takes to load the plugin has been greatly reduced. This
    translates into faster zsh startup when the plugin is enabled.
    
    Incidentally, two generators out of three have been sped up to a large
    degree while one generator (`genpass-xkcd`) has gotten slower. This is
    unlikely to matter one way or another unless generating a very large
    number of passwords. In the latter case `genpass-xkcd` is now also
    faster than it used to be.
    
    The following table shows benchmark results from Linux x86-64 on i9-7900X.
    The numbers in the second and third columns show how many times a given
    command could be executed per second. Higher numbers are better.
    
    command                     | before (Hz) | after (Hz) | speedup |
    ----------------------------|------------:|-----------:|--------:|
    `source genpass.plugin.zsh` |        4810 |      68700 |  +1326% |
    `genpass-apple`             |        30.3 |        893 |  +2846% |
    `genpass-monkey`            |         203 |       5290 |  +2504% |
    `genpass-xkcd`              |        34.4 |       14.5 |    -58% |
    `genpass-xkcd 1000`         |       0.145 |      0.804 |   +454% |
    b28665ae
Name
Last commit
Last update
..
adb Loading commit data...
alias-finder Loading commit data...
ansible Loading commit data...
ant Loading commit data...
apache2-macports Loading commit data...
arcanist Loading commit data...
archlinux Loading commit data...
asdf Loading commit data...
autoenv Loading commit data...
autojump Loading commit data...
autopep8 Loading commit data...
aws Loading commit data...
battery Loading commit data...
bazel Loading commit data...
bbedit Loading commit data...
bgnotify Loading commit data...
boot2docker Loading commit data...
bower Loading commit data...
branch Loading commit data...
brew Loading commit data...
bundler Loading commit data...
cabal Loading commit data...
cake Loading commit data...
cakephp3 Loading commit data...
capistrano Loading commit data...
cargo Loading commit data...
cask Loading commit data...
catimg Loading commit data...
celery Loading commit data...
chruby Loading commit data...
chucknorris Loading commit data...
cloudapp Loading commit data...
cloudfoundry Loading commit data...
codeclimate Loading commit data...
coffee Loading commit data...
colemak Loading commit data...
colored-man-pages Loading commit data...
colorize Loading commit data...
command-not-found Loading commit data...
common-aliases Loading commit data...
compleat Loading commit data...
composer Loading commit data...
copybuffer Loading commit data...
copydir Loading commit data...
copyfile Loading commit data...
cp Loading commit data...
cpanm Loading commit data...
dash Loading commit data...
debian Loading commit data...
dircycle Loading commit data...
direnv Loading commit data...
dirhistory Loading commit data...
dirpersist Loading commit data...
django Loading commit data...
dnf Loading commit data...
dnote Loading commit data...
docker Loading commit data...
docker-compose Loading commit data...
docker-machine Loading commit data...
doctl Loading commit data...
dotenv Loading commit data...
dotnet Loading commit data...
droplr Loading commit data...
drush Loading commit data...
eecms Loading commit data...
emacs Loading commit data...
ember-cli Loading commit data...
emoji Loading commit data...
emoji-clock Loading commit data...
emotty Loading commit data...
encode64 Loading commit data...
extract Loading commit data...
fabric Loading commit data...
fancy-ctrl-z Loading commit data...
fasd Loading commit data...
fastfile Loading commit data...
fbterm Loading commit data...
fd Loading commit data...
fedora Loading commit data...
firewalld Loading commit data...
flutter Loading commit data...
forklift Loading commit data...
fossil Loading commit data...
frontend-search Loading commit data...
fzf Loading commit data...
gas Loading commit data...
gatsby Loading commit data...
gb Loading commit data...
gcloud Loading commit data...
geeknote Loading commit data...
gem Loading commit data...
genpass Loading commit data...
git Loading commit data...
git-auto-fetch Loading commit data...
git-escape-magic Loading commit data...
git-extras Loading commit data...
git-flow Loading commit data...
git-flow-avh Loading commit data...
git-hubflow Loading commit data...
git-lfs Loading commit data...
git-prompt Loading commit data...
gitfast Loading commit data...
github Loading commit data...
gitignore Loading commit data...
glassfish Loading commit data...
globalias Loading commit data...
gnu-utils Loading commit data...
go Loading commit data...
golang Loading commit data...
gpg-agent Loading commit data...
gradle Loading commit data...
grails Loading commit data...
grc Loading commit data...
grunt Loading commit data...
gulp Loading commit data...
hanami Loading commit data...
helm Loading commit data...
heroku Loading commit data...
history Loading commit data...
history-substring-search Loading commit data...
hitokoto Loading commit data...
homestead Loading commit data...
httpie Loading commit data...
ionic Loading commit data...
ipfs Loading commit data...
iterm2 Loading commit data...
jake-node Loading commit data...
jenv Loading commit data...
jfrog Loading commit data...
jhbuild Loading commit data...
jira Loading commit data...
jruby Loading commit data...
jsontools Loading commit data...
jump Loading commit data...
kate Loading commit data...
keychain Loading commit data...
kitchen Loading commit data...
knife Loading commit data...
knife_ssh Loading commit data...
kops Loading commit data...
kube-ps1 Loading commit data...
kubectl Loading commit data...
lando Loading commit data...
laravel Loading commit data...
laravel4 Loading commit data...
laravel5 Loading commit data...
last-working-dir Loading commit data...
lein Loading commit data...
lighthouse Loading commit data...
lol Loading commit data...
lxd Loading commit data...
macports Loading commit data...
magic-enter Loading commit data...
man Loading commit data...
marked2 Loading commit data...
mercurial Loading commit data...
meteor Loading commit data...
microk8s Loading commit data...
minikube Loading commit data...
mix Loading commit data...
mix-fast Loading commit data...
mosh Loading commit data...
mvn Loading commit data...
mysql-macports Loading commit data...
n98-magerun Loading commit data...
nanoc Loading commit data...
ng Loading commit data...
nmap Loading commit data...
node Loading commit data...
nomad Loading commit data...
npm Loading commit data...
npx Loading commit data...
nvm Loading commit data...
oc Loading commit data...
osx Loading commit data...
otp Loading commit data...
pass Loading commit data...
paver Loading commit data...
pep8 Loading commit data...
per-directory-history Loading commit data...
percol Loading commit data...
perl Loading commit data...
perms Loading commit data...
phing Loading commit data...
pip Loading commit data...
pipenv Loading commit data...
pj Loading commit data...
please Loading commit data...
pod Loading commit data...
postgres Loading commit data...
pow Loading commit data...
powder Loading commit data...
powify Loading commit data...
profiles Loading commit data...
pyenv Loading commit data...
pylint Loading commit data...
python Loading commit data...
rails Loading commit data...
rake Loading commit data...
rake-fast Loading commit data...
rand-quote Loading commit data...
rbenv Loading commit data...
rbfu Loading commit data...
react-native Loading commit data...
rebar Loading commit data...
redis-cli Loading commit data...
repo Loading commit data...
ripgrep Loading commit data...
ros Loading commit data...
rsync Loading commit data...
ruby Loading commit data...
rust Loading commit data...
rustup Loading commit data...
rvm Loading commit data...
safe-paste Loading commit data...
salt Loading commit data...
sbt Loading commit data...
scala Loading commit data...
scd Loading commit data...
screen Loading commit data...
scw Loading commit data...
sdk Loading commit data...
sfdx Loading commit data...
sfffe Loading commit data...
shell-proxy Loading commit data...
shrink-path Loading commit data...
singlechar Loading commit data...
spring Loading commit data...
sprunge Loading commit data...
ssh-agent Loading commit data...
stack Loading commit data...
sublime Loading commit data...
sublime-merge Loading commit data...
sudo Loading commit data...
supervisor Loading commit data...
suse Loading commit data...
svcat Loading commit data...
svn Loading commit data...
svn-fast-info Loading commit data...
swiftpm Loading commit data...
symfony Loading commit data...
symfony2 Loading commit data...
systemadmin Loading commit data...
systemd Loading commit data...
taskwarrior Loading commit data...
terminitor Loading commit data...
terraform Loading commit data...
textastic Loading commit data...
textmate Loading commit data...
thefuck Loading commit data...
themes Loading commit data...
thor Loading commit data...
tig Loading commit data...
timer Loading commit data...
tmux Loading commit data...
tmux-cssh Loading commit data...
tmuxinator Loading commit data...
torrent Loading commit data...
transfer Loading commit data...
tugboat Loading commit data...
ubuntu Loading commit data...
ufw Loading commit data...
urltools Loading commit data...
vagrant Loading commit data...
vagrant-prompt Loading commit data...
vault Loading commit data...
vi-mode Loading commit data...
vim-interaction Loading commit data...
virtualenv Loading commit data...
virtualenvwrapper Loading commit data...
vscode Loading commit data...
vundle Loading commit data...
wakeonlan Loading commit data...
wd Loading commit data...
web-search Loading commit data...
wp-cli Loading commit data...
xcode Loading commit data...
yarn Loading commit data...
yii Loading commit data...
yii2 Loading commit data...
yum Loading commit data...
z Loading commit data...
zeus Loading commit data...
zsh-interactive-cd Loading commit data...
zsh-navigation-tools Loading commit data...
zsh_reload Loading commit data...