1#!/usr/bin/perl 2package IkiWiki::Plugin::lockedit; 3 4use warnings; 5use strict; 6use IkiWiki 3.00; 7 8sub import { 9 hook(type => "getsetup", id => "lockedit", call => \&getsetup); 10 hook(type => "canedit", id => "lockedit", call => \&canedit); 11} 12 13sub getsetup () { 14 return 15 plugin => { 16 safe => 1, 17 rebuild => 0, 18 section => "auth", 19 }, 20 locked_pages => { 21 type => "pagespec", 22 example => "!*/Discussion", 23 description => "PageSpec controlling which pages are locked", 24 link => "ikiwiki/PageSpec", 25 safe => 1, 26 rebuild => 0, 27 }, 28} 29 30sub canedit ($$) { 31 my $page=shift; 32 my $cgi=shift; 33 my $session=shift; 34 35 my $user=$session->param("name"); 36 return undef if defined $user && IkiWiki::is_admin($user); 37 38 if (defined $config{locked_pages} && length $config{locked_pages} && 39 pagespec_match($page, $config{locked_pages}, 40 user => $session->param("name"), 41 ip => $session->remote_addr(), 42 )) { 43 if ((! defined $user || 44 ! IkiWiki::userinfo_get($session->param("name"), "regdate")) && 45 exists $IkiWiki::hooks{auth}) { 46 return sub { IkiWiki::needsignin($cgi, $session) }; 47 } 48 else { 49 return sprintf(gettext("%s is locked and cannot be edited"), 50 htmllink("", "", $page, noimageinline => 1)); 51 52 } 53 } 54 55 return undef; 56} 57 581 59