#!/bin/sh
-l10n_immutablepage >/dev/null \
+# 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
<h1>Immutable Page</h1>
*) return 1;;
esac
-l10n_movepage >/dev/null \
+l10n_movepage >/dev/null 2>&1 \
|| l10n_movepage(){ # TRANSLATION
cat <<-EOF
<h1>Move Page</h1>
<button type=submit name=action value=cancel>Cancel</button>
EOF
}
-l10n_renamepage >/dev/null \
+l10n_renamepage >/dev/null 2>&1 \
|| l10n_renamepage(){ # TRANSLATION
cat <<-EOF
<h1>Rename Page</h1>
<button type=submit name=action value=cancel>Cancel</button>
EOF
}
-l10n_deletepage >/dev/null \
+l10n_deletepage >/dev/null 2>&1 \
|| l10n_deletepage(){ # TRANSLATION
cat <<-EOF
<h1>Delete Page</h1>
<p class="pageid">$(HTML "${page}")</p>
<p>This page and its attachments will be deleted</p>
+ <input type=checkbox name=delete_subpages value=true id=delsub><label for=delsub>Delete subpages</label>
<ul>
- <li>Past revisions of the page text (including the current one) will remain accessible and can be restored.</li>
- <li>Attachments will be deleted completely, and cannot be restored.</li>
- <li>Subpages will not be affected and can still be accessed normally.</li>
+ EOF
+ [ "$REV_PAGES" = true ] \
+ && printf ' <li>Past revisions of the page text (including the current one) will remain accessible and can be restored.</li>'
+ [ "$REV_PAGES" = true -a "$REV_ATTACHMENTS" = true ] \
+ && printf ' <li>Attachments can be restored as well.</li>' \
+ || printf ' <li>Attachments will be deleted completely, and cannot be restored.</li>'
+ cat <<-EOF
+ <li class="delsub">Subpages will not be affected and can still be accessed normally.</li>
</ul>
<button type=submit name=action value=delete>Delete</button>
<button type=submit name=action value=cancel>Cancel</button>
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%/*}/"
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
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
- 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
+ <article id="deleteconfirm">
+ <h1>$(_ "Pages deleted:")</h1>
+ <ul>
+ $(while read page; do
+ printf '<li>%s</li>' "$(HTML $page)"
+ done)
+ </ul>
+ <a class="button" href="./">$(_ OK)</a>
+ </article>
+ 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