0127493cf044c13c1afc4ff805bf6a8aee4509ce
[shellsnippets/shellsnippets.git] / mksh / annex.cgi
1 #!/bin/mksh
2 # $MirOS: src/share/misc/licence.template,v 1.28 2008/11/14 15:33:44 tg Rel $
3 #-
4 # Copyright © 2012
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21
22 export LC_ALL=C.UTF-8
23 unset LANGUAGE
24
25 [[ $1 = -s ]] || if [[ $REQUEST_METHOD = GET && $HTTPS = on && \
26     -n $REMOTE_USER && $REMOTE_USER = "$AUTHENTICATE_UID" ]]; then
27         [[ $PATH_INFO = /* ]] && \
28             exec sudo -u "$REMOTE_USER" "$(realpath "$0")" -s "$PATH_INFO"
29         print Status: 301 Redirect
30         print Location: $SCRIPT_NAME/
31         print
32         print Please add the trailing slash after the .cgi
33         exit 1
34 else
35         print Content-type: text/plain\; charset=UTF-8
36         print
37         print Error in request arguments.
38         exit 1
39 fi
40
41 me=$(realpath "$0")
42 cd $(dirname "$(dirname "$me")")
43 basedir=$(realpath .)
44 shift
45 pi=$1
46
47 pi=${pi##*(/)}
48 pi=${pi%%*(/)}
49
50 function e403 {
51         print Status: 403 Forbidden
52         print Content-type: text/plain\; charset=UTF-8
53         print
54         print Du kumms hier nisch rein!
55         exit 1
56 }
57
58 if [[ -n $pi ]]; then
59         i=$(realpath "$pi")
60         [[ -n $i && $i = "$basedir"/* ]] || e403
61 fi
62
63 [[ -e ${pi:-.} && -r ${pi:-.} ]] || e403
64
65 [[ -n $pi ]] && if [[ ! -d $pi ]]; then
66         print Content-type: $(file -biL "$pi")
67         print
68         cat "$pi"
69         exit 0
70 fi
71
72 [[ -n $pi ]] && cd "$pi"
73 set -A dirs
74 set -A files
75 for i in *; do
76         [[ -e $i && -r $i ]] || continue
77         if [[ -d $i ]]; then
78                 dirs+=("$i")
79         else
80                 files+=("$i")
81         fi
82 done
83
84 function h {
85         typeset x="$*"
86
87         x=${x//'&'/"&amp;"}
88         x=${x//'<'/"&lt;"}
89         x=${x//'>'/"&gt;"}
90
91         print -r -- "$x"
92 }
93
94 cat <<EOF
95 Content-type: text/html; charset=UTF-8
96
97 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
98  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
99 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>
100  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
101  <title>$pi/ – Index for nik’s Annex</title>
102 </head><body>
103 <h1>Index of $pi/ in nik’s Annex</h1>
104 EOF
105
106 if (( !${#dirs[*]} && !${#files[*]} )); then
107         print '<p>No content found.</p>'
108 else
109         print '<table width="100%" border="0">'
110         for i in "${dirs[@]}"; do
111                 print "<tr><td align=\"right\" style=\"width:20;\">[DIR]</td><td><a href=\"$(h "$i")/\">$(h "$i")/</a></td></tr>"
112         done
113         for i in "${files[@]}"; do
114                 sz=$(stat -Lc '%s' "$i")
115                 if (( ${#sz} < 10 )); then
116                         if (( sz >= 1048576 )); then
117                                 if (( sz > 210000000 )); then
118                                         sz=$(( (sz + 524288) / 1048576)) MiB
119                                 else
120                                         (( sz = (sz * 10 + 524288) / 1048576 ))
121                                         x=${sz%?}
122                                         sz=$x.${sz#$x} MiB
123                                 fi
124                         elif (( sz >= 1024 )); then
125                                 sz=$(( (sz * 100 + 512) / 1024))
126                                 x=${sz%??}
127                                 sz=$x.${sz#$x} KiB
128                         fi
129                 else
130                         sz=$(bc -q <<<$'scale=2\n'"$sz/1073741824") GiB
131                 fi
132                 print "<tr><td align=\"right\" style=\"width:20;\">$sz</td><td><a href=\"$(h "$i")\">$(h "$i")</a></td></tr>"
133         done
134         print '</table>'
135 fi
136
137 print '</body></html>'
138 exit 0