diff options
-rwxr-xr-x | otp.bash | 28 | ||||
-rwxr-xr-x | test/insert.t | 40 | ||||
-rw-r--r-- | test/setup.sh | 16 |
3 files changed, 68 insertions, 16 deletions
@@ -22,7 +22,7 @@ OATH=$(which oathtool) # Vars are consumed by caller # shellcheck disable=SC2034 otp_parse_uri() { - local uri="$*" + local uri="$1" uri="${uri//\`/%60}" uri="${uri//\"/%22}" @@ -75,17 +75,18 @@ otp_increment_counter() { } otp_insert() { + echo "args: $*" + local path="${1%/}" local passfile="$PREFIX/$path.gpg" local force=$2 local contents="$3" check_sneaky_paths "$path" + set_git "$passfile" [[ $force -eq 0 && -e $passfile ]] && yesno "An entry already exists for $path. Overwrite it?" - set_git "$passfile" - mkdir -p -v "$PREFIX/$(dirname "$path")" set_gpg_recipients "$(dirname "$path")" @@ -94,6 +95,25 @@ otp_insert() { git_add_file "$passfile" "Add given OTP secret for $path to store." } +otp_insert_uri() { + local opts force=0 + opts="$($GETOPT -o f -l force -n "$PROGRAM" -- "$@")" + local err=$? + eval set -- "$opts" + while true; do case $1 in + -f|--force) force=1; shift ;; + --) shift; break ;; + esac done + + [[ $err -ne 0 || $# -ne 2 ]] && die "Usage: $PROGRAM $COMMAND insert [--force,-f] uri pass-name" + + local uri="$1" + + otp_parse_uri "$uri" + + otp_insert "$2" $force "$otp_uri" +} + otp_insert_totp() { local opts contents secret="" algorithm="sha1" period=30 digits=6 force=0 opts="$($GETOPT -o s:a:p:d:f -l secret:,algorithm:,period:,digits:,force -n "$PROGRAM" -- "$@")" @@ -203,7 +223,7 @@ cmd_otp_insert() { case "$1" in totp) shift; otp_insert_totp "$@" ;; hotp) shift; otp_insert_hotp "$@" ;; - *) die "Invalid OTP type '$1'. May be one of 'totp' or 'hotp'" ;; + *) otp_insert_uri "$@" ;; esac } diff --git a/test/insert.t b/test/insert.t index a78971f..e04914e 100755 --- a/test/insert.t +++ b/test/insert.t @@ -4,16 +4,44 @@ export test_description="Tests pass otp insert commands" . ./setup.sh +test_expect_success 'Inserts a key URI' ' + uri="otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example" + + test_pass_init && + "$PASS" otp insert "$uri" passfile && + [[ $("$PASS" show passfile) == "$uri" ]] +' + +test_expect_success 'Prompts before overwriting key URI' ' + uri1="otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Foo" + uri2="otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Bar" + + test_pass_init && + "$PASS" otp insert "$uri1" passfile && + test_faketty "echo n | $PASS otp insert $uri2 passfile" && + [[ $("$PASS" show passfile) == "$uri1" ]] +' + +test_expect_success 'Force overwrites key URI' ' + uri1="otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Foo" + uri2="otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Bar" + + test_pass_init && + "$PASS" otp insert "$uri1" passfile && + "$PASS" otp insert -f "$uri2" passfile && + [[ $("$PASS" show passfile) == "$uri2" ]] +' + test_expect_success 'Inserts a basic TOTP key' ' - "$PASS" init $KEY1 && - "$PASS" otp insert totp -s AAAAAAAAAAAAAAAAAAAAA totp-secret + test_pass_init && + "$PASS" otp insert totp -s AAAAAAAAAAAAAAAAAAAAA passfile ' test_expect_success 'Commits insert to git' ' - git init "$PASSWORD_STORE_DIR" && - "$PASS" init $KEY1 && - "$PASS" otp insert totp -s AAAAAAAAAAAAAAAAAAAAA totp-secret2 && - git log --no-decorate -1 | grep "Add given OTP secret for totp-secret2 to store." + test_pass_init && + pass git init && + "$PASS" otp insert totp -s AAAAAAAAAAAAAAAAAAAAA passfile && + git log --no-decorate -1 | grep "Add given OTP secret for passfile to store." ' test_done diff --git a/test/setup.sh b/test/setup.sh index f896382..b363e6d 100644 --- a/test/setup.sh +++ b/test/setup.sh @@ -33,12 +33,6 @@ export PASSWORD_STORE_ENABLE_EXTENSIONS=true export PASSWORD_STORE_EXTENSIONS_DIR="$EXT_HOME" export PASSWORD_STORE_DIR="$SHARNESS_TRASH_DIRECTORY/test-store" -rm -rf "$PASSWORD_STORE_DIR" -mkdir -p "$PASSWORD_STORE_DIR" -if [[ ! -d $PASSWORD_STORE_DIR ]]; then - echo "Could not create $PASSWORD_STORE_DIR" - exit 1 -fi export GIT_DIR="$PASSWORD_STORE_DIR/.git" export GIT_WORK_TREE="$PASSWORD_STORE_DIR" @@ -65,3 +59,13 @@ KEY2="D774A374" # pass test key 2 KEY3="EB7D54A8" # pass test key 3 KEY4="E4691410" # pass test key 4 KEY5="39E5020C" # pass test key 5 + +# Test helpers +test_pass_init() { + rm -rf "$PASSWORD_STORE_DIR" + "$PASS" init "$KEY1" +} + +test_faketty() { + script -qfc "$(printf "%q " "$@")" +} |