]>
Commit | Line | Data |
---|---|---|
c3608beb | 1 | ### unset unwanted options that could be set in /etc/zshenv |
2 | unsetopt SH_WORD_SPLIT KSH_ARRAYS | |
3 | ||
4 | ### check if su | |
5 | if [[ -v _sev_olduser && $_sev_olduser != $USERNAME ]] _sev_reset_shell= | |
6 | export _sev_olduser=$USERNAME | |
7 | ||
8 | ### exports for all new shells | |
9 | if [[ -v _sev_reset_shell || $SHLVL == 1 ]] { | |
d569f3f7 | 10 | ## lang |
11 | export CHARSET=UTF-8 | |
c3608beb | 12 | export LANG=en_US.UTF-8 |
13 | export LC_CTYPE=$LANG | |
d569f3f7 | 14 | |
15 | ## path | |
c3608beb | 16 | typeset -U path fpath |
17 | if [[ $SHLVL == 1 ]] { | |
18 | # take a backup before any customizations | |
19 | export _sev_sys_PATH=$PATH | |
20 | export _sev_sys_FPATH=$FPATH | |
21 | } | |
d569f3f7 | 22 | # /usr/{pkg,local,games} are unix/bsdisms |
d569f3f7 | 23 | path=({~/,/,/usr/}sbin {~/,/,/usr/}bin /usr/pkg/{s,}bin /usr/X11R{7,6}/bin |
c3608beb | 24 | /usr/local/{s,}bin /usr/games) |
25 | PATH=$PATH:$_sev_sys_PATH | |
26 | fpath=(${ZDOTDIR:-$HOME/.zsh}/functions/{*,Completions/*}(N)) | |
1118e1ee | 27 | #fpath is not exported by default |
28 | export FPATH=$FPATH:$_sev_sys_FPATH | |
c3608beb | 29 | # take another backup, explained in .zprofile |
30 | typeset -U _backup_path | |
31 | _backup_path=("${path[@]}") | |
d569f3f7 | 32 | |
33 | ## xdg | |
34 | export XDG_CONFIG_HOME=~/etc | |
35 | export XDG_CONFIG_DIRS=~/.config:/usr/pkg/etc/xdg:/usr/local/etc/xdg:/etc/xdg | |
36 | export XDG_DATA_HOME=~/share | |
37 | export XDG_DATA_DIRS=~/.local/share:/usr/pkg/share:/usr/local/share:/usr/share | |
38 | export XDG_CACHE_HOME=~/tmp | |
39 | export XDG_RUNTIME_DIR=~/tmp | |
40 | ||
c3608beb | 41 | ## create tmp link |
42 | t=${TMPDIR:-/tmp}/home-$LOGNAME | |
c3608beb | 43 | if [[ ! -e $t ]] { |
f520c79a | 44 | mkdir -m 700 $t >/dev/null 2>&1 |
d569f3f7 | 45 | # TODO: check if dir exists after mkdir |
46 | } | |
47 | # allow opaque entries to override link creation | |
496de37b | 48 | if [[ ! -e $XDG_RUNTIME_DIR ]] { |
49 | ln -sf $t $XDG_RUNTIME_DIR >/dev/null 2>&1 | |
d569f3f7 | 50 | } |
496de37b | 51 | unset t |
d569f3f7 | 52 | |
c3608beb | 53 | ## ssh agents |
54 | # NOTE: preferred order of agents to check: okcagent, gnupg, openssh | |
55 | # first block takes care of okcagent and openssh, second gnupg | |
3cec0481 | 56 | [[ -o interactive ]] && print -nP "%F{blue}>>>%f SSH: %F{green}" |
c3608beb | 57 | if [[ ! -v SSH_AUTH_SOCK && ( -v commands[okc-ssh-agent] || |
58 | ( -v commands[ssh-agent] && ! -v commands[gpg] ) ) ]] { | |
59 | okc=${commands[okc-ssh-agent]:+okc-} | |
60 | agentfile=~/tmp/${okc}ssh-agent-exports | |
61 | typeset sock= | |
62 | typeset -i pid= | |
63 | if [[ -f $agentfile ]] { | |
64 | IFS=$'\0' read -r sock pid <$agentfile | |
65 | } | |
66 | if [[ -S $sock && $pid > 0 ]] && kill -0 $pid; then | |
f520c79a | 67 | [[ -o interactive ]] && echo "Reusing agent pid $pid" |
c3608beb | 68 | export SSH_AUTH_SOCK=$sock |
69 | export SSH_AGENT_PID=$pid | |
70 | else | |
71 | # TODO: ensure ssh-agent path looks legit | |
72 | # to avoid unsafe eval? | |
f520c79a | 73 | # NOTE: no way around doing redirection like this I think |
74 | e=${okc}ssh-agent | |
75 | if [[ -o interactive ]] { | |
76 | eval `$e` | |
77 | } else { | |
78 | eval `$e` >/dev/null 2>&1 | |
79 | } | |
c3608beb | 80 | echo -n $SSH_AUTH_SOCK$'\0'$SSH_AGENT_PID >!$agentfile |
81 | fi | |
82 | unset okc agentfile sock pid | |
83 | } elif [[ -v commands[gpg] && ! -S $_GNUPG_SOCK_DEST && \ | |
84 | ( ! -v SSH_AUTH_SOCK || -v DISPLAY ) ]] { | |
85 | export GPG_TTY=$(tty) | |
86 | export PINENTRY_USER_DATA=USE_TTY=$((!${+DISPLAY})) | |
87 | gpg-connect-agent UPDATESTARTUPTTY /bye >/dev/null 2>&1 | |
f520c79a | 88 | [[ -o interactive ]] && gpg-connect-agent /subst /serverpid \ |
c3608beb | 89 | '/echo GPG agent pid ${get serverpid}' /bye |
90 | [[ ! -v SSH_AUTH_SOCK ]] && \ | |
91 | export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) | |
92 | } else { | |
f520c79a | 93 | [[ -o interactive ]] && echo "Pre-existing or remote agent" |
c3608beb | 94 | } |
95 | ||
96 | ## gpg ssh forwarding | |
97 | # ssh automatically tunnels SSH_AUTH_SOCK with the right config, but GPG | |
98 | # doesn't—we use a RemoteForward rule in ~/.ssh/config that uses these env | |
99 | # vars to push the gpg extra socket through when connecting via ssh | |
100 | # HACK: this entire thing sucks but there is no other easy way that works | |
101 | # out of the box with other systems | |
102 | if [[ -v commands[gpgconf] ]] { | |
103 | # if already connected over SSH, reuse forwarded socket for future | |
104 | # connections; else use extra socket | |
105 | sock=${SSH_CLIENT:+agent-socket} | |
106 | export _GNUPG_SOCK_SRC=$(gpgconf --list-dirs ${sock:-agent-extra-socket}) | |
107 | unset sock | |
108 | # XXX: multiple SSH sessions to the same host will overwrite this | |
109 | # socket, no way to send unique paths without configuring explicit | |
110 | # SendEnv and AcceptEnv exclusions on client and host respectively | |
111 | export _GNUPG_SOCK_DEST=/tmp/.gpg-agent-forward | |
112 | # if socket exists already, we are on a RemoteForwarded client, so copy | |
113 | # it over so that GPG sees it | |
114 | # XXX: race condition if connecting multiple terminals at once | |
115 | if [[ -S $_GNUPG_SOCK_DEST ]] { | |
116 | unlink $_GNUPG_SOCK_SRC >/dev/null 2>&1 | |
117 | mv $_GNUPG_SOCK_DEST $_GNUPG_SOCK_SRC >/dev/null | |
118 | } | |
119 | } | |
d569f3f7 | 120 | } |
121 | ||
ff1a2414 | 122 | ### load site-specific |
8eb81f95 | 123 | if [[ -f ~/.zshenv.local ]] { source ~/.zshenv.local } |
124 | ||
c3608beb | 125 | ### source .zprofile |
126 | # if we used su, without --login, let's run zprofile ourselves | |
127 | # XXX: system zprofile is not run | |
128 | if [[ -v _sev_reset_shell || $SHLVL == 1 ]] source ~/.zprofile | |
129 | ||
8eb81f95 | 130 | # vim: set et sts=4 sw=4 ts=8 tw=79 : |