#!/usr/bin/perl
-
package IkiWiki::Receive;
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 genwrapper () {
+ # Test for commits from untrusted committers in the wrapper, to
+ # avoid starting ikiwiki proper 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 () { #{{{
+sub test () {
exit 0 if trusted();
IkiWiki::lockwiki();
# 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 add.)
+ # could not add.)
next if $newfiles{$file};
if (IkiWiki::Plugin::remove->can("check_canremove")) {
}
exit 0;
-} #}}}
+}
1