git.fiddlerwoaroof.com
Raw Blame History
#!/usr/bin/env bash
set -e -u -o pipefail

DUAL_CONTROL="$(command -v dual_control || printf '')"
DUAL_CONTROL="${DUAL_CONTROL:-./dual_control}"

get_key() {
  "$DUAL_CONTROL" | awk '$1 == "Key:" { print $2 }'
}

get_token() {
  "$DUAL_CONTROL" | awk '$2 == "Token:" { print $0 }'
}

qr() {
  local VAL=$1
  local MODE=${2:-ANSI}
  shift 2 || true

  qrencode -t $MODE $VAL
}

get_url() {
  local user="$(whoami)"
  printf "otpauth://totp/${user}?secret=$1"
}

main() {
  pushd "$(dirname $0)" > /dev/null
  local KEY="$(get_key)"
  local KEY_URL="$(get_url "$KEY")"
  local NONINTERACTIVE="$1"

  if command -v qrencode > /dev/null; then
    qr $KEY_URL
  else
    echo "Run 'yum install qrencode' to get a QR code"
  fi
  echo

  "$DUAL_CONTROL"
  local MORE
  while [[ -z "$NONINTERACTIVE" ]]; do
    read -r -p 'Another token [Y/n]? ' MORE
    MORE="${MORE:-y}"
    if [[ "${MORE/Y/y}" != 'y' ]]; then
      break
    fi
    get_token
  done

  popd > /dev/null
}

case "${1:-}" in
'-h')
  cat <<EOF
USAGE:
  $(basename $0) [--help]
  $(basename $0) [is_not_interactive]
EOF
  exit 0
  ;;

*)
  main "${1:-}"
esac