123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #!/usr/bin/env bash
-
- # See the README for instructions setting up.
- # ./make-anonymous-key KEYNAME
-
- # figure out which directory we are stored in
- # https://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
- _GITNONYMOUS_SRC="${BASH_SOURCE[0]}"
- # resolve $_GITNONYMOUS_SRC until the file is no longer a symlink
- while [ -h "$_GITNONYMOUS_SRC" ]; do
- dir="$( cd -P "$( dirname "$_GITNONYMOUS_SRC" )" && pwd )"
- _GITNONYMOUS_SRC="$(readlink "$_GITNONYMOUS_SRC")"
- # if $_GITNONYMOUS_SRC was a relative symlink, we need to resolve it
- # relative to the path where the symlink file was located
- [[ $_GITNONYMOUS_SRC != /* ]] && _GITNONYMOUS_SRC="$DIR/$_GITNONYMOUS_SRC"
- done
- dir="$( cd -P "$( dirname "$_GITNONYMOUS_SRC" )" && pwd )"
- unset _GITNONYMOUS_SRC
-
- gitnonymous_usage () {
- if [ "$1" != "" ]
- then
- gitnonymous_error "Don't call this script directly. 'Source' it instead."
- fi
- echo "Usage:"
- echo ". ${BASH_SOURCE[0]} KEYNAME"
- }
-
- # function to throw error messages
- gitnonymous_error () {
- >&2 echo $@
- }
-
- # when we are missing a config file call this
- gitnonymous_error_missing () {
- gitnonymous_error $@
- gitnonymous_error "To create it run: ${dir}/gitnonymous-setup ${keyname}"
- }
-
- # Make sure we were called with 'source' instead of directly
- if [[ "${BASH_SOURCE[0]}" != "$0" ]]
- then
- # check for the keyname parameter
- if [ "$1" = "" ]
- then
- gitnonymous_usage
- return 1
- else
- # set the key and the config file
- keyname="${1}"
- rootdir="${HOME}/.gitnonymous-${keyname}"
- configfile="${rootdir}/config"
- sshdir="${rootdir}/ssh"
- oldenvfile="${rootdir}/previous-environment"
- sshagentsocket="${sshdir}/.ssh-agent-$$"
-
- if [ "$_GITNONYMOUS" != "" ]
- # toggle everything off again
- then
- echo "Unsetting gitnonymous environment ${keyname}"
- # kill our special ssh agent
- ssh-agent -k
- # restore the command prompt
- export PS1="${_GITNONYMOUS_OLDPS1}"
- unset GIT_COMMITTER_EMAIL
- unset GIT_COMMITTER_NAME
- unset GIT_AUTHOR_EMAIL
- unset GIT_AUTHOR_NAME
- unset GIT_SSH
- unset GIT_PROXY_COMMAND
- unset ALL_PROXY
- unset TZ
- # restore any GIT_ environment variables set before
- . "${oldenvfile}"
- # unset our environment variables we set
- unset _GITNONYMOUS_OLDPS1
- unset _GITNONYMOUS
- unalias "gitnonymous-exit"
- echo "Done unsetting ${keyname}."
- else
- # add our custom local SSH key (make the key with ./make-anonymous-key)
- if [ -f ${sshdir}/id_rsa -o -f ${sshdir}/identity ]
- then
- # if a stale socket already exists then throw an error
- if [ -f "${sshagentsocket}" ]
- then
- gitnonymous_error "Stale SSH agent socket '${sshagentsocket}' exists."
- gitnonymous_error "You can probably delete it safely and try again."
- return 2
- fi
- # start a new SSH agent just for this session
- eval $(ssh-agent -a "${sshagentsocket}")
- # add the key
- if [ -f ${sshdir}/id_rsa ]
- then
- ssh-add ${sshdir}/id_rsa
- else
- ssh-add ${sshdir}/identity
- fi
- else
- gitnonymous_error_missing "SSH config in ${sshdir} not found!"
- return 3
- fi
-
- # load the user's anonymous GIT settings and environment
- if [ -f "${configfile}" ]
- then
- # save the old GIT values
- export | grep -E "GIT_|ALL_PROXY|TZ" > ${oldenvfile}
- # source the config file
- . "${configfile}"
- else
- gitnonymous_error_missing "GIT config in ${configfile} not found!"
- return 4
- fi
-
- # trap exit of this shell and kill ssh-agent
- trap 'ssh-agent -k' EXIT
-
- # tell GIT to use our customised anonymous SSH wrapper
- export GIT_SSH="${rootdir}/git-ssh-wrap"
-
- # tell GIT to use the tor proxy for all other traffic
- export GIT_PROXY_COMMAND="${dir}/git-proxy-command"
- export ALL_PROXY="socks5://127.0.0.1:9050"
-
- # make it obvious we're in a special environment
- _GITNONYMOUS_OLDPS1="${PS1}"
- export PS1="${keyname}⚔ ${PS1}"
- export _GITNONYMOUS="${keyname}"
-
- echo "Run 'gitnonymous-exit' to exit this identity."
- # alias exit command
- alias "gitnonymous-exit"=". ${BASH_SOURCE[0]} ${keyname}"
- fi
- fi
- else
- gitnonymous_usage true
- exit 2
- fi
|