From faf94b578729387f85af2b2b248959debe2fa4b8 Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kitenet.net>
Date: Fri, 8 Oct 2010 18:06:38 -0400
Subject: [PATCH] refactor check_canchange into IkiWiki library

---
 IkiWiki.pm                      | 63 ++++++++++++++++++++++++++++++++
 IkiWiki/Plugin/recentchanges.pm |  3 +-
 IkiWiki/Receive.pm              | 65 +--------------------------------
 3 files changed, 66 insertions(+), 65 deletions(-)

diff --git a/IkiWiki.pm b/IkiWiki.pm
index 1f6d70ba3..2190f008c 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -1519,6 +1519,69 @@ sub check_content (@) {
 	return defined $ok ? $ok : 1;
 }
 
+sub check_canchange (@) {
+	my %params = @_;
+	my $cgi = $params{cgi};
+	my $session = $params{session};
+	my @changes = @{$params{changes}};
+
+	my %newfiles;
+	foreach my $change (@changes) {
+		# This untaint is safe because we check file_pruned and
+		# wiki_file_regexp.
+		my ($file)=$change->{file}=~/$config{wiki_file_regexp}/;
+		$file=possibly_foolish_untaint($file);
+		if (! defined $file || ! length $file ||
+		    file_pruned($file)) {
+			error(gettext("bad file name %s"), $file);
+		}
+
+		my $type=pagetype($file);
+		my $page=pagename($file) if defined $type;
+
+		if ($change->{action} eq 'add') {
+			$newfiles{$file}=1;
+		}
+
+		if ($change->{action} eq 'change' ||
+		    $change->{action} eq 'add') {
+			if (defined $page) {
+				check_canedit($page, $cgi, $session);
+				next;
+			}
+			else {
+				if (IkiWiki::Plugin::attachment->can("check_canattach")) {
+					IkiWiki::Plugin::attachment::check_canattach($session, $file, $change->{path});
+					check_canedit($file, $cgi, $session);
+					next;
+				}
+			}
+		}
+		elsif ($change->{action} eq 'remove') {
+			# check_canremove tests to see if the file is present
+			# on disk. This will fail when a single commit adds a
+			# file and then removes it again. Avoid the problem
+			# by not testing the removal in such pairs of changes.
+			# (The add is still tested, just to make sure that
+			# no data is added to the repo that a web edit
+			# could not add.)
+			next if $newfiles{$file};
+
+			if (IkiWiki::Plugin::remove->can("check_canremove")) {
+				IkiWiki::Plugin::remove::check_canremove(defined $page ? $page : $file, $cgi, $session);
+				check_canedit(defined $page ? $page : $file, $cgi, $session);
+				next;
+			}
+		}
+		else {
+			error "unknown action ".$change->{action};
+		}
+
+		error sprintf(gettext("you are not allowed to change %s"), $file);
+	}
+}
+
+
 my $wikilock;
 
 sub lockwiki () {
diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm
index 56e17dcca..fe414d865 100644
--- a/IkiWiki/Plugin/recentchanges.pm
+++ b/IkiWiki/Plugin/recentchanges.pm
@@ -94,8 +94,7 @@ sub sessioncgi ($$) {
 	return unless $do eq 'revert' && $rev;
 
 	my @changes=$IkiWiki::hooks{rcs}{rcs_preprevert}{call}->($rev);
-	require IkiWiki::Receive;
-	IkiWiki::Receive::test_changes(
+	IkiWiki::check_canchange(
 		cgi => $q,
 		session => $session,
 		changes => \@changes,
diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
index 88fb49725..225f2b9ab 100644
--- a/IkiWiki/Receive.pm
+++ b/IkiWiki/Receive.pm
@@ -73,73 +73,12 @@ sub test () {
 		}) || error("failed adding user");
 	}
 
-	test_changes(cgi => $cgi,
+	check_canchange(
+		cgi => $cgi,
 		session => $session,
 		changes => [IkiWiki::rcs_receive()]
 	);
 	exit 0;
 }
 
-sub test_changes {
-	my %params = @_;
-	my $cgi = $params{cgi};
-	my $session = $params{session};
-	my @changes = @{$params{changes}};
-
-	my %newfiles;
-	foreach my $change (@changes) {
-		# This untaint is safe because we check file_pruned and
-		# wiki_file_regexp.
-		my ($file)=$change->{file}=~/$config{wiki_file_regexp}/;
-		$file=IkiWiki::possibly_foolish_untaint($file);
-		if (! defined $file || ! length $file ||
-		    IkiWiki::file_pruned($file)) {
-			error(gettext("bad file name %s"), $file);
-		}
-
-		my $type=pagetype($file);
-		my $page=pagename($file) if defined $type;
-
-		if ($change->{action} eq 'add') {
-			$newfiles{$file}=1;
-		}
-
-		if ($change->{action} eq 'change' ||
-		    $change->{action} eq 'add') {
-			if (defined $page) {
-				IkiWiki::check_canedit($page, $cgi, $session);
-				next;
-			}
-			else {
-				if (IkiWiki::Plugin::attachment->can("check_canattach")) {
-					IkiWiki::Plugin::attachment::check_canattach($session, $file, $change->{path});
-					IkiWiki::check_canedit($file, $cgi, $session);
-					next;
-				}
-			}
-		}
-		elsif ($change->{action} eq 'remove') {
-			# check_canremove tests to see if the file is present
-			# on disk. This will fail when a single commit adds a
-			# file and then removes it again. Avoid the problem
-			# by not testing the removal in such pairs of changes.
-			# (The add is still tested, just to make sure that
-			# no data is added to the repo that a web edit
-			# could not add.)
-			next if $newfiles{$file};
-
-			if (IkiWiki::Plugin::remove->can("check_canremove")) {
-				IkiWiki::Plugin::remove::check_canremove(defined $page ? $page : $file, $cgi, $session);
-				IkiWiki::check_canedit(defined $page ? $page : $file, $cgi, $session);
-				next;
-			}
-		}
-		else {
-			error "unknown action ".$change->{action};
-		}
-
-		error sprintf(gettext("you are not allowed to change %s"), $file);
-	}
-}
-
 1
-- 
2.39.5