X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=handlers%2F60_move_rename_delete.sh;h=eefd9b41b6d77bfcafe9b32d0bb58d983b7d917f;hb=3be0846ae20cbd5bcfb52d2b17306e621bd5170e;hp=bbe994e4f7a44911d18e10f7cc4eca923d0518dc;hpb=295a04b184bb6cd427c35c58f88d3d35a0552ed8;p=shellwiki diff --git a/handlers/60_move_rename_delete.sh b/handlers/60_move_rename_delete.sh index bbe994e..eefd9b4 100755 --- a/handlers/60_move_rename_delete.sh +++ b/handlers/60_move_rename_delete.sh @@ -1,5 +1,28 @@ #!/bin/sh +# Copyright 2022 - 2023 Paul Hänsch +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +l10n_immutablepage >/dev/null 2>&1 \ +|| l10n_immutablepage(){ #TRANSLATION + cat <<-EOF +

Immutable Page

+ This is a core page of the wiki system. Its name and position cannot be changed. + You may however update this page and you can use ACLs to hide it from various listings. + EOF +} + case "${PATH_INFO}" in */\[move\]|*/\[rename\]|*/\[delete\]) page="${PATH_INFO%\[*\]}" @@ -10,13 +33,11 @@ case "${PATH_INFO}" in printf 'Refresh: %i, url=%s\r\n' 4 ./ theme_error 403 return 0 - elif [ -d "$_EXEC/pages/${page}/" ]; then + elif [ ! -d "$_DATA/pages/${page}" -a -d "$_EXEC/pages/${page}" ]; then theme_page - <<-EOF

-

Immutable Page

- This is a core page of the wiki system. Its name and position cannot be changed. - You may however update this page and you can use ACLs to hide it from various listings. + $(l10n_immutablepage)

