1#!/usr/bin/perl
2package IkiWiki::Receive;
3
4use warnings;
5use strict;
6use IkiWiki;
7
8sub getuser () {
9	my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $<))[0];
10	if (! defined $user) {
11		error("cannot determine username for $<");
12	}
13	return $user;
14}
15
16sub trusted () {
17	my $user=getuser();
18	return ! ref $config{untrusted_committers} ||
19		! grep { $_ eq $user } @{$config{untrusted_committers}};
20}
21
22sub genwrapper () {
23	# Test for commits from untrusted committers in the wrapper, to
24	# avoid starting ikiwiki proper at all for trusted commits.
25
26	my $ret=<<"EOF";
27	{
28		int u=getuid();
29		/* 3 characters per byte is certainly enough */
30		char uid_string[sizeof(u) * 3 + 1];
31EOF
32	$ret.="\t\tif ( ".
33		join("&&", map {
34			my $uid=getpwnam($_);
35			if (! defined $uid) {
36				error(sprintf(gettext("cannot determine id of untrusted committer %s"), $_));
37			}
38			"u != $uid";
39		} @{$config{untrusted_committers}}).
40		") {\n";
41
42
43	$ret.=<<"EOF";
44			/* Trusted user.
45			 * Consume all stdin before exiting, as git may
46			 * otherwise be unhappy. */
47			char buf[256];
48			while (read(0, &buf, 256) != 0) {}
49			exit(0);
50		}
51		snprintf(uid_string, sizeof(uid_string), "%i", u);
52		addenv("CALLER_UID", uid_string);
53	}
54EOF
55	return $ret;
56}
57
58sub test () {
59	exit 0 if trusted();
60
61	IkiWiki::lockwiki();
62	IkiWiki::loadindex();
63
64	# Dummy up a cgi environment to use when calling check_canedit
65	# and friends.
66	eval q{use CGI};
67	error($@) if $@;
68	my $cgi=CGI->new;
69
70	# And dummy up a session object.
71	require IkiWiki::CGI;
72	my $session=IkiWiki::cgi_getsession($cgi);
73	$session->param("name", getuser());
74	# Make sure whatever user was authed is in the
75	# userinfo db.
76	require IkiWiki::UserInfo;
77	if (! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
78		IkiWiki::userinfo_setall($session->param("name"), {
79			email => "",
80			password => "",
81			regdate => time,
82		}) || error("failed adding user");
83	}
84
85	IkiWiki::check_canchange(
86		cgi => $cgi,
87		session => $session,
88		changes => [IkiWiki::rcs_receive()]
89	);
90	exit 0;
91}
92
931
94