slitaz-base-files annotate rootfs/usr/lib/slitaz/httphelper.sh @ rev 227

httphelper.sh: shrink
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jan 06 17:13:16 2014 +0000 (2014-01-06)
parents 793c2b7ed97f
children 94340c7e4c50
rev   line source
pankso@127 1 #!/bin/sh
pankso@127 2 #
pankso@127 3 # SliTaz Helper for SHell CGI scripts - See httphelper function
pankso@127 4 #
pankso@127 5 # This helper is used in TazPanel, Pizza and other SliTaz CGI tools and
pankso@127 6 # services. The goal is to maintain it according to the needs of the
pankso@127 7 # project and Busybox httpd server applet since it is used for URL
pankso@127 8 # [en|de]coding.
pankso@127 9 #
pankso@139 10 # Documentation: man httphelper or /usr/share/doc/slitaz/httpelper.txt
pankso@139 11 #
pascal@226 12 # Copyright (C) SliTaz 2014 - GNU GPL v2
pankso@127 13 #
pankso@127 14
pankso@127 15 alias urlencode='busybox httpd -e'
pankso@127 16 alias urldecode='busybox httpd -d'
pankso@127 17
pankso@127 18 # Send headers.
pankso@127 19 header() {
pankso@127 20 local i
pankso@127 21 [ -z "$1" ] && set -- "Content-type: text/html"
pankso@127 22 for i in "$@" ""
pankso@127 23 do
pankso@127 24 echo -e "$i\r"
pankso@127 25 done
pankso@127 26 }
pankso@127 27
pankso@127 28 http_urlencode() {
pankso@127 29 sed -e "s|%|%25|g;s|!|%21|g;s|\*|%2A|g;s|'|%27|g;s|(|%28|g" \
pankso@127 30 -e "s|)|%29|g;s|;|%3B|g;s|:|%3A|g;s|@|%40|g;s|&|%26|g" \
pankso@127 31 -e "s|=|%3D|g;s|+|%2B|g;s|\$|%24|g;s|,|%2C|g;s|/|%2F|g" \
pankso@127 32 -e "s|\?|%3F|g;s|#|%25|g;s|\[|%5B|g;s|\]|%5D|g;s| |+|g"
pankso@127 33 }
pankso@127 34
pankso@127 35 htmlentities() {
pascal@209 36 echo $1 | sed -e 's|&|\&amp;|g;s|<|\&lt;|g;s|>|\&gt;|g' \
pascal@209 37 -e 's|"|\&quot;|g;s|'"'"'|\&acute;|g;s|\t|\&#09;|g'
pankso@127 38 }
pankso@127 39
pankso@127 40 # MD5 crypt a string such as password (httpd -m dont give same result ?)
pankso@127 41 md5crypt() {
pankso@127 42 echo -n "$1" | md5sum | awk '{print $1}'
pankso@127 43 }
pankso@127 44
pankso@127 45 # MD5 crypt a string. Stronger crypto than MD5
pankso@127 46 sha512crypt() {
pankso@127 47 echo -n "$1" | sha512sum | awk '{print $1}'
pankso@127 48 }
pankso@127 49
pankso@127 50 _ARRAY()
pankso@127 51 {
pankso@127 52 [ -z "$2" ] && eval echo \$${1}__NAMES ||
pankso@127 53 [ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1}
pankso@127 54 }
pankso@127 55
pankso@127 56 GET() { _ARRAY GET "$1" $2; }
pankso@127 57 POST() { _ARRAY POST "$1" $2; }
pankso@127 58 FILE() { _ARRAY FILE "$1" $2; }
pankso@127 59 COOKIE() { _ARRAY COOKIE "$1" $2; }
pankso@127 60
pankso@127 61 httpinfo()
pankso@127 62 {
pankso@127 63 local i
pankso@127 64 local j
pankso@127 65 local x
pascal@227 66 env | sort | sed "s/=/='/;s/$/'/"
pankso@127 67 for x in GET POST COOKIE ; do
pankso@127 68 for i in $($x) ; do
pankso@127 69 if [ $($x $i count) -gt 1 ]; then
pankso@127 70 for j in $(seq 1 $($x $i count)); do
pankso@127 71 echo "$x($i,$j)='$($x $i $j)'"
pankso@127 72 done
pankso@127 73 else
pankso@127 74 echo "$x($i)='$($x $i)'"
pankso@127 75 fi
pankso@127 76 done
pankso@127 77 done
pankso@127 78 for i in $(FILE) ; do
pankso@127 79 for j in name size type tmpname ; do
pankso@127 80 echo "FILE($i,$j)='$(FILE $i $j)'"
pankso@127 81 done
pankso@127 82 done
pankso@127 83 }
pankso@127 84
pankso@127 85 read_query_string()
pankso@127 86 {
pankso@127 87 local i
pankso@127 88 local names
pankso@127 89 local cnt
pankso@127 90 names=""
pankso@127 91 IFS="&"
pankso@127 92 for i in $2 ; do
pankso@127 93 var=${i%%[^A-Za-z_0-9]*}
pankso@127 94 case " $names " in
pankso@127 95 *\ $var\ *) eval cnt=\$${1}_${var}_count ;;
pankso@127 96 *) cnt=0
pankso@127 97 names="$names $var" ;;
pankso@127 98 esac
pankso@127 99 eval ${1}_${var}_count=$((++cnt))
pankso@127 100 eval ${1}_${var}_$cnt=\'$(busybox httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\'
pankso@127 101 done
pankso@127 102 unset IFS
pankso@127 103 eval ${1}__NAMES=\'${names# }\'
pankso@127 104 }
pankso@127 105
pankso@127 106 [ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING"
pankso@127 107 [ -z "$COOKIE_NAMES" ] &&
pankso@127 108 read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')"
pankso@127 109
pankso@127 110 ddcut()
pankso@127 111 {
pankso@127 112 page=4096
pankso@127 113 skip=$1
pankso@127 114 count=$(($2 - $1 -2))
pankso@127 115 tmp=$(($skip / $page))
pankso@127 116 [ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0
pankso@127 117 skip=$(($skip - ($tmp * $page) ))
pankso@127 118 dd bs=1 skip=$skip count=0
pankso@127 119 tmp=$(( ($page - $skip) % $page ))
pankso@127 120 if [ $tmp -ne 0 -a $tmp -le $count ]; then
pankso@127 121 dd bs=1 count=$tmp
pankso@127 122 count=$(($count - $tmp))
pankso@127 123 fi
pankso@127 124 tmp=$(($count / $page))
pankso@127 125 [ $tmp -ne 0 ] && dd bs=$page count=$tmp
pankso@127 126 dd bs=1 count=$(($count - ($tmp * $page) ))
pankso@127 127 }
pankso@127 128
pankso@127 129 if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then
pankso@127 130 prefix=/tmp/httpd_post
pankso@127 131 mkdir $prefix$$
pankso@127 132 now=$(stat -c %Y $prefix$$)
pankso@127 133 for i in $prefix* ; do
pankso@127 134 [ $(stat -c %Y $i) -lt $(($now - 3600)) ] && rm -rf $i
pankso@127 135 done
pankso@127 136 post=$prefix$$/post
pankso@127 137 n=1
pankso@127 138 cat > ${post}0
pankso@127 139 read args < ${post}0
pankso@127 140 delim="${args%?}"
pankso@127 141 case "$delim" in
pankso@127 142 -*) awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o }
pankso@127 143 { o+=1+length() }" < ${post}0 | while read offset; do
pankso@127 144 if [ $offset -ne 0 ]; then
pankso@127 145 ddcut $last $offset < ${post}0 > $post$n 2> /dev/null
pankso@127 146 n=$(($n+1))
pankso@127 147 fi
pankso@127 148 last=$offset
pankso@127 149 done
pankso@127 150 rm -f ${post}0
pankso@127 151 CR=`printf '\r'`
pankso@127 152 for i in $post* ; do
pankso@127 153 head -n 2 $i | grep -q filename= || echo '' >> $i
pankso@127 154 filename=
pankso@127 155 while read line; do
pankso@127 156 case "$line" in
pankso@127 157 *Content-Disposition*)
pankso@127 158 name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/')
pankso@127 159 name=${name%%[^A-Za-z_0-9]*}
pankso@127 160 case "$line" in
pankso@127 161 *filename=*) filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;;
pankso@127 162 esac ;;
pankso@127 163 *Content-Type*)
pankso@127 164 type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;;
pankso@127 165 $CR)
pankso@127 166 if [ -n "$filename" ]; then
pankso@127 167 tmp=$(mktemp $prefix$$/uploadXXXXXX)
pankso@127 168 cat > $tmp
pankso@127 169 FILE__NAMES="$FILE__NAMES $name"
pankso@127 170 FILE__NAMES="${FILE__NAMES# }"
pankso@127 171 eval FILE_${name}_tmpname=$tmp
pankso@127 172 eval FILE_${name}_name=$filename
pankso@127 173 eval FILE_${name}_size=$(stat -c %s $tmp)
pankso@127 174 eval FILE_${name}_type=$type
pankso@127 175 elif [ -n "$name" ]; then
pankso@127 176 eval cnt=\$POST_${name}_count
pankso@127 177 cnt=$(($cnt + 1))
pankso@127 178 eval var=\$POST_${name}_$cnt
pankso@127 179 while read line; do
pankso@127 180 [ -n "$var" ] && var="$var
pankso@127 181 "
pankso@127 182 var="$var$line"
pankso@127 183 done
pankso@127 184 eval POST_${name}_$cnt="\$var"
pankso@127 185 eval POST_${name}_count=$cnt
pankso@127 186 case " $POST__NAMES " in
pankso@127 187 *\ $name\ *) ;;
pankso@127 188 *) POST__NAMES="$POST__NAMES $name"
pankso@127 189 POST__NAMES="${POST__NAMES# }" ;;
pankso@127 190 esac
pankso@127 191 fi
pankso@127 192 break ;;
pankso@127 193 *)
pankso@127 194 esac
pankso@127 195 done < $i
pankso@127 196 rm -f $i
pankso@127 197 done
pankso@127 198 rmdir $(dirname $post) ;;
pankso@127 199 *) rm -rf $(dirname $post)
pankso@127 200 read_query_string POST "$args" ;;
pankso@127 201 esac
pankso@127 202 fi