version 1.1341, 2017/03/13 18:48:48
|
version 1.1348, 2017/08/08 15:33:13
|
Line 71 delayed.
|
Line 71 delayed.
|
package Apache::lonnet; |
package Apache::lonnet; |
|
|
use strict; |
use strict; |
use LWP::UserAgent(); |
|
use HTTP::Date; |
use HTTP::Date; |
use Image::Magick; |
use Image::Magick; |
|
|
Line 101 use LONCAPA qw(:DEFAULT :match);
|
Line 100 use LONCAPA qw(:DEFAULT :match);
|
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
use LONCAPA::lonmetadata; |
use LONCAPA::lonmetadata; |
use LONCAPA::Lond; |
use LONCAPA::Lond; |
|
use LONCAPA::LWPReq; |
|
|
use File::Copy; |
use File::Copy; |
|
|
Line 243 sub get_servercerts_info {
|
Line 243 sub get_servercerts_info {
|
if ($1 < 6) { |
if ($1 < 6) { |
$uselocal = 0; |
$uselocal = 0; |
} |
} |
|
} elsif ($distro =~ /^(?:sles)(\d+)$/) { |
|
if ($1 < 12) { |
|
$uselocal = 0; |
|
} |
} |
} |
} |
} |
if ($uselocal) { |
if ($uselocal) { |
Line 305 sub get_server_loncaparev {
|
Line 309 sub get_server_loncaparev {
|
$answer = &reply('serverloncaparev',$lonhost); |
$answer = &reply('serverloncaparev',$lonhost); |
if (($answer eq 'unknown_cmd') || ($answer eq 'con_lost')) { |
if (($answer eq 'unknown_cmd') || ($answer eq 'con_lost')) { |
if ($caller eq 'loncron') { |
if ($caller eq 'loncron') { |
my $ua=new LWP::UserAgent; |
|
$ua->timeout(4); |
|
my $protocol = $protocol{$lonhost}; |
my $protocol = $protocol{$lonhost}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
my $url = $protocol.'://'.&hostname($lonhost).'/adm/about.html'; |
my $url = $protocol.'://'.&hostname($lonhost).'/adm/about.html'; |
my $request=new HTTP::Request('GET',$url); |
my $request=new HTTP::Request('GET',$url); |
my $response=$ua->request($request); |
my $response=&LONCAPA::LWPReq::makerequest($lonhost,$request,'',\%perlvar,4,1); |
unless ($response->is_error()) { |
unless ($response->is_error()) { |
my $content = $response->content; |
my $content = $response->content; |
if ($content =~ /<p>VERSION\:\s*([\w.\-]+)<\/p>/) { |
if ($content =~ /<p>VERSION\:\s*([\w.\-]+)<\/p>/) { |
Line 1596 sub internet_dom_servers {
|
Line 1598 sub internet_dom_servers {
|
return %uniqservers; |
return %uniqservers; |
} |
} |
|
|
|
sub trusted_domains { |
|
my ($cmdtype,$calldom) = @_; |
|
my (%trusted,%untrusted); |
|
if (&domain($calldom) eq '') { |
|
return (\%trusted,\%untrusted); |
|
} |
|
unless ($cmdtype =~ /^(content|shared|enroll|coaurem|domroles|catalog|reqcrs|msg)$/) { |
|
return (\%trusted,\%untrusted); |
|
} |
|
my $callprimary = &domain($calldom,'primary'); |
|
my $intcalldom = &Apache::lonnet::internet_dom($callprimary); |
|
if ($intcalldom eq '') { |
|
return (\%trusted,\%untrusted); |
|
} |
|
|
|
my ($trustconfig,$cached)=&Apache::lonnet::is_cached_new('trust',$calldom); |
|
unless (defined($cached)) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['trust'],$calldom); |
|
&Apache::lonnet::do_cache_new('trust',$calldom,$domconfig{'trust'},3600); |
|
$trustconfig = $domconfig{'trust'}; |
|
} |
|
if (ref($trustconfig)) { |
|
my (%possexc,%possinc,@allexc,@allinc); |
|
if (ref($trustconfig->{$cmdtype}) eq 'HASH') { |
|
if (ref($trustconfig->{$cmdtype}->{'exc'}) eq 'ARRAY') { |
|
map { $possexc{$_} = 1; } @{$trustconfig->{$cmdtype}->{'exc'}}; |
|
} |
|
if (ref($trustconfig->{$cmdtype}->{'inc'}) eq 'ARRAY') { |
|
map { $possinc{$_} = 1; } @{$trustconfig->{$cmdtype}->{'inc'}}; |
|
} |
|
} |
|
if (keys(%possexc)) { |
|
if (keys(%possinc)) { |
|
foreach my $key (sort(keys(%possexc))) { |
|
next if ($key eq $intcalldom); |
|
unless ($possinc{$key}) { |
|
push(@allexc,$key); |
|
} |
|
} |
|
} else { |
|
@allexc = sort(keys(%possexc)); |
|
} |
|
} |
|
if (keys(%possinc)) { |
|
$possinc{$intcalldom} = 1; |
|
@allinc = sort(keys(%possinc)); |
|
} |
|
if ((@allexc > 0) || (@allinc > 0)) { |
|
my %doms_by_intdom; |
|
my %allintdoms = &all_host_intdom(); |
|
my %alldoms = &all_host_domain(); |
|
foreach my $key (%allintdoms) { |
|
if (ref($doms_by_intdom{$allintdoms{$key}}) eq 'ARRAY') { |
|
unless (grep(/^\Q$alldoms{$key}\E$/,@{$doms_by_intdom{$allintdoms{$key}}})) { |
|
push(@{$doms_by_intdom{$allintdoms{$key}}},$alldoms{$key}); |
|
} |
|
} else { |
|
$doms_by_intdom{$allintdoms{$key}} = [$alldoms{$key}]; |
|
} |
|
} |
|
foreach my $exc (@allexc) { |
|
if (ref($doms_by_intdom{$exc}) eq 'ARRAY') { |
|
map { $untrusted{$_}; } @{$doms_by_intdom{$exc}}; |
|
} |
|
} |
|
foreach my $inc (@allinc) { |
|
if (ref($doms_by_intdom{$inc}) eq 'ARRAY') { |
|
map { $trusted{$_}; } @{$doms_by_intdom{$inc}}; |
|
} |
|
} |
|
} |
|
} |
|
return(\%trusted,\%untrusted); |
|
} |
|
|
|
sub will_trust { |
|
my ($cmdtype,$domain,$possdom) = @_; |
|
return 1 if ($domain eq $possdom); |
|
my ($trustedref,$untrustedref) = &trusted_domains($cmdtype,$possdom); |
|
my $willtrust; |
|
if ((ref($trustedref) eq 'ARRAY') && (@{$trustedref} > 0)) { |
|
if (grep(/^\Q$domain\E$/,@{$trustedref})) { |
|
$willtrust = 1; |
|
} |
|
} elsif ((ref($untrustedref) eq 'ARRAY') && (@{$untrustedref} > 0)) { |
|
unless (grep(/^\Q$domain\E$/,@{$untrustedref})) { |
|
$willtrust = 1; |
|
} |
|
} else { |
|
$willtrust = 1; |
|
} |
|
return $willtrust; |
|
} |
|
|
# ---------------------- Find the homebase for a user from domain's lib servers |
# ---------------------- Find the homebase for a user from domain's lib servers |
|
|
my %homecache; |
my %homecache; |
Line 1845 sub get_dom {
|
Line 1941 sub get_dom {
|
} |
} |
} |
} |
if ($udom && $uhome && ($uhome ne 'no_host')) { |
if ($udom && $uhome && ($uhome ne 'no_host')) { |
my $rep=&reply("getdom:$udom:$namespace:$items",$uhome); |
my $rep; |
|
if ($namespace =~ /^enc/) { |
|
$rep=&reply("encrypt:egetdom:$udom:$namespace:$items",$uhome); |
|
} else { |
|
$rep=&reply("getdom:$udom:$namespace:$items",$uhome); |
|
} |
my %returnhash; |
my %returnhash; |
if ($rep eq '' || $rep =~ /^error: 2 /) { |
if ($rep eq '' || $rep =~ /^error: 2 /) { |
return %returnhash; |
return %returnhash; |
Line 1889 sub put_dom {
|
Line 1990 sub put_dom {
|
$items.=&escape($item).'='.&freeze_escape($$storehash{$item}).'&'; |
$items.=&escape($item).'='.&freeze_escape($$storehash{$item}).'&'; |
} |
} |
$items=~s/\&$//; |
$items=~s/\&$//; |
return &reply("putdom:$udom:$namespace:$items",$uhome); |
if ($namespace =~ /^enc/) { |
|
return &reply("encrypt:putdom:$udom:$namespace:$items",$uhome); |
|
} else { |
|
return &reply("putdom:$udom:$namespace:$items",$uhome); |
|
} |
} else { |
} else { |
&logthis("put_dom failed - no homeserver and/or domain"); |
&logthis("put_dom failed - no homeserver and/or domain"); |
} |
} |
Line 1986 sub inst_directory_query {
|
Line 2091 sub inst_directory_query {
|
&escape($srch->{'srchtype'}),$homeserver); |
&escape($srch->{'srchtype'}),$homeserver); |
my $host=&hostname($homeserver); |
my $host=&hostname($homeserver); |
if ($queryid !~/^\Q$host\E\_/) { |
if ($queryid !~/^\Q$host\E\_/) { |
&logthis('instituional directory search invalid queryid: '.$queryid.' for host: '.$homeserver.'in domain '.$udom); |
&logthis('institutional directory search invalid queryid: '.$queryid.' for host: '.$homeserver.' in domain '.$udom); |
return; |
return; |
} |
} |
my $response = &get_query_reply($queryid); |
my $response = &get_query_reply($queryid); |
Line 2944 sub repcopy {
|
Line 3049 sub repcopy {
|
mkdir($path,0777); |
mkdir($path,0777); |
} |
} |
} |
} |
my $ua=new LWP::UserAgent; |
|
my $request=new HTTP::Request('GET',"$remoteurl"); |
my $request=new HTTP::Request('GET',"$remoteurl"); |
my $response=$ua->request($request,$transname); |
my $response; |
|
if ($remoteurl =~ m{/raw/}) { |
|
$response=&LONCAPA::LWPReq::makerequest($home,$request,$transname,\%perlvar,'',0,1); |
|
} else { |
|
$response=&LONCAPA::LWPReq::makerequest($home,$request,$transname,\%perlvar,'',1); |
|
} |
if ($response->is_error()) { |
if ($response->is_error()) { |
unlink($transname); |
unlink($transname); |
my $message=$response->status_line; |
my $message=$response->status_line; |
Line 2956 sub repcopy {
|
Line 3065 sub repcopy {
|
} else { |
} else { |
if ($remoteurl!~/\.meta$/) { |
if ($remoteurl!~/\.meta$/) { |
my $mrequest=new HTTP::Request('GET',$remoteurl.'.meta'); |
my $mrequest=new HTTP::Request('GET',$remoteurl.'.meta'); |
my $mresponse=$ua->request($mrequest,$filename.'.meta'); |
my $mresponse; |
|
if ($remoteurl =~ m{/raw/}) { |
|
$mresponse = &LONCAPA::LWPReq::makerequest($home,$mrequest,$filename.'.meta',\%perlvar,'',0,1); |
|
} else { |
|
$mresponse = &LONCAPA::LWPReq::makerequest($home,$mrequest,$filename.'.meta',\%perlvar,'',1); |
|
} |
if ($mresponse->is_error()) { |
if ($mresponse->is_error()) { |
unlink($filename.'.meta'); |
unlink($filename.'.meta'); |
&logthis( |
&logthis( |
Line 3019 sub absolute_url {
|
Line 3133 sub absolute_url {
|
sub ssi { |
sub ssi { |
|
|
my ($fn,%form)=@_; |
my ($fn,%form)=@_; |
my $ua=new LWP::UserAgent; |
|
my $request; |
my $request; |
|
|
$form{'no_update_last_known'}=1; |
$form{'no_update_last_known'}=1; |
Line 3037 sub ssi {
|
Line 3150 sub ssi {
|
} |
} |
|
|
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
my $response= $ua->request($request); |
my $lonhost = $perlvar{'lonHostID'}; |
my $content = $response->content; |
my $response= &LONCAPA::LWPReq::makerequest($lonhost,$request,'',\%perlvar); |
|
|
|
|
if (wantarray) { |
if (wantarray) { |
return ($content, $response); |
return ($response->content, $response); |
} else { |
} else { |
return $content; |
return $response->content; |
} |
} |
} |
} |
|
|
sub externalssi { |
sub externalssi { |
my ($url)=@_; |
my ($url)=@_; |
my $ua=new LWP::UserAgent; |
|
my $request=new HTTP::Request('GET',$url); |
my $request=new HTTP::Request('GET',$url); |
my $response=$ua->request($request); |
my $response = &LONCAPA::LWPReq::makerequest('',$request,'',\%perlvar); |
if (wantarray) { |
if (wantarray) { |
return ($response->content, $response); |
return ($response->content, $response); |
} else { |
} else { |
Line 3198 sub can_edit_resource {
|
Line 3309 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
} elsif ($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/exttools?$}) { |
} elsif ($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/ext\.tool$}) { |
$incourse = 1; |
$incourse = 1; |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
$forceview = 1; |
$forceview = 1; |
Line 3230 sub can_edit_resource {
|
Line 3341 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
} elsif (($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/exttools?$}) && ($env{'form.folderpath'} =~ /^supplemental/)) { |
} elsif (($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/ext\.tool$}) && ($env{'form.folderpath'} =~ /^supplemental/)) { |
$incourse = 1; |
$incourse = 1; |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
$forceview = 1; |
$forceview = 1; |
Line 3248 sub can_edit_resource {
|
Line 3359 sub can_edit_resource {
|
} else { |
} else { |
$cfile = $env{'form.suppurl'}; |
$cfile = $env{'form.suppurl'}; |
my $escfile = &unescape($cfile); |
my $escfile = &unescape($cfile); |
if ($escfile =~ m{^/adm/$cdom/$cnum/\d+/exttools?$}) { |
if ($escfile =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) { |
$cfile = '/adm/wrapper'.$escfile; |
$cfile = '/adm/wrapper'.$escfile; |
} else { |
} else { |
$escfile =~ s{^http://}{}; |
$escfile =~ s{^http://}{}; |
Line 6039 sub role_status {
|
Line 6150 sub role_status {
|
my ($author,$adv,$rar)= &set_userprivs(\%userroles,\%allroles,\%allgroups, |
my ($author,$adv,$rar)= &set_userprivs(\%userroles,\%allroles,\%allgroups, |
\%groups_roles); |
\%groups_roles); |
&appenv(\%userroles,\@rolecodes); |
&appenv(\%userroles,\@rolecodes); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$role); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$spec); |
} |
} |
} |
} |
$$tstatus = 'is'; |
$$tstatus = 'is'; |
Line 6160 sub set_adhoc_privileges {
|
Line 6271 sub set_adhoc_privileges {
|
} |
} |
my ($author,$adv,$rar)= &set_userprivs(\%userroles,\%rolehash); |
my ($author,$adv,$rar)= &set_userprivs(\%userroles,\%rolehash); |
&appenv(\%userroles,[$role,'cm']); |
&appenv(\%userroles,[$role,'cm']); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$role); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$spec); |
unless ($caller eq 'constructaccess' && $env{'request.course.id'}) { |
unless ($caller eq 'constructaccess' && $env{'request.course.id'}) { |
&appenv( {'request.role' => $spec, |
&appenv( {'request.role' => $spec, |
'request.role.domain' => $dcdom, |
'request.role.domain' => $dcdom, |
Line 6314 sub currentdump {
|
Line 6425 sub currentdump {
|
# |
# |
my %returnhash=(); |
my %returnhash=(); |
# |
# |
if ($rep eq "unknown_cmd") { |
if ($rep eq 'unknown_cmd') { |
# an old lond will not know currentdump |
# an old lond will not know currentdump |
# Do a dump and make it look like a currentdump |
# Do a dump and make it look like a currentdump |
my @tmp = &dumpstore($courseid,$sdom,$sname,'.'); |
my @tmp = &dumpstore($courseid,$sdom,$sname,'.'); |
Line 7248 sub allowed {
|
Line 7359 sub allowed {
|
|
|
if (defined($env{'allowed.'.$priv})) { return $env{'allowed.'.$priv}; } |
if (defined($env{'allowed.'.$priv})) { return $env{'allowed.'.$priv}; } |
# Free bre access to adm and meta resources |
# Free bre access to adm and meta resources |
if (((($uri=~/^adm\//) && ($uri !~ m{/(?:smppg|bulletinboard)$})) |
if (((($uri=~/^adm\//) && ($uri !~ m{/(?:smppg|bulletinboard|ext\.tool)$})) |
|| (($uri=~/\.meta$/) && ($uri!~m|^uploaded/|) )) |
|| (($uri=~/\.meta$/) && ($uri!~m|^uploaded/|) )) |
&& ($priv eq 'bre')) { |
&& ($priv eq 'bre')) { |
return 'F'; |
return 'F'; |
Line 10956 sub get_domain_ltitools {
|
Line 11067 sub get_domain_ltitools {
|
my %domconfig = &get_dom('configuration',['ltitools'],$cdom); |
my %domconfig = &get_dom('configuration',['ltitools'],$cdom); |
if (ref($domconfig{'ltitools'}) eq 'HASH') { |
if (ref($domconfig{'ltitools'}) eq 'HASH') { |
%ltitools = %{$domconfig{'ltitools'}}; |
%ltitools = %{$domconfig{'ltitools'}}; |
|
my %encdomconfig = &get_dom('encconfig',['ltitools'],$cdom); |
|
if (ref($encdomconfig{'ltitools'}) eq 'HASH') { |
|
foreach my $id (keys(%ltitools)) { |
|
if (ref($encdomconfig{'ltitools'}{$id}) eq 'HASH') { |
|
foreach my $item ('key','secret') { |
|
$ltitools{$id}{$item} = $encdomconfig{'ltitools'}{$id}{$item}; |
|
} |
|
} |
|
} |
|
} |
} |
} |
my $cachetime = 24*60*60; |
my $cachetime = 24*60*60; |
&do_cache_new('ltitools',$cdom,\%ltitools,$cachetime); |
&do_cache_new('ltitools',$cdom,\%ltitools,$cachetime); |
Line 11465 sub metadata {
|
Line 11586 sub metadata {
|
# if it is a non metadata possible uri return quickly |
# if it is a non metadata possible uri return quickly |
if (($uri eq '') || |
if (($uri eq '') || |
(($uri =~ m|^/*adm/|) && |
(($uri =~ m|^/*adm/|) && |
($uri !~ m|^adm/includes|) && ($uri !~ m{/(smppg|bulletinboard|exttools?)$})) || |
($uri !~ m|^adm/includes|) && ($uri !~ m{/(smppg|bulletinboard|ext\.tool)$})) || |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
return undef; |
return undef; |
} |
} |
Line 12741 sub repcopy_userfile {
|
Line 12862 sub repcopy_userfile {
|
} |
} |
# now the path exists for sure |
# now the path exists for sure |
# get a user agent |
# get a user agent |
my $ua=new LWP::UserAgent; |
|
my $transferfile=$file.'.in.transfer'; |
my $transferfile=$file.'.in.transfer'; |
# FIXME: this should flock |
# FIXME: this should flock |
if (-e $transferfile) { return 'ok'; } |
if (-e $transferfile) { return 'ok'; } |
Line 12751 sub repcopy_userfile {
|
Line 12871 sub repcopy_userfile {
|
my $protocol = $protocol{$homeserver}; |
my $protocol = $protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
$request=new HTTP::Request('GET',$protocol.'://'.&hostname($homeserver).'/raw/'.$uri); |
$request=new HTTP::Request('GET',$protocol.'://'.&hostname($homeserver).'/raw/'.$uri); |
my $response=$ua->request($request,$transferfile); |
my $response = &LONCAPA::LWPReq::makerequest($homeserver,$request,$transferfile,\%perlvar,'',0,1); |
# did it work? |
# did it work? |
if ($response->is_error()) { |
if ($response->is_error()) { |
unlink($transferfile); |
unlink($transferfile); |
Line 12795 sub getuploaded {
|
Line 12915 sub getuploaded {
|
my $protocol = $protocol{$homeserver}; |
my $protocol = $protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
$uri = $protocol.'://'.&hostname($homeserver).'/raw/'.$uri; |
$uri = $protocol.'://'.&hostname($homeserver).'/raw/'.$uri; |
my $ua=new LWP::UserAgent; |
|
my $request=new HTTP::Request($reqtype,$uri); |
my $request=new HTTP::Request($reqtype,$uri); |
my $response=$ua->request($request); |
my $response=&LONCAPA::LWPReq::makerequest($homeserver,$request,'',\%perlvar,'',0,1); |
$$rtncode = $response->code; |
$$rtncode = $response->code; |
if (! $response->is_success()) { |
if (! $response->is_success()) { |
return 'failed'; |
return 'failed'; |
Line 12998 sub clutter {
|
Line 13117 sub clutter {
|
# &logthis("Got a blank emb style"); |
# &logthis("Got a blank emb style"); |
} |
} |
} |
} |
} elsif ($thisfn =~ m{^/adm/$match_domain/$match_courseid/\d+/exttools?$}) { |
} elsif ($thisfn =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) { |
$thisfn='/adm/wrapper'.$thisfn; |
$thisfn='/adm/wrapper'.$thisfn; |
} |
} |
return $thisfn; |
return $thisfn; |
Line 13085 sub get_dns {
|
Line 13204 sub get_dns {
|
} |
} |
while (%alldns) { |
while (%alldns) { |
my ($dns) = sort { $b cmp $a } keys(%alldns); |
my ($dns) = sort { $b cmp $a } keys(%alldns); |
my $ua=new LWP::UserAgent; |
|
$ua->timeout(30); |
|
my $request=new HTTP::Request('GET',"$alldns{$dns}://$dns$url"); |
my $request=new HTTP::Request('GET',"$alldns{$dns}://$dns$url"); |
my $response=$ua->request($request); |
my $response = &LONCAPA::LWPReq::makerequest('',$request,'',\%perlvar,30,0); |
delete($alldns{$dns}); |
delete($alldns{$dns}); |
next if ($response->is_error()); |
next if ($response->is_error()); |
my @content = split("\n",$response->content); |
my @content = split("\n",$response->content); |