slitaz-base-files view rootfs/usr/lib/slitaz/httphelper.sh @ rev 232

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