EOF @@ -26,19 +47,12 @@ case "${PATH_INFO}" in *) return 1;; esac -if [ "$REQUEST_METHOD" = POST ]; then - action="$(POST action)" - newname="$(POST newname |grep -m1 -xE '[^#/]*')" - newlocation="$(POST newlocation |grep -m1 -xE '/[^#]*')" -else case "${PATH_INFO}" in - */\[move\]) - location="${page%/}" location="${location%/*}/" - theme_page - <<-EOF -
- +l10n_movepage >/dev/null 2>&1 \ +|| l10n_movepage(){ # TRANSLATION + cat <<-EOF

Move Page

$(HTML "${page}")

- + -
EOF - return 0 - ;; - */\[rename\]) - name="${page%/}" name="${name##*/}" - theme_page - <<-EOF -
- +} +l10n_renamepage >/dev/null 2>&1 \ +|| l10n_renamepage(){ # TRANSLATION + cat <<-EOF

Rename Page

$(HTML "${page}")

- + -
EOF - return 0 - ;; - */\[delete\]) - theme_page - <<-EOF -
- +} +l10n_deletepage >/dev/null 2>&1 \ +|| l10n_deletepage(){ # TRANSLATION + cat <<-EOF

Delete Page

$(HTML "${page}")

This page and its attachments will be deleted

+ + EOF +} + +list_writable() { + local PATH_INFO page="${1%/}/" + + if acl_write "$page"; then + PATH_INFO="$page" + page_glob "*" 0 \ + | while read page; do + list_writable "${PATH_INFO}${page}" + done + printf %s\\n "$page" |debug + fi +} + +if [ "$REQUEST_METHOD" = POST ]; then + action="$(POST action)" + newname="$(POST newname |grep -m1 -xE '[^#/]*')" + newlocation="$(POST newlocation |grep -m1 -xE '/[^#]*')" + delsub="$(POST delete_subpages |grep -m1 -xE 'true|false')" +else case "${PATH_INFO}" in + */\[move\]) + location="${page%/}" location="${location%/*}/" + theme_page - <<-EOF + + + + $(page_glob / -1 |while read loc; do + [ "$loc" = "$page" ] && continue + acl_write "$loc" || continue + printf '\n ' "$(HTML "$loc")" + done) + + $(l10n_movepage) +
+ EOF + return 0 + ;; + */\[rename\]) + name="${page%/}" name="${name##*/}" + theme_page - <<-EOF +
+ + $(l10n_renamepage) +
+ EOF + return 0 + ;; + */\[delete\]) + theme_page - <<-EOF +
+ + $(l10n_deletepage)
EOF return 0 @@ -98,22 +165,27 @@ if [ "$action" = rename -a "$newname" ]; then if [ -d "$_DATA/pages/$newname" ]; then printf 'Refresh: %i\r\n' 4 - export ERRORMSG="A location of that name already exists." + export ERROR_MSG="A location of that name already exists." theme_error 400 return 0 elif ! acl_write "$oldname" || ! acl_write "$newname"; then printf 'Refresh: %i\r\n' 4 theme_error 403 return 0 - elif [ "$REV_PAGES" = true ]; then + fi + if [ "$REV_PAGES" = true ]; then git -C "$_DATA" mv "pages/$oldname" "pages/$newname" git -C "$_DATA" commit -m 'Page # '"$oldname"' # renamed to # '"$newname"' # by user @ '"$USER_NAME"' @' \ -- "pages/$oldname" "pages/$newname" - REDIRECT "$_BASE${newname}" else mv -- "$_DATA/pages/$oldname" "$_DATA/pages/$newname" - REDIRECT "$_BASE${newname}" fi + if [ "$SEARCH_INDEX" = true ]; then + find "$_DATA/pages/$newname" -name "#index.flag" -delete + ( "$_EXEC/searchindex.sh" index --location "$newname" & ) & + fi + REDIRECT "$_BASE${newname}" + elif [ "$action" = move -a "$newlocation" ]; then oldname="${PATH_INFO%\[*\]}" newlocation="$(PATH "$newlocation")" @@ -122,51 +194,83 @@ elif [ "$action" = move -a "$newlocation" ]; then if [ -d "$_DATA/pages/$newname" ]; then printf 'Refresh: %i\r\n' 4 - export ERRORMSG="A page of that name already exists at the given location." + export ERROR_MSG="A page of that name already exists at the given location." theme_error 400 return 0 elif [ ! -d "$_DATA/pages/$newlocation" ]; then printf 'Refresh: %i\r\n' 4 - export ERRORMSG="The given location does not exist." + export ERROR_MSG="The given location does not exist." theme_error 400 return 0 elif ! acl_write "$oldname" || ! acl_write "$newname"; then printf 'Refresh: %i\r\n' 4 theme_error 403 return 0 - elif [ "$REV_PAGES" = true ]; then + fi + if [ "$REV_PAGES" = true ]; then git -C "$_DATA" mv "pages/${oldname}" "pages/${newname}" git -C "$_DATA" commit -m 'Page # '"$oldname"' # moved to # '"$newname"' # by user @ '"$USER_NAME"' @' \ -- "pages/${oldname}" "pages/${newname}" - REDIRECT "$_BASE${newname}" else mv -- "$_DATA/pages/$oldname" "$_DATA/pages/$newname" - REDIRECT "$_BASE${newname}" fi + if [ "$SEARCH_INDEX" = true ]; then + find "$_DATA/pages/$newname" -name "#index.flag" -delete + ( "$_EXEC/searchindex.sh" index --location "$newname" & ) & + fi + REDIRECT "$_BASE${newname}" + elif [ "$action" = delete ]; then oldname="${PATH_INFO%\[*\]}" if ! acl_write "$oldname"; then printf 'Refresh: %i\r\n' 4 theme_error 403 return 0 - elif [ "$REV_PAGES" = true ]; then - git -C "$_DATA" rm "pages/${oldname}/#page.md" - git -C "$_DATA" commit -m 'Page # '"$oldname"' # deleted by user @ '"$USER_NAME"' @' \ - -- "pages/${oldname}/#page.md" - rm -r -- "$_DATA/pages/${oldname}"/\#* - rmdir -- "$_DATA/pages/${oldname}/" || true - REDIRECT ./ - else - rm -- "$_DATA/pages/${oldname}/#page.md" - rm -r -- "$_DATA/pages/${oldname}"/\#* - rmdir -- "$_DATA/pages/${oldname}/" || true - REDIRECT ./ fi + + printf 'Status: 202 Accepted\r\n' + { [ "$delsub" = true ] \ + && list_writable "$oldname" \ + || printf %s\\n "$oldname" + } | while read oldname; do + if [ "$REV_PAGES" = true -a "$REV_ATTACHMENTS" = true ]; then + git -C "$_DATA" rm "pages/${oldname}/#page.md" >&2 + git -C "$_DATA" rm -r "pages/${oldname}/#attachments/" >&2 + git -C "$_DATA" commit -m 'Page # '"$oldname"' # deleted by user @ '"$USER_NAME"' @' \ + -- "pages/${oldname}/#page.md" "pages/${oldname}/#attachments/" >&2 + rm -r -- "$_DATA/pages/${oldname}"/\#* + rmdir -- "$_DATA/pages/${oldname}/" || true + elif [ "$REV_PAGES" = true ]; then + git -C "$_DATA" rm "pages/${oldname}/#page.md" >&2 + git -C "$_DATA" commit -m 'Page # '"$oldname"' # deleted by user @ '"$USER_NAME"' @' \ + -- "pages/${oldname}/#page.md" >&2 + rm -r -- "$_DATA/pages/${oldname}"/\#* + rmdir -- "$_DATA/pages/${oldname}/" || true + else + rm -- "$_DATA/pages/${oldname}/#page.md" + rm -r -- "$_DATA/pages/${oldname}"/\#* + rmdir -- "$_DATA/pages/${oldname}/" || true + fi + printf '%s\n' "$oldname" + done | { + cat <<-EOF +
+

$(_ "Pages deleted:")

+ + $(_ OK) +
+ EOF + } | theme_page - + return 0 elif [ "$action" = cancel ]; then REDIRECT ./ elif [ "$action" ]; then printf 'Refresh: %i\r\n' 4 - export ERRORMSG="Missing parameters." + export ERROR_MSG="Missing parameters." theme_error 400 return 0 fi