--- loncom/Attic/lchtmldir 2004/10/20 09:30:57 1.11 +++ loncom/Attic/lchtmldir 2005/04/07 22:27:52 1.16 @@ -69,12 +69,12 @@ use strict; use Fcntl qw(:mode); use DirHandle; - +use POSIX; $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/sbin:/home/httpd/perl'; delete @ENV{qw{IFS CDPATH ENV BASH_ENV}}; -my $DEBUG = 0; # .nonzero -> Debug printing enabled. +my $DEBUG = 1; # .nonzero -> Debug printing enabled. my $path_sep = "/"; # Unix like operating systems. @@ -144,7 +144,7 @@ my $safeuser = $patt; if($DEBUG) { print("Save username = $safeuser \n"); } -if(($username ne $safeuser) or ($safeuser!~/^[A-za-z]/)) { +if(($username ne $safeuser) or ($safeuser!~/^[A-z]/)) { if($DEBUG) { print("User name $username had illegal characters\n"); } @@ -185,6 +185,17 @@ if(!( -e $dirtry1)) { exit 6; } } +if ($authentication eq "unix:") { + # check whether group $safeuser exists. + my $usergroups = `id -nG $safeuser`; + if (! grep /^$safeuser$/, split(/\s+/,$usergroups)) { + if($DEBUG) { + print("Group \"$safeuser\" does not exist or $safeuser is not a member of that group.\n"); + } + exit 7; + } +} + &EnableRoot; &System("/bin/mkdir -p $fulldir") unless (-e $fulldir); @@ -214,14 +225,15 @@ END close OUT; } -&System("/bin/chmod 02775 $fulldir"); -&System("/bin/chmod 0775 $fulldir"."/index.html"); +&System("/bin/chmod 02770 $fulldir"); +&System("/bin/chmod 0770 $fulldir"."/index.html"); # Based on the authentiation mode, set the ownership of the directory. if($authentication eq "unix:") { # Unix mode authentication... - &System("/bin/chown -R $safeuser".":".$safeuser." ".$fulldir); + print "Unix auth\n"; + &System("/bin/chown -R $safeuser:$safeuser"." ".$fulldir); &JoinGroup($safeuser); } else { # Internal, Kerberos, and Local authentication are for users @@ -237,11 +249,28 @@ if($authentication eq "unix:") { # Unix # user's home directory that can reset ownerships and permissions # back the way the used to be. - &write_restore_script($homedir); - - &System("/bin/chown -R root:root ".$homedir); + # This can take long enough for lond to time out, so we'll do it + # in a separate process that we'll not wait for. + # + my $fpid = fork; + if($fpid) { + &DisableRoot; + exit 0; + } else { + print "Forked\n"; + POSIX::setsid(); # Disassociate from parent. + print "Separate session\n"; + &write_restore_script($homedir); + print "Restore script written\n"; + &System("/bin/chown -R root:root ".$homedir); + &System("/bin/chown -R www:www ".$fulldir); + print "Exiting\n"; + exit 0; + } + } else { + &System("/bin/chown -R www:www ".$fulldir); } - &System("/bin/chown -R www:www ".$fulldir); + } &DisableRoot; @@ -283,7 +312,10 @@ sub DisableRoot { print("Disable root: id = ".$>."\n"); } } - +# +# Join the www user to the user's group. +# we must be running with euid as root at this time. +# sub JoinGroup { my $usergroup = shift; @@ -302,7 +334,16 @@ sub JoinGroup { } exit 6; } - + if (-e '/var/run/httpd.pid') { + open(PID,'/var/run/httpd.pid'); + my $pid=; + close(PID); + my ($safepid) = $pid=~ /(\d+)/; + $pid = $safepid; + if ($pid) { + my $status = system("kill -USR1 $safepid"); + } + } }