diff options
-rwxr-xr-x | kiss | 34 |
1 files changed, 29 insertions, 5 deletions
@@ -72,18 +72,28 @@ pkg_find() { # in $KISS_PATH/*. [ "$KISS_PATH" ] || die "\$KISS_PATH needs to be set" + # Turn the argument list into variables as we reset + # the list below. + query=$1 + match=$2 + # Find the repository containing a package. # Searches installed packages if the package is absent # from the repositories. # See [1] at top of script. # shellcheck disable=2046,2086 - set -- "$1" $(IFS=:; find $KISS_PATH "$sys_db" -maxdepth 1 -name "$1") + set -- $(IFS=:; find $KISS_PATH "$sys_db" -maxdepth 1 -name "$1") # A package may also not be found due to a repository not being # readable by the current user. Either way, we need to die here. - [ "$2" ] || die "Package '$1' not in any repository" + [ "$1" ] || die "Package '$query' not in any repository" - printf '%s\n' "$2" + # Show all search results if called from 'kiss search', else + # print only the first match. + case $match in + all) printf '%s\n' "$@" ;; + *) printf '%s\n' "$1" ;; + esac } pkg_list() { @@ -845,6 +855,20 @@ args() { # arguments despite trapping the error ('|| :'). shift "$(($# > 0 ? 1 : 0))" + # Unless this is a search, sanitize the user's input. The call to + # 'pkg_find()' supports basic globbing, ensure input doesn't expand + # to anything except for when this behavior is needed. + # + # This handles the globbing characters '*', '!', '[' and ']' as per: + # https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html + [ "$action" != search ] && [ "$action" != s ] && + case $* in + *'*'*|*'!'*|*'['*|*']'*) + log kiss "$action $*" + die "Arguments contain invalid characters" + ;; + esac + # Parse some arguments earlier to remove the need to duplicate code. case $action in c|checksum|s|search) @@ -938,11 +962,11 @@ args() { ;; s|search) - for pkg; do pkg_find "$pkg"; done + for pkg; do pkg_find "$pkg" all; done ;; v|version|-v|--version) - log kiss 0.40.0 + log kiss 0.41.0 ;; h|help|-h|--help|'') |