aboutsummaryrefslogtreecommitdiff
#!/bin/sh
#
# Utility to manage encrypted files using OpenSSL's pbkdf2.

set -eu

PROGNAME=vault
USAGE="${PROGNAME} <check|create|decrypt|edit|encrypt|reencrypt|> FILE..."
BOXCONF_ROOT=$(dirname "$(readlink -f "$0")")

usage(){
  printf 'usage: %s\n' "$USAGE" 2>&1
  exit 2
}

vault_check(){
  while [ $# -gt 0 ]; do
    if [ ! -f "$1" ]; then
      warn "file does not exist: ${1}"
    elif _boxconf_is_encrypted "$1"; then
      echo "${1} is encrypted"
    else
      echo "${1} is not encrypted"
    fi
    shift
  done
}

vault_create(){
  _boxconf_get_vault_password
  if [ -e "$1" ]; then
    die "file already exists: ${1}"
  else
    "$EDITOR" "$TMPFILE"
    PASS=$BOXCONF_VAULT_PASSWORD openssl enc -in "$TMPFILE" -out "$1" -e "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
  fi
}

vault_decrypt(){
  _boxconf_get_vault_password
  while [ $# -gt 0 ]; do
    if [ ! -f "$1" ]; then
      warn "file does not exist: ${1}"
    elif ! _boxconf_is_encrypted "$1"; then
      warn "file is not encrypted: ${1}"
    else
      PASS=$BOXCONF_VAULT_PASSWORD openssl enc -in "$1" -d "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
    fi
    shift
  done
}

vault_edit(){
  _boxconf_get_vault_password
  while [ $# -gt 0 ]; do
    if [ ! -f "$1" ]; then
      warn "file does not exist: ${1}"
    elif ! _boxconf_is_encrypted "$1"; then
      warn "file is not encrypted: ${1}"
    else
      PASS=$BOXCONF_VAULT_PASSWORD openssl enc -in "$1" -out "$TMPFILE" -d "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
      "$EDITOR" "$TMPFILE"
      PASS=$BOXCONF_VAULT_PASSWORD openssl enc -in "$TMPFILE" -out "$1" -e "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
    fi
    shift
  done
}

vault_encrypt(){
  _boxconf_get_vault_password
  while [ $# -gt 0 ]; do
    if [ ! -f "$1" ]; then
      warn "file does not exist: ${1}"
    elif _boxconf_is_encrypted "$1"; then
      warn "file is already encrypted, refusing: ${1}"
    else
      PASS=$BOXCONF_VAULT_PASSWORD openssl enc -in "$1" -out "$TMPFILE" -e "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
      cp "$TMPFILE" "$1"
    fi
    shift
  done
}

vault_reencrypt(){
  _boxconf_get_vault_password

  [ -n "${VAULT_NEW_PASSWORD:-}" ] \
    || _boxconf_read_password 'Enter new vault password: ' VAULT_NEW_PASSWORD

  while [ $# -gt 0 ]; do
    if [ ! -f "$1" ]; then
      warn "file does not exist: ${1}"
    elif ! _boxconf_is_encrypted "$1"; then
      warn "file is not encrypted: ${1}"
    else
      PASS=$BOXCONF_VAULT_PASSWORD openssl enc -in "$1" -out "$TMPFILE" -d "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
      PASS=$VAULT_NEW_PASSWORD openssl enc -in "$TMPFILE" -out "$1" -e "-${BOXCONF_VAULT_CIPHER}" -pass env:PASS -pbkdf2
    fi
    shift
  done
}

[ $# -gt 1 ] || usage
action=$1; shift

for _bc_lib in "${BOXCONF_ROOT}/lib"/*; do
  . "$_bc_lib"
done

TMPFILE=$(mktemp)
trap 'rm -f "$TMPFILE"' HUP INT QUIT TERM EXIT

case $action in
  check)     vault_check "$@" ;;
  create)    vault_create "$@" ;;
  decrypt)   vault_decrypt "$@" ;;
  edit)      vault_edit "$@" ;;
  encrypt)   vault_encrypt "$@" ;;
  reencrypt) vault_reencrypt "$@" ;;
  *)         usage ;;
esac