mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-05-29 04:53:17 +02:00
This patch adds missing % character escaping for custom git prompts used in a few themes. It also includes escaping for git-prompt.sh. In combination with CVE-2021-45444, this could allow code execution when displaying branch information in cloned malicious git repositories. However, zsh 5.8.1 and newer are largely the default zsh versions, and on those supported distributions with older zsh versions, the CVE has been found to be also patched. For this reason, this doesn't qualify as a security patch, but a bug fix for proper printing of git branches.
93 lines
2.8 KiB
Bash
93 lines
2.8 KiB
Bash
# Sunrise theme for oh-my-zsh
|
||
# Intended to be used with Solarized: https://ethanschoonover.com/solarized
|
||
|
||
# Color shortcuts
|
||
R=$fg_no_bold[red]
|
||
G=$fg_no_bold[green]
|
||
M=$fg_no_bold[magenta]
|
||
Y=$fg_no_bold[yellow]
|
||
B=$fg_no_bold[blue]
|
||
RESET=$reset_color
|
||
|
||
if [ "$USERNAME" = "root" ]; then
|
||
PROMPTCOLOR="%{$R%}" PROMPTPREFIX="-!-";
|
||
else
|
||
PROMPTCOLOR="" PROMPTPREFIX="---";
|
||
fi
|
||
|
||
local return_code="%(?..%{$R%}%? ↵%{$RESET%})"
|
||
|
||
# Get the status of the working tree (copied and modified from git.zsh)
|
||
custom_git_prompt_status() {
|
||
INDEX=$(git status --porcelain 2> /dev/null)
|
||
STATUS=""
|
||
# Non-staged
|
||
if $(echo "$INDEX" | grep '^?? ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
|
||
fi
|
||
if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
|
||
fi
|
||
if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
|
||
fi
|
||
if $(echo "$INDEX" | grep '^.M ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
|
||
elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
|
||
elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
|
||
fi
|
||
# Staged
|
||
if $(echo "$INDEX" | grep '^D ' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_STAGED_DELETED$STATUS"
|
||
fi
|
||
if $(echo "$INDEX" | grep '^R' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_STAGED_RENAMED$STATUS"
|
||
fi
|
||
if $(echo "$INDEX" | grep '^M' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_STAGED_MODIFIED$STATUS"
|
||
fi
|
||
if $(echo "$INDEX" | grep '^A' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_PROMPT_STAGED_ADDED$STATUS"
|
||
fi
|
||
|
||
if $(echo -n "$STATUS" | grep '.*' &> /dev/null); then
|
||
STATUS="$ZSH_THEME_GIT_STATUS_PREFIX$STATUS"
|
||
fi
|
||
|
||
echo $STATUS
|
||
}
|
||
|
||
# get the name of the branch we are on (copied and modified from git.zsh)
|
||
function custom_git_prompt() {
|
||
ref=$(git symbolic-ref HEAD 2> /dev/null) || return
|
||
echo "$ZSH_THEME_GIT_PROMPT_PREFIX${${ref#refs/heads/}//\%/%%}$(parse_git_dirty)$(git_prompt_ahead)$(custom_git_prompt_status)$ZSH_THEME_GIT_PROMPT_SUFFIX"
|
||
}
|
||
|
||
# %B sets bold text
|
||
PROMPT='%B$PROMPTPREFIX %2~ $(custom_git_prompt)%{$M%}%B»%b%{$RESET%} '
|
||
RPS1="${return_code}"
|
||
|
||
ZSH_THEME_GIT_PROMPT_PREFIX="%{$Y%}‹"
|
||
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$Y%}›%{$RESET%} "
|
||
|
||
ZSH_THEME_GIT_PROMPT_DIRTY="%{$R%}*"
|
||
ZSH_THEME_GIT_PROMPT_CLEAN=""
|
||
|
||
ZSH_THEME_GIT_PROMPT_AHEAD="%{$B%}➔"
|
||
|
||
|
||
ZSH_THEME_GIT_STATUS_PREFIX=" "
|
||
|
||
# Staged
|
||
ZSH_THEME_GIT_PROMPT_STAGED_ADDED="%{$G%}A"
|
||
ZSH_THEME_GIT_PROMPT_STAGED_MODIFIED="%{$G%}M"
|
||
ZSH_THEME_GIT_PROMPT_STAGED_RENAMED="%{$G%}R"
|
||
ZSH_THEME_GIT_PROMPT_STAGED_DELETED="%{$G%}D"
|
||
|
||
# Not-staged
|
||
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$R%}?"
|
||
ZSH_THEME_GIT_PROMPT_MODIFIED="%{$R%}M"
|
||
ZSH_THEME_GIT_PROMPT_DELETED="%{$R%}D"
|
||
ZSH_THEME_GIT_PROMPT_UNMERGED="%{$R%}UU"
|