tinycm annotate index.cgi @ rev 55

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