X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/c987aee47acfcc0df4c1ac2667d9c63133e99d2b..ac750fcd12f1375d4875d62a889005322aa6f534:/IkiWiki/Plugin/lockedit.pm

diff --git a/IkiWiki/Plugin/lockedit.pm b/IkiWiki/Plugin/lockedit.pm
index 5ffb4e6f9..f6cac6cdd 100644
--- a/IkiWiki/Plugin/lockedit.pm
+++ b/IkiWiki/Plugin/lockedit.pm
@@ -6,11 +6,28 @@ use strict;
 use IkiWiki 2.00;
 
 sub import { #{{{
+	hook(type => "getsetup", id => "lockedit", call => \&getsetup);
 	hook(type => "canedit", id => "lockedit", call => \&canedit);
 	hook(type => "formbuilder_setup", id => "lockedit",
 	     call => \&formbuilder_setup);
 } # }}}
 
+sub getsetup () { #{{{
+	return
+		plugin => {
+			safe => 1,
+			rebuild => 0,
+		},
+		locked_pages => {
+			type => "pagespec",
+			example => "!*/Discussion",
+			description => "PageSpec controlling which pages are locked",
+			link => "ikiwiki/PageSpec",
+			safe => 1,
+			rebuild => 0,
+		},
+} #}}}
+
 sub canedit ($$) { #{{{
 	my $page=shift;
 	my $cgi=shift;
@@ -19,16 +36,35 @@ sub canedit ($$) { #{{{
 	my $user=$session->param("name");
 	return undef if defined $user && IkiWiki::is_admin($user);
 
+	if (defined $config{locked_pages} && length $config{locked_pages} &&
+	    pagespec_match($page, $config{locked_pages},
+		    user => $session->param("name"),
+		    ip => $ENV{REMOTE_ADDR},
+	    )) {
+		if (! defined $user ||
+		    ! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
+			return sub { IkiWiki::needsignin($cgi, $session) };
+		}
+		else {
+			return sprintf(gettext("%s is locked and cannot be edited"),
+				htmllink("", "", $page, noimageinline => 1));
+			
+		}
+	}
+
+	# XXX deprecated, should be removed eventually
 	foreach my $admin (@{$config{adminuser}}) {
-		if (pagespec_match($page, IkiWiki::userinfo_get($admin, "locked_pages"))) {
+		if (pagespec_match($page, IkiWiki::userinfo_get($admin, "locked_pages"),
+		    user => $session->param("name"),
+		    ip => $ENV{REMOTE_ADDR},
+		)) {
 			if (! defined $user ||
 			    ! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
 				return sub { IkiWiki::needsignin($cgi, $session) };
 			}
 			else {
-				return sprintf(gettext("%s is locked by %s and cannot be edited"),
-					htmllink("", "", $page, noimageinline => 1),
-					IkiWiki::userlink($admin));
+				return sprintf(gettext("%s is locked and cannot be edited"),
+					htmllink("", "", $page, noimageinline => 1));
 			}
 		}
 	}
@@ -38,7 +74,8 @@ sub canedit ($$) { #{{{
 
 sub formbuilder_setup (@) { #{{{
 	my %params=@_;
-	
+
+	# XXX deprecated, should be removed eventually	
 	my $form=$params{form};
 	if ($form->title eq "preferences") {
 		my $session=$params{session};
@@ -47,19 +84,28 @@ sub formbuilder_setup (@) { #{{{
 
 		$form->field(name => "locked_pages", size => 50,
 			fieldset => "admin",
-			comment => "(".htmllink("", "", "ikiwiki/PageSpec", noimageinline => 1).")");
+			comment => "deprecated; please move to locked_pages in setup file"
+		);
 		if (! IkiWiki::is_admin($user_name)) {
 			$form->field(name => "locked_pages", type => "hidden");
 		}
 		if (! $form->submitted) {
-			$form->field(name => "locked_pages", force => 1,
-				value => IkiWiki::userinfo_get($user_name, "locked_pages"));
+			my $value=IkiWiki::userinfo_get($user_name, "locked_pages");
+			if (length $value) {
+				$form->field(name => "locked_pages", force => 1, value => $value);
+			}
+			else {
+				$form->field(name => "locked_pages", type => "hidden");
+			}
 		}
 		if ($form->submitted && $form->submitted eq 'Save Preferences') {
 			if (defined $form->field("locked_pages")) {
 				IkiWiki::userinfo_set($user_name, "locked_pages",
 					$form->field("locked_pages")) ||
 						error("failed to set locked_pages");
+				if (! length $form->field("locked_pages")) {
+					$form->field(name => "locked_pages", type => "hidden");
+				}
 			}
 		}
 	}