From: paul Date: Sat, 13 Jun 2015 16:04:16 +0000 (+0000) Subject: merge with cgi scripts from busy X-Git-Url: http://git.plutz.net/?p=cgilite;a=commitdiff_plain;h=49831f4301899b008b94f590b4c9765f76b4c0f0 merge with cgi scripts from busy svn path=/trunk/; revision=4 --- diff --git a/action.sh b/action.sh index 390c5ef..5432664 100755 --- a/action.sh +++ b/action.sh @@ -19,6 +19,6 @@ ACTION="$(echo "$_GET[\"action\"]" |egrep '^[a-zA-Z0-9_-]+$')" ACTION="${_EXEC}/actions/${ACTION}.sh" -[ -x "$ACTION" ] || echo -n "Location: /?p=error\n\n" +[ -x "$ACTION" ] || echo -n "Location: ?p=error\n\n" . $ACTION diff --git a/cgi.sh b/cgi.sh index c70c4d2..37f4787 100755 --- a/cgi.sh +++ b/cgi.sh @@ -1,39 +1,44 @@ #!/bin/zsh -# Copyright 2014 Paul Hänsch +# Copyright 2014,2015 Paul Hänsch # -# This file is part of Serve0. +# This file is part of shcgi. # -# Serve0 is free software: you can redistribute it and/or modify +# shcgi is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# Serve0 is distributed in the hope that it will be useful, +# shcgi is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with Serve0. If not, see . +# along with shcgi. If not, see . declare -A _GET declare -A _POST declare -A _REF +[ -z "$HTTP_REFERER" ] && HTTP_REFERER="./" + cgi_get() { # parse HTTP GET string + debug "== CGI DATA: GET ==" echo "$QUERY_STRING" |tr '&' '\n' |while read query; do - key="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" - val="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" - _GET["$key"]="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")" + key="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" + val="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" + _GET["$key"]="$(echo -e "$(echo -E "$val" |sed 's:+: :g;s:\\:\\\\:g;s:%:\\x:g')")" + debug "_GET[$key] => $val" done } cgi_post() { # parse HTTP POST string + debug "== CGI DATA: POST ==" sed -u 1q |tr '&' '\n' |while read query; do - key="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" - val="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" - value="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")" + key="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" + val="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" + value="$(echo -e "$(echo -E "$val" |sed 's:+: :g;s:\\:\\\\:g;s:%:\\x:g;')")" if [ -n "$_POST[\"$key\"]" ]; then n=0 while [ -n "$_POST[\"$key$n\"]" ]; do n=$(($n + 1)); done @@ -41,15 +46,17 @@ cgi_post() { # parse HTTP POST string else _POST["$key"]="$value" fi - #debug "_POST[$key] => $value" + debug "_POST[$key] => $value" done } cgi_refdata() { # Parse GET data from referer + debug "== CGI DATA: REFERER ==" echo "$HTTP_REFERER" |cut -d'?' -f2- |tr '&' '\n' |while read query; do - key="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" - val="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" - _REF["$key"]="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")" + key="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" + val="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" + _REF["$key"]="$(echo -e "$(echo -E "$val" |sed 's:+: :g;s:\\:\\\\:g;s:%:\\x:g')")" + debug "_REF[$key] => $val" done } diff --git a/index.cgi b/index.cgi index 6359a0a..9c068b5 100755 --- a/index.cgi +++ b/index.cgi @@ -17,7 +17,9 @@ # You should have received a copy of the GNU Affero General Public License # along with shcgi. If not, see . -export LC_ALL=C +export LC_ALL=C LANG=C +DBG_ENABLED=false +DBG_FILE=/dev/stderr # this program is supposed to be symlinked into a http root directory # we will use the http root as object storage (data directory) and call sub @@ -28,16 +30,24 @@ real="$(readlink -f $call)" _DATA="$(dirname "$call")" #storage directory _EXEC="${real%/shcgi/index.cgi}" #execution directory +# put debug options in the local.opts file +[ -r "$_DATA/local.opts" ] && . "$_DATA/local.opts" + # basic functions -die() { - echo "$@" >&2 - exit 1 +debug() { #change to false to disable debugging + if [ "$DBG_ENABLED" = true -a -n "$*" ]; then + echo -E "$@" >>"$DBG_FILE" + elif [ "$DBG_ENABLED" = true -a -z "$*" ]; then + tee -a "$DBG_FILE" + elif [ -z "$*" ]; then + cat + fi } -debug() { #change to false to disable debugging - #true && echo "$*" >>debug - true && [ -n "$*" ] && echo -E "$*" >>/dev/stderr - true && [ -z "$*" ] && tee /dev/stderr +die() { + debug "$@" + echo -E "$@" >>/dev/stderr + exit 1 } data_dirs(){ diff --git a/local.opts b/local.opts new file mode 100644 index 0000000..a473b58 --- /dev/null +++ b/local.opts @@ -0,0 +1,8 @@ +# This file is meaningless in the exec directory +# You can copy it to your data directory (usually +# your HTTP root) to set per instance debug +# options and the like +# beware that the file is sourced as a shell script + +DBG_ENABLED=false +DBG_FILE=/dev/stderr diff --git a/page.sh b/page.sh index a260233..578e93a 100755 --- a/page.sh +++ b/page.sh @@ -1,33 +1,33 @@ #!/bin/zsh -# Copyright 2014 Paul Hänsch +# Copyright 2014,2015 Paul Hänsch # -# This file is part of Serve0. +# This file is part of shcgi. # -# Serve0 is free software: you can redistribute it and/or modify +# shcgi is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# Serve0 is distributed in the hope that it will be useful, +# shcgi is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with Serve0. If not, see . +# along with shcgi. If not, see . echo -n "Content-Type: text/html;charset=utf-8\n\n" -PAGE="$(echo "$_GET[\"p\"]" |egrep '^[a-zA-Z0-9_-]+$')" +PAGE="$(echo -E "$_GET[\"p\"]" |egrep '^[a-zA-Z0-9_-]+$')" PAGE="${_EXEC}/pages/${PAGE}.sh" [ -x "$PAGE" ] || PAGE="${_EXEC}/pages/error.sh" NAVIGATION() { for each in "${_EXEC}"/pages/*.sh; do - link="$(echo "$each" |sed -r "s:^.*/([^/]*)\.sh$:\1:")" + link="$(echo -E "$each" |sed -r "s:^.*/([^/]*)\.sh$:\1:")" title="$($each title)" - [ -n "$title" ] && echo "/?p=$link $title" + [ -n "$title" ] && echo -E "/?p=$link $title" done }