#!/usr/bin/env bash
# fetch KeePass database passwords from kdewallet

### change the path to suit your installation or set KDBX_SEARCH before calling ###
: ${KDBX_SEARCH:=~/.KeePass/*.kdbx}

PROG=${0##*/}
KEEPASSXC=$(which -a keepassxc | sed -e "\\,$0,d" -e 'q')

daemon_main() {
  # open kdewallet
  handle=$(qdbus6 org.kde.kwalletd6 /modules/kwalletd6 open kdewallet 0 "$PROG")
  while [[ true != $(qdbus6 org.kde.kwalletd6 /modules/kwalletd6 isOpen kdewallet) ]]; do
    sleep 1
  done

  declare -A DBs
  for DBPATH in $(ls -r $KDBX_SEARCH); do
    DBs[$(realpath $DBPATH)]=$(qdbus6 org.kde.kwalletd6 /modules/kwalletd6 readPassword "$handle" "Passwords" "${DBPATH##*/}" "$PROG")
  done

  # launch real keepassxc
  IFS=$'\n\n\n'
  "$KEEPASSXC" --pw-stdin "${!DBs[@]}" <<<"${DBs[*]}" &

  # done with kdewallet
  qdbus6 org.kde.kwalletd6 /modules/kwalletd6 close "$handle" "false" "$PROG"
}

if [[ $1 == '-d' ]]; then
  exec >&~/tmp/$PROG.log
  set -vx
  daemon_main
else
  cd /
  daemon_main </dev/null >&/dev/null &
  disown
fi
