version 1.78, 2002/05/03 03:21:25
|
version 1.85, 2002/08/01 18:44:19
|
Line 53
|
Line 53
|
# 02/12 Gerd Kortemeyer |
# 02/12 Gerd Kortemeyer |
# 02/19 Matthew Hall |
# 02/19 Matthew Hall |
# 02/25 Gerd Kortemeyer |
# 02/25 Gerd Kortemeyer |
|
# 05/11 Scott Harrison |
### |
### |
|
|
# based on "Perl Cookbook" ISBN 1-56592-243-3 |
# based on "Perl Cookbook" ISBN 1-56592-243-3 |
Line 61
|
Line 62
|
# HUPs |
# HUPs |
# uses IDEA encryption |
# uses IDEA encryption |
|
|
|
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA::Configuration; |
|
|
use IO::Socket; |
use IO::Socket; |
use IO::File; |
use IO::File; |
use Apache::File; |
use Apache::File; |
Line 101 sub timeout {
|
Line 105 sub timeout {
|
$SIG{'QUIT'}=\&catchexception; |
$SIG{'QUIT'}=\&catchexception; |
$SIG{__DIE__}=\&catchexception; |
$SIG{__DIE__}=\&catchexception; |
|
|
# ------------------------------------ Read httpd access.conf and get variables |
# ---------------------------------- Read loncapa_apache.conf and loncapa.conf |
|
&status("Read loncapa_apache.conf and loncapa.conf"); |
open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf"; |
my $perlvarref=LONCAPA::Configuration::read_conf('loncapa_apache.conf', |
|
'loncapa.conf'); |
while ($configline=<CONFIG>) { |
my %perlvar=%{$perlvarref}; |
if ($configline =~ /PerlSetVar/) { |
undef $perlvarref; |
my ($dummy,$varname,$varvalue)=split(/\s+/,$configline); |
|
chomp($varvalue); |
|
$perlvar{$varname}=$varvalue; |
|
} |
|
} |
|
close(CONFIG); |
|
|
|
# ----------------------------- Make sure this process is running from user=www |
# ----------------------------- Make sure this process is running from user=www |
my $wwwid=getpwnam('www'); |
my $wwwid=getpwnam('www'); |
Line 549 sub make_new_child {
|
Line 547 sub make_new_child {
|
# ------------------------------------------------------------ Process requests |
# ------------------------------------------------------------ Process requests |
while (my $userinput=<$client>) { |
while (my $userinput=<$client>) { |
chomp($userinput); |
chomp($userinput); |
|
Debug("Request = $userinput\n"); |
&status('Processing '.$hostid{$clientip}.': '.$userinput); |
&status('Processing '.$hostid{$clientip}.': '.$userinput); |
my $wasenc=0; |
my $wasenc=0; |
alarm(120); |
alarm(120); |
Line 604 sub make_new_child {
|
Line 603 sub make_new_child {
|
} elsif ($userinput =~ /^currentauth/) { |
} elsif ($userinput =~ /^currentauth/) { |
if ($wasenc==1) { |
if ($wasenc==1) { |
my ($cmd,$udom,$uname)=split(/:/,$userinput); |
my ($cmd,$udom,$uname)=split(/:/,$userinput); |
my $result = GetAuthType($udom, $user); |
my $result = GetAuthType($udom, $uname); |
if($result eq "nouser") { |
if($result eq "nouser") { |
print $client "unknown_user\n"; |
print $client "unknown_user\n"; |
} |
} |
Line 948 sub make_new_child {
|
Line 947 sub make_new_child {
|
} else { |
} else { |
print $client "rejected\n"; |
print $client "rejected\n"; |
} |
} |
|
# -------------------------------------- fetch a user file from a remote server |
|
} elsif ($userinput =~ /^fetchuserfile/) { |
|
my ($cmd,$fname)=split(/:/,$userinput); |
|
# ------------------------------------------ authenticate access to a user file |
|
} elsif ($userinput =~ /^authuserfile/) { |
|
my ($cmd,$fname,$session)=split(/:/,$userinput); |
# ----------------------------------------------------------------- unsubscribe |
# ----------------------------------------------------------------- unsubscribe |
} elsif ($userinput =~ /^unsub/) { |
} elsif ($userinput =~ /^unsub/) { |
my ($cmd,$fname)=split(/:/,$userinput); |
my ($cmd,$fname)=split(/:/,$userinput); |
if (-e $fname) { |
if (-e $fname) { |
if (unlink("$fname.$hostid{$clientip}")) { |
print $client &unsub($client,$fname,$clientip); |
print $client "ok\n"; |
|
} else { |
|
print $client "not_subscribed\n"; |
|
} |
|
} else { |
} else { |
print $client "not_found\n"; |
print $client "not_found\n"; |
} |
} |
# ------------------------------------------------------------------- subscribe |
# ------------------------------------------------------------------- subscribe |
} elsif ($userinput =~ /^sub/) { |
} elsif ($userinput =~ /^sub/) { |
my ($cmd,$fname)=split(/:/,$userinput); |
print $client &subscribe($userinput,$clientip); |
my $ownership=ishome($fname); |
|
if ($ownership eq 'owner') { |
|
if (-e $fname) { |
|
if (-d $fname) { |
|
print $client "directory\n"; |
|
} else { |
|
$now=time; |
|
{ |
|
my $sh; |
|
if ($sh= |
|
IO::File->new(">$fname.$hostid{$clientip}")) { |
|
print $sh "$clientip:$now\n"; |
|
} |
|
} |
|
unless ($fname=~/\.meta$/) { |
|
unlink("$fname.meta.$hostid{$clientip}"); |
|
} |
|
$fname=~s/\/home\/httpd\/html\/res/raw/; |
|
$fname="http://$thisserver/".$fname; |
|
print $client "$fname\n"; |
|
} |
|
} else { |
|
print $client "not_found\n"; |
|
} |
|
} else { |
|
print $client "rejected\n"; |
|
} |
|
# ------------------------------------------------------------------------- log |
# ------------------------------------------------------------------------- log |
} elsif ($userinput =~ /^log/) { |
} elsif ($userinput =~ /^log/) { |
my ($cmd,$udom,$uname,$what)=split(/:/,$userinput); |
my ($cmd,$udom,$uname,$what)=split(/:/,$userinput); |
Line 1293 sub make_new_child {
|
Line 1267 sub make_new_child {
|
# ------------------------------------------------------------------- querysend |
# ------------------------------------------------------------------- querysend |
} elsif ($userinput =~ /^querysend/) { |
} elsif ($userinput =~ /^querysend/) { |
my ($cmd,$query, |
my ($cmd,$query, |
$custom,$customshow)=split(/:/,$userinput); |
$arg1,$arg2,$arg3)=split(/\:/,$userinput); |
$query=~s/\n*$//g; |
$query=~s/\n*$//g; |
unless ($custom or $customshow) { |
print $client "". |
print $client "". |
|
sqlreply("$hostid{$clientip}\&$query")."\n"; |
|
} |
|
else { |
|
print $client "". |
|
sqlreply("$hostid{$clientip}\&$query". |
sqlreply("$hostid{$clientip}\&$query". |
"\&$custom"."\&$customshow")."\n"; |
"\&$arg1"."\&$arg2"."\&$arg3")."\n"; |
} |
|
# ------------------------------------------------------------------ queryreply |
# ------------------------------------------------------------------ queryreply |
} elsif ($userinput =~ /^queryreply/) { |
} elsif ($userinput =~ /^queryreply/) { |
my ($cmd,$id,$reply)=split(/:/,$userinput); |
my ($cmd,$id,$reply)=split(/:/,$userinput); |
Line 1409 sub make_new_child {
|
Line 1377 sub make_new_child {
|
my $ulsout=''; |
my $ulsout=''; |
my $ulsfn; |
my $ulsfn; |
if (-e $ulsdir) { |
if (-e $ulsdir) { |
if (opendir(LSDIR,$ulsdir)) { |
if(-d $ulsdir) { |
while ($ulsfn=readdir(LSDIR)) { |
if (opendir(LSDIR,$ulsdir)) { |
my @ulsstats=stat($ulsdir.'/'.$ulsfn); |
while ($ulsfn=readdir(LSDIR)) { |
$ulsout.=$ulsfn.'&'.join('&',@ulsstats).':'; |
my @ulsstats=stat($ulsdir.'/'.$ulsfn); |
} |
$ulsout.=$ulsfn.'&'. |
closedir(LSDIR); |
join('&',@ulsstats).':'; |
} |
} |
} else { |
closedir(LSDIR); |
|
} |
|
} else { |
|
my @ulsstats=stat($ulsdir); |
|
$ulsout.=$ulsfn.'&'.join('&',@ulsstats).':'; |
|
} |
|
} else { |
$ulsout='no_such_dir'; |
$ulsout='no_such_dir'; |
} |
} |
if ($ulsout eq '') { $ulsout='empty'; } |
if ($ulsout eq '') { $ulsout='empty'; } |
Line 1500 sub GetAuthType
|
Line 1474 sub GetAuthType
|
my $domain = shift; |
my $domain = shift; |
my $user = shift; |
my $user = shift; |
|
|
|
Debug("GetAuthType( $domain, $user ) \n"); |
my $proname = &propath($domain, $user); |
my $proname = &propath($domain, $user); |
my $passwdfile = "$proname/passwd"; |
my $passwdfile = "$proname/passwd"; |
if( -e $passwdfile ) { |
if( -e $passwdfile ) { |
my $pf = IO::File->new($passwdfile); |
my $pf = IO::File->new($passwdfile); |
my $realpassword = <$pf>; |
my $realpassword = <$pf>; |
chomp($realpassword); |
chomp($realpassword); |
|
Debug("Password info = $realpassword\n"); |
my ($authtype, $contentpwd) = split(/:/, $realpassword); |
my ($authtype, $contentpwd) = split(/:/, $realpassword); |
|
Debug("Authtype = $authtype, content = $contentpwd\n"); |
my $availinfo = ''; |
my $availinfo = ''; |
if($authtype eq 'krb4') { |
if($authtype eq 'krb4') { |
$availinfo = $contentpwd; |
$availinfo = $contentpwd; |
} |
} |
|
|
return "$authtype:$availinfo"; |
return "$authtype:$availinfo"; |
} |
} |
else { |
else { |
|
Debug("Returning nouser"); |
return "nouser"; |
return "nouser"; |
} |
} |
|
|
} |
} |
|
|
|
sub addline { |
|
my ($fname,$hostid,$ip,$newline)=@_; |
|
my $contents; |
|
my $found=0; |
|
my $expr='^'.$hostid.':'.$ip.':'; |
|
$expr =~ s/\./\\\./g; |
|
if ($sh=IO::File->new("$fname.subscription")) { |
|
while (my $subline=<$sh>) { |
|
if ($subline !~ /$expr/) {$contents.= $subline;} else {$found=1;} |
|
} |
|
$sh->close(); |
|
} |
|
$sh=IO::File->new(">$fname.subscription"); |
|
if ($contents) { print $sh $contents; } |
|
if ($newline) { print $sh $newline; } |
|
$sh->close(); |
|
return $found; |
|
} |
|
|
|
sub unsub { |
|
my ($fname,$clientip)=@_; |
|
my $result; |
|
if (unlink("$fname.$hostid{$clientip}")) { |
|
$result="ok\n"; |
|
} else { |
|
$result="not_subscribed\n"; |
|
} |
|
if (-e "$fname.subscription") { |
|
my $found=&addline($fname,$hostid{$clientip},$clientip,''); |
|
if ($found) { $result="ok\n"; } |
|
} else { |
|
if ($result != "ok\n") { $result="not_subscribed\n"; } |
|
} |
|
return $result; |
|
} |
|
|
|
sub subscribe { |
|
my ($userinput,$clientip)=@_; |
|
my $result; |
|
my ($cmd,$fname)=split(/:/,$userinput); |
|
my $ownership=&ishome($fname); |
|
if ($ownership eq 'owner') { |
|
if (-e $fname) { |
|
if (-d $fname) { |
|
$result="directory\n"; |
|
} else { |
|
if (-e "$fname.$hostid{$clientip}") {&unsub($fname,$clientip);} |
|
$now=time; |
|
my $found=&addline($fname,$hostid{$clientip},$clientip, |
|
"$hostid{$clientip}:$clientip:$now\n"); |
|
if ($found) { $result="$fname\n"; } |
|
# if they were subscribed to only meta data, delete that |
|
# subscription, when you subscribe to a file you also get |
|
# the metadata |
|
unless ($fname=~/\.meta$/) { &unsub("$fname.meta",$clientip); } |
|
$fname=~s/\/home\/httpd\/html\/res/raw/; |
|
$fname="http://$thisserver/".$fname; |
|
$result="$fname\n"; |
|
} |
|
} else { |
|
$result="not_found\n"; |
|
} |
|
} else { |
|
$result="rejected\n"; |
|
} |
|
return $result; |
|
} |
# ----------------------------------- POD (plain old documentation, CPAN style) |
# ----------------------------------- POD (plain old documentation, CPAN style) |
|
|
=head1 NAME |
=head1 NAME |