@@ -96,23 +96,31 @@ _init_bash() {
9696
9797__FUNC___run_post_cd_hooks() {
9898 local dir="$1"
99+ local _gtr_trust_dir="${XDG_CONFIG_HOME:-$HOME/.config}/gtr/trusted"
99100
100101 cd "$dir" && {
101102 local _gtr_hooks _gtr_hook _gtr_seen _gtr_config_file
102103 _gtr_hooks=""
103104 _gtr_seen=""
104105 # Read from git config (local > global > system)
105106 _gtr_hooks="$(git config --get-all gtr.hook.postCd 2>/dev/null)" || true
106- # Read from .gtrconfig if it exists
107+ # Read from .gtrconfig if it exists — only if trusted
107108 _gtr_config_file="$(git rev-parse --show-toplevel 2>/dev/null)/.gtrconfig"
108109 if [ -f "$_gtr_config_file" ]; then
109110 local _gtr_file_hooks
110111 _gtr_file_hooks="$(git config -f "$_gtr_config_file" --get-all hooks.postCd 2>/dev/null)" || true
111112 if [ -n "$_gtr_file_hooks" ]; then
112- if [ -n "$_gtr_hooks" ]; then
113- _gtr_hooks="$_gtr_hooks"$'\n'"$_gtr_file_hooks"
113+ # Verify trust before including .gtrconfig hooks
114+ local _gtr_hook_hash
115+ _gtr_hook_hash="$(git config -f "$_gtr_config_file" --get-regexp '^hooks\.' 2>/dev/null | shasum -a 256 | cut -d' ' -f1)" || true
116+ if [ -n "$_gtr_hook_hash" ] && [ -f "$_gtr_trust_dir/$_gtr_hook_hash" ]; then
117+ if [ -n "$_gtr_hooks" ]; then
118+ _gtr_hooks="$_gtr_hooks"$'\n'"$_gtr_file_hooks"
119+ else
120+ _gtr_hooks="$_gtr_file_hooks"
121+ fi
114122 else
115- _gtr_hooks="$_gtr_file_hooks"
123+ echo "__FUNC__: Untrusted .gtrconfig hooks skipped — run 'git gtr trust' to approve" >&2
116124 fi
117125 fi
118126 fi
@@ -273,23 +281,31 @@ _init_zsh() {
273281__FUNC___run_post_cd_hooks() {
274282 emulate -L zsh
275283 local dir="$1"
284+ local _gtr_trust_dir="${XDG_CONFIG_HOME:-$HOME/.config}/gtr/trusted"
276285
277286 cd "$dir" && {
278287 local _gtr_hooks _gtr_hook _gtr_seen _gtr_config_file
279288 _gtr_hooks=""
280289 _gtr_seen=""
281290 # Read from git config (local > global > system)
282291 _gtr_hooks="$(git config --get-all gtr.hook.postCd 2>/dev/null)" || true
283- # Read from .gtrconfig if it exists
292+ # Read from .gtrconfig if it exists — only if trusted
284293 _gtr_config_file="$(git rev-parse --show-toplevel 2>/dev/null)/.gtrconfig"
285294 if [ -f "$_gtr_config_file" ]; then
286295 local _gtr_file_hooks
287296 _gtr_file_hooks="$(git config -f "$_gtr_config_file" --get-all hooks.postCd 2>/dev/null)" || true
288297 if [ -n "$_gtr_file_hooks" ]; then
289- if [ -n "$_gtr_hooks" ]; then
290- _gtr_hooks="$_gtr_hooks"$'\n'"$_gtr_file_hooks"
298+ # Verify trust before including .gtrconfig hooks
299+ local _gtr_hook_hash
300+ _gtr_hook_hash="$(git config -f "$_gtr_config_file" --get-regexp '^hooks\.' 2>/dev/null | shasum -a 256 | cut -d' ' -f1)" || true
301+ if [ -n "$_gtr_hook_hash" ] && [ -f "$_gtr_trust_dir/$_gtr_hook_hash" ]; then
302+ if [ -n "$_gtr_hooks" ]; then
303+ _gtr_hooks="$_gtr_hooks"$'\n'"$_gtr_file_hooks"
304+ else
305+ _gtr_hooks="$_gtr_file_hooks"
306+ fi
291307 else
292- _gtr_hooks="$_gtr_file_hooks"
308+ echo "__FUNC__: Untrusted .gtrconfig hooks skipped — run 'git gtr trust' to approve" >&2
293309 fi
294310 fi
295311 fi
@@ -451,17 +467,30 @@ _init_fish() {
451467
452468function __FUNC___run_post_cd_hooks
453469 set -l dir "$argv[1]"
470+ set -l _gtr_trust_dir "$HOME/.config/gtr/trusted"
471+ if set -q XDG_CONFIG_HOME
472+ set _gtr_trust_dir "$XDG_CONFIG_HOME/gtr/trusted"
473+ end
454474 cd $dir
455475 and begin
456476 set -l _gtr_hooks
457477 set -l _gtr_seen
458478 # Read from git config (local > global > system)
459479 set -l _gtr_git_hooks (git config --get-all gtr.hook.postCd 2>/dev/null)
460- # Read from .gtrconfig if it exists
480+ # Read from .gtrconfig if it exists — only if trusted
461481 set -l _gtr_config_file (git rev-parse --show-toplevel 2>/dev/null)"/.gtrconfig"
462482 set -l _gtr_file_hooks
463483 if test -f "$_gtr_config_file"
464- set _gtr_file_hooks (git config -f "$_gtr_config_file" --get-all hooks.postCd 2>/dev/null)
484+ set -l _gtr_candidate_hooks (git config -f "$_gtr_config_file" --get-all hooks.postCd 2>/dev/null)
485+ if test (count $_gtr_candidate_hooks) -gt 0
486+ # Verify trust before including .gtrconfig hooks
487+ set -l _gtr_hook_hash (git config -f "$_gtr_config_file" --get-regexp '^hooks\.' 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
488+ if test -n "$_gtr_hook_hash"; and test -f "$_gtr_trust_dir/$_gtr_hook_hash"
489+ set _gtr_file_hooks $_gtr_candidate_hooks
490+ else
491+ echo "__FUNC__: Untrusted .gtrconfig hooks skipped — run 'git gtr trust' to approve" >&2
492+ end
493+ end
465494 end
466495 # Merge and deduplicate
467496 set _gtr_hooks $_gtr_git_hooks $_gtr_file_hooks
0 commit comments