Merge branch 'master' of ssh://git.ikiwiki.info/srv/git/ikiwiki.info
[ikiwiki.git] / IkiWiki / Receive.pm
blobc73adfbbb84b34462eaa474ca315570aba85cc44
1 #!/usr/bin/perl
2 package IkiWiki::Receive;
4 use warnings;
5 use strict;
6 use IkiWiki;
8 sub getuser () {
9 my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $<))[0];
10 if (! defined $user) {
11 error("cannot determine username for $<");
13 return $user;
16 sub trusted () {
17 my $user=getuser();
18 return ! ref $config{untrusted_committers} ||
19 ! grep { $_ eq $user } @{$config{untrusted_committers}};
22 sub genwrapper () {
23 # Test for commits from untrusted committers in the wrapper, to
24 # avoid starting ikiwiki proper at all for trusted commits.
26 my $ret=<<"EOF";
28 int u=getuid();
29 EOF
30 $ret.="\t\tif ( ".
31 join("&&", map {
32 my $uid=getpwnam($_);
33 if (! defined $uid) {
34 error(sprintf(gettext("cannot determine id of untrusted committer %s"), $_));
36 "u != $uid";
37 } @{$config{untrusted_committers}}).
38 ") exit(0);\n";
41 $ret.=<<"EOF";
42 asprintf(&s, "CALLER_UID=%i", u);
43 newenviron[i++]=s;
45 EOF
46 return $ret;
49 sub test () {
50 exit 0 if trusted();
52 IkiWiki::lockwiki();
53 IkiWiki::loadindex();
55 # Dummy up a cgi environment to use when calling check_canedit
56 # and friends.
57 eval q{use CGI};
58 error($@) if $@;
59 my $cgi=CGI->new;
61 # And dummy up a session object.
62 require IkiWiki::CGI;
63 my $session=IkiWiki::cgi_getsession($cgi);
64 $session->param("name", getuser());
65 # Make sure whatever user was authed is in the
66 # userinfo db.
67 require IkiWiki::UserInfo;
68 if (! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
69 IkiWiki::userinfo_setall($session->param("name"), {
70 email => "",
71 password => "",
72 regdate => time,
73 }) || error("failed adding user");
76 IkiWiki::check_canchange(
77 cgi => $cgi,
78 session => $session,
79 changes => [IkiWiki::rcs_receive()]
81 exit 0;