]> git.plutz.net Git - serve0/blobdiff - actions/filter.sh
adopted update in shcgi
[serve0] / actions / filter.sh
index 94b87f2c7ce6036f54b4e5458cba35344bc6f313..c7f4d87fd8aba5e3125866735a397d07fc33f6b0 100755 (executable)
@@ -1,37 +1,26 @@
 #!/bin/zsh
 
-if [ -n "${CONTENT_LENGTH}" -a "${CONTENT_LENGTH}" -gt 0 ]; then
-(head -c "${CONTENT_LENGTH}"; echo)|sed 's:&:\n:g;s:\r::g' |while read line; do
-  case "$line" in
-    type[0-9]=neg)
-      [ -z "$filters" ] && filters="!"
-      [ -n "$filters" ] && egrep -q '(^|\^|\||!)$' <<<"$filters" || filters="${filters}^!"
-      ;;
-    type[0-9]=pos)
-      egrep -q '(^|\^|\||!)$' <<<"$filters" || filters="${filters}^"
-      ;;
-    category=*)
-      category="$(sed 's/^category=//;s/+/ /g;s/%/\\x/g' <<<"$line")"
-      category="$(echo -e "${category}" |sed 's/\t/ /g;s/\r//g;s/\\/\\\\/g' |head -n1)"
-      ;;
-    filter=*)
-      filter="$(sed 's/^filter=//;s/+/ /g;s/%/\\x/g' <<<"$line")"
-      filter="$(echo -e "${filter}" |sed 's/\t/ /g;s/\r//g;s/\\/\\\\/g' |head -n1)"
-      egrep -q '(^|\^|\||!)$' <<<"${filters}" || filters="${filters}|"
-      filters="${filters}${filter}"
-      ;;
-    cfilter=*)
-      cfilter="$(sed 's/^cfilter=//;s/+/ /g;s/%/\\x/g' <<<"$line")"
-      cfilter="$(echo -e "${cfilter}" |sed 's/\t/ /g;s/\r//g;s/\\/\\\\/g' |head -n1)"
-      egrep -q '(^|\^|\||!)$' <<<"${filters}" || filters="${filters}|"
-      [ -n "$cfilter" ] && filters="${filters}${category}:${cfilter}"
-      ;;
-    o=Name) order=Name;;
-    o=Date) order=Date;;
-    o=Length) order=Length;;
-  esac
+cgi_post
+order=$(validate "${_POST[o]}" 'Name|Length|Date' Name)
+
+for fn in {0..9}; do
+  category="$(validate "${_POST[category$fn]}" '[[:alnum:]_-]+' none)"
+
+  n=''; while [ -n "${_POST[cfilter${fn}_$n]}" ]; do
+    cfilter="$(validate "${_POST[cfilter${fn}_$n]}" '[[:alnum:]\?!\._=\(\)+-]+' '#')"
+
+    if [ -z "$n" ]; then
+      [ -n "$filters" ] && filters="${filters}^"
+      [ "${_POST[type$fn]}" = 'neg' ] && filters="${filters}!"
+      n=0
+    else
+      filters="${filters}|"
+      n=$(($n + 1))
+    fi
+    [ "$category" = "none" ] && filters="${filters}${cfilter}" \
+                             || filters="${filters}${category}:${cfilter}"
+  done
 done
-fi
 
 echo "?o=${order}&f=${filters}" >>${_DATA}/meta/recent
 echo -n "Location: ?o=${order}&f=${filters}\n\n"