7070# Note: After unset, the token remains visible in /proc/<pid>/environ for the
7171# lifetime of this process. This is a platform limitation of environment variables.
7272_USERNAME=" ${SUDO_USER:- ${USER:- vscode} } "
73- _USER_HOME=$( eval echo " ~${_USERNAME} " )
73+ _USER_HOME=$( getent passwd " $_USERNAME " 2> /dev/null | cut -d: -f6)
74+ _USER_HOME=" ${_USER_HOME:-/ home/ $_USERNAME } "
7475CLAUDE_CRED_DIR=" ${CLAUDE_CONFIG_DIR:- ${_USER_HOME} / .claude} "
7576CLAUDE_CRED_FILE=" $CLAUDE_CRED_DIR /.credentials.json"
7677if [ -n " $CLAUDE_AUTH_TOKEN " ]; then
@@ -88,11 +89,15 @@ if [ -n "$CLAUDE_AUTH_TOKEN" ]; then
8889 AUTH_CONFIGURED=true
8990 else
9091 echo " [setup-auth] Creating .credentials.json from CLAUDE_AUTH_TOKEN..."
91- mkdir -p " $CLAUDE_CRED_DIR "
92+ # Create directory with restrictive permissions (matches credential file at 600)
93+ ( umask 077; mkdir -p " $CLAUDE_CRED_DIR " )
94+ # Escape JSON-special characters in token value (defense against malformed JSON
95+ # if a token ever contains " or \ — unlikely with sk-ant-* but closes the gap)
96+ ESCAPED_TOKEN=$( printf ' %s' " $CLAUDE_AUTH_TOKEN " | sed ' s/\\/\\\\/g; s/"/\\"/g' )
9297 # Write credentials with restrictive permissions from the start (no race window).
9398 # Uses printf '%s' to avoid shell expansion of token value (defense against
9499 # metacharacters in the token string — backticks, $(), quotes).
95- if ( umask 077; printf ' {\n "claudeAiOauth": {\n "accessToken": "%s",\n "refreshToken": "%s",\n "expiresAt": 9999999999999,\n "scopes": ["user:inference", "user:profile"]\n }\n}\n' " $CLAUDE_AUTH_TOKEN " " $CLAUDE_AUTH_TOKEN " > " $CLAUDE_CRED_FILE " ); then
100+ if ( umask 077; printf ' {\n "claudeAiOauth": {\n "accessToken": "%s",\n "refreshToken": "%s",\n "expiresAt": 9999999999999,\n "scopes": ["user:inference", "user:profile"]\n }\n}\n' " $ESCAPED_TOKEN " " $ESCAPED_TOKEN " > " $CLAUDE_CRED_FILE " ); then
96101 echo " [setup-auth] Claude auth token configured"
97102 AUTH_CONFIGURED=true
98103 else
0 commit comments