]> git.plutz.net Git - shellwiki/commitdiff
Fix pathing bugs in attachment_glob()
authorPaul Hänsch <paul@plutz.net>
Fri, 7 Nov 2025 00:19:04 +0000 (01:19 +0100)
committerPaul Hänsch <paul@plutz.net>
Fri, 7 Nov 2025 00:19:04 +0000 (01:19 +0100)
tools.sh

index 6923b6a53e43b31be70c5d1cc867e07deb588a74..e067e4799064a43c07a967f27fc1035e3b06b688 100755 (executable)
--- a/tools.sh
+++ b/tools.sh
@@ -110,31 +110,35 @@ size_human(){
 }
 
 attachment_glob(){
-  local pattern="${1%/}" IFS=''
+  local pattern="${1}" IFS=''
   local glob page pagedir
 
   page="${pattern%/*}"
-  [ "$page" = "$pattern" ] && page=.
-  [ ! "$page" ] && page=/
+  [ "$page" = "$pattern" ] && page="./" || page="${page}/"
   pattern="${pattern##*/}"
   [ ! "$pattern" ] && pattern="*"
 
   case $page in
   /*)
-    for glob in "$_DATA/pages/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages"}"; done
-    for glob in "$_EXEC/pages/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages"}"; done
+    for glob in "$_DATA/pages${page}#attachments"/$pattern;
+     do [ -e "$glob" ] && printf '%s\n' "${glob#"$_DATA/pages"}"; done
+    for glob in "$_EXEC/pages${page}#attachments"/$pattern;
+     do [ -e "$glob" ] && printf '%s\n' "${glob#"$_EXEC/pages"}"; done
     ;;
   *)
-    for glob in "$_DATA/pages/$PATH_INFO/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
-    for glob in "$_EXEC/pages/$PATH_INFO/$page/#attachments"/$pattern; do printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
+    for glob in "$_DATA/pages/$PATH_INFO/$page#attachments"/$pattern;
+     do [ -e "$glob" ] && printf '%s\n' "${glob#"$_DATA/pages/$PATH_INFO/"}"; done
+    # FIXME: ../ cannot resolve if $PATH_INFO does not exist in $_EXEC/pages/
+    # even though the resulting path would be valid (i.e. $_EXEC/pages/NONEXIST/../)
+    for glob in "$_EXEC/pages/$PATH_INFO/$page#attachments"/$pattern;
+     do [ -e "$glob" ] && printf '%s\n' "${glob#"$_EXEC/pages/$PATH_INFO/"}"; done
     ;;
   esac \
   | sort -u \
   | while read -r glob; do
-    [ -e "$glob" ] || continue
     pagedir="$(page_abs "${glob%%/#attachments/*}/")"
     [ -d "$_DATA/pages/$pagedir" -o -d "$_EXEC/pages/$pagedir" ] \
-    && printf '%s\n' "${glob%%/#attachments/*}/${glob#*/#attachments/}"
+    && printf '%s\n' "${glob%%/#attachments/*}/${glob##*/}"
   done
 }