blob: 9c8e022a61e5ba1eb390b8145b16ca414bd5594a [file] [log] [blame]
Denis Vlasenko5d148e22006-11-21 00:12:09 +00001#!/bin/sh
2# This CGI creates directory index.
3# Put it into cgi-bin/index.cgi and chmod 0755.
4#
5# Problems:
6# * Unsafe wrt weird filenames with <>"'& etc...
7# * Not efficient: calls stat (program, not syscall) for each file
8# * Probably requires bash
9#
10# If you want speed and safety, you need to code it in C
11
12# Must start with '/'
13test "${QUERY_STRING:0:1}" = "/" || exit 1
14# /../ is not allowed
15test "${QUERY_STRING%/../*}" = "$QUERY_STRING" || exit 1
16test "${QUERY_STRING%/..}" = "$QUERY_STRING" || exit 1
17
18# Outta cgi-bin...
19cd .. 2>/dev/null || exit 1
20# Strip leading '/', go to target dir
21cd "${QUERY_STRING:1}" 2>/dev/null || exit 1
22
23f=`dirname "$QUERY_STRING"`
24test "$f" = "/" && f=""
25
Denis Vlasenko5d148e22006-11-21 00:12:09 +000026printf "%s" \
27$'HTTP/1.0 200 OK\r\n'\
28$'Content-type: text/html\r\n\r\n'\
29"<html><head><title>Index of $QUERY_STRING</title></head>"$'\r\n'\
30"<body><h1>Index of $QUERY_STRING</h1><pre>"$'\r\n'\
31$'<table width=100%>\r\n'\
32$'<col><col><col width=0*>\r\n'\
33$'<tr><th>Name<th align=right>Last modified<th align=right>Size\r\n'\
34\
35"<tr><td><a href='$f/'>..</a><td><td>"$'\r\n'
36
37IFS='#'
38for f in *; do
39 # Guard against empty dirs...
40 test -e "$f" && \
41 stat -c "%F#%s#%z" "$f" | {
42 read type size cdt junk
43 dir=''
44 test "$type" = "directory" && dir='/'
45 cdt="${cdt//.*}" # no fractional seconds
46 cdt="${cdt// /&nbsp;}" # prevent wrapping around space
47 printf "%s" "<tr><td><a href='$f$dir'>$f</a><td align=right>$cdt<td align=right>$size"$'\r\n'
48 }
49done
50printf "</table></pre><hr></body></html>"$'\r\n'