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

libpkg.sh: unset TAGS too in unset_receipt(); and code reformatting
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Nov 27 16:26:29 2014 +0200 (2014-11-27)
parents c3e9d6b91059
children efac6599349a
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/httphelper.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; charset=UTF-8"
22 for i in "$@" ""; do
23 echo -e "$i\r"
24 done
25 }
27 http_urlencode() {
28 sed \
29 -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 \
37 -e 's|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g' \
38 -e 's|"|\&quot;|g; s|'"'"'|\&apos;|g; s|\t|\&#09;|g'
39 }
41 # MD5 crypt a string such as password (httpd -m dont give same result ?)
42 md5crypt() {
43 echo -n "$1" | md5sum | awk '{print $1}'
44 }
46 # MD5 crypt a string. Stronger crypto than MD5
47 sha512crypt() {
48 echo -n "$1" | sha512sum | awk '{print $1}'
49 }
51 _ARRAY()
52 {
53 if [ -z "$2" ]; then
54 eval echo \$${1}__NAMES
55 else
56 [ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1}
57 fi
58 }
60 GET() { _ARRAY GET "$1" $2; }
61 POST() { _ARRAY POST "$1" $2; }
62 FILE() { _ARRAY FILE "$1" $2; }
63 COOKIE() { _ARRAY COOKIE "$1" $2; }
65 httpinfo()
66 {
67 local i
68 local j
69 local x
70 env | sort | sed "s/=/='/;s/$/'/"
71 for x in GET POST COOKIE ; do
72 for i in $($x) ; do
73 if [ $($x $i count) -gt 1 ]; then
74 for j in $(seq 1 $($x $i count)); do
75 echo "$x($i,$j)='$($x $i $j)'"
76 done
77 else
78 echo "$x($i)='$($x $i)'"
79 fi
80 done
81 done
82 for i in $(FILE) ; do
83 for j in name size type tmpname ; do
84 echo "FILE($i,$j)='$(FILE $i $j)'"
85 done
86 done
87 }
89 read_query_string()
90 {
91 local i
92 local names
93 local cnt
94 names=""
95 IFS="&"
96 for i in $2 ; do
97 var=${i%%[^A-Za-z_0-9]*}
98 case " $names " in
99 *\ $var\ *)
100 eval cnt=\$${1}_${var}_count ;;
101 *)
102 cnt=0
103 names="$names $var" ;;
104 esac
105 eval ${1}_${var}_count=$((++cnt))
106 eval ${1}_${var}_$cnt=\'$(busybox httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\'
107 done
108 unset IFS
109 eval ${1}__NAMES=\'${names# }\'
110 }
114 [ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING"
115 [ -z "$COOKIE_NAMES" ] &&
116 read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')"
120 ddcut()
121 {
122 page=4096
123 skip=$1
124 count=$(($2 - $1 -2))
126 tmp=$(($skip / $page))
127 [ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0
129 skip=$(($skip - ($tmp * $page) ))
130 dd bs=1 skip=$skip count=0
132 tmp=$(( ($page - $skip) % $page ))
133 if [ $tmp -ne 0 -a $tmp -le $count ]; then
134 dd bs=1 count=$tmp
135 count=$(($count - $tmp))
136 fi
138 tmp=$(($count / $page))
139 [ $tmp -ne 0 ] && dd bs=$page count=$tmp
140 dd bs=1 count=$(($count - ($tmp * $page) ))
141 }
145 if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then
146 prefix=/tmp/httpd_post
147 mkdir $prefix$$
148 now=$(stat -c %Y $prefix$$)
149 for i in $prefix* ; do
150 [ $(stat -c %Y $i) -lt $(($now - 3600)) ] && rm -rf $i
151 done
152 post=$prefix$$/post
153 n=1
154 cat > ${post}0
155 read args < ${post}0
156 delim="${args%?}"
158 case "$delim" in
160 -*)
161 awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o }
162 { o+=1+length() }" < ${post}0 | \
163 while read offset; do
164 if [ $offset -ne 0 ]; then
165 ddcut $last $offset < ${post}0 > $post$n 2> /dev/null
166 n=$(($n+1))
167 fi
168 last=$offset
169 done
170 rm -f ${post}0
172 for i in $post* ; do
173 head -n2 $i | grep -q filename= || echo '' >> $i
174 filename=
175 while read line; do
176 case "$line" in
178 *Content-Disposition*)
179 name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/')
180 name=${name%%[^A-Za-z_0-9]*}
181 case "$line" in
182 *filename=*)
183 filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;;
184 esac ;;
186 *Content-Type*)
187 type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;;
189 $'\r')
190 if [ -n "$filename" ]; then
191 tmp=$(mktemp $prefix$$/uploadXXXXXX)
192 cat > $tmp
193 FILE__NAMES="$FILE__NAMES $name"
194 FILE__NAMES="${FILE__NAMES# }"
195 eval FILE_${name}_tmpname=$tmp
196 eval FILE_${name}_name=$filename
197 eval FILE_${name}_size=$(stat -c %s $tmp)
198 eval FILE_${name}_type=$type
199 elif [ -n "$name" ]; then
200 eval cnt=\$POST_${name}_count
201 cnt=$(($cnt + 1))
202 eval var=\$POST_${name}_$cnt
203 while read line; do
204 [ -n "$var" ] && var="$var"$'\n'
205 var="$var$line"
206 done
207 eval POST_${name}_$cnt="\$var"
208 eval POST_${name}_count=$cnt
209 case " $POST__NAMES " in
210 *\ $name\ *)
211 ;;
212 *)
213 POST__NAMES="$POST__NAMES $name"
214 POST__NAMES="${POST__NAMES# }" ;;
215 esac
216 fi
217 break ;;
219 *) ;;
220 esac
221 done < $i
222 rm -f $i
223 done
224 #rmdir $(dirname $post)
225 ;;
227 *)
228 rm -rf $(dirname $post)
229 read_query_string POST "$args" ;;
231 esac
232 fi