slitaz-base-files annotate rootfs/usr/lib/slitaz/httphelper @ rev 122
httphelper: fix for apache
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Thu Apr 12 16:47:54 2012 +0200 (2012-04-12) |
parents | 31f8714202b6 |
children | 333e86ef0a8f |
rev | line source |
---|---|
pankso@105 | 1 #!/bin/sh |
pankso@105 | 2 # |
pankso@105 | 3 # SliTaz Helper for SHell CGI scripts - See httphelper function |
pankso@105 | 4 # |
pankso@109 | 5 # This helper is used in TazPanel, Pizza and other SliTaz CGI tools and |
pankso@109 | 6 # services. The goal is to maintain it according to the needs of the |
pankso@109 | 7 # project and Busybox httpd server applet since it is used for URL |
pankso@109 | 8 # [en|de]coding. |
pankso@105 | 9 # |
pankso@109 | 10 # Copyright (C) SliTaz 2012 - GNU gpl v2 |
pankso@105 | 11 # |
pankso@105 | 12 |
pascal@122 | 13 alias urlencode='busybox httpd -e' |
pascal@122 | 14 alias urldecode='busybox httpd -d' |
pankso@105 | 15 |
pankso@105 | 16 # Help and usage. |
pankso@105 | 17 httphelper() { |
pankso@105 | 18 cat << EOT |
pankso@105 | 19 |
pankso@105 | 20 Include this helper in a script: |
pankso@105 | 21 . /usr/lib/slitaz/httphelper |
pankso@105 | 22 |
pankso@105 | 23 Functions: |
pankso@105 | 24 GET [var [index]] |
pankso@105 | 25 POST [var [index]] |
pankso@105 | 26 COOKIE [var [index]] |
pankso@105 | 27 FILE [var {name|tmpname|size|type}] |
pankso@105 | 28 header [strings] |
pascal@113 | 29 http_urlencode string |
pankso@105 | 30 urlencode string |
pankso@105 | 31 urldecode string |
pankso@105 | 32 htmlentities string |
pankso@121 | 33 md5crypt string |
pankso@121 | 34 sha512crypt string |
pankso@105 | 35 httpinfo |
pankso@121 | 36 httphelper |
pankso@105 | 37 |
pankso@105 | 38 Example: |
pankso@105 | 39 header "Content-type: text/html" "Set-Cookie: name=value; HttpOnly" |
pankso@105 | 40 |
pankso@105 | 41 if [ "\$(GET name)" ]; then |
paul@110 | 42 echo "Input name has a value from HTML form" |
pankso@105 | 43 fi |
pankso@105 | 44 |
pankso@105 | 45 EOT |
pankso@105 | 46 } |
pankso@105 | 47 |
pankso@105 | 48 # Send headers. |
pankso@105 | 49 header() { |
pankso@105 | 50 local i |
pankso@105 | 51 [ -z "$1" ] && set -- "Content-type: text/html" |
pankso@105 | 52 for i in "$@" "" |
pankso@105 | 53 do |
pankso@105 | 54 echo -e "$i\r" |
pankso@105 | 55 done |
pankso@105 | 56 } |
pankso@105 | 57 |
pascal@113 | 58 http_urlencode() { |
pascal@113 | 59 sed -e "s|%|%25|g;s|!|%21|g;s|\*|%2A|g;s|'|%27|g;s|(|%28|g" \ |
pascal@113 | 60 -e "s|)|%29|g;s|;|%3B|g;s|:|%3A|g;s|@|%40|g;s|&|%26|g" \ |
pascal@113 | 61 -e "s|=|%3D|g;s|+|%2B|g;s|\$|%24|g;s|,|%2C|g;s|/|%2F|g" \ |
pascal@113 | 62 -e "s|\?|%3F|g;s|#|%25|g;s|\[|%5B|g;s|\]|%5D|g;s| |+|g" |
pascal@113 | 63 } |
pascal@113 | 64 |
pankso@105 | 65 htmlentities() { |
pankso@105 | 66 echo $1 | sed 's|&|\&|g;s|<|\<|g;s|>|\>|g;s|"|\"|g' |
pankso@105 | 67 } |
pankso@105 | 68 |
pankso@114 | 69 # MD5 crypt a string such as password (httpd -m dont give same result ?) |
pankso@114 | 70 md5crypt() { |
pankso@114 | 71 echo -n "$1" | md5sum | awk '{print $1}' |
pankso@114 | 72 } |
pankso@114 | 73 |
pankso@121 | 74 # MD5 crypt a string. Stronger crypto than MD5 |
pankso@121 | 75 sha512crypt() { |
pankso@121 | 76 echo -n "$1" | sha512sum | awk '{print $1}' |
pankso@121 | 77 } |
pankso@121 | 78 |
pankso@105 | 79 _ARRAY() |
pankso@105 | 80 { |
pankso@105 | 81 [ -z "$2" ] && eval echo \$${1}__NAMES || |
pankso@105 | 82 [ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1} |
pankso@105 | 83 } |
pankso@105 | 84 |
pankso@105 | 85 GET() { _ARRAY GET "$1" $2; } |
pankso@105 | 86 POST() { _ARRAY POST "$1" $2; } |
pankso@105 | 87 FILE() { _ARRAY FILE "$1" $2; } |
pankso@105 | 88 COOKIE() { _ARRAY COOKIE "$1" $2; } |
pankso@105 | 89 |
pankso@105 | 90 httpinfo() |
pankso@105 | 91 { |
pankso@105 | 92 local i |
pankso@105 | 93 local j |
pankso@105 | 94 local x |
pankso@105 | 95 for i in SERVER_PROTOCOL SERVER_SOFTWARE SERVER_NAME SERVER_PORT AUTH_TYPE \ |
pankso@105 | 96 GATEWAY_INTERFACE REMOTE_HOST REMOTE_ADDR REMOTE_PORT \ |
pankso@105 | 97 HTTP_REFERER HTTP_HOST HTTP_USER_AGENT HTTP_ACCEPT \ |
pankso@105 | 98 HTTP_ACCEPT_LANGUAGE HTTP_COOKIE AUTH_TYPE REMOTE_USER REMOTE_IDENT \ |
pankso@105 | 99 REQUEST_METHOD REQUEST_URI QUERY_STRING CONTENT_LENGTH CONTENT_TYPE \ |
pankso@105 | 100 SCRIPT_NAME SCRIPT_FILENAME PATH_INFO PATH_TRANSLATED \ |
pankso@105 | 101 USER HOME LOGNAME SHELL PWD ; do |
pankso@105 | 102 eval x=\$$i |
pankso@105 | 103 [ -n "$x" ] && echo "$i='$x'" |
pankso@105 | 104 done |
pankso@105 | 105 for x in GET POST COOKIE ; do |
pankso@105 | 106 for i in $($x) ; do |
pankso@105 | 107 if [ $($x $i count) -gt 1 ]; then |
pankso@105 | 108 for j in $(seq 1 $($x $i count)); do |
pankso@105 | 109 echo "$x($i,$j)='$($x $i $j)'" |
pankso@105 | 110 done |
pankso@105 | 111 else |
pankso@105 | 112 echo "$x($i)='$($x $i)'" |
pankso@105 | 113 fi |
pankso@105 | 114 done |
pankso@105 | 115 done |
pankso@105 | 116 for i in $(FILE) ; do |
pankso@105 | 117 for j in name size type tmpname ; do |
pankso@105 | 118 echo "FILE($i,$j)='$(FILE $i $j)'" |
pankso@105 | 119 done |
pankso@105 | 120 done |
pankso@105 | 121 } |
pankso@105 | 122 |
pankso@105 | 123 read_query_string() |
pankso@105 | 124 { |
pankso@105 | 125 local i |
pankso@105 | 126 local names |
pankso@105 | 127 local cnt |
pankso@105 | 128 names="" |
pankso@105 | 129 IFS="&" |
pankso@105 | 130 for i in $2 ; do |
pankso@105 | 131 var=${i%%[^A-Za-z_0-9]*} |
pankso@105 | 132 case " $names " in |
pankso@105 | 133 *\ $var\ *) eval cnt=\$${1}_${var}_count ;; |
pankso@105 | 134 *) cnt=0 |
pankso@105 | 135 names="$names $var" ;; |
pankso@105 | 136 esac |
pankso@105 | 137 eval ${1}_${var}_count=$((++cnt)) |
pascal@122 | 138 eval ${1}_${var}_$cnt=\'$(busybox httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\' |
pankso@105 | 139 done |
pankso@105 | 140 unset IFS |
pankso@105 | 141 eval ${1}__NAMES=\'${names# }\' |
pankso@105 | 142 } |
pankso@105 | 143 |
pankso@105 | 144 [ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING" |
pankso@105 | 145 [ -z "$COOKIE_NAMES" ] && |
pankso@105 | 146 read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')" |
pankso@105 | 147 |
pankso@105 | 148 ddcut() |
pankso@105 | 149 { |
pankso@105 | 150 page=4096 |
pankso@105 | 151 skip=$1 |
pankso@105 | 152 count=$(($2 - $1 -2)) |
pankso@105 | 153 tmp=$(($skip / $page)) |
pankso@105 | 154 [ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0 |
pankso@105 | 155 skip=$(($skip - ($tmp * $page) )) |
pankso@105 | 156 dd bs=1 skip=$skip count=0 |
pankso@105 | 157 tmp=$(( ($page - $skip) % $page )) |
pankso@105 | 158 if [ $tmp -ne 0 -a $tmp -le $count ]; then |
pankso@105 | 159 dd bs=1 count=$tmp |
pankso@105 | 160 count=$(($count - $tmp)) |
pankso@105 | 161 fi |
pankso@105 | 162 tmp=$(($count / $page)) |
pankso@105 | 163 [ $tmp -ne 0 ] && dd bs=$page count=$tmp |
pankso@105 | 164 dd bs=1 count=$(($count - ($tmp * $page) )) |
pankso@105 | 165 } |
pankso@105 | 166 |
pankso@105 | 167 if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then |
pankso@105 | 168 prefix=/tmp/httpd_post |
pankso@105 | 169 mkdir $prefix$$ |
pankso@105 | 170 now=$(stat -c %Y $prefix$$) |
pankso@105 | 171 for i in $prefix* ; do |
pankso@105 | 172 [ $(stat -c %Y $i) -lt $(($now - 3600)) ] && rm -rf $i |
pankso@105 | 173 done |
pankso@105 | 174 post=$prefix$$/post |
pankso@105 | 175 n=1 |
pankso@105 | 176 cat > ${post}0 |
pascal@111 | 177 read args < ${post}0 |
pascal@111 | 178 delim="${args%?}" |
pankso@105 | 179 case "$delim" in |
pankso@105 | 180 -*) awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o } |
pankso@105 | 181 { o+=1+length() }" < ${post}0 | while read offset; do |
pankso@105 | 182 if [ $offset -ne 0 ]; then |
pankso@105 | 183 ddcut $last $offset < ${post}0 > $post$n 2> /dev/null |
pankso@105 | 184 n=$(($n+1)) |
pankso@105 | 185 fi |
pankso@105 | 186 last=$offset |
pankso@105 | 187 done |
pankso@105 | 188 rm -f ${post}0 |
pankso@105 | 189 CR=`printf '\r'` |
pankso@105 | 190 for i in $post* ; do |
pankso@105 | 191 head -n 2 $i | grep -q filename= || echo '' >> $i |
pankso@105 | 192 filename= |
pankso@105 | 193 while read line; do |
pankso@105 | 194 case "$line" in |
pankso@105 | 195 *Content-Disposition*) |
pankso@105 | 196 name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/') |
pankso@105 | 197 name=${name%%[^A-Za-z_0-9]*} |
pankso@105 | 198 case "$line" in |
pankso@105 | 199 *filename=*) filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;; |
pankso@105 | 200 esac ;; |
pankso@105 | 201 *Content-Type*) |
pankso@105 | 202 type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;; |
pankso@105 | 203 $CR) |
pankso@105 | 204 if [ -n "$filename" ]; then |
pankso@105 | 205 tmp=$(mktemp $prefix$$/uploadXXXXXX) |
pankso@105 | 206 cat > $tmp |
pankso@105 | 207 FILE__NAMES="$FILE__NAMES $name" |
pankso@105 | 208 FILE__NAMES="${FILE__NAMES# }" |
pankso@105 | 209 eval FILE_${name}_tmpname=$tmp |
pankso@105 | 210 eval FILE_${name}_name=$filename |
pankso@105 | 211 eval FILE_${name}_size=$(stat -c %s $tmp) |
pankso@105 | 212 eval FILE_${name}_type=$type |
pankso@105 | 213 elif [ -n "$name" ]; then |
pankso@105 | 214 eval cnt=\$POST_${name}_count |
pankso@105 | 215 cnt=$(($cnt + 1)) |
pankso@105 | 216 eval var=\$POST_${name}_$cnt |
pankso@105 | 217 while read line; do |
pankso@105 | 218 [ -n "$var" ] && var="$var |
pankso@105 | 219 " |
pankso@105 | 220 var="$var$line" |
pankso@105 | 221 done |
pankso@105 | 222 eval POST_${name}_$cnt="\$var" |
pankso@105 | 223 eval POST_${name}_count=$cnt |
pankso@105 | 224 case " $POST__NAMES " in |
pankso@105 | 225 *\ $name\ *) ;; |
pankso@105 | 226 *) POST__NAMES="$POST__NAMES $name" |
pankso@105 | 227 POST__NAMES="${POST__NAMES# }" ;; |
pankso@105 | 228 esac |
pankso@105 | 229 fi |
pankso@105 | 230 break ;; |
pankso@105 | 231 *) |
pankso@105 | 232 esac |
pankso@105 | 233 done < $i |
pankso@105 | 234 rm -f $i |
pankso@105 | 235 done |
pankso@105 | 236 rmdir $(dirname $post) ;; |
pankso@105 | 237 *) rm -rf $(dirname $post) |
pascal@111 | 238 read_query_string POST "$args" ;; |
pankso@105 | 239 esac |
pankso@105 | 240 fi |