<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/perl
package IkiWiki::Receive;

use warnings;
use strict;
use IkiWiki;

sub getuser () {
	my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $&lt;))[0];
	if (! defined $user) {
		error("cannot determine username for $&lt;");
	}
	return $user;
}

sub trusted () {
	my $user=getuser();
	return ! ref $config{untrusted_committers} ||
		! grep { $_ eq $user } @{$config{untrusted_committers}};
}

sub genwrapper () {
	# Test for commits from untrusted committers in the wrapper, to
	# avoid starting ikiwiki proper at all for trusted commits.

	my $ret=&lt;&lt;"EOF";
	{
		int u=getuid();
		/* 3 characters per byte is certainly enough */
		char uid_string[sizeof(u) * 3 + 1];
EOF
	$ret.="\t\tif ( ".
		join("&amp;&amp;", map {
			my $uid=getpwnam($_);
			if (! defined $uid) {
				error(sprintf(gettext("cannot determine id of untrusted committer %s"), $_));
			}
			"u != $uid";
		} @{$config{untrusted_committers}}).
		") {\n";

	
	$ret.=&lt;&lt;"EOF";
			/* Trusted user.
			 * Consume all stdin before exiting, as git may
			 * otherwise be unhappy. */
			char buf[256];
			while (read(0, &amp;buf, 256) != 0) {}
			exit(0);
		}
		snprintf(uid_string, sizeof(uid_string), "%i", u);
		addenv("CALLER_UID", uid_string);
	}
EOF
	return $ret;
}

sub test () {
	exit 0 if trusted();

	IkiWiki::lockwiki();
	IkiWiki::loadindex();

	# Dummy up a cgi environment to use when calling check_canedit
	# and friends.
	eval q{use CGI};
	error($@) if $@;
	my $cgi=CGI-&gt;new;

	# And dummy up a session object.
	require IkiWiki::CGI;
	my $session=IkiWiki::cgi_getsession($cgi);
	$session-&gt;param("name", getuser());
	# Make sure whatever user was authed is in the
	# userinfo db.
	require IkiWiki::UserInfo;
	if (! IkiWiki::userinfo_get($session-&gt;param("name"), "regdate")) {
		IkiWiki::userinfo_setall($session-&gt;param("name"), {
			email =&gt; "",
			password =&gt; "",
			regdate =&gt; time,
		}) || error("failed adding user");
	}

	IkiWiki::check_canchange(
		cgi =&gt; $cgi,
		session =&gt; $session,
		changes =&gt; [IkiWiki::rcs_receive()]
	);
	exit 0;
}

1
</pre></body></html>