]> sipb.mit.edu Git - ikiwiki.git/commitdiff
move untrusted committer test into the wrapper
authorJoey Hess <joey@kodama.kitenet.net>
Sun, 26 Oct 2008 18:03:18 +0000 (14:03 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Sun, 26 Oct 2008 18:03:18 +0000 (14:03 -0400)
This saves around 1/4th second per trusted commit since ikiwiki
doesn't need to start up.

IkiWiki/Receive.pm
IkiWiki/Wrapper.pm
ikiwiki.in

index 451a3fe8e50d98c155579321109e6084d25e657e..72668d26a9d596c8b340946b2051fa4ad840949e 100644 (file)
@@ -7,7 +7,6 @@ use strict;
 use IkiWiki;
 
 sub getuser () { #{{{
-       # CALLER_UID is set by the suid wrapper, to the original uid
        my $user=(getpwuid(exists $ENV{CALLER_UID} ? $ENV{CALLER_UID} : $<))[0];
        if (! defined $user) {
                error("cannot determine username for $<");
@@ -21,6 +20,31 @@ sub trusted () { #{{{
                ! grep { $_ eq $user } @{$config{untrusted_committers}};
 } #}}}
 
+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();
        
index 0a2b8d4f83c80b648d33d2f17474dc5957e91769..fd8a0e5b0e03d3f4f1a907fdb0b25d6fb68033ae 100644 (file)
@@ -36,7 +36,13 @@ sub gen_wrapper () { #{{{
                addenv("$var", s);
 EOF
        }
-       
+
+       my $test_receive="";
+       if ($config{test_receive}) {
+               require IkiWiki::Receive;
+               $test_receive=IkiWiki::Receive::gen_wrapper();
+       }
+
        $Data::Dumper::Indent=0; # no newlines
        my $configstring=Data::Dumper->Dump([\%config], ['*config']);
        $configstring=~s/\\/\\\\/g;
@@ -67,13 +73,12 @@ addenv(char *var, char *val) {
 }
 
 int main (int argc, char **argv) {
-       /* Sanitize environment. */
        char *s;
+
+$test_receive
 $envsave
        newenviron[i++]="HOME=$ENV{HOME}";
        newenviron[i++]="WRAPPED_OPTIONS=$configstring";
-       asprintf(&s, "CALLER_UID=%i", getuid());
-       newenviron[i++]=s;
        newenviron[i]=NULL;
        environ=newenviron;
 
index d601d2739e64bdba76cfd5a852d18a36876d12ec..f2407b8d0e0d02c6c01e9770eed0199ba9094669 100755 (executable)
@@ -123,11 +123,6 @@ sub getconfig () { #{{{
                        # optimisation for no-op post_commit 
                        exit 0;
                }
-               elsif ($config{test_receive}) {
-                       # quick success if the user is trusted
-                       require IkiWiki::Receive;
-                       exit 0 if IkiWiki::Receive::trusted();
-               }
 
                loadplugins();
                checkconfig();