]> git.plutz.net Git - shellwiki/blobdiff - index.cgi
generalized error pages
[shellwiki] / index.cgi
index 9b38362b665dffae0b6a0f59286e0aff5d8da30e..9b9bb5fb473ca02ba50fef4d40190303d3505d9a 100755 (executable)
--- a/index.cgi
+++ b/index.cgi
@@ -4,6 +4,7 @@
 . "${_EXEC}/cgilite/session.sh"
 . "${_EXEC}/cgilite/file.sh"
 . "${_EXEC}/cgilite/users.sh"
+. "${_EXEC}/acl.sh"
 
 . "${_EXEC}/themes/default.sh"
 
@@ -19,35 +20,39 @@ else
   md() { cat; }
 fi
 
-wiki_text() {
-  # Print source text of a wiki page
-  # Get page from data or underlay dir
+mdfile(){
   local page="$(PATH "$1")"
 
-  if [ -f "$_DATA/pages/$page/#page.md" ]; then
-    cat -- "$_DATA/pages/$page/#page.md"
+  if   [ -f "$_DATA/pages/$page/#page.md" ]; then
+    printf %s\\n "$_DATA/pages/$page/#page.md"
   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
-    cat -- "$_EXEC/pages/$page/#page.md"
+    printf %s\\n "$_EXEC/pages/$page/#page.md"
   else
     return 1
   fi
 }
 
+wiki_text() {
+  # Print source text of a wiki page
+  # Get page from data or underlay dir
+  local page="$(PATH "$1")" mdfile
+
+  mdfile="$(mdfile "$page")" || return 4
+  acl_read "$page" || return 3
+  cat -- "$mdfile"
+}
+
 wiki() {
   # Print content of a wiki page
   # Get page from data or underlay dir, handle caching
-  local page="$(PATH "$1")" md cache cachetime
+  local page="$(PATH "$1")" mdfile cache cachetime
 
-  cache="$_DATA/pages/$page/#page.cache"
-  if [ -f "$_DATA/pages/$page/#page.md" ]; then
-    md="$_DATA/pages/$page/#page.md"
-  elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
-    md="$_EXEC/pages/$page/#page.md"
-  else
-    return 1
-  fi
+  cache="$_DATA/pages/$page/#page.${USER_ID}.cache"
+
+  mdfile="$(mdfile "$page")" || return 4
+  acl_read "$page" || return 3
 
-  cachetime="$(stat -c %Y -- "$md" "$cache" 2>/dev/null)"
+  cachetime="$(stat -c %Y -- "$mdfile" "$cache" 2>/dev/null)"
 
   if [ "${cachetime#*${BR}}" -gt "${cachetime%${BR}*}" \
     -a "${cachetime#*${BR}}" -gt "$((_DATE - CACHE_AGE))" ]; then
@@ -56,25 +61,12 @@ wiki() {
     mkdir -p -- "$_DATA/pages/$page/"
     # Macros expect to find page directory as working dir
     ( cd -- "$_DATA/pages/$page/";
-      md <"$md" |tee -- "${cache}.$$"
+      sed -E '1,20{ /^%[a-z]+/d; }' "$mdfile" \
+      | md |tee -- "${cache}.$$"
     )
-    mv -- "${cache}.$$" "${cache}"
-  fi
-}
-
-attachment() {
-  local file="$(PATH "$1")"
-
-  # TODO: deliver downscaled images, etc.
-  if [ -f "$_DATA/pages/${file%/*}/#attachments/${file#*/}" ]; then
-    FILE "$_DATA/pages/${file%/*}/#attachments/${file#*/}"
-  elif [ -f "$_EXEC/pages/${file%/*}/#attachments/${file#*/}" ]; then
-    FILE "$_EXEC/pages/${file%/*}/#attachments/${file#*/}"
-  elif [ -d "$_DATA/pages/${file}/" -o -d "$_EXEC/pages/${file}" ]; then
-    # path looks like a rogue page name (without trailing slash), so redirect
-    REDIRECT "$_BASE/${file}/"
-  else
-    return 1
+    grep -q '^%nocache' "$mdfile" \
+    && rm -- "${cache}.$$" \
+    || mv -- "${cache}.$$" "${cache}"
   fi
 }
 
@@ -82,24 +74,26 @@ case "${PATH_INFO}" in
   /"[.]"/*)
     FILE "${_EXEC}/${PATH_INFO#/\[.\]}"
     ;;
-  */)
-    if [ -f "$_DATA/pages/$PATH_INFO/#page.md" \
-      -o -f "$_EXEC/pages/$PATH_INFO/#page.md" ]; then
-      theme_page "${PATH_INFO}"
-    fi
+  */"#"*/*)
+    export ERROR_MSG="This page name is not allowed"
+    theme_error 400
+    ;;
+  /|*[^]]/)
+    theme_page "${PATH_INFO}"
     ;;
   */"[login]")
-    [ "$USER_NAME" ] \
-    && REDIRECT "./" \
-    || theme_login
+    theme_page "/[wiki]/login/"
     ;;
   */"[register]")
-    theme_register
+    theme_page "/[wiki]/register/"
+    ;;
+  */"[invite]")
+    theme_page "/[wiki]/invite/"
     ;;
-  */"#"*)
-    :  # TODO: Invalid page name
+  *)
+    . "$_EXEC/page_edit.sh" \
+    || . "$_EXEC/attachment.sh" \
+    || theme_error 404
     ;;
 esac
 
-. "$_EXEC/page_edit.sh"
-. "$_EXEC/attachment.sh"