X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/146192d5b01329bd8e5dfbf4045efded467151e0..bbeb9a4a1462ef17cfc1faeaf3bb73eb6384bdab:/IkiWiki/Receive.pm?ds=inline

diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
index 451a3fe8e..37b6f2a62 100644
--- a/IkiWiki/Receive.pm
+++ b/IkiWiki/Receive.pm
@@ -6,22 +6,46 @@ use warnings;
 use strict;
 use IkiWiki;
 
-sub getuser () { #{{{
-	# CALLER_UID is set by the suid wrapper, to the original uid
+sub getuser () {
 	my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $<))[0];
 	if (! defined $user) {
 		error("cannot determine username for $<");
 	}
 	return $user;
-} #}}}
+}
 
-sub trusted () { #{{{
+sub trusted () {
 	my $user=getuser();
 	return ! ref $config{untrusted_committers} ||
 		! grep { $_ eq $user } @{$config{untrusted_committers}};
-} #}}}
+}
 
-sub test () { #{{{
+sub gen_wrapper () {
+	# Test for commits from untrusted committers in the wrapper, to
+	# avoid loading ikiwiki at all for trusted commits.
+
+	my $ret=<<"EOF";
+	{
+		int u=getuid();
+EOF
+	$ret.="\t\tif ( ".
+		join("&&", map {
+			my $uid=getpwnam($_);
+			if (! defined $uid) {
+				error(sprintf(gettext("cannot determine id of untrusted committer %s"), $_));
+			}
+			"u != $uid";
+		} @{$config{untrusted_committers}}).
+		") exit(0);\n";
+	$ret.=<<"EOF";
+		asprintf(&s, "CALLER_UID=%i", u);
+		newenviron[i++]=s;
+	}
+EOF
+	return $ret;
+}
+
+sub test () {
 	exit 0 if trusted();
 	
 	IkiWiki::lockwiki();
@@ -106,6 +130,6 @@ sub test () { #{{{
 	}
 
 	exit 0;
-} #}}}
+}
 
 1