Joseph Nuthalapati ad09964e18
featherwiki: Use new utility for handling uploads
Tests:

- Raise an error by editing code in create, upload, rename and delete
operations. Notice that the details error messages are shown with a drop-down.

- Upload a wiki and it works. The name is as expected.

- Upload the wiki again notice that the duplicate wiki error is shown.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
[sunil: Use new utility for uploading]
[sunil: Better error message display in the UI]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2024-10-03 11:45:39 +03:00

84 lines
2.3 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""Configure Feather Wiki."""
import pathlib
import re
import shutil
import urllib.request
from plinth import action_utils
from plinth.actions import privileged
EMPTY_WIKI_FILE = 'https://ftp.freedombox.org/pub/featherwiki/empty.html'
wiki_dir = pathlib.Path('/var/lib/featherwiki')
def _set_ownership(path: pathlib.Path):
"""Makes www-data:www-data the owner of the give path."""
shutil.chown(path, user='www-data', group='www-data')
@privileged
def setup():
"""Setup wiki dir and CGI script."""
wiki_dir.mkdir(parents=True, exist_ok=True)
_set_ownership(wiki_dir)
def _normalize_wiki_file_name(name):
"""Return a normalized file name from a wiki name."""
file_name = name.replace(' ', '_')
invalid_characters = r'[\/\\\:\*\?\"\'\<\>\|]'
file_name = re.sub(invalid_characters, '', file_name)
if not file_name.endswith('.html'):
return file_name + '.html'
return file_name
@privileged
def create_wiki(file_name: str):
"""Initialize wiki with the latest version of Feather Wiki."""
file_name = _normalize_wiki_file_name(file_name)
response = urllib.request.urlopen(EMPTY_WIKI_FILE)
file_path = wiki_dir / file_name
if file_path.exists():
raise ValueError('Wiki exists')
file_path.write_bytes(response.read())
_set_ownership(file_path)
@privileged
def add_wiki_file(file_name: str, temporary_file_path: str):
"""Add an uploaded wiki file."""
action_utils.move_uploaded_file(temporary_file_path, wiki_dir, file_name,
allow_overwrite=False, user='www-data',
group='www-data', permissions=0o644)
@privileged
def rename_wiki(old_name: str, new_name: str):
"""Rename wiki file."""
old_name = _normalize_wiki_file_name(old_name)
new_name = _normalize_wiki_file_name(new_name)
file_path = wiki_dir / new_name
if file_path.exists():
raise ValueError('Wiki exists')
(wiki_dir / old_name).rename(file_path)
@privileged
def delete_wiki(file_name: str):
"""Delete one wiki file by name."""
file_name = _normalize_wiki_file_name(file_name)
(wiki_dir / file_name).unlink(missing_ok=True)
@privileged
def uninstall():
"""Delete all the wiki content."""
shutil.rmtree(wiki_dir)