]>
Commit | Line | Data |
---|---|---|
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 ]] { | |
10 | ## lang | |
11 | export CHARSET=UTF-8 | |
12 | export LANG=en_US.UTF-8 | |
13 | export LC_CTYPE=$LANG | |
14 | ||
15 | ## path | |
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 | } | |
22 | # /usr/{pkg,local,games} are unix/bsdisms | |
23 | path=({~/,/,/usr/}sbin {~/,/,/usr/}bin /usr/pkg/{s,}bin /usr/X11R{7,6}/bin | |
24 | /usr/local/{s,}bin /usr/games) | |
25 | PATH=$PATH:$_sev_sys_PATH | |
26 | fpath=(${ZDOTDIR:-$HOME/.zsh}/functions/{*,Completions/*}(N)) | |
27 | #fpath is not exported by default | |
28 | export FPATH=$FPATH:$_sev_sys_FPATH | |
29 | # take another backup, explained in .zprofile | |
30 | typeset -U _backup_path | |
31 | _backup_path=("${path[@]}") | |
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 | ||
41 | ## create tmp link | |
42 | t=${TMPDIR:-/tmp}/home-$LOGNAME | |
43 | if [[ ! -e $t ]] { | |
44 | mkdir -m 700 $t >/dev/null 2>&1 | |
45 | # TODO: check if dir exists after mkdir | |
46 | } | |
47 | # allow opaque entries to override link creation | |
48 | if [[ ! -e $XDG_RUNTIME_DIR ]] { | |
49 | ln -sf $t $XDG_RUNTIME_DIR >/dev/null 2>&1 | |
50 | } | |
51 | unset t | |
52 | ||
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 | |
56 | [[ -o interactive ]] && print -nP "%F{blue}>>>%f SSH: %F{green}" | |
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 | |
67 | [[ -o interactive ]] && echo "Reusing agent pid $pid" | |
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? | |
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 | } | |
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 | |
88 | [[ -o interactive ]] && gpg-connect-agent /subst /serverpid \ | |
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 { | |
93 | [[ -o interactive ]] && echo "Pre-existing or remote agent" | |
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 | } | |
120 | } | |
121 | ||
122 | ### load site-specific | |
123 | if [[ -f ~/.zshenv.local ]] { source ~/.zshenv.local } | |
124 | ||
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 | ||
130 | # vim: set et sts=4 sw=4 ts=8 tw=79 : |