#!/bin/sh
# Export pass store to CSV format on stdout.  Version 1
# Use PASSWORD_STORE_DIR environment variable to override location.

encode() {
   # If first argument is 1, then only output the first line.
   # Encode double-quote character as CSV-escaped ""
   # Encode newline character as C-escaped \n

   awk -v onlyfirst="$1" '{
       if (length(last) > 0) {
           if (onlyfirst) exit
           gsub(/"/, "\"\"", last)
           printf "%s%cn", last, "\\"
       }
       last = $0
   }

   END {
       if (length(last) > 0) {
           gsub(/"/, "\"\"", last)
           printf "%s", last
       }
   }'
   return
}

PASSWORD_STORE_DIR=${PASSWORD_STORE_DIR:-$HOME/.password-store}
fileList=$(mktemp)
trap "rm $fileList" 0
cd $PASSWORD_STORE_DIR
find . -type f -name '*.gpg' | sed -e 's/^\.\///' | sort >$fileList
cd - >/dev/null
printf "Name,Password,User1,Url1,Email1,Users,Urls,Emails\n"
while read
do
   name=${REPLY%%.gpg}
   password=$(pass "$name" | encode 1)
   user1=$(pass "$name" | grep -i -e UserName: -e User: -e Login: | encode 1)
   users=$(pass "$name" | grep -i -e UserName: -e User: -e Login: | encode)
   url1=$(pass "$name" | grep -i URL: | encode 1)
   urls=$(pass "$name" | grep -i URL: | encode)
   email1=$(pass "$name" | grep -i -e email: -e e-mail: | encode 1)
   emails=$(pass "$name" | grep -i -e email: -e e-mail: | encode)
   printf "\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n" \
       "$name" "$password" "$user1" "$url1" "$email1" "$users" \
       "$urls" "$emails"
done <$fileList
exit