implement multiple remote protocol support

This commit is contained in:
zawwz 2021-07-08 14:46:33 +02:00
parent 037d4d0f65
commit d79363b0a6
7 changed files with 107 additions and 50 deletions

View file

@ -1,6 +1,6 @@
var_exclude = ZPASS_.* XDG_.* REMOTE_.* DISPLAY CONFIGFILE TMPDIR var_exclude = ZPASS_.* XDG_.* REMOTE_.* DISPLAY CONFIGFILE TMPDIR DEBUG
fct_exclude = _tty_on fct_exclude = _tty_on sftp_cmd ftps_cmd upload download list delete
zpass: src/* zpass: src/*
lxsh -o zpass -M --exclude-var "$(var_exclude)" --exclude-fct "$(fct_exclude)" src/main.sh lxsh -o zpass -M --exclude-var "$(var_exclude)" --exclude-fct "$(fct_exclude)" src/main.sh

View file

@ -29,7 +29,7 @@ pack()
if [ -n "$ZPASS_REMOTE_ADDR" ] if [ -n "$ZPASS_REMOTE_ADDR" ]
then then
ret=0 ret=0
sftp_upload "$1/$archive" "$datapath/$ZPASS_FILE$ZPASS_EXTENSION" || ret=$? remote upload "$1/$archive" "$datapath/$ZPASS_FILE$ZPASS_EXTENSION" || ret=$?
rm -f "$1/$archive" 2>/dev/null rm -f "$1/$archive" 2>/dev/null
return $ret return $ret
else else
@ -88,7 +88,7 @@ create() {
[ -n "$ZPASS_REMOTE_ADDR" ] && { [ -n "$ZPASS_REMOTE_ADDR" ] && {
ret=0 ret=0
ssh "$ZPASS_REMOTE_ADDR" "mkdir -p '$datapath'" ssh "$ZPASS_REMOTE_ADDR" "mkdir -p '$datapath'"
sftp_upload "$file" "$datapath/$ZPASS_FILE$ZPASS_EXTENSION" || ret=$? remote upload "$file" "$datapath/$ZPASS_FILE$ZPASS_EXTENSION" || ret=$?
rm -rf "$file" 2>/dev/null rm -rf "$file" 2>/dev/null
return $ret return $ret
} }

View file

@ -19,7 +19,7 @@ decrypt()
# get remote file # get remote file
[ -n "$ZPASS_REMOTE_ADDR" ] && { [ -n "$ZPASS_REMOTE_ADDR" ] && {
file="$TMPDIR/zpass_$(filehash)$ZPASS_EXTENSION" file="$TMPDIR/zpass_$(filehash)$ZPASS_EXTENSION"
sftp_download "$datapath/$ZPASS_FILE$ZPASS_EXTENSION" "$file" >/dev/null || return $? remote download "$datapath/$ZPASS_FILE$ZPASS_EXTENSION" "$file" >/dev/null || return $?
} }
cat "$file" >/dev/null 2>&1 || { echo "File doesn't exist. Use 'zpass create' to create the file" >&2 && return 1; } # no file cat "$file" >/dev/null 2>&1 || { echo "File doesn't exist. Use 'zpass create' to create the file" >&2 && return 1; } # no file

View file

@ -2,25 +2,20 @@
list_files() { list_files() {
if [ -n "$ZPASS_REMOTE_ADDR" ] ; then if [ -n "$ZPASS_REMOTE_ADDR" ] ; then
echo "$cmd" | sftp_cmd -b- << EOF remote list
cd "$datapath"
ls -1
EOF
else else
( ( cd "$datapath" && ls -1 )
cd "$datapath"
ls -1
)
fi | grep "$(escape_chars "$ZPASS_EXTENSION")$" fi | grep "$(escape_chars "$ZPASS_EXTENSION")$"
} }
remove_files() remove_files()
{ {
if [ -n "$ZPASS_REMOTE_ADDR" ] ; then for file
echo "$cmd" | sftp_cmd -b- << EOF do
rm "$datapath/$N$ZPASS_EXTENSION" if [ -n "$ZPASS_REMOTE_ADDR" ] ; then
EOF remote delete "$datapath/$file$ZPASS_EXTENSION"
else else
rm "$datapath/$N$ZPASS_EXTENSION" rm "$datapath/$file$ZPASS_EXTENSION"
fi fi
done
} }

View file

@ -26,20 +26,21 @@ usage()
rm-cache Delete the cached key for this file. Shortcut 'rmc' rm-cache Delete the cached key for this file. Shortcut 'rmc'
[Config]: [Config]:
*Variable* *Default value* *Description* *Variable* *Default value* *Description*
------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------
CONFIGFILE '\$XDG_CONFIG_HOME/zpass/defaut.conf' Path to the config file to load CONFIGFILE '\$XDG_CONFIG_HOME/zpass/defaut.conf' Path to the config file to load
ZPASS_PATH '\$XDG_DATA_HOME/zpass' Folder containing password files ZPASS_PATH '\$XDG_DATA_HOME/zpass' Folder containing password files
ZPASS_CACHE_PATH '\$XDG_CACHE_HOME/zpass' Path used for caching keys ZPASS_CACHE_PATH '\$XDG_CACHE_HOME/zpass' Path used for caching keys
ZPASS_FILE 'default' File to use for operations ZPASS_FILE 'default' File to use for operations
ZPASS_KEY Key to use for encrypting/decrypting files ZPASS_KEY Key to use for encrypting/decrypting files
ZPASS_KEY_CACHE_TIME '60' Time a key stays in cache for decrypting, in seconds ZPASS_KEY_CACHE_TIME '60' Time a key stays in cache for decrypting, in seconds
ZPASS_CLIPBOARD_TIME '30' Time until clipboard gets cleared after copy, in seconds ZPASS_CLIPBOARD_TIME '30' Time until clipboard gets cleared after copy, in seconds
ZPASS_UNK_OP_CALL 'copy' Operation to call on unrecognized first argument ZPASS_UNK_OP_CALL 'copy' Operation to call on unrecognized first argument
ZPASS_RAND_LEN Length of random passwords generated by 'new' ZPASS_RAND_LEN Length of random passwords generated by 'new'
ZPASS_REMOTE_ADDR SSH server the file is on ZPASS_REMOTE_METHOD 'scp' Method to use for remote file. scp/sftp/ftps
ZPASS_REMOTE_PORT '22' SSH server port ZPASS_REMOTE_ADDR Server the file is on
ZPASS_SSH_ID SSH private key to use ZPASS_REMOTE_PORT Server port
ZPASS_SSH_ID SSH private key to use for scp/sftp
All operations can be shortened to their first char unless specified All operations can be shortened to their first char unless specified
Unknown first argument will perform the operation described in 'ZPASS_UNK_OP_CALL' on that argument Unknown first argument will perform the operation described in 'ZPASS_UNK_OP_CALL' on that argument

View file

@ -1,5 +1,7 @@
#!/bin/lxsh #!/bin/lxsh
[ "$DEBUG" = true ] && set -x
%include util.sh config.sh *.sh %include util.sh config.sh *.sh
## pre exec ## pre exec

View file

@ -1,24 +1,83 @@
# $1 = cond value , $2 = precede , $3 = separator
cond_gen() {
[ -n "$1" ] && env printf "%q%s%q" "$2" "$3" "$1"
}
# $@ = command
ftps_cmd() {
shift 3
user=${ZPASS_REMOTE_ADDR%%@*}
host=${ZPASS_REMOTE_ADDR#*@}
lftp << EOF
set ftp:ssl-allow true ; set ssl:verify-certificate no ; set ftp:ssl-auth TLS
open ftp://$host$(cond_gen "$ZPASS_REMOTE_PORT" ":")
user $user $ZPASS_REMOTE_PASSWORD
$(cat)
EOF
}
# $@ = args # $@ = args
sftp_cmd() { sftp_cmd() {
[ -n "$ZPASS_REMOTE_ADDR" ] || return $? { sftp -b- $(cond_gen "$ZPASS_REMOTE_PORT" -P " ") $(cond_gen "$ZPASS_SSH_ID" -i " ") "$@" "$ZPASS_REMOTE_ADDR" || return $?; } | grep -v "^sftp>" || true
if [ -n "$ZPASS_SSH_ID" ] ; then
sftp -i "$ZPASS_SSH_ID" "$@" "$ZPASS_REMOTE_ADDR"
else
sftp "$@" "$ZPASS_REMOTE_ADDR"
fi | grep -v "^sftp>"
return 0
} }
# $1 = local file , $2 = remote file # $@ args
sftp_upload() { scp_cmd() {
sftp_cmd -b- >/dev/null << E scp $(cond_gen "$ZPASS_REMOTE_PORT" -P " ") $(cond_gen "$ZPASS_SSH_ID" -i " ") "$@"
put "$1" "$2"
E
} }
# $1 = remote file , $2 = local file # $@ = args
sftp_download() { ssh_cmd() {
sftp_cmd -b- >/dev/null << E ssh $(cond_gen "$ZPASS_REMOTE_PORT" -p " ") $(cond_gen "$ZPASS_SSH_ID" -i " ") "$@"
get "$1" "$2" }
E
# $1 = protocol , $2 = local file , $3 = remote file
upload() {
case $1 in
scp) scp_cmd "$2" "$ZPASS_REMOTE_ADDR:$3" ;;
sftp|ftps) "$1"_cmd >/dev/null << EOF
put "$2" "$3"
EOF
esac
}
# $1 = protocol, $2 = remote file , $3 = local file
download() {
case $1 in
scp) scp_cmd "$ZPASS_REMOTE_ADDR:$2" "$3" ;;
sftp|ftps) ${1}_cmd >/dev/null << EOF
get "$2" "$3"
EOF
esac
}
# $1 = protocol
list() {
case $1 in
scp) ssh_cmd "cd '$datapath' && ls -1" ;;
sftp|ftps) ${1}_cmd >/dev/null << EOF
cd "$datapath"
ls -1
EOF
esac
}
# $1 = protocol , $2 = file
delete() {
case $1 in
scp) ssh_cmd "rm '$2'" ;;
sftp|ftps) ${1}_cmd >/dev/null << EOF
rm "$2"
EOF
esac
}
# $1 = action , $@ = arguments
remote() {
action=$1
shift 1
case "${ZPASS_REMOTE_METHOD-scp}" in
scp|sftp|ftps) $action "${ZPASS_REMOTE_METHOD-scp}" "$@" ;;
*) echo "Unknown remote method: $ZPASS_REMOTE_METHOD" ;;
esac
} }