gitpages.post-receive.hook (1656B)
1 #!/bin/sh 2 # 3 # Copyright (c) 2026 Fred Großkopf 4 # 5 # Permission to use, copy, modify, and/or distribute this software for any 6 # purpose with or without fee is hereby granted, provided that the above 7 # copyright notice and this permission notice appear in all copies. 8 # 9 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 17 set -euf 18 19 QUEUE_DIR="/var/spool/gitpages/queue" 20 21 sanitize_repo_name() { 22 name="$1" 23 24 # WHITELIST: ONLY these chars allowed 25 name=$(printf '%s' "$name" | tr -cd 'A-Za-z0-9_-') 26 27 # Reject if invalid length or format 28 if [ ${#name} -lt 1 ] || [ ${#name} -gt 32 ]; then 29 printf '%s\n' "invalid" >&2 30 exit 1 31 fi 32 33 # Reject if just separators or ending with seperators 34 case "$name" in 35 "-" | "_" | *"-" | *"_") 36 printf '%s\n' "invalid" >&2 37 exit 1 38 ;; 39 esac 40 41 # No leading digits 42 if echo "$name" | grep -q '^[0-9]'; then 43 printf '%s\n' "invalid" >&2 44 exit 1 45 fi 46 47 printf '%s\n' "$name" 48 } 49 50 main() { 51 REPO_PATH="$PWD" 52 53 repo_name=$(basename "$REPO_PATH" .git) 54 safe_repo_name=$(sanitize_repo_name "$repo_name") 55 jobfile="$QUEUE_DIR/$safe_repo_name" 56 57 umask 002 58 59 printf '%s\n' "$REPO_PATH" > "$jobfile.$$" 60 mv "$jobfile.$$" "$jobfile" 61 } 62 63 main