mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-06-11 19:18:01 +02:00
52260: handle variable assignments before the command in sudo completion
This commit is contained in:
parent
9f57ca4ac8
commit
a9b0ccd661
2 changed files with 46 additions and 15 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2023-11-02 Oliver Kiddle <opk@zsh.org>
|
||||||
|
|
||||||
|
* 52260: Completion/Unix/Command/_sudo: handle variable assignments
|
||||||
|
before the command in sudo completion
|
||||||
|
|
||||||
2023-11-01 Oliver Kiddle <opk@zsh.org>
|
2023-11-01 Oliver Kiddle <opk@zsh.org>
|
||||||
|
|
||||||
* 52252: Src/Modules/pcre.c: Coverity defect 1547827
|
* 52252: Src/Modules/pcre.c: Coverity defect 1547827
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
#compdef sudo sudoedit
|
#compdef sudo sudoedit
|
||||||
|
|
||||||
setopt localoptions extended_glob
|
local curcontext="$curcontext" environ e cmd cpp ret=1
|
||||||
|
local -a context state line args _comp_priv_prefix
|
||||||
local environ e cmd cpp
|
|
||||||
local -a args _comp_priv_prefix
|
|
||||||
local -A opt_args
|
local -A opt_args
|
||||||
|
|
||||||
zstyle -a ":completion:${curcontext}:" environ environ
|
zstyle -a ":completion:${curcontext}:" environ environ
|
||||||
|
@ -20,20 +18,21 @@ args=(
|
||||||
'(-g --group)'{-g+,--group=}'[run command as the specified group name or ID]:group:_groups'
|
'(-g --group)'{-g+,--group=}'[run command as the specified group name or ID]:group:_groups'
|
||||||
'(-)'{-h,--help}'[display help message and exit]'
|
'(-)'{-h,--help}'[display help message and exit]'
|
||||||
'(-h --host)'{-h+,--host=}'[run command on host]:host:_hosts'
|
'(-h --host)'{-h+,--host=}'[run command on host]:host:_hosts'
|
||||||
'(-K --remove-timestamp)'{-K,--remove-timestamp}'[remove timestamp file completely]'
|
'(-k --reset-timestamp -K --remove-timestamp -N --no-update)'{-K,--remove-timestamp}'[remove timestamp file completely]'
|
||||||
'(-k --reset-timestamp)'{-k,--reset-timestamp}'[invalidate timestamp file]'
|
'(-k --reset-timestamp -K --remove-timestamp -N --no-update)'{-k,--reset-timestamp}'[invalidate timestamp file]'
|
||||||
\*{-l,--list}"[list user's privileges or check a specific command]"
|
\*{-l,--list}"[list user's privileges or check a specific command]"
|
||||||
'(-n --non-interactive)'{-n,--non-interactive}'[non-interactive mode, no prompts are used]'
|
'(-n --non-interactive)'{-n,--non-interactive}'[non-interactive mode, no prompts are used]'
|
||||||
|
'(-k --reset-timestamp -K --remove-timestamp -N --no-update)'{-N,--no-update}"[don't update user's cached credentials]"
|
||||||
'(-p --prompt)'{-p+,--prompt=}'[use the specified password prompt]:prompt'
|
'(-p --prompt)'{-p+,--prompt=}'[use the specified password prompt]:prompt'
|
||||||
'(-R --chroot)'{-R+,--chroot=}'[change the root directory before running command]:directory:_directories'
|
'(-R --chroot)'{-R+,--chroot=}'[change the root directory before running command]:directory:_directories'
|
||||||
'(-r --role)'{-r+,--role=}'[create SELinux security context with specified role]: :_selinux_roles'
|
'(-r --role)'{-r+,--role=}'[create SELinux security context with specified role]: :_selinux_roles'
|
||||||
'(-S --stdin)'{-S,--stdin}'[read password from standard input]'
|
'(-S --stdin)'{-S,--stdin}'[read password from standard input]'
|
||||||
'(-t --type)'{-t+,--type=}'[create SELinux security context with specified type]: :_selinux_types'
|
'(-t --type)'{-t+,--type=}'[create SELinux security context with specified type]: :_selinux_types'
|
||||||
'(-T --command-timeout)'{-T+,--command-timeout=}'[terminate command after specified time limit]:timeout'
|
'(-T --command-timeout)'{-T+,--command-timeout=}'[terminate command after specified time limit]:timeout'
|
||||||
'(-U --other-user)'{-U+,--other-user=}'[in list mode, display privileges for user]:user:_users'
|
'(-U --other-user -v --validate)'{-U+,--other-user=}'[in list mode, display privileges for user]:user:_users'
|
||||||
'(-u --user)'{-u+,--user=}'[run command (or edit file) as specified user]:user:_users'
|
'(-u --user)'{-u+,--user=}'[run command (or edit file) as specified user]:user:_users'
|
||||||
'(-)'{-V,--version}'[display version information and exit]'
|
'(-)'{-V,--version}'[display version information and exit]'
|
||||||
'(-v --validate)'{-v,--validate}"[update user's timestamp without running a command]"
|
'(-v --validate -U --other-user *)'{-v,--validate}"[update user's timestamp without running a command]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Does -e appears before the first word that doesn't begin with a hyphen?
|
# Does -e appears before the first word that doesn't begin with a hyphen?
|
||||||
|
@ -45,10 +44,6 @@ if [[ $service = sudoedit ]] || (( $words[(i)-e] < $words[(i)^(*sudo|-[^-]*)] ))
|
||||||
args=( -A "-*" $args '!(-V --version -h --help)-e' '*:file:_files' )
|
args=( -A "-*" $args '!(-V --version -h --help)-e' '*:file:_files' )
|
||||||
else
|
else
|
||||||
cmd="$words[1]"
|
cmd="$words[1]"
|
||||||
cpp='_comp_priv_prefix=(
|
|
||||||
$cmd -n
|
|
||||||
${(kv)opt_args[(I)(-[ugHEP]|--(user|group|set-home|preserve-env|preserve-groups))]}
|
|
||||||
)'
|
|
||||||
args+=(
|
args+=(
|
||||||
'(-e --edit 1 *)'{-e,--edit}'[edit files instead of running a command]' \
|
'(-e --edit 1 *)'{-e,--edit}'[edit files instead of running a command]' \
|
||||||
'(-s --shell)'{-s,--shell}'[run shell as the target user; a command may also be specified]' \
|
'(-s --shell)'{-s,--shell}'[run shell as the target user; a command may also be specified]' \
|
||||||
|
@ -58,9 +53,40 @@ else
|
||||||
'(-E -i --login -s --shell -e --edit)--preserve-env=-[preserve user environment when running command]::environment variable:_sequence _parameters -g "*export*"' \
|
'(-E -i --login -s --shell -e --edit)--preserve-env=-[preserve user environment when running command]::environment variable:_sequence _parameters -g "*export*"' \
|
||||||
'(-H --set-home -i --login -s --shell -e --edit)'{-H,--set-home}"[set HOME variable to target user's home dir]" \
|
'(-H --set-home -i --login -s --shell -e --edit)'{-H,--set-home}"[set HOME variable to target user's home dir]" \
|
||||||
'(-P --preserve-groups -i -login -s --shell -e --edit)'{-P,--preserve-groups}"[preserve group vector instead of setting to target's]" \
|
'(-P --preserve-groups -i -login -s --shell -e --edit)'{-P,--preserve-groups}"[preserve group vector instead of setting to target's]" \
|
||||||
"(-)1: :{ $cpp; _command_names -e }"
|
'*:: :->normal'
|
||||||
"*:: :{ $cpp; _normal }"
|
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_arguments -s -S $args
|
_arguments -s -S $args && ret=0
|
||||||
|
|
||||||
|
if [[ $state = normal ]]; then
|
||||||
|
_comp_priv_prefix=(
|
||||||
|
$cmd -n
|
||||||
|
${(kv)opt_args[(I)(-[ugHEP]|--(user|group|set-home|preserve-env|preserve-groups))]}
|
||||||
|
)
|
||||||
|
if (( $+opt_args[-l] || $+opt_args[--list] )); then
|
||||||
|
_normal -p $service
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
while [[ $words[1] = *=* ]]; do
|
||||||
|
if (( CURRENT == 1 )); then
|
||||||
|
compstate[parameter]="${PREFIX%%\=*}"
|
||||||
|
compset -P 1 '*='
|
||||||
|
_value && ret=0
|
||||||
|
return ret
|
||||||
|
fi
|
||||||
|
shift words
|
||||||
|
(( CURRENT-- ))
|
||||||
|
done
|
||||||
|
if (( CURRENT == 1 )); then
|
||||||
|
curcontext="${curcontext%:*:*}:-command-:"
|
||||||
|
_alternative \
|
||||||
|
'commands:: _command_names -e' \
|
||||||
|
'options:option:(-s --shell -l --login)' \
|
||||||
|
'parameters: :_parameters -g "*export*~*readonly*" -qS=' && ret=0
|
||||||
|
else
|
||||||
|
_normal
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
Loading…
Reference in a new issue