X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/4669eab596c8d90de0cf9f9d359ad8dd8f48edb5..a5de24ec9700c56f8945668c3647b45a7a9b71c2:/IkiWiki/Plugin/editpage.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm index fe2864bac..91d125a5c 100644 --- a/IkiWiki/Plugin/editpage.pm +++ b/IkiWiki/Plugin/editpage.pm @@ -6,19 +6,19 @@ use strict; use IkiWiki; use open qw{:utf8 :std}; -sub import { #{{{ +sub import { hook(type => "getsetup", id => "editpage", call => \&getsetup); hook(type => "refresh", id => "editpage", call => \&refresh); hook(type => "sessioncgi", id => "editpage", call => \&IkiWiki::cgi_editpage); -} # }}} +} -sub getsetup () { #{{{ +sub getsetup () { return plugin => { safe => 1, rebuild => 1, }, -} #}}} +} sub refresh () { if (exists $wikistate{editpage} && exists $wikistate{editpage}{previews}) { @@ -54,7 +54,7 @@ sub refresh () { # and other plugins use the functions below. package IkiWiki; -sub check_canedit ($$$;$) { #{{{ +sub check_canedit ($$$;$) { my $page=shift; my $q=shift; my $session=shift; @@ -79,9 +79,36 @@ sub check_canedit ($$$;$) { #{{{ } }); return $canedit; -} #}}} +} + +sub check_cansave ($$$$) { + my $page=shift; + my $content=shift; + my $q=shift; + my $session=shift; + + my $cansave; + run_hooks(cansave => sub { + return if defined $cansave; + my $ret=shift->($page, $content, $q, $session); + if (defined $ret) { + if ($ret eq "") { + $cansave=1; + } + elsif (ref $ret eq 'CODE') { + $ret->(); + $cansave=0; + } + else { + error($ret); + $cansave=0; + } + } + }); + return $cansave; +} -sub cgi_editpage ($$) { #{{{ +sub cgi_editpage ($$) { my $q=shift; my $session=shift; @@ -105,7 +132,6 @@ sub cgi_editpage ($$) { #{{{ header => 0, table => 0, template => scalar template_params("editpage.tmpl"), - wikiname => $config{wikiname}, ); decode_form_utf8($form); @@ -340,16 +366,7 @@ sub cgi_editpage ($$) { #{{{ else { # save page check_canedit($page, $q, $session); - - # The session id is stored on the form and checked to - # guard against CSRF. But only if the user is logged in, - # as anonok can allow anonymous edits. - if (defined $session->param("name")) { - my $sid=$q->param('sid'); - if (! defined $sid || $sid ne $session->id) { - error(gettext("Your login session has expired.")); - } - } + checksessionexpiry($q, $session, $q->param('sid')); my $exists=-e "$config{srcdir}/$file"; @@ -380,6 +397,7 @@ sub cgi_editpage ($$) { #{{{ } my $content=$form->field('editcontent'); + check_cansave($page, $content, $q, $session); run_hooks(editcontent => sub { $content=shift->( content => $content, @@ -462,6 +480,6 @@ sub cgi_editpage ($$) { #{{{ } exit; -} #}}} +} 1