51 lines
1.5 KiB
Bash
51 lines
1.5 KiB
Bash
#!/bin/sh
|
|
# This CGI creates directory index.
|
|
# Put it into cgi-bin/index.cgi and chmod 0755.
|
|
#
|
|
# Problems:
|
|
# * Unsafe wrt weird filenames with <>"'& etc...
|
|
# * Not efficient: calls stat (program, not syscall) for each file
|
|
# * Probably requires bash
|
|
#
|
|
# If you want speed and safety, you need to code it in C
|
|
|
|
# Must start with '/'
|
|
test "${QUERY_STRING:0:1}" = "/" || exit 1
|
|
# /../ is not allowed
|
|
test "${QUERY_STRING%/../*}" = "$QUERY_STRING" || exit 1
|
|
test "${QUERY_STRING%/..}" = "$QUERY_STRING" || exit 1
|
|
|
|
# Outta cgi-bin...
|
|
cd .. 2>/dev/null || exit 1
|
|
# Strip leading '/', go to target dir
|
|
cd "${QUERY_STRING:1}" 2>/dev/null || exit 1
|
|
|
|
f=`dirname "$QUERY_STRING"`
|
|
test "$f" = "/" && f=""
|
|
|
|
printf "%s" \
|
|
$'HTTP/1.0 200 OK\r\n'\
|
|
$'Content-type: text/html\r\n\r\n'\
|
|
"<html><head><title>Index of $QUERY_STRING</title></head>"$'\r\n'\
|
|
"<body><h1>Index of $QUERY_STRING</h1><pre>"$'\r\n'\
|
|
$'<table width=100%>\r\n'\
|
|
$'<col><col><col width=0*>\r\n'\
|
|
$'<tr><th>Name<th align=right>Last modified<th align=right>Size\r\n'\
|
|
\
|
|
"<tr><td><a href='$f/'>..</a><td><td>"$'\r\n'
|
|
|
|
IFS='#'
|
|
for f in *; do
|
|
# Guard against empty dirs...
|
|
test -e "$f" && \
|
|
stat -c "%F#%s#%z" "$f" | {
|
|
read type size cdt junk
|
|
dir=''
|
|
test "$type" = "directory" && dir='/'
|
|
cdt="${cdt//.*}" # no fractional seconds
|
|
cdt="${cdt// / }" # prevent wrapping around space
|
|
printf "%s" "<tr><td><a href='$f$dir'>$f</a><td align=right>$cdt<td align=right>$size"$'\r\n'
|
|
}
|
|
done
|
|
printf "</table></pre><hr></body></html>"$'\r\n'
|