aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Receive.pm
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-10-24 15:47:42 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-10-24 15:47:42 -0400
commit146192d5b01329bd8e5dfbf4045efded467151e0 (patch)
tree75752f4ffac35c5c4e32e4025e4d3a689d454cd6 /IkiWiki/Receive.pm
parent86ea8adaf3263babd401b7c2d73a1824b99ea908 (diff)
downloadikiwiki-146192d5b01329bd8e5dfbf4045efded467151e0.tar
ikiwiki-146192d5b01329bd8e5dfbf4045efded467151e0.tar.gz
the pre-receive wrapper needs to be suid after all
It needs to write to the user db.
Diffstat (limited to 'IkiWiki/Receive.pm')
-rw-r--r--IkiWiki/Receive.pm26
1 files changed, 19 insertions, 7 deletions
diff --git a/IkiWiki/Receive.pm b/IkiWiki/Receive.pm
index 81b67d9b4..451a3fe8e 100644
--- a/IkiWiki/Receive.pm
+++ b/IkiWiki/Receive.pm
@@ -7,7 +7,8 @@ use strict;
use IkiWiki;
sub getuser () { #{{{
- my $user=(getpwuid($<))[0];
+ # 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 $<");
}
@@ -23,20 +24,31 @@ sub trusted () { #{{{
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->new;
+ $ENV{REMOTE_ADDR}='unknown' unless exists $ENV{REMOTE_ADDR};
+
+ # And dummy up a session object.
require IkiWiki::CGI;
my $session=IkiWiki::cgi_getsession($cgi);
$session->param("name", getuser());
- $ENV{REMOTE_ADDR}='unknown' unless exists $ENV{REMOTE_ADDR};
-
- # Wiki is not locked because we lack permission to do so.
- # So, relying on atomic index file updates to avoid trouble.
- IkiWiki::loadindex();
-
+ # Make sure whatever user was authed is in the
+ # userinfo db.
+ require IkiWiki::UserInfo;
+ if (! IkiWiki::userinfo_get($session->param("name"), "regdate")) {
+ IkiWiki::userinfo_setall($session->param("name"), {
+ email => "",
+ password => "",
+ regdate => time,
+ }) || error("failed adding user");
+ }
+
my %newfiles;
foreach my $change (IkiWiki::rcs_receive()) {