Commit 68651c22 authored by Frank Terbeck's avatar Frank Terbeck

Update grml prompt to deal with prompt_subst better

This from my upstream commit at:

  https://github.com/grml/grml-etc-core/commit/38a1b613f10a162812ce91075bdf3ec102126dc1
parent 3cc76e57
......@@ -54,6 +54,19 @@ function prompt_grml_help () {
accordingly. Default (left): rc change-root user at host path vcs
percent; Default (right): sad-smiley
- strip-sensitive-characters (boolean): If the \`prompt_subst' option
is active in zsh, the shell performs lots of expansions on prompt
variable strings, including command substitution. So if you don't
control where some of your prompt strings is coming from, this is
an exploitable weakness. Grml's zsh setup does not set this option
and it is off in the shell in zsh-mode by default. If it *is* turned
on however, this style becomes active, and there are two flavours of
it: On per default is a global variant in the '*:setup' context. This
strips characters after the whole prompt string was constructed. There
is a second variant in the '*:items:<item>', that is off by default.
It allows fine grained control over which items' data is stripped.
The characters that are stripped are: \$ and \`.
Available styles in 'items:<item>' are: pre, post. These are strings that
are inserted before (pre) and after (post) the item in question. Thus, the
following would cause the user name to be printed in red instead of the
......
......@@ -196,7 +196,7 @@ grml_theme_add_token: Token `%s'\'' exists! Giving up!\n\n' $name
fi
}
function grml_typeset_and_wrap () {
function grml_wrap_reply () {
emulate -L zsh
local target="$1"
local new="$2"
......@@ -204,14 +204,16 @@ function grml_typeset_and_wrap () {
local right="$4"
if (( ${+parameters[$new]} )); then
typeset -g "${target}=${(P)target}${left}${(P)new}${right}"
REPLY="${left}${(P)new}${right}"
else
REPLY=''
fi
}
function grml_prompt_addto () {
emulate -L zsh
local target="$1"
local lr it apre apost new v
local lr it apre apost new v REPLY
local -a items
shift
......@@ -225,21 +227,21 @@ function grml_prompt_addto () {
|| apost=${grml_prompt_post_default[$it]}
zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \
|| new=${grml_prompt_token_default[$it]}
typeset -g "${target}=${(P)target}${apre}"
if (( ${+grml_prompt_token_function[$it]} )); then
${grml_prompt_token_function[$it]} $it
typeset -g "${target}=${(P)target}${REPLY}"
else
case $it in
battery)
grml_typeset_and_wrap $target $new '' ''
grml_wrap_reply $target $new '' ''
;;
change-root)
grml_typeset_and_wrap $target $new '(' ')'
grml_wrap_reply $target $new '(' ')'
;;
grml-chroot)
if [[ -n ${(P)new} ]]; then
typeset -g "${target}=${(P)target}(CHROOT)"
REPLY="$CHROOT"
else
REPLY=''
fi
;;
vcs)
......@@ -249,14 +251,33 @@ function grml_prompt_addto () {
vcscalled=1
fi
if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then
typeset -g "${target}=${(P)target}${(P)v}"
REPLY="${(P)v}"
else
REPLY=''
fi
;;
*) typeset -g "${target}=${(P)target}${new}" ;;
*) REPLY="$new" ;;
esac
fi
typeset -g "${target}=${(P)target}${apost}"
# Strip volatile characters per item. This is off by default. See the
# global stripping code a few lines below for details.
if [[ -o prompt_subst ]] && zstyle -t ":prompt:${grmltheme}:${lr}:items:$it" \
strip-sensitive-characters
then
REPLY="${REPLY//[$\`]/}"
fi
typeset -g "${target}=${(P)target}${apre}${REPLY}${apost}"
done
# Per default, strip volatile characters (in the prompt_subst case)
# globally. If the option is off, the style has no effect. For more
# control, this can be turned off and stripping can be configured on a
# per-item basis (see above).
if [[ -o prompt_subst ]] && zstyle -T ":prompt:${grmltheme}:${lr}:setup" \
strip-sensitive-characters
then
typeset -g "${target}=${${(P)target}//[$\`]/}"
fi
}
function prompt_grml_precmd_worker () {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment