From: Paul Hänsch Date: Thu, 12 May 2022 09:48:26 +0000 (+0200) Subject: URL selection based on handlers X-Git-Url: https://git.plutz.net/?a=commitdiff_plain;h=b86e88d2d6acd3eda7d9858539818a290db67d41;p=shellwiki URL selection based on handlers --- diff --git a/handlers/10_page.sh b/handlers/10_page.sh new file mode 100755 index 0000000..e010ab1 --- /dev/null +++ b/handlers/10_page.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +CACHE_AGE=${CACHE_AGE:-1800} +export MD_MACROS="$_EXEC/macros" +export MD_HTML="${MD_HTML:-false}" +export WIKI_THEME=${WIKI_THEME:-default} + +. "$_EXEC/themes/${WIKI_THEME}.sh" + +if [ "$(which awk)" ]; then + md() { awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; } +elif [ "$(which busybox)" ]; then + md() { busybox awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; } +else + md() { cat; } +fi + +wiki() { + # Print content of a wiki page + # Get page from data or underlay dir, handle caching + local page="$(PATH "$1")" mdfile cache cachetime + + cache="$_DATA/pages/$page/#page.${USER_ID}.cache" + + mdfile="$(mdfile "$page")" || return 4 + acl_read "$page" || return 3 + + cachetime="$(stat -c %Y -- "$mdfile" "$cache" 2>/dev/null)" + + if [ "${cachetime#*${BR}}" -gt "${cachetime%${BR}*}" \ + -a "${cachetime#*${BR}}" -gt "$((_DATE - CACHE_AGE))" ]; then + cat "${cache}" + else + mkdir -p -- "$_DATA/pages/$page/" + # Macros expect to find page directory as working dir + ( cd -- "$_DATA/pages/$page/"; + sed -E '1,20{ /^%[a-z]+/d; }' "$mdfile" \ + | md |tee -- "${cache}.$$" + ) + grep -q '^%nocache' "$mdfile" \ + && rm -- "${cache}.$$" \ + || mv -- "${cache}.$$" "${cache}" + fi +} + +case "${PATH_INFO}" in + /"[.]"/*) + FILE "${_EXEC}/${PATH_INFO#/\[.\]}" + return 0 + ;; + */\[*\]/*/) + return 1 + ;; + */"#"*/*) + export ERROR_MSG="This page name is not allowed" + theme_error 400 + return 0 + ;; + */"[login]") + theme_page "/[wiki]/login/" + return 0 + ;; + */"[register]") + theme_page "/[wiki]/register/" + return 0 + ;; + */"[invite]") + theme_page "/[wiki]/invite/" + return 0 + ;; + */) + theme_page "${PATH_INFO}" + return 0 + ;; +esac + +return 1 diff --git a/attachment.sh b/handlers/20_attachment.sh similarity index 100% rename from attachment.sh rename to handlers/20_attachment.sh diff --git a/page_edit.sh b/handlers/30_edit.sh similarity index 100% rename from page_edit.sh rename to handlers/30_edit.sh diff --git a/index.cgi b/index.cgi index 9b9bb5f..0c7e914 100755 --- a/index.cgi +++ b/index.cgi @@ -6,20 +6,6 @@ . "${_EXEC}/cgilite/users.sh" . "${_EXEC}/acl.sh" -. "${_EXEC}/themes/default.sh" - -CACHE_AGE=${CACHE_AGE:-1800} -export MD_MACROS="$_EXEC/macros" -export MD_HTML="${MD_HTML:-false}" - -if [ "$(which awk)" ]; then - md() { awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; } -elif [ "$(which busybox)" ]; then - md() { busybox awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk"; } -else - md() { cat; } -fi - mdfile(){ local page="$(PATH "$1")" @@ -42,58 +28,11 @@ wiki_text() { cat -- "$mdfile" } -wiki() { - # Print content of a wiki page - # Get page from data or underlay dir, handle caching - local page="$(PATH "$1")" mdfile cache cachetime - - cache="$_DATA/pages/$page/#page.${USER_ID}.cache" - - mdfile="$(mdfile "$page")" || return 4 - acl_read "$page" || return 3 - - cachetime="$(stat -c %Y -- "$mdfile" "$cache" 2>/dev/null)" - - if [ "${cachetime#*${BR}}" -gt "${cachetime%${BR}*}" \ - -a "${cachetime#*${BR}}" -gt "$((_DATE - CACHE_AGE))" ]; then - cat "${cache}" - else - mkdir -p -- "$_DATA/pages/$page/" - # Macros expect to find page directory as working dir - ( cd -- "$_DATA/pages/$page/"; - sed -E '1,20{ /^%[a-z]+/d; }' "$mdfile" \ - | md |tee -- "${cache}.$$" - ) - grep -q '^%nocache' "$mdfile" \ - && rm -- "${cache}.$$" \ - || mv -- "${cache}.$$" "${cache}" - fi -} - -case "${PATH_INFO}" in - /"[.]"/*) - FILE "${_EXEC}/${PATH_INFO#/\[.\]}" - ;; - */"#"*/*) - export ERROR_MSG="This page name is not allowed" - theme_error 400 - ;; - /|*[^]]/) - theme_page "${PATH_INFO}" - ;; - */"[login]") - theme_page "/[wiki]/login/" - ;; - */"[register]") - theme_page "/[wiki]/register/" - ;; - */"[invite]") - theme_page "/[wiki]/invite/" - ;; - *) - . "$_EXEC/page_edit.sh" \ - || . "$_EXEC/attachment.sh" \ - || theme_error 404 - ;; -esac +for handler in "$_EXEC"/handlers/*; do + . "$handler" && break +done +if [ $? != 0 ]; then + export ERROR_MSG="The presented URL schema cannot be handled" + theme_error 400 +fi