From d4c68c5c7ccdec8bf533a934b5b996c2908fbf02 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 10 Oct 2019 09:49:22 +0100 Subject: [PATCH] wiki: Implement restoring pages Signed-off-by: Michael Tremer --- Makefile.am | 1 + src/backend/wiki.py | 9 ++++++++ src/templates/wiki/confirm-restore.html | 28 ++++++++++++++++++++++++ src/templates/wiki/modules/list.html | 6 +++++ src/web/__init__.py | 1 + src/web/wiki.py | 29 +++++++++++++++++++++++++ 6 files changed, 74 insertions(+) create mode 100644 src/templates/wiki/confirm-restore.html diff --git a/Makefile.am b/Makefile.am index ea654525..f7b40a67 100644 --- a/Makefile.am +++ b/Makefile.am @@ -277,6 +277,7 @@ templates_wiki_DATA = \ src/templates/wiki/404.html \ src/templates/wiki/base.html \ src/templates/wiki/confirm-delete.html \ + src/templates/wiki/confirm-restore.html \ src/templates/wiki/diff.html \ src/templates/wiki/edit.html \ src/templates/wiki/page.html \ diff --git a/src/backend/wiki.py b/src/backend/wiki.py index 1747429c..3f19c242 100644 --- a/src/backend/wiki.py +++ b/src/backend/wiki.py @@ -338,6 +338,9 @@ class Page(misc.Object): def breadcrumbs(self): return self.backend.wiki.make_breadcrumbs(self.page) + def is_latest_revision(self): + return self.get_latest_revision() == self + def get_latest_revision(self): revisions = self.get_revisions() @@ -446,6 +449,12 @@ class Page(misc.Object): sender="IPFire Wiki ", recipients=[watcher], page=self, priority=-10) + def restore(self, author, address): + changes = "Restore to revision from %s" % self.timestamp.isoformat() + + return self.backend.wiki.create_page(self.page, + author, self.markdown, changes=changes, address=address) + class File(misc.Object): def init(self, id, data): diff --git a/src/templates/wiki/confirm-restore.html b/src/templates/wiki/confirm-restore.html new file mode 100644 index 00000000..f9acfaed --- /dev/null +++ b/src/templates/wiki/confirm-restore.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} + +{% block title %}{{ _("Restore %s") % page.page }}{% end block %} + +{% block content %} +
+
+
+
{{ _("Restore %s") % page.page }}
+ +

+ {{ _("Do you really want to restore this page to its revision from %s?") % locale.format_date(page.timestamp) }} +

+ +
+ {% raw xsrf_form_html() %} + + + + + +
+
+
+
+{% end block %} diff --git a/src/templates/wiki/modules/list.html b/src/templates/wiki/modules/list.html index 0663fd21..3891a291 100644 --- a/src/templates/wiki/modules/list.html +++ b/src/templates/wiki/modules/list.html @@ -30,5 +30,11 @@ {% end %} {% end %} + + {% if not page.is_latest_revision() %} + + + + {% end %}

{% end %} diff --git a/src/web/__init__.py b/src/web/__init__.py index 8343b86d..ff7cd400 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -294,6 +294,7 @@ class Application(tornado.web.Application): (r"([A-Za-z0-9\-_\/]+)?/_edit", wiki.ActionEditHandler), (r"([A-Za-z0-9\-_\/]+)?/_render", wiki.ActionRenderHandler), (r"([A-Za-z0-9\-_\/]+)?/_(watch|unwatch)", wiki.ActionWatchHandler), + (r"/actions/restore", wiki.ActionRestoreHandler), (r"/actions/upload", wiki.ActionUploadHandler), # Handlers diff --git a/src/web/wiki.py b/src/web/wiki.py index e5759e37..ca0f1b35 100644 --- a/src/web/wiki.py +++ b/src/web/wiki.py @@ -126,6 +126,30 @@ class ActionDeleteHandler(auth.CacheMixin, base.BaseHandler): self.redirect("%s/_files" % file.path) +class ActionRestoreHandler(auth.CacheMixin, base.BaseHandler): + @tornado.web.authenticated + @base.ratelimit(minutes=60, requests=24) + def post(self): + path = self.get_argument("path") + + # Check permissions + if not self.backend.wiki.check_acl(path, self.current_user): + raise tornado.web.HTTPError(403, "Access to %s not allowed for %s" % (path, self.current_user)) + + # Check if we are asked to render a certain revision + revision = self.get_argument("revision", None) + + # Fetch the wiki page + page = self.backend.wiki.get_page(path, revision=revision) + + with self.db.transaction(): + page = page.restore( + author=self.current_user, address=self.get_remote_ip(), + ) + + # Redirect back to page + self.redirect(page.page) + class ActionWatchHandler(auth.CacheMixin, base.BaseHandler): @tornado.web.authenticated @@ -286,6 +310,11 @@ class PageHandler(auth.CacheMixin, base.BaseHandler): self.render("wiki/diff.html", page=page, a=a, b=b) return + # Restore + elif self.action == "restore": + self.render("wiki/confirm-restore.html", page=page) + return + # Revisions elif self.action == "revisions": self.render("wiki/revisions.html", page=page) -- 2.39.2