Skip to content

Instantly share code, notes, and snippets.

@Mischi
Created February 22, 2015 21:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mischi/315bcdd74bd4bc7ed087 to your computer and use it in GitHub Desktop.
Save Mischi/315bcdd74bd4bc7ed087 to your computer and use it in GitHub Desktop.
openpass - cli password manager (inspired by http://www.passwordstore.org/)
#!/bin/ksh
#
# Copyright (c) 2015 Fabian Raetz <fabian.raetz@gmail.com>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# RUN_DEPENDS= security/reop \ sysutils/tree \ x11/xclip
# TODO clear xclip after 5? seconds
# TODO password lenght should be configurable
# TODO store TMPFILE/TMPFILE2 in tmpfs / mount/unmount for every use?
set -e
set +X
set -u
usage() {
echo "usage: ${0##*/} [-alrx] [-cdes pass]" >&2
exit 1
}
pass_show_all=false
pass_create=false
pass_delete=false
pass_edit=false
pass_ls=false
pass_show=false
pass_delete_recursive=
pass_use_xclip=false
pass=
(($# == 0)) && usage
while getopts "ac:e:d:k:lrs:x" OPT; do
case $OPT in
a)
pass_show_all=true
;;
c)
( $pass_delete || $pass_edit || $pass_show ) && usage
pass_create=true
pass=$OPTARG
;;
d)
( $pass_create || $pass_edit || $pass_show ) && usage
pass_delete=true
pass=$OPTARG
;;
e)
( $pass_create || $pass_delete || $pass_show ) && usage
pass_edit=true
pass=$OPTARG
;;
l)
pass_ls=true
;;
r)
pass_delete_recursive=-r
;;
s)
( $pass_create || $pass_delete || $pass_edit ) && usage
pass_show=true
pass=$OPTARG
;;
x)
pass_use_xclip=true
;;
*)
usage
;;
esac
done
shift $(($OPTIND -1))
(($# > 0)) && usage
PASSDIR=$HOME/.openpass
TMPFILE=`mktemp -t openpass.XXXXXXXXXX`
TMPFILE2=`mktemp -t openpass.XXXXXXXXXX`
clear_tmp() {
rm -f $TMPFILE $TMPFILE2
}
trap clear_tmp EXIT TERM INT
print_passwd() {
if $pass_show_all; then
cat $TMPFILE
return
fi
local passwd=`head -1 $TMPFILE`
if $pass_use_xclip; then
echo -n $passwd | xclip
else
echo $passwd
fi
}
check_passfile_not_exists() {
if [[ ! -e $1 ]]; then
echo "password file \"$pass\" doesn't exist" >&2
exit 1
fi
}
encrypt_file() {
reop -E -m $TMPFILE -x $1
}
decrypt_file() {
check_passfile_not_exists $1
reop -D -x $1 -m $TMPFILE
}
openpass_create() {
local pass_file="$PASSDIR/$pass"
if [[ -e $pass_file ]]; then
echo "password file \"$pass\" already exists" >&2
exit 1
fi
mkdir -p ${pass_file%/*}
openssl rand -base64 16 | sed -e 's/..$//' > $TMPFILE
encrypt_file $pass_file
print_passwd
}
openpass_delete() {
local pass_file="$PASSDIR/$pass"
check_passfile_not_exists $pass_file
rm $pass_delete_recursive -f $pass_file
}
openpass_edit() {
local pass_file="$PASSDIR/$pass"
decrypt_file $pass_file
cp $TMPFILE $TMPFILE2
vi -SF $TMPFILE
if ! cmp -s $TMPFILE $TMPFILE2; then
encrypt_file $pass_file
fi
}
openpass_show() {
local pass_file="$PASSDIR/$pass"
decrypt_file $pass_file
print_passwd
}
openpass_ls() {
tree -s $PASSDIR | sed -e 1d
}
[[ -d $PASSDIR ]] || mkdir $PASSDIR
$pass_create && openpass_create
$pass_delete && openpass_delete
$pass_edit && openpass_edit
$pass_show && openpass_show
$pass_ls && openpass_ls
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment