summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2013-04-08 09:02:51 +0200
committerPaul Buetow <paul@buetow.org>2013-04-08 09:02:51 +0200
commit757fe70cd77daa4a58aec21d2ef93fb40981bc6e (patch)
tree00dff20e63aa0d934833dba6e0add6e13c74ecf1 /bin
parent078807e927e4737ec6c37e8f02e5078ed9d0ad67 (diff)
more on the makefile
Diffstat (limited to 'bin')
-rwxr-xr-xbin/pwgrep.sh415
1 files changed, 415 insertions, 0 deletions
diff --git a/bin/pwgrep.sh b/bin/pwgrep.sh
new file mode 100755
index 0000000..b9d1edc
--- /dev/null
+++ b/bin/pwgrep.sh
@@ -0,0 +1,415 @@
+#!/bin/bash
+
+# pwgrep v0.8.2 (c) 2009, 2010, 2011, 2013 by Paul Buetow
+# pwgrep helps you to manage all your passwords using GnuGP
+# for encryption and a versioning system (subversion by default)
+# for keeping track all changes of your password database. In
+# combination to GnuPG you should use the versioning system in
+# combination with SSL or SSH encryption.
+
+# If you are using a *BSD, you may want to edit the shebang line.
+#
+# Usage:
+#
+# Searching for a database value:
+# ./pwgrep.sh searchstring
+#
+# Editing the database (same but without args):
+# ./pwgrep.sh
+#
+# For more reasonable commands the following symlinks are recommended.
+# Take a look at the create-symlinks.sh script.
+
+# You can overwrite the default values by setting env. variables
+# or by just editing this file.
+DEFAULTDB=private.gpg
+DEFAULTFILESTOREDIR=filestore
+DEFAULTFILESTORECATEGORY=default
+[ -z "$RCFILE" ] && RCFILE=~/.pwgreprc
+
+# Only use mawk or gawk, but if possible not nawk. On *BSD awk=nawk. So try
+# awk/nawk last. You can use nawk but nawk will not match case insensitive.
+[ -z "$TRYAWKLIST" ] && TRYAWKLIST="mawk gawk awk nawk"
+# Find the correct command to wipe temporaly files after usage
+[ -z "$TRYWIPELIST" ] && TRYWIPELIST="destroy shred"
+# Same for sed
+[ -z "$TRYSEDLIST" ] && TRYSEDLIST="sed gsed"
+
+# From here, do not change stuff! You may edit the content of the file $RCFILE!
+
+function source_config () {
+ [ -f $RCFILE ] && source <($SED 's/^/export /' $RCFILE)
+}
+
+function pwgrep_version () {
+ sed -n '/# pwgrep v/ { s/# //; p; q; }' $0
+}
+
+function configure () {
+ # Reading the current configuration
+ source_config
+
+ # Setting default values if not set in the configuration file already
+ (
+ #[ -z "$SVN_EDITOR" ] && echo 'export SVN_EDITOR="ex -c 1"'
+ [ -z "$GIT_EDITOR" ] && echo 'export GIT_EDITOR=vim'
+ [ -z "$DB" ] && echo DB=$DEFAULTDB
+ [ -z "$FILESTOREDIR" ] && echo export FILESTOREDIR=$DEFAULTFILESTOREDIR
+ [ -z "$FILESTORECATEGORY" ] && echo export FILESTORECATEGORY=$DEFAULTFILESTORECATEGORY
+
+ # The PWGREPWORDIR should be in its own versioning repository.
+ # For password revisions.
+ [ -z "$WORKDIR" ] && echo export WORKDIR=~/git/pwdb
+
+ # Enter here your GnuPG key ID
+ [ -z "$GPGKEYID" ] && echo export GPGKEYID=37EC5C1D
+
+ # Customizing the versioning commands (i.e. if you want to use another
+ # versioning system).
+ [ -z "$VERSIONCOMMIT" ] && echo 'export VERSIONCOMMIT="git commit -a"'
+ [ -z "$VERSIONUPDATE" ] && echo 'export VERSIONUPDATE="git pull origin master"'
+ [ -z "$VERSIONPUSH" ] && echo 'export VERSIONPUSH="git push origin master"'
+ [ -z "$VERSIONADD" ] && echo 'export VERSIONADD="git add"'
+ [ -z "$VERSIONDEL" ] && echo 'export VERSIONDEL="git rm"'
+ ) >> $RCFILE
+
+ # Re-reading the current configuration, because there might be new
+ # variables by now
+ source_config
+}
+
+function out () {
+ echo "$@" 1>&2
+}
+
+function info () {
+ out "=====> $@"
+}
+
+function error () {
+ echo "ERROR: $@"
+ exit 666
+}
+
+function findbin () {
+ local -r trylist=$1
+ found=""
+ for bin in $trylist; do
+ if [ -z $found ]; then
+ which=$(which $bin)
+ [ ! -z $which ] && found=$bin
+ fi
+ done
+
+ echo $found
+}
+
+function setawkcmd () {
+ AWK=$(findbin "$TRYAWKLIST")
+ [ -z $AWK ] && error No awk found in $PATH
+}
+
+function setsedcmd () {
+ SED=$(findbin "$TRYSEDLIST")
+ [ -z $SED ] && error No sed found in $PATH
+}
+
+function setwipecmd () {
+ WIPE=$(findbin "$TRYWIPELIST")
+
+ if [ -z $WIPE ]; then
+ # FreeBSDs rm includes -P which is secure enough
+ if [ $(uname) = 'FreBSD' ]; then
+ WIPE="rm -v -P"
+ else
+ error "No wipe command found in $PATH, please install shred or destroy"
+ fi
+ fi
+
+ info Using $WIPE for secure file deletion
+}
+
+function pwgrep () {
+ local -r search=$1
+ local -a dbs=()
+
+ if [ -z "$ALL" ]; then
+ dbs=$DB
+ else
+ dbs=$(_pwdbls | sed 's/$/.gpg/')
+ fi
+
+ for db in $dbs; do
+ info Searching for $search in $db
+ gpg --use-agent --decrypt $db | $AWK -v search="$search" '
+ BEGIN {
+ flag=0
+ IGNORECASE=1
+ }
+ !/^\t/ {
+ if (!flag && $0 ~ search) {
+ flag=1
+ print $0
+ } else if (flag && $0 ~ search) {
+ print $0
+ } else if (flag) {
+ flag=0
+ }
+ } /^\t/ && flag {
+ print $0
+ }'
+ done
+}
+
+function pwupdate () {
+ if [ -z "$NOVERSIONING" ]; then
+ info Updating repository
+ $VERSIONUPDATE 2>&1 >/dev/null
+ fi
+}
+
+function pwedit () {
+ pwupdate
+ cp -vp $DB $DB.$(date +'%s').snap && \
+ gpg --decrypt $DB > .database && \
+ vim --cmd 'set noswapfile' --cmd 'set nobackup' \
+ --cmd 'set nowritebackup' .database && \
+ gpg --output .$DB -e -r $GPGKEYID .database && \
+ $WIPE .database && \
+ mv .$DB $DB && \
+ [ -z "$NOVERSIONING" ] && $VERSIONCOMMIT && [ ! -z "$VERSIONPUSH" ] && $VERSIONPUSH
+}
+
+function _pwdbls () {
+ ls *.gpg | sed 's/\.gpg$//'
+}
+
+function pwdbls () {
+ echo Available Databases:
+ _pwdbls
+ echo Current database: $DB
+}
+
+function pwfls () {
+ local arg=$1
+
+ if [ "$ALL" = "1" ]; then
+ ALL=0
+ local -r dir=$WORKDIR/$FILESTOREDIR
+ [ ! -e $dir ] && error $dir does not exist
+
+ info Showing all categories
+ ls $dir | while read store; do
+ pwfls $store
+ done
+ else
+ local dir=$WORKDIR/$FILESTOREDIR
+
+ if [ -z "$USEFILESTORECATEGORY" ]; then
+ info Available file store categories:
+ dir=$WORKDIR/$FILESTOREDIR
+ info "(You may use '`basename $0` -d <CATEGORY>' to display containing files.)"
+ else
+ info Available files in store $FILESTORECATEGORY
+ dir=$WORKDIR/$FILESTOREDIR/$FILESTORECATEGORY
+ fi
+
+ [ ! -e $dir ] && error "Category ($dir) does not exist"
+ ls $dir
+ fi
+}
+
+function pwfcat () {
+ local arg=$1
+
+ if [ -z "$arg" ]; then
+ error "No file specified (hint: use pwfls)"
+
+ else
+ local -r dir=$WORKDIR/$FILESTOREDIR/$FILESTORECATEGORY
+ local -r file=$(echo $arg | sed 's/.gpg$//')
+
+ [ ! -e $dir ] && error "Category $FILESTORECATEGORY ($dir) does not exist"
+ [ ! -e $dir/$file.gpg ] && error "File $file in category $FILESTORECATEGORY does not exist"
+ gpg --decrypt $dir/$file.gpg
+ fi
+}
+
+function pwfadd () {
+ local -r name=$(echo $1 | sed 's/.gpg$//')
+ local srcfile=$1
+ local outfile=''
+
+ if [ $(echo "$srcfile" | grep -v '^/') ]; then
+ srcfile=$CWD/$srcfile
+ fi
+
+ if [ ! -z $2 ]; then
+ outfile=$(basename $2)
+ else
+ outfile=$(basename $name)
+ fi
+
+ pwupdate
+
+ [ -z "$name" ] && error Missing argument
+ if [ ! -e $FULLFILESTORE ]; then
+ info Creating new category
+ [ ! -z "$NOVERSIONING" ] && error Cannot add new category with versioning disabled
+ local -r umaskbackup=$(umask)
+ umask 0022
+ mkdir $FULLFILESTORE && $VERSIONADD $FULLFILESTORE && $VERSIONCOMMIT && [ ! -z "$VERSIONPUSH" ] && $VERSIONPUSH
+
+ umask $umaskbackup
+ fi
+
+ [ ! -e $FILESTOREWORKDIR ] && error $FILESTOREWORKDIR does not exist
+ gpg --output $FULLFILESTORE/$outfile.gpg -e -r $GPGKEYID $srcfile && \
+
+ if [ -z "$NOVERSIONING" ]; then
+ $VERSIONADD $FULLFILESTORE/$outfile.gpg && $VERSIONCOMMIT && [ ! -z "$VERSIONPUSH" ] && $VERSIONPUSH
+
+ fi
+}
+
+function pwfdel () {
+ local arg=$1
+
+ if [ -z "$arg" ]; then
+ error "No file specified (hint: use pwfls)"
+
+ else
+ local -r dir=$WORKDIR/$FILESTOREDIR/$FILESTORECATEGORY
+ local -r file=$(echo $arg | sed 's/.gpg$//')
+ local -r filepath=$dir/$file.gpg
+
+ [ ! -e $dir ] && error "Category $FILESTORECATEGORY ($dir) does not exist"
+ [ ! -e $filepath ] && error "File $file in category $FILESTORECATEGORY does not exist"
+
+ if [ -z "$NOVERSIONING" ]; then
+ # Wipe even encrypted file securely
+ $WIPE $filepath && \
+ touch $filepath && $VERSIONCOMMIT && \
+ $VERSIONDEL $filepath && $VERSIONCOMMIT
+ [ ! -z "$VERSIONPUSH" ] && $VERSIONPUSH
+ else
+ $WIPE $filepath
+ fi
+ fi
+}
+
+function fwipe () {
+ [ -z $1 ] && error Missing argument
+ $WIPE $CWD/$1
+}
+
+function pwhelp () {
+ info $(pwgrep_version)
+ info Possible operations are:
+cat <<END
+ fwipe <FILE> - Wiping a file
+ pwdbls - Listing available DBs
+ pwedit [OPTS] - Editing current DB
+ pwfadd <FILE> - Adding a file to FDB
+ pwfcat <NAME> - Printing a file from filestore to stdout
+ pwfdel <NAME> - Deleting a file from filestore
+ pwgrep [OPTS] <REGEX> - Grepping current DB
+ pwldb - Synonym for pwdbls
+ pwupdate - Updating FDB and all DBs
+ pwhelp - Printing this help screen
+Where OPTS are:
+ -o - Offline mode
+ -d <DB NAME> - Using a specific DB
+ -a - Searching all available DBs or categories at once
+END
+}
+
+setawkcmd
+setsedcmd
+setwipecmd
+
+configure
+
+CWD=$(pwd)
+#umask 177
+
+cd $WORKDIR || error "No such file or directory: $WORKDIR"
+
+BASENAME=$(basename $0)
+ARGS=$@
+
+function set_opts () {
+ case $ARGS in
+ -o*)
+ # Offlinemode
+ NOVERSIONING=1
+ ARGS=${ARGS[@]:2}
+ set_opts
+ ;;
+
+ -d*)
+ # Alternate DB
+ DB=$(echo $ARGS | $AWK '{ print $2 }')
+ FILESTORECATEGORY=$DB
+ USEFILESTORECATEGORY=1
+ ARGS=$(echo $ARGS | $SED "s/-d $DB//")
+ DB=$DB.gpg
+ set_opts
+ ;;
+
+ -a*)
+ # All DBs at once
+ which gpg-agent
+ if [ $? == "0" ]; then
+ ALL=1
+ ARGS=${ARGS[@]:2}
+ set_opts
+ else
+ error You need gpg-agent installed
+ fi
+ ;;
+
+ *)
+ esac
+}
+
+set_opts $ARGS
+FULLFILESTORE=$FILESTOREDIR/$FILESTORECATEGORY
+FILESTOREWORKDIR=$WORKDIR/$FULLFILESTORE
+
+case $BASENAME in
+ pwgrep)
+ pwgrep $ARGS
+ ;;
+ pwupdate)
+ pwupdate
+ ;;
+ pwedit)
+ pwedit
+ ;;
+ pwdbls)
+ pwdbls
+ ;;
+ pwldb)
+ pwdbls
+ ;;
+ pwfls)
+ pwfls $ARGS
+ ;;
+ pwfcat)
+ pwfcat $ARGS
+ ;;
+ pwfadd)
+ pwfadd $ARGS
+ ;;
+ pwfdel)
+ pwfdel $ARGS
+ ;;
+ fwipe)
+ fwipe $ARGS
+ ;;
+ *)
+ pwhelp
+ ;;
+esac
+