3 # need to set these shell options before they are relied upon when bash parses the big { ... } block later down.
5 shopt -s expand_aliases
6 # aliases in non-interactive bash script are not evaluated in the same scope where they are defined,
7 # but they are in the big { ... } block below.
8 alias set_site
='if [ -z "${site:-}" ]; then set_site_func "${1:-}"; shift; fi;'
15 .
/usr
/lib
/tool
/bash-utils
16 .
/usr
/lib
/tool
/ansi-codes
22 local i stack_size
=${#FUNCNAME[@]}
23 for (( i
=1; i
<stack_size
; i
++ )); do
24 local func
="${FUNCNAME[$i]}"
25 [[ $func = "" ]] && func
=MAIN
26 local linen
="${BASH_LINENO[$(( i - 1 ))]}"
27 local src
="${BASH_SOURCE[$i]}"
28 [[ "$src" = "" ]] && src
=non_file_source
30 echo -n "$ANSI_bold$ANSI_fg_black"
31 echo " function: $func"
32 echo " file: $src (line $linen)"
35 local line_number_text_sep
='| '
36 nl -ba -w ${#linen} -s " $line_number_text_sep" "$src" |
grep -C 2 -E "^\s*$linen " |\
38 sed -e "s/^\(\s*$linen\) \(.\{${#line_number_text_sep}\}\)\(.*\)/\1-\2$ANSI_italic\3$ANSI_normal/" |\
39 sd
'^' "$ANSI_bold$ANSI_fg_black" | sd
'$' "$ANSI_reset"
43 trap 'print_traceback >&2' ERR
50 errx
1 "Enter site name or directory!"
53 site
=`basename "$param"`
61 [[ $1 =~ password|key|cvc|secret|pin
]]
66 xclip
-i -selection clipboard
74 if [ "${1:-}" = site
]
92 GLOBIGNORE
=${GLOBIGNORE:-}${GLOBIGNORE:+:}".:..:.[!/.]*:..[!/]*:-*"
101 if in_list reveal-secrets
"${options[@]}"
104 elif in_list hash-secrets
"${options[@]}"
106 hash=`cat "$file" | md5sum | cut -c 1-32`
107 echo "$file$TAB$hash$TAB""hash-algo=md5"
110 echo "$file"$
'\t'"*****"
115 grep .
"$file" | prefixlines
"$file"$
'\t'
122 cred dump
"$parent" "${options[@]}"
128 cat "$basedir/$site/PASSWORD"
131 find -L "$basedir" -path "$basedir/${1:-}*" -type d
-printf "%P\n"
135 prop
=${1:?'enter property name!'}
143 warnx
"$prop is a secret."
144 warnx
"enter 'cred [...] prop [...] $prop show' explicitely, or"
145 warnx
"more preferably 'cred [...] prop [...] $prop clip' to copy to the clipboard!"
148 cat "$basedir/$site/$prop"
152 cat "$basedir/$site/$prop" | do_clip
155 elif [ "$subcmd" = prop
]
161 mkdir
-p "$basedir/$site"
162 printf '%s' "$val" > "$basedir/$site/$prop"
165 mkdir
-p "$basedir/$site"
166 "${EDITOR:-$VISUAL}" "$basedir/$site/$prop"
169 rm "$basedir/$site/$prop"
172 cat "$basedir/$site/$prop"
175 cat "$basedir/$site/$prop" | do_clip
178 false
"invalid argument"
185 find "$basedir/$site" -type f
-printf "%P\n"
189 newpwd
=$
(pwgen
-y 8 1)$
(pwgen
-y 8 1)
191 pwdfile
=$basedir/$site/PASSWORD
192 mkdir
-p "$basedir/$site"
195 cur_pwd
=`cat "$pwdfile"`
196 atime
=`stat -c %x "$pwdfile"`
197 now
=`date +'%F %T.%N %z'`
198 echo "$atime $now $cur_pwd" >> "$basedir/$site/OLDPASSWORDS"
200 printf '%s' "$newpwd" > "$pwdfile"
204 _autocomplete_cred() {
206 local curr_word=${COMP_WORDS[$COMP_CWORD]}
207 local prev_word=${COMP_WORDS[$[COMP_CWORD - 1]]}
208 local site_subcmds="list-sites dump renew-password list-props prop clip"
212 compreply="compscript site $site_subcmds"
215 local site=$curr_word; site=${site/#'~/'/$HOME/}
216 compreply=`cred list-sites "$site"`
219 local subcmd=${COMP_WORDS[1]}
220 local site=${COMP_WORDS[2]}; site=${site/#'~/'/$HOME/}
221 local cword_idx=$COMP_CWORD
222 if [ "$subcmd" = site ]
224 if [ $COMP_CWORD = 3 ]
226 compreply="$site_subcmds"
228 subcmd=${COMP_WORDS[3]}
236 compreply=`cred list-props "$site"`
239 compreply="set edit del show clip"
244 compreply=`cred list-props "$site"`
249 compreply="reveal-secrets mask-secrets hash-secrets"
255 COMPREPLY=($(compgen -W "$compreply" -- "${COMP_WORDS[$COMP_CWORD]}"))
258 complete -F _autocomplete_cred cred
259 # use this in your bash session by eg: eval "$(cred compscript)"
263 warnx
'Use tab-completion!'
264 warnx
'Example: eval "$(cred compscript)"'