shell bypass 403
#!/usr/bin/env bash
#
# Environment manipulation functions.
#
__rvm_nuke_rvm_variables()
{
unset rvm_head_flag $(env | __rvm_awk -F= '/^rvm_/{print $1" "}')
}
# Unset ruby-specific variables
__rvm_unset_ruby_variables()
{
# unset rvm_ruby_flag $(env | __rvm_awk -F= '/^rvm_ruby_/{printf $1" "}')
unset rvm_env_string rvm_ruby_string rvm_ruby_strings rvm_ruby_binary rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_log_path rvm_ruby_major_version rvm_ruby_minor_version rvm_ruby_package_name rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_repo_branch rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_tag rvm_ruby_version rvm_head_flag rvm_ruby_package_file rvm_ruby_configure rvm_ruby_name rvm_ruby_url rvm_ruby_global_gems_path rvm_ruby_args rvm_ruby_name rvm_llvm_flag rvm_ruby_repo_tag
__rvm_load_rvmrc # restore important variables
}
# TODO: Should be able to...
# Unset both rvm variables as well as ruby-specific variables
# Preserve gemset if 'rvm_sticky' is set
# (persist gemset unless clear is explicitly called).
__rvm_cleanse_variables()
{
__rvm_unset_ruby_variables
if [[ ${rvm_sticky_flag:-0} -eq 1 ]]
then export rvm_gemset_name
else unset rvm_gemset_name
fi
# arrays
unset rvm_configure_flags rvm_patch_names rvm_make_flags
# variables
unset rvm_env_string rvm_ruby_string rvm_action rvm_error_message rvm_force_flag rvm_debug_flag rvm_delete_flag rvm_summary_flag rvm_json_flag rvm_yaml_flag rvm_file_name rvm_user_flag rvm_system_flag rvm_install_flag rvm_llvm_flag rvm_sticky_flag rvm_rvmrc_flag rvm_gems_flag rvm_docs_flag rvm_ruby_alias rvm_static_flag rvm_archive_extension rvm_hook rvm_ruby_name rvm_remote_flag
# rvm_gemsets_path rvm_user_path rvm_wrappers_path rvm_patches_path rvm_docs_path rvm_examples_path rvm_rubies_path rvm_usr_path rvm_src_path rvm_tmp_path rvm_lib_path rvm_repos_path rvm_log_path rvm_help_path rvm_environments_path rvm_archives_path
__rvm_load_rvmrc # restore important variables
}
# Add bin path if not present
__rvm_conditionally_add_bin_path()
{
[[ ":${PATH}:" == *":${rvm_bin_path}:"* ]] ||
{
if [[ "${rvm_ruby_string:-"system"}" == "system" && -z "$GEM_HOME" ]]
then PATH="$PATH:${rvm_bin_path}"
else PATH="${rvm_bin_path}:$PATH"
fi
}
}
__rvm_load_environment()
{
\typeset __hook
if
[[ -f "$rvm_environments_path/$1" ]]
then
# Restore the environment
unset GEM_HOME GEM_PATH
__rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path
# source the environment file
\. "$rvm_environments_path/$1"
rvm_hook="after_use"
if [[ -n "${rvm_scripts_path:-}" || -n "${rvm_path:-}" ]]
then source "${rvm_scripts_path:-$rvm_path/scripts}/hook"
fi
# clear the PATH cache
builtin hash -r
else
__rvm_use "$1"
fi
}
__rvm_export()
{
# extract the variable name from the first arg.
\typeset name
name=${1%%\=*}
# store the current value, to be restored later.
builtin export rvm_old_$name=${!name}
# pass-through the return value of the builtin.
export "$@"
return $?
}
__rvm_unset_exports()
{
\typeset wrap_name name value
\typeset -a __variables_list
__rvm_read_lines __variables_list <<< "$(
printenv | __rvm_sed '/^rvm_old_.*=/ { s/=.*$//; p; }; d;'
)"
for wrap_name in "${__variables_list[@]}"
do
eval "value=\"\${${wrap_name}}\""
name=${wrap_name#rvm_old_}
if [[ -n "${value:-}" ]]
then export $name="${value}"
else unset $name
fi
unset $wrap_name
done
}
__rvm_fix_path_from_gem_path()
{
[[ -n "${GEM_PATH:-}" ]] || return 0
export PATH
\typeset IFS _iterator_path
\typeset -a _gem_path _new_path
IFS=:
_gem_path=()
_new_path=()
__rvm_custom_separated_array _gem_path : "${GEM_PATH}"
for _iterator_path in "${_gem_path[@]}"
do
_new_path+=( "${_iterator_path}/bin" )
done
_new_path+=( "${MY_RUBY_HOME:-${GEM_HOME/gems/rubies}}/bin" )
_new_path+=( "${rvm_bin_path}" )
PATH="${_new_path[*]}:$PATH"
builtin hash -r
}
# Clean all rvm items out of the current working path.
__rvm_remove_rvm_from_path()
{
\typeset local_rvm_path
__rvm_remove_from_path "${rvm_path%/}/*"
__rvm_remove_from_path "${rvm_gems_path%/}/*"
__rvm_remove_from_path "${rvm_bin_path}" #TODO: this might be dangerous if rvm is available in some common path
while local_rvm_path="$( __rvm_which rvm 2>/dev/null )"
do __rvm_remove_from_path "${local_rvm_path%/*}"
done
builtin hash -r
}
__rvm_switch()
{
\typeset new_rvm_path new_rvm_bin_path
(( $# )) && [[ -z "$1" ]] && shift || true # skip first empty argument
(( $# )) && [[ -n "$1" ]] && [[ -d "$1" || -d "${1%/*}" ]] && [[ ! -f "$1" ]] ||
{
rvm_error "No valid path given."
return 1
}
[[ "${rvm_path}" != "${new_rvm_path}" ]] ||
{
rvm_warn "Already there!"
return 2
}
rvm_log "Switching ${rvm_path} => ${1}"
new_rvm_path="${1%/}"
new_rvm_bin_path="${2:-$new_rvm_path/bin}"
new_rvm_bin_path="${new_rvm_bin_path%/}"
__rvm_use_system
__rvm_remove_from_path "${rvm_path%/}/*"
rvm_reload_flag=1
rvm_path="${new_rvm_path}"
rvm_bin_path="${new_rvm_bin_path}"
rvm_scripts_path="${rvm_path}/scripts"
rvm_environments_path="${rvm_path}/environments"
__rvm_remove_from_path "${rvm_path%/}/*"
__rvm_add_to_path prepend "${rvm_bin_path}"
}
__rvm_unload_action()
{
\typeset _element IFS
\typeset -a _list
IFS=$'\n'
_list=( $( \command \cat ${2:--} | sort -u ) )
for _element in "${_list[@]}"
do $1 "${_element}"
done
}
__function_unset()
{
if [[ -n "${ZSH_VERSION:-}" ]]
then unset -f "$1"
else unset "$1"
fi
}
__rvm_unload()
{
\typeset _element
\typeset -a _list
#PATH
__rvm_remove_rvm_from_path
# fpath
if [[ -n "${ZSH_VERSION:-}" ]]
then
__rvm_remove_from_array fpath "$rvm_path/scripts/extras/completion.zsh" "${fpath[@]}"
fi
# aliases
__rvm_unload_action unalias <<< "$(
if [[ -n "${ZSH_VERSION:-}" ]]
then alias | __rvm_awk -F"=" '/rvm/ {print $1}'
else alias | __rvm_awk -F"[= ]" '/rvm/ {print $2}'
fi
)"
# variables
__rvm_unload_action unset <<< "$(
set |
__rvm_awk -F"=" 'BEGIN{v=0;} /^[a-zA-Z_][a-zA-Z0-9_]*=/{v=1;} v==1&&$2~/^['\''\$]/{v=2;}
v==1&&$2~/^\(/{v=3;} v==2&&/'\''$/&&!/'\'\''$/{v=1;} v==3&&/\)$/{v=1;} v{print;} v==1{v=0;}' |
__rvm_awk -F"=" '/^[^ ]*(RUBY|GEM|IRB|gem|rubies|rvm)[^ ]*=/ {print $1} /^[^ ]*=.*rvm/ {print $1}' |
__rvm_grep -vE "^PROMPT|^prompt|^PS|^BASH_SOURCE|^PATH"
)"
# functions
__rvm_unload_action __function_unset <<< "$(
\typeset -f | __rvm_awk '$2=="()" {fun=$1} /rvm/{print fun}' | sort -u | __rvm_grep -v __rvm_unload_action
)"
if
[[ -n "${ZSH_VERSION:-}" ]]
then
unset -f __rvm_unload_action
unset -f __function_unset
if
[[ -n "${_comp_dumpfile:-}" ]]
then
\command \rm -f "$_comp_dumpfile"
compinit -d "$_comp_dumpfile"
fi
else
unset __rvm_unload_action __function_unset
fi
}
__rvm_ruby_config_get()
{
\typeset variable_name ruby_path
variable_name="$1"
ruby_path="${2:-$rvm_ruby_home/bin/ruby}"
# mruby doesn't support -r requires or RbConfig
__rvm_string_match "$ruby_path" "*mruby*" && return
case "${variable_name:---all}" in
(--all)
"$ruby_path" -rrbconfig -e 'puts RbConfig::CONFIG.sort.map{|k,v| "#{k}: #{v}" }' 2>/dev/null || return $?
;;
(*)
"$ruby_path" -rrbconfig -e 'puts RbConfig::CONFIG["'"$variable_name"'"]' 2>/dev/null || return $?
;;
esac
}
__rvm_env_print()
{
environment_file_path="$rvm_environments_path/$(__rvm_env_string)"
# Echo the path or environment file.
if
[[ "$rvm_path_flag" == "1" || "$*" == *"--path"* ]]
then
echo "$environment_file_path"
elif
[[ "$rvm_cron_flag" == "1" || "$*" == *"--cron"* ]]
then
\command \cat "$environment_file_path" |
__rvm_grep -Eo "[^ ]+=[^;]+" |
__rvm_sed -e 's/\$PATH/'"${PATH//\//\\/}"'/' -e 's/\${PATH}/'"${PATH//\//\\/}"'/'
else
\command \cat "$environment_file_path"
fi
}