rev |
line source |
pankso@5
|
1 #!/bin/sh
|
pankso@5
|
2 #
|
pankso@5
|
3 # TinyCM - Small, fast and elegent CGI/SHell Content Manager
|
pankso@5
|
4 #
|
pankso@15
|
5 # Copyright (C) 2012-2014 SliTaz GNU/Linux - BSD License
|
pankso@5
|
6 #
|
pankso@5
|
7 . /usr/lib/slitaz/httphelper
|
pankso@5
|
8
|
paul@8
|
9 # Let's have a peer site config file with a .cgi extension so content
|
pankso@5
|
10 # is secure even if left in a web server directory.
|
pankso@5
|
11 . config.cgi
|
pankso@5
|
12
|
pankso@5
|
13 tiny="$PWD"
|
pankso@5
|
14 po="en fr"
|
pankso@5
|
15 content="content"
|
pankso@5
|
16 wiki="$content/wiki"
|
pankso@5
|
17 index="index"
|
pankso@5
|
18 cache="cache"
|
pankso@5
|
19 plugins="plugins"
|
pankso@5
|
20 tmp="/tmp/tinycm"
|
pankso@5
|
21 sessions="$tmp/sessions"
|
pankso@15
|
22 script="$SCRIPT_NAME"
|
pankso@5
|
23
|
pankso@5
|
24 # Content negotiation for Gettext
|
pankso@5
|
25 IFS=","
|
pankso@5
|
26 for lang in $HTTP_ACCEPT_LANGUAGE
|
pankso@5
|
27 do
|
pankso@5
|
28 lang=${lang%;*} lang=${lang# } lang=${lang%-*}
|
pankso@5
|
29 if echo "$po" | fgrep -q "$lang"; then
|
pankso@5
|
30 break
|
pankso@5
|
31 fi
|
pankso@5
|
32 case "$lang" in
|
pankso@5
|
33 en) lang="C" ;;
|
pankso@5
|
34 fr) lang="fr_FR" ;;
|
pankso@5
|
35 pt) lang="pt_BR" ;;
|
pankso@5
|
36 ru) lang="ru_RU" ;;
|
pankso@5
|
37 esac
|
pankso@5
|
38 done
|
pankso@5
|
39 unset IFS
|
pankso@5
|
40 export LANG=$lang LC_ALL=$lang
|
pankso@5
|
41
|
pankso@5
|
42 #
|
pankso@5
|
43 # Functions
|
pankso@5
|
44 #
|
pankso@5
|
45
|
paul@8
|
46 # Used by edit to display language name and the language box. This is
|
pankso@5
|
47 # for CM content not gettext support.
|
pankso@5
|
48 get_lang() {
|
pankso@5
|
49 lang=$(echo $d | cut -d "/" -f 1)
|
pankso@5
|
50 doc=${d#$lang/}
|
pankso@5
|
51 echo '<div id="lang">'
|
pankso@5
|
52 for l in $LANGUAGES
|
pankso@5
|
53 do
|
pankso@5
|
54 case $lang in
|
pankso@5
|
55 en) i18n="English" ;;
|
pankso@5
|
56 fr) i18n="Français" ;;
|
pankso@5
|
57 pt) i18n="Português" ;;
|
pankso@5
|
58 ru) i18n="Русский" ;;
|
pankso@5
|
59 *) i18n="*" ;;
|
pankso@5
|
60 esac
|
pankso@5
|
61 echo "<a href='?d=$l/$doc'>$l</a>"
|
pankso@5
|
62 done
|
pankso@5
|
63 echo '</div>'
|
pankso@5
|
64 }
|
pankso@5
|
65
|
pankso@5
|
66 # HTML 5 header.
|
pankso@5
|
67 html_header() {
|
pankso@5
|
68 if [ -f "$tiny/lib/header.html" ]; then
|
pankso@5
|
69 cat $tiny/lib/header.html | sed -e s!'%TITLE%'!"$TITLE - $d"!g
|
pankso@5
|
70 else
|
pankso@5
|
71 cat << EOT
|
pankso@5
|
72 <!DOCTYPE html>
|
pankso@5
|
73 <html xmlns="http://www.w3.org/1999/xhtml">
|
pankso@5
|
74 <head>
|
pankso@5
|
75 <title>$TITLE</title>
|
pankso@5
|
76 <meta charset="utf-8" />
|
pankso@5
|
77 <style type="text/css">body { margin: 40px 120px; }</style>
|
pankso@5
|
78 </head>
|
pankso@5
|
79 <body>
|
pankso@5
|
80 <!-- Content -->
|
pankso@5
|
81 <div id="content">
|
pankso@5
|
82 EOT
|
pankso@5
|
83 fi
|
pankso@5
|
84 }
|
pankso@5
|
85
|
pankso@5
|
86 # HTML 5 footer.
|
pankso@5
|
87 html_footer() {
|
pankso@5
|
88 if [ -f "$tiny/lib/footer.html" ]; then
|
pankso@5
|
89 cat $tiny/lib/footer.html
|
pankso@5
|
90 else
|
pankso@5
|
91 cat << EOT
|
pankso@5
|
92
|
pankso@5
|
93 <!-- End content -->
|
pankso@5
|
94 </div>
|
pankso@5
|
95
|
pankso@5
|
96 <div id="footer">♥</div>
|
pankso@5
|
97
|
pankso@5
|
98 </body>
|
pankso@5
|
99 </html>
|
pankso@5
|
100 EOT
|
pankso@5
|
101 fi
|
pankso@5
|
102 }
|
pankso@5
|
103
|
pankso@5
|
104 # Default index if missing
|
pankso@5
|
105 default_index() {
|
pankso@11
|
106 mkdir -p "$wiki"
|
pankso@5
|
107 cat > $wiki/$index.txt << EOT
|
pankso@5
|
108 ==== Welcome ====
|
pankso@5
|
109
|
pankso@11
|
110 This is the default index page of your CM, you can start to edit and adding
|
pankso@5
|
111 some content to your TinyCM.
|
pankso@5
|
112
|
pankso@5
|
113 EOT
|
pankso@5
|
114 }
|
pankso@5
|
115
|
pankso@5
|
116 # Log documents activity.
|
pankso@5
|
117 log() {
|
pankso@5
|
118 grep ^[A-Z] | \
|
pankso@5
|
119 sed s"#^[A-Z]\([^']*\)#$(date '+%Y-%m-%d %H:%M') : \0#" \
|
pankso@5
|
120 >> $cache/$d/activity.log
|
pankso@5
|
121 }
|
pankso@5
|
122
|
pankso@5
|
123 # Check if user is auth
|
pankso@5
|
124 check_auth() {
|
pankso@5
|
125 auth="$(COOKIE auth)"
|
pankso@5
|
126 user="$(echo $auth | cut -d ":" -f 1)"
|
pankso@5
|
127 md5cookie="$(echo $auth | cut -d ":" -f 2)"
|
pankso@5
|
128 [ -f "$sessions/$user" ] && md5session="$(cat $sessions/$user)"
|
pankso@5
|
129 if [ "$md5cookie" == "$md5session" ] && [ "$auth" ]; then
|
pankso@5
|
130 . $PEOPLE/$user/account.conf
|
pankso@5
|
131 return 0
|
pankso@5
|
132 else
|
pankso@5
|
133 return 1
|
pankso@5
|
134 fi
|
pankso@5
|
135 }
|
pankso@5
|
136
|
pankso@5
|
137 # Authentified or not
|
pankso@5
|
138 user_box() {
|
pankso@5
|
139 if check_auth; then
|
pankso@5
|
140 cat << EOT
|
pankso@5
|
141
|
pankso@5
|
142 <div id="user">
|
pankso@5
|
143 <a href="$script?user=$user">$(get_gravatar $MAIL 20)</a>
|
pankso@5
|
144 <a href="$script?logout">Logout</a>
|
pankso@5
|
145 </div>
|
pankso@5
|
146
|
pankso@5
|
147 EOT
|
pankso@5
|
148 else
|
pankso@5
|
149 cat << EOT
|
pankso@5
|
150
|
pankso@5
|
151 <div id="user">
|
pankso@5
|
152 <a href="$script?login"><img src="images/avatar.png" alt="[ User ]" /></a>
|
pankso@5
|
153 <a href="$script?login">Login</a>
|
pankso@5
|
154 </div>
|
pankso@5
|
155
|
pankso@5
|
156 EOT
|
pankso@5
|
157 fi
|
pankso@5
|
158 cat << EOT
|
pankso@5
|
159 <!--
|
pankso@5
|
160 <div id="search">
|
pankso@5
|
161 <form method="get" action="$script">
|
pankso@5
|
162 <input type="text" name="search" placeholder="$(gettext "Search")" />
|
pankso@5
|
163 </form>
|
pankso@5
|
164 </div>
|
pankso@5
|
165 -->
|
pankso@5
|
166 EOT
|
pankso@5
|
167 }
|
pankso@5
|
168
|
pankso@5
|
169 # Link for online signup if enabled.
|
pankso@5
|
170 online_signup() {
|
pankso@5
|
171 if [ "$ONLINE_SIGNUP" == "yes" ]; then
|
pankso@5
|
172 echo -n "<p><a href='$script?signup'>"
|
pankso@5
|
173 gettext "Create a new account"
|
pankso@5
|
174 echo '</a></p>'
|
pankso@5
|
175 fi
|
pankso@5
|
176 }
|
pankso@5
|
177
|
pankso@5
|
178 # Login page
|
pankso@5
|
179 login_page() {
|
pankso@5
|
180 cat << EOT
|
pankso@5
|
181 <h2>$(gettext "Login")</h2>
|
pankso@5
|
182
|
pankso@5
|
183 <div id="account-info">
|
paul@8
|
184 $(gettext "No account yet or trouble with you account? Please send
|
pankso@5
|
185 a request to $ADMIN_MAIL with your real name, user name, mail and password.")
|
pankso@5
|
186 $(online_signup)
|
pankso@5
|
187 </div>
|
pankso@5
|
188
|
pankso@5
|
189 <div id="login">
|
pankso@5
|
190 <form method="post" action="$script">
|
pankso@5
|
191 <input type="text" name="auth" placeholder="$(gettext "User name")" />
|
pankso@5
|
192 <input type="password" name="pass" placeholder="$(gettext "Password")" />
|
pankso@5
|
193 <div>
|
pankso@5
|
194 <input type="submit" value="Login" /> $error
|
pankso@5
|
195 </div>
|
pankso@5
|
196 </form>
|
pankso@5
|
197 </div>
|
pankso@5
|
198
|
pankso@5
|
199 <div style="clear: both;"></div>
|
pankso@5
|
200 EOT
|
pankso@5
|
201 }
|
pankso@5
|
202
|
pankso@5
|
203 # Signup page
|
pankso@5
|
204 signup_page() {
|
pankso@5
|
205 cat << EOT
|
pankso@5
|
206
|
pankso@5
|
207 <div id="signup">
|
pankso@5
|
208 <form method="post" name="signup" action="$script" onsubmit="return checkSignup();">
|
pankso@5
|
209 <input type="hidden" name="signup" value="new" />
|
pankso@5
|
210 <input type="text" name="name" placeholder="$(gettext "Real name")" />
|
pankso@5
|
211 <input type="text" name="user" placeholder="$(gettext "User name")" />
|
pankso@5
|
212 <input type="text" name="mail" placeholder="$(gettext "Email")" />
|
pankso@5
|
213 <input type="password" name="pass" placeholder="$(gettext "Password")" />
|
pankso@5
|
214 <div>
|
pankso@5
|
215 <input type="submit" value="$(gettext "Create new account")" />
|
pankso@5
|
216 </div>
|
pankso@5
|
217 </form>
|
pankso@5
|
218 </div>
|
pankso@5
|
219
|
pankso@5
|
220 EOT
|
pankso@5
|
221 }
|
pankso@5
|
222
|
pankso@5
|
223 # Create a new user in AUTH_FILE and PEOPLE
|
pankso@5
|
224 new_user_config() {
|
pankso@20
|
225 if [ ! -f "$AUTH_FILE" ];then
|
pankso@20
|
226 touch $(DESTDIR)$(LOGIN)/auth/people
|
pankso@20
|
227 chmod 0600 $(DESTDIR)$(LOGIN)/auth/people
|
pankso@20
|
228 fi
|
pankso@5
|
229 key=$(echo -n "$user:$mail:$pass" | md5sum | awk '{print $1}')
|
pankso@5
|
230 echo "$user:$pass" >> $AUTH_FILE
|
pankso@5
|
231 mkdir -p $PEOPLE/$user/
|
pankso@5
|
232 cat > $PEOPLE/$user/account.conf << EOT
|
pankso@5
|
233 # SliTaz user configuration
|
pankso@5
|
234 #
|
pankso@5
|
235
|
pankso@5
|
236 NAME="$name"
|
pankso@5
|
237 USER="$user"
|
pankso@5
|
238 MAIL="$mail"
|
pankso@5
|
239 KEY="$key"
|
pankso@5
|
240
|
pankso@5
|
241 EOT
|
pankso@5
|
242 chmod 0600 $PEOPLE/$user/account.conf
|
pankso@5
|
243 }
|
pankso@5
|
244
|
pankso@5
|
245 # Display user public profile.
|
pankso@5
|
246 public_people() {
|
pankso@5
|
247 cat << EOT
|
pankso@5
|
248 <pre>
|
pankso@5
|
249 Real name : $NAME
|
pankso@5
|
250 </pre>
|
pankso@5
|
251 EOT
|
pankso@23
|
252 # Display personnal user profile
|
pankso@23
|
253 if [ -f "$PEOPLE/$USER/profile.txt" ]; then
|
pankso@23
|
254 cat $PEOPLE/$USER/profile.txt | wiki_parser
|
pankso@23
|
255 fi
|
pankso@5
|
256 }
|
pankso@5
|
257
|
pankso@5
|
258 # Display authentified user profile. TODO: change password
|
pankso@5
|
259 auth_people() {
|
pankso@5
|
260 cat << EOT
|
pankso@5
|
261 <pre>
|
pankso@5
|
262 Real name : $NAME
|
pankso@5
|
263 Email : $MAIL
|
pankso@5
|
264 Secure key : $KEY
|
pankso@5
|
265 </pre>
|
pankso@5
|
266 EOT
|
pankso@23
|
267 # Each user can have personal profile page
|
pankso@23
|
268 if [ -f "$PEOPLE/$USER/profile.txt" ]; then
|
pankso@23
|
269 cat $PEOPLE/$USER/profile.txt | wiki_parser
|
pankso@23
|
270 cat << EOT
|
pankso@23
|
271 <div id="tools">
|
pankso@23
|
272 <a href="$script?edit=profile">$(gettext "Edit profile")</a>
|
pankso@23
|
273 </div>
|
pankso@23
|
274 EOT
|
pankso@23
|
275 else
|
pankso@23
|
276 cat << EOT
|
pankso@23
|
277 <div id="tools">
|
pankso@23
|
278 <a href="$script?edit=profile">$(gettext "Create a profile page")</a>
|
pankso@23
|
279 </div>
|
pankso@23
|
280 EOT
|
pankso@23
|
281 fi
|
pankso@5
|
282 }
|
pankso@5
|
283
|
paul@8
|
284 # The CM style parser. Just a title, simple text formating and internal
|
paul@8
|
285 # links, as well as images and use HTML for other stuff. Keep it fast!
|
pankso@5
|
286 # To make TinyCM as easy as possible we have a small HTML editor/helper
|
pankso@5
|
287 # written in Javascript
|
pankso@5
|
288 wiki_parser() {
|
pankso@5
|
289 doc="[0-9a-zA-Z\.\#/~\_%=\?\&,\+\:@;!\(\)\*\$'\-]*"
|
pankso@5
|
290 sed \
|
pankso@5
|
291 -e s"#====\([^']*\)====#<h2>\1</h2>#"g \
|
pankso@5
|
292 -e s"#===\([^']*\)===#<h3>\1</h3>#"g \
|
pankso@5
|
293 -e s"#==\([^']*\)==#<h4>\1</h4>#"g \
|
pankso@13
|
294 -e s"#\*\*\([^']*\)\*\*#<b>\1</b>#"g \
|
pankso@5
|
295 -e s"#''\([^']*\)''#<em>\1</em>#"g \
|
pankso@5
|
296 -e s"#__\([^']*\)__#<u>\1</u>#"g \
|
pankso@5
|
297 -e s"#\[\([^]]*\)|\($doc\)\]#<a href='$script?d=\2'>\1</a>#"g \
|
pankso@17
|
298 -e s"#\[\([^]]*\)!\($doc\)\]#<a href='\2'>\1</a>#"g \
|
pankso@17
|
299 -e s"#\[\(http://*[^]]*.png\)\]#<img src='\1' />#"g \
|
pankso@17
|
300 -e s"#\[\([^]]*.png\)\]#<img src='content/cloud/\1' />#"g
|
pankso@5
|
301 }
|
pankso@5
|
302
|
pankso@5
|
303 link_user() {
|
pankso@15
|
304 echo "<a href='$(basename $script)?user=$user'>$user</a>"
|
pankso@5
|
305 }
|
pankso@5
|
306
|
pankso@5
|
307 # Save a document. Do we need more than 1 backup and diff ?
|
pankso@5
|
308 save_document() {
|
pankso@5
|
309 mkdir -p $cache/$d $(dirname $wiki/$d)
|
pankso@5
|
310 # May be a new page.
|
pankso@5
|
311 if [ ! -f "$wiki/$d.txt" ]; then
|
pankso@5
|
312 new=0
|
pankso@5
|
313 touch $wiki/$d.txt
|
pankso@5
|
314 fi
|
pankso@5
|
315 cp $wiki/$d.txt $cache/$d/last.bak
|
pankso@5
|
316 sed "s/$(echo -en '\r') /\n/g" > $wiki/$d.txt << EOT
|
pankso@5
|
317 $(GET content)
|
pankso@5
|
318 EOT
|
pankso@5
|
319 diff $cache/$d/last.bak $wiki/$d.txt > $cache/$d/last.diff
|
pankso@5
|
320 # Log
|
pankso@5
|
321 if [ "$new" ]; then
|
pankso@5
|
322 echo "Page created by: $(link_user)" | log
|
pankso@5
|
323 if [ "$HG" == "yes" ]; then
|
pankso@5
|
324 cd $content && hg -q add
|
pankso@5
|
325 hg commit -q -u "$NAME <$MAIL>" -m "Created new document: $d"
|
pankso@5
|
326 cd $tiny
|
pankso@5
|
327 fi
|
pankso@5
|
328 else
|
pankso@5
|
329 # Here we will clean log: cat && tail -n 40
|
pankso@5
|
330 echo "Page edited by: $(link_user)" | log
|
pankso@5
|
331 if [ "$HG" == "yes" ]; then
|
pankso@5
|
332 cd $content && hg commit -q -u "$NAME <$MAIL>" \
|
pankso@5
|
333 -m "Edited document: $d"
|
pankso@5
|
334 cd $tiny
|
pankso@5
|
335 fi
|
pankso@5
|
336 fi
|
pankso@5
|
337 }
|
pankso@5
|
338
|
pankso@23
|
339 # Save a user profile.
|
pankso@23
|
340 save_profile() {
|
pankso@23
|
341 path="$PEOPLE/$user"
|
pankso@23
|
342 cp -f ${path}/${d}.txt ${path}/${d}.bak
|
pankso@23
|
343 sed "s/$(echo -en '\r') /\n/g" > ${path}/${d}.txt << EOT
|
pankso@23
|
344 $(GET content)
|
pankso@23
|
345 EOT
|
pankso@23
|
346 }
|
pankso@23
|
347
|
pankso@5
|
348 # CM tools (edit, diff, etc).
|
pankso@5
|
349 wiki_tools() {
|
pankso@5
|
350 cat << EOT
|
pankso@5
|
351 <div id="tools">
|
pankso@5
|
352 <a href="$script?edit=$d">$(gettext "Edit document")</a>
|
pankso@5
|
353 <a href="$script?diff=$d">$(gettext "Last diff")</a>
|
pankso@5
|
354 <a href="$script?log=$d">$(gettext "Activity")</a>
|
pankso@5
|
355 <a href="$script?dashboard">Dashboard</a>
|
pankso@5
|
356 $([ "$HG" == "yes" ] && echo "<a href='$script?hg'>Hg Log</a>")
|
pankso@5
|
357 </div>
|
pankso@5
|
358 EOT
|
pankso@5
|
359 }
|
pankso@5
|
360
|
pankso@5
|
361 # Get and display Gravatar image: get_gravatar email size
|
pankso@5
|
362 # Link to profile: <a href="http://www.gravatar.com/$md5">...</a>
|
pankso@5
|
363 get_gravatar() {
|
pankso@5
|
364 email=$1
|
pankso@5
|
365 size=$2
|
pankso@5
|
366 [ "$size" ] || size=48
|
pankso@5
|
367 url="http://www.gravatar.com/avatar"
|
pankso@5
|
368 md5=$(md5crypt $email)
|
pankso@5
|
369 echo "<img src='$url/$md5?d=identicon&s=$size' alt='∗' />"
|
pankso@5
|
370 }
|
pankso@5
|
371
|
pankso@5
|
372 # List hg logs
|
pankso@5
|
373 hg_log() {
|
pankso@5
|
374 cd $content
|
pankso@5
|
375 cat << EOT
|
pankso@5
|
376 <table>
|
pankso@5
|
377 <thead>
|
pankso@5
|
378 <td>$(gettext "User")</td>
|
pankso@5
|
379 <td>$(gettext "Description")</td>
|
pankso@5
|
380 <td>$(gettext "Revision")</td>
|
pankso@5
|
381 </thead>
|
pankso@5
|
382 EOT
|
pankso@5
|
383 hg log --template "<tr><td>{author}</td><td>{desc}</td><td>{rev}</td></tr>\n"
|
pankso@5
|
384 echo '</table>'
|
pankso@5
|
385 }
|
pankso@5
|
386
|
pankso@5
|
387 #
|
pankso@5
|
388 # POST actions
|
pankso@5
|
389 #
|
pankso@5
|
390
|
pankso@5
|
391 case " $(POST) " in
|
pankso@5
|
392 *\ auth\ *)
|
pankso@5
|
393 # Authenticate user. Create a session file in $sessions to be used
|
pankso@5
|
394 # by check_auth. We have the user login name and a peer session
|
pankso@5
|
395 # md5 string in the COOKIE.
|
pankso@5
|
396 user="$(POST auth)"
|
pankso@5
|
397 pass="$(md5crypt "$(POST pass)")"
|
pankso@5
|
398 valid=$(fgrep "${user}:" $AUTH_FILE | cut -d ":" -f 2)
|
pankso@5
|
399 if [ "$pass" == "$valid" ] && [ "$pass" != "" ]; then
|
pankso@5
|
400 md5session=$(echo -n "$$:$user:$pass:$$" | md5sum | awk '{print $1}')
|
pankso@5
|
401 [ -d $sessions ] || mkdir -p $sessions
|
pankso@5
|
402 echo "$md5session" > $sessions/$user
|
pankso@5
|
403 header "Location: $script" \
|
pankso@5
|
404 "Set-Cookie: auth=$user:$md5session; HttpOnly"
|
pankso@5
|
405 else
|
pankso@5
|
406 header "Location: $script?login&error"
|
pankso@5
|
407 fi ;;
|
pankso@5
|
408 *\ signup\ *)
|
pankso@5
|
409 # POST action for signup
|
pankso@5
|
410 name="$(POST name)"
|
pankso@5
|
411 user="$(POST user)"
|
pankso@5
|
412 mail="$(POST mail)"
|
pankso@5
|
413 pass="$(md5crypt "$(POST pass)")"
|
pankso@5
|
414 if ! grep "^${user}:" $AUTH_FILE; then
|
pankso@5
|
415 new_user_config
|
pankso@5
|
416 header "Location: $script?login"
|
pankso@5
|
417 else
|
pankso@5
|
418 header
|
pankso@5
|
419 html_header
|
pankso@5
|
420 user_box
|
paul@8
|
421 echo "<h2>gettext "User already exists: $user"</h2>"
|
pankso@5
|
422 html_footer
|
pankso@5
|
423 fi ;;
|
pankso@5
|
424 esac
|
pankso@5
|
425
|
pankso@5
|
426 #
|
pankso@5
|
427 # Plugins
|
pankso@5
|
428 #
|
pankso@5
|
429 for p in $(ls -1 $plugins)
|
pankso@5
|
430 do
|
pankso@5
|
431 [ -f "$plugins/$p/$p.conf" ] && . $plugins/$p/$p.conf
|
pankso@5
|
432 [ -x "$plugins/$p/$p.cgi" ] && . $plugins/$p/$p.cgi
|
pankso@5
|
433 done
|
pankso@5
|
434
|
pankso@5
|
435 #
|
pankso@5
|
436 # GET actions
|
pankso@5
|
437 #
|
pankso@5
|
438
|
pankso@5
|
439 case " $(GET) " in
|
pankso@5
|
440 *\ edit\ *)
|
pankso@5
|
441 d="$(GET edit)"
|
pankso@5
|
442 header
|
pankso@5
|
443 html_header
|
pankso@5
|
444 user_box
|
pankso@5
|
445 get_lang
|
pankso@5
|
446 if check_auth; then
|
pankso@23
|
447 if [ "$doc" == "profile" ]; then
|
pankso@23
|
448 wiki="$PEOPLE/$user"
|
pankso@23
|
449 fi
|
pankso@5
|
450 cat << EOT
|
pankso@5
|
451 <h2>$(gettext "Edit $doc [ $i18n ]")</h2>
|
pankso@5
|
452
|
pankso@5
|
453 <div id="edit">
|
pankso@5
|
454
|
pankso@5
|
455 <form method="get" action="$script" name="editor">
|
pankso@5
|
456 <input type="hidden" name="save" value="$d" />
|
pankso@5
|
457 <textarea name="content">$(cat "$wiki/$d.txt")</textarea>
|
pankso@5
|
458 <input type="submit" value="$(gettext "Save document")" />
|
pankso@5
|
459 $(gettext "Code Helper:")
|
pankso@5
|
460 $(cat lib/jseditor.html)
|
pankso@5
|
461 </form>
|
pankso@5
|
462
|
pankso@5
|
463 </div>
|
pankso@5
|
464 EOT
|
pankso@5
|
465 else
|
paul@8
|
466 gettext "You must be logged in to edit pages"
|
pankso@5
|
467 fi
|
pankso@5
|
468 html_footer ;;
|
pankso@15
|
469
|
pankso@5
|
470 *\ save\ *)
|
pankso@5
|
471 d="$(GET save)"
|
pankso@5
|
472 if check_auth; then
|
pankso@23
|
473 # User profile
|
pankso@23
|
474 if [ "$d" == "profile" ]; then
|
pankso@23
|
475 save_profile
|
pankso@23
|
476 header "Location: $script?user=$user"
|
pankso@23
|
477 else
|
pankso@23
|
478 save_document
|
pankso@23
|
479 fi
|
pankso@5
|
480 fi
|
pankso@5
|
481 header "Location: $script?d=$d" ;;
|
pankso@15
|
482
|
pankso@5
|
483 *\ log\ *)
|
pankso@5
|
484 d="$(GET log)"
|
pankso@5
|
485 header
|
pankso@5
|
486 html_header
|
pankso@5
|
487 user_box
|
pankso@5
|
488 get_lang
|
pankso@5
|
489 echo "<h2>$(gettext "Activity for:") <a href='$script?d=$d'>$d</a></h2>"
|
pankso@5
|
490 echo '<pre>'
|
pankso@5
|
491 if [ -f "$cache/$d/activity.log" ]; then
|
pankso@5
|
492 tac $cache/$d/activity.log
|
pankso@5
|
493 else
|
pankso@5
|
494 gettext "No log for: $d"; echo
|
pankso@5
|
495 fi
|
pankso@5
|
496 echo '</pre>'
|
pankso@5
|
497 if check_auth; then
|
pankso@5
|
498 wiki_tools
|
pankso@5
|
499 fi
|
pankso@5
|
500 html_footer ;;
|
pankso@15
|
501
|
pankso@5
|
502 *\ diff\ *)
|
pankso@5
|
503 d="$(GET diff)"
|
pankso@5
|
504 date="last"
|
pankso@5
|
505 header
|
pankso@5
|
506 html_header
|
pankso@5
|
507 user_box
|
pankso@5
|
508 get_lang
|
pankso@5
|
509 echo "<h2>$(gettext "Diff for:") <a href='$script?d=$d'>$d</a></h2>"
|
pankso@5
|
510 echo '<pre>'
|
pankso@5
|
511 if [ -f "$cache/$d/$date.diff" ]; then
|
pankso@5
|
512 cat $cache/$d/$date.diff | sed \
|
pankso@5
|
513 -e 's|&|\&|g' -e 's|<|\<|g' -e 's|>|\>|g' \
|
pankso@5
|
514 -e s"#^-\([^']*\).#<span style='color: red;'>\0</span>#"g \
|
pankso@5
|
515 -e s"#^+\([^']*\).#<span style='color: green;'>\0</span>#"g \
|
pankso@5
|
516 -e s"#@@\([^']*\)@@#<span style='color: blue;'>@@\1@@</span>#"g
|
pankso@5
|
517 else
|
pankso@5
|
518 gettext "No diff for: $d"; echo
|
pankso@5
|
519 fi
|
pankso@5
|
520 echo '</pre>'
|
pankso@5
|
521 if check_auth; then
|
pankso@5
|
522 wiki_tools
|
pankso@5
|
523 fi
|
pankso@5
|
524 html_footer ;;
|
pankso@15
|
525
|
pankso@5
|
526 *\ login\ *)
|
pankso@5
|
527 # The login page
|
pankso@5
|
528 d="Login"
|
pankso@5
|
529 [ "$(GET error)" ] && \
|
pankso@5
|
530 error="<p class="error">$(gettext "Bad login or pass")</p>"
|
pankso@5
|
531 header
|
pankso@5
|
532 html_header
|
pankso@5
|
533 user_box
|
pankso@5
|
534 login_page
|
pankso@5
|
535 html_footer ;;
|
pankso@15
|
536
|
pankso@5
|
537 *\ signup\ *)
|
pankso@5
|
538 # The login page
|
pankso@5
|
539 d="$(gettext "Sign Up")"
|
pankso@5
|
540 header
|
pankso@5
|
541 html_header
|
pankso@5
|
542 user_box
|
pankso@5
|
543 echo "<h2>$d</h2>"
|
pankso@5
|
544 if [ "$ONLINE_SIGNUP" == "yes" ]; then
|
pankso@5
|
545 signup_page
|
pankso@5
|
546 else
|
paul@8
|
547 gettext "Online registration is disabled"
|
pankso@5
|
548 fi
|
pankso@5
|
549 html_footer ;;
|
pankso@15
|
550
|
pankso@5
|
551 *\ logout\ *)
|
pankso@5
|
552 # Set a Cookie in the past to logout.
|
pankso@5
|
553 expires="Expires=Wed, 01-Jan-1980 00:00:00 GMT"
|
pankso@5
|
554 if check_auth; then
|
pankso@5
|
555 rm -f "$sessions/$user"
|
pankso@5
|
556 header "Location: $script" "Set-Cookie: auth=none; $expires; HttpOnly"
|
pankso@5
|
557 fi ;;
|
pankso@15
|
558
|
pankso@5
|
559 *\ user\ *)
|
pankso@5
|
560 # User profile
|
pankso@15
|
561 d="$(GET user)"
|
pankso@5
|
562 header
|
pankso@5
|
563 html_header
|
pankso@5
|
564 user_box
|
pankso@5
|
565 . $PEOPLE/"$(GET user)"/account.conf
|
pankso@5
|
566 echo "<h2>$(get_gravatar $MAIL) $(GET user)</h2>"
|
pankso@21
|
567 loglines=$(fgrep $(GET user) $(find $cache -name *.log) | wc -l)
|
pankso@5
|
568 gettext "Activities:"; echo " $loglines"
|
pankso@5
|
569 if check_auth && [ "$(GET user)" == "$user" ]; then
|
pankso@5
|
570 auth_people
|
pankso@5
|
571 else
|
pankso@5
|
572 public_people
|
pankso@5
|
573 fi
|
pankso@5
|
574 html_footer ;;
|
pankso@15
|
575
|
pankso@5
|
576 *\ dashboard\ *)
|
pankso@5
|
577 # For now simply list plugins and users info. We could have a
|
pankso@5
|
578 # dashbord only for ADMINS found in the config file. The dashboard
|
pankso@5
|
579 # should also be a plugin.
|
pankso@5
|
580 d="Dashboard"
|
pankso@5
|
581 header
|
pankso@5
|
582 html_header
|
pankso@5
|
583 user_box
|
pankso@5
|
584 users=$(ls -1 $PEOPLE | wc -l)
|
pankso@5
|
585 docs=$(find $wiki -type f | wc -l)
|
pankso@17
|
586 wikisize="$(du -sh $wiki | awk '{print $1}')"
|
pankso@17
|
587 cachesize="$(du -sh $cache | awk '{print $1}')"
|
pankso@17
|
588 [ "$HG" != "yes" ] && hg=$(gettext "disabled")
|
pankso@17
|
589 [ "$HG" == "yes" ] && hg=$(gettext "enabled")
|
pankso@5
|
590 echo "<h2>$d</h2>"
|
pankso@5
|
591 if check_auth; then
|
pankso@17
|
592 cat << EOT
|
pankso@17
|
593 <pre>
|
pankso@17
|
594 Users : $users
|
pankso@17
|
595 Wiki : $docs ($wikisize)
|
pankso@17
|
596 Cache : $cachesize
|
pankso@17
|
597 Mercurial : $hg
|
pankso@17
|
598 </pre>
|
pankso@17
|
599
|
pankso@19
|
600 <div id="tools">
|
pankso@19
|
601 <a href="$scripts?README">README</a>
|
pankso@19
|
602 </div>
|
pankso@19
|
603
|
pankso@17
|
604 <h3>$(gettext "Plugins")</h3>
|
pankso@17
|
605 <pre>
|
pankso@17
|
606 EOT
|
pankso@5
|
607 for p in $(ls -1 $plugins)
|
pankso@5
|
608 do
|
pankso@5
|
609 . $plugins/$p/$p.conf
|
pankso@5
|
610 echo "<a href='?$p'>$PLUGIN</a> - $SHORT_DESC"
|
pankso@5
|
611 done
|
pankso@5
|
612 echo '</pre>'
|
pankso@5
|
613 else
|
paul@8
|
614 gettext "You must be logged in to view the dashboard."
|
pankso@5
|
615 fi
|
pankso@5
|
616 html_footer ;;
|
pankso@19
|
617
|
pankso@19
|
618 *\ README\ *)
|
pankso@19
|
619 d="README"
|
pankso@19
|
620 header
|
pankso@19
|
621 html_header
|
pankso@19
|
622 user_box
|
pankso@19
|
623 echo "<h2>README</h2>"
|
pankso@19
|
624 echo '<pre>'
|
pankso@19
|
625 cat ${tiny}/README
|
pankso@19
|
626 echo '</pre>' && html_footer ;;
|
pankso@15
|
627
|
pankso@5
|
628 *\ hg\ *)
|
pankso@5
|
629 header
|
pankso@5
|
630 [ "$HG" != "yes" ] && gettext "Hg is disabled" && exit 0
|
pankso@5
|
631 [ ! -x /usr/bin/hg ] && gettext "Hg is not installed" && exit 0
|
pankso@5
|
632 d="Hg Log"
|
pankso@5
|
633 html_header
|
pankso@5
|
634 user_box
|
pankso@5
|
635 echo "<h2>$d</h2>"
|
pankso@5
|
636 case " $(GET hg) " in
|
pankso@5
|
637 *\ init\ *)
|
pankso@5
|
638 if check_auth; then
|
pankso@5
|
639 [ -d "$content/.hg" ] && exit 0
|
pankso@5
|
640 echo '<pre>'
|
pankso@5
|
641 gettext "Executing: hg init"; echo
|
pankso@5
|
642 cd $content/ && hg init
|
pankso@5
|
643 echo '[hooks]' > .hg/hgrc
|
pankso@5
|
644 echo 'incoming = hg update' >> .hg/hgrc
|
paul@8
|
645 gettext "Adding current content and committing"; echo
|
pankso@5
|
646 [ ! -f "$wiki/index.txt" ] && touch $wiki/$index.txt
|
pankso@5
|
647 hg add && hg commit -u "$NAME <$MAIL>" \
|
paul@22
|
648 -m "Initial commit with current content"
|
pankso@5
|
649 echo '</pre>' && cd ..
|
pankso@5
|
650 fi ;;
|
pankso@5
|
651 esac
|
pankso@5
|
652 hg_log
|
pankso@5
|
653 html_footer ;;
|
pankso@15
|
654
|
pankso@5
|
655 *)
|
pankso@5
|
656 # Display requested page
|
pankso@5
|
657 d="$(GET d)"
|
pankso@5
|
658 [ "$d" ] || d=$index
|
pankso@5
|
659 header
|
pankso@5
|
660 html_header
|
pankso@5
|
661 user_box
|
pankso@5
|
662 get_lang
|
pankso@15
|
663 # Generate a default index on first run.
|
pankso@11
|
664 if [ ! -f "$wiki/$index.txt" ]; then
|
pankso@11
|
665 default_index
|
pankso@11
|
666 fi
|
pankso@5
|
667 if [ ! -f "$wiki/$d.txt" ]; then
|
pankso@5
|
668 echo "<h2>$d</h2>"
|
pankso@5
|
669 gettext "The document does not exist. You can create it or read the"
|
pankso@13
|
670 echo " <a href='?d=en/help'>help</a>"
|
pankso@5
|
671 else
|
pankso@13
|
672 if fgrep -q NOWIKI $wiki/$d.txt; then
|
pankso@13
|
673 cat $wiki/$d.txt | sed '/NOWIKI/'d
|
pankso@5
|
674 else
|
pankso@5
|
675 cat $wiki/$d.txt | wiki_parser
|
pankso@5
|
676 fi
|
pankso@5
|
677 fi
|
pankso@5
|
678 if check_auth; then
|
pankso@5
|
679 wiki_tools
|
pankso@5
|
680 if [ "$HG" == "yes" ] && [ ! -d "$content/.hg" ]; then
|
pankso@5
|
681 echo '<p class="error box">'
|
pankso@5
|
682 gettext "Mercurial is enabled but no repository found"
|
pankso@5
|
683 echo ": <a href='?hg=init'>Hg init</a>"
|
pankso@5
|
684 echo '</p>'
|
pankso@5
|
685 fi
|
pankso@5
|
686 fi
|
pankso@5
|
687 html_footer ;;
|
pankso@5
|
688 esac
|
pankso@5
|
689
|
pankso@5
|
690 exit 0
|