version 1.1172.2.112, 2019/08/19 17:57:03
|
version 1.1172.2.126, 2020/09/28 13:56:29
|
Line 78 use CGI::Cookie;
|
Line 78 use CGI::Cookie;
|
|
|
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir $deftex |
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir $deftex |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease |
%managerstab); |
%managerstab $passwdmin); |
|
|
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
Line 263 sub get_server_loncaparev {
|
Line 263 sub get_server_loncaparev {
|
if ($caller eq 'loncron') { |
if ($caller eq 'loncron') { |
my $ua=new LWP::UserAgent; |
my $ua=new LWP::UserAgent; |
$ua->timeout(4); |
$ua->timeout(4); |
|
my $hostname = &hostname($lonhost); |
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.'/adm/about.html'; |
my $request=new HTTP::Request('GET',$url); |
my $request=new HTTP::Request('GET',$url); |
my $response=$ua->request($request); |
my $response=$ua->request($request); |
unless ($response->is_error()) { |
unless ($response->is_error()) { |
Line 953 sub spareserver {
|
Line 954 sub spareserver {
|
} |
} |
|
|
if (!$want_server_name) { |
if (!$want_server_name) { |
my $protocol = 'http'; |
|
if ($protocol{$spare_server} eq 'https') { |
|
$protocol = $protocol{$spare_server}; |
|
} |
|
if (defined($spare_server)) { |
if (defined($spare_server)) { |
my $hostname = &hostname($spare_server); |
my $hostname = &hostname($spare_server); |
if (defined($hostname)) { |
if (defined($hostname)) { |
|
my $protocol = 'http'; |
|
if ($protocol{$spare_server} eq 'https') { |
|
$protocol = $protocol{$spare_server}; |
|
} |
$spare_server = $protocol.'://'.$hostname; |
$spare_server = $protocol.'://'.$hostname; |
} |
} |
} |
} |
Line 1161 sub choose_server {
|
Line 1162 sub choose_server {
|
return ($login_host,$hostname,$portal_path,$isredirect,$lowest_load); |
return ($login_host,$hostname,$portal_path,$isredirect,$lowest_load); |
} |
} |
|
|
|
sub get_course_sessions { |
|
my ($cnum,$cdom,$lastactivity) = @_; |
|
my %servers = &internet_dom_servers($cdom); |
|
my %returnhash; |
|
foreach my $server (sort(keys(%servers))) { |
|
my $rep = &reply("coursesessions:$cdom:$cnum:$lastactivity",$server); |
|
my @pairs=split(/\&/,$rep); |
|
unless (($rep eq 'unknown_cmd') || ($rep =~ /^error/)) { |
|
foreach my $item (@pairs) { |
|
my ($key,$value)=split(/=/,$item,2); |
|
$key = &unescape($key); |
|
next if ($key =~ /^error: 2 /); |
|
if (exists($returnhash{$key})) { |
|
next if ($value < $returnhash{$key}); |
|
} |
|
$returnhash{$key}=$value; |
|
} |
|
} |
|
} |
|
return %returnhash; |
|
} |
|
|
# --------------------------------------------- Try to change a user's password |
# --------------------------------------------- Try to change a user's password |
|
|
sub changepass { |
sub changepass { |
Line 1196 sub changepass {
|
Line 1219 sub changepass {
|
} elsif ($answer =~ "invalid_client") { |
} elsif ($answer =~ "invalid_client") { |
&logthis("$server refused to change $uname in $udom password because ". |
&logthis("$server refused to change $uname in $udom password because ". |
"it was a reset by e-mail originating from an invalid server."); |
"it was a reset by e-mail originating from an invalid server."); |
|
} elsif ($answer =~ "^prioruse") { |
|
&logthis("$server refused to change $uname in $udom password because ". |
|
"the password had been used before"); |
} |
} |
return $answer; |
return $answer; |
} |
} |
Line 1982 sub inst_directory_query {
|
Line 2008 sub inst_directory_query {
|
my $homeserver = &domain($udom,'primary'); |
my $homeserver = &domain($udom,'primary'); |
my $outcome; |
my $outcome; |
if ($homeserver ne '') { |
if ($homeserver ne '') { |
|
unless ($homeserver eq $perlvar{'lonHostID'}) { |
|
if ($srch->{'srchby'} eq 'email') { |
|
my $lcrev = &get_server_loncaparev($udom,$homeserver); |
|
my ($major,$minor,$subver) = ($lcrev =~ /^\'?(\d+)\.(\d+)\.(\d+)[\w.\-]+\'?$/); |
|
if (($major eq '' && $minor eq '') || ($major < 2) || |
|
(($major == 2) && ($minor < 11)) || |
|
(($major == 2) && ($minor == 11) && ($subver < 3))) { |
|
return; |
|
} |
|
} |
|
} |
my $queryid=&reply("querysend:instdirsearch:". |
my $queryid=&reply("querysend:instdirsearch:". |
&escape($srch->{'srchby'}).':'. |
&escape($srch->{'srchby'}).':'. |
&escape($srch->{'srchterm'}).':'. |
&escape($srch->{'srchterm'}).':'. |
Line 2023 sub usersearch {
|
Line 2060 sub usersearch {
|
my $query = 'usersearch'; |
my $query = 'usersearch'; |
foreach my $tryserver (keys(%libserv)) { |
foreach my $tryserver (keys(%libserv)) { |
if (&host_domain($tryserver) eq $dom) { |
if (&host_domain($tryserver) eq $dom) { |
|
unless ($tryserver eq $perlvar{'lonHostID'}) { |
|
if ($srch->{'srchby'} eq 'email') { |
|
my $lcrev = &get_server_loncaparev($dom,$tryserver); |
|
my ($major,$minor,$subver) = ($lcrev =~ /^\'?(\d+)\.(\d+)\.(\d+)[\w.\-]+\'?$/); |
|
next if (($major eq '' && $minor eq '') || ($major < 2) || |
|
(($major == 2) && ($minor < 11)) || |
|
(($major == 2) && ($minor == 11) && ($subver < 3))); |
|
} |
|
} |
my $host=&hostname($tryserver); |
my $host=&hostname($tryserver); |
my $queryid= |
my $queryid= |
&reply("querysend:".&escape($query).':'. |
&reply("querysend:".&escape($query).':'. |
Line 2465 sub retrieve_instcodes {
|
Line 2511 sub retrieve_instcodes {
|
return $totcodes; |
return $totcodes; |
} |
} |
|
|
|
# --------------------------------------------- Get domain config for passwords |
|
|
|
sub get_passwdconf { |
|
my ($dom) = @_; |
|
my (%passwdconf,$gotconf,$lookup); |
|
my ($result,$cached)=&is_cached_new('passwdconf',$dom); |
|
if (defined($cached)) { |
|
if (ref($result) eq 'HASH') { |
|
%passwdconf = %{$result}; |
|
$gotconf = 1; |
|
} |
|
} |
|
unless ($gotconf) { |
|
my %domconfig = &get_dom('configuration',['passwords'],$dom); |
|
if (ref($domconfig{'passwords'}) eq 'HASH') { |
|
%passwdconf = %{$domconfig{'passwords'}}; |
|
} |
|
my $cachetime = 24*60*60; |
|
&do_cache_new('passwdconf',$dom,\%passwdconf,$cachetime); |
|
} |
|
return %passwdconf; |
|
} |
|
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
Line 3000 sub repcopy {
|
Line 3069 sub repcopy {
|
} |
} |
} |
} |
|
|
|
# ------------------------------------------------- Unsubscribe from a resource |
|
|
|
sub unsubscribe { |
|
my ($fname) = @_; |
|
my $answer; |
|
if ($fname=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) { return $answer; } |
|
$fname=~s/[\n\r]//g; |
|
my $author=$fname; |
|
$author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/; |
|
my ($udom,$uname)=split(/\//,$author); |
|
my $home=homeserver($uname,$udom); |
|
if ($home eq 'no_host') { |
|
$answer = 'no_host'; |
|
} elsif (grep { $_ eq $home } ¤t_machine_ids()) { |
|
$answer = 'home'; |
|
} else { |
|
$answer = reply("unsub:$fname",$home); |
|
} |
|
return $answer; |
|
} |
|
|
# ------------------------------------------------ Get server side include body |
# ------------------------------------------------ Get server side include body |
sub ssi_body { |
sub ssi_body { |
my ($filelink,%form)=@_; |
my ($filelink,%form)=@_; |
Line 3126 sub remove_stale_resfile {
|
Line 3216 sub remove_stale_resfile {
|
(grep { $_ eq $homeserver } ¤t_machine_ids())) { |
(grep { $_ eq $homeserver } ¤t_machine_ids())) { |
my $fname = &filelocation('',$url); |
my $fname = &filelocation('',$url); |
if (-e $fname) { |
if (-e $fname) { |
my $ua=new LWP::UserAgent; |
|
$ua->timeout(5); |
|
my $protocol = $protocol{$homeserver}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
my $hostname = &hostname($homeserver); |
my $hostname = &hostname($homeserver); |
if ($hostname) { |
if ($hostname) { |
|
my $protocol = $protocol{$homeserver}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
my $uri = $protocol.'://'.$hostname.'/raw/'.&declutter($url); |
my $uri = $protocol.'://'.$hostname.'/raw/'.&declutter($url); |
|
my $ua=new LWP::UserAgent; |
|
$ua->timeout(5); |
my $request=new HTTP::Request('HEAD',$uri); |
my $request=new HTTP::Request('HEAD',$uri); |
my $response=$ua->request($request); |
my $response=$ua->request($request); |
if ($response->is_success()) { |
if ($response->is_success()) { |
Line 3158 sub remove_stale_resfile {
|
Line 3248 sub remove_stale_resfile {
|
$stale = 1; |
$stale = 1; |
} |
} |
if ($stale) { |
if ($stale) { |
unlink($fname); |
if (unlink($fname)) { |
if ($uri!~/\.meta$/) { |
if ($uri!~/\.meta$/) { |
unlink($fname.'.meta'); |
if (-e $fname.'.meta') { |
|
unlink($fname.'.meta'); |
|
} |
|
} |
|
my $unsubresult = &unsubscribe($fname); |
|
unless ($unsubresult eq 'ok') { |
|
&logthis("no unsub of $fname from $homeserver, reason: $unsubresult"); |
|
} |
|
$removed = 1; |
} |
} |
&reply("unsub:$fname",$homeserver); |
|
$removed = 1; |
|
} |
} |
} |
} |
} |
} |
Line 3313 sub can_edit_resource {
|
Line 3409 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
|
} elsif (($resurl =~ m{^/ext/}) && ($symb ne '')) { |
|
my ($map,$id,$res) = &decode_symb($symb); |
|
if ($map =~ /\.page$/) { |
|
$incourse = 1; |
|
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
$cfile = $map; |
|
} else { |
|
$forceedit = 1; |
|
$cfile = '/adm/wrapper'.$resurl; |
|
} |
|
} |
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
$incourse = 1; |
$incourse = 1; |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
Line 3330 sub can_edit_resource {
|
Line 3438 sub can_edit_resource {
|
$cfile = $template; |
$cfile = $template; |
} |
} |
} elsif (($resurl =~ m{^/adm/wrapper/ext/}) && ($env{'form.folderpath'} =~ /^supplemental/)) { |
} elsif (($resurl =~ m{^/adm/wrapper/ext/}) && ($env{'form.folderpath'} =~ /^supplemental/)) { |
$incourse = 1; |
$incourse = 1; |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
$forceview = 1; |
$forceview = 1; |
} else { |
} else { |
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
} elsif (($resurl eq '/adm/extresedit') && ($symb || $env{'form.folderpath'})) { |
} elsif (($resurl eq '/adm/extresedit') && ($symb || $env{'form.folderpath'})) { |
$incourse = 1; |
$incourse = 1; |
$forceview = 1; |
$forceview = 1; |
Line 7676 sub customaccess {
|
Line 7784 sub customaccess {
|
# ------------------------------------------------- Check for a user privilege |
# ------------------------------------------------- Check for a user privilege |
|
|
sub allowed { |
sub allowed { |
my ($priv,$uri,$symb,$role,$clientip,$noblockcheck)=@_; |
my ($priv,$uri,$symb,$role,$clientip,$noblockcheck,$ignorecache)=@_; |
my $ver_orguri=$uri; |
my $ver_orguri=$uri; |
$uri=&deversion($uri); |
$uri=&deversion($uri); |
my $orguri=$uri; |
my $orguri=$uri; |
Line 7858 sub allowed {
|
Line 7966 sub allowed {
|
|
|
if ($env{'user.priv.'.$env{'request.role'}.'.'.$courseuri} |
if ($env{'user.priv.'.$env{'request.role'}.'.'.$courseuri} |
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
unless (($priv eq 'bro') && (!$ownaccess)) { |
if ($priv eq 'mip') { |
$thisallowed.=$1; |
my $rem = $1; |
|
if (($uri ne '') && ($env{'request.course.id'} eq $uri) && |
|
($env{'course.'.$env{'request.course.id'}.'.internal.courseowner'} eq $env{'user.name'}.':'.$env{'user.domain'})) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
if ($cdom ne '') { |
|
my %passwdconf = &get_passwdconf($cdom); |
|
if (ref($passwdconf{'crsownerchg'}) eq 'HASH') { |
|
if (ref($passwdconf{'crsownerchg'}{'by'}) eq 'ARRAY') { |
|
if (@{$passwdconf{'crsownerchg'}{'by'}}) { |
|
my @inststatuses = split(':',$env{'environment.inststatus'}); |
|
unless (@inststatuses) { |
|
@inststatuses = ('default'); |
|
} |
|
foreach my $status (@inststatuses) { |
|
if (grep(/^\Q$status\E$/,@{$passwdconf{'crsownerchg'}{'by'}})) { |
|
$thisallowed.=$rem; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
unless (($priv eq 'bro') && (!$ownaccess)) { |
|
$thisallowed.=$1; |
|
} |
} |
} |
} |
} |
|
|
Line 7875 sub allowed {
|
Line 8009 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed.=$value; |
$thisallowed.=$value; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 7895 sub allowed {
|
Line 8029 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed='F'; |
$thisallowed='F'; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
my @blockers = &has_comm_blocking($priv,$symb,$refuri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 7942 sub allowed {
|
Line 8076 sub allowed {
|
|
|
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
|
|
|
# If this is modifying password (internal auth) domains must match for user and user's role. |
|
|
|
if ($priv eq 'mip') { |
|
if ($env{'user.domain'} eq $env{'request.role.domain'}) { |
|
return $thisallowed; |
|
} else { |
|
return ''; |
|
} |
|
} |
|
|
$courseprivid=$env{'request.course.id'}; |
$courseprivid=$env{'request.course.id'}; |
if ($env{'request.course.sec'}) { |
if ($env{'request.course.sec'}) { |
$courseprivid.='/'.$env{'request.course.sec'}; |
$courseprivid.='/'.$env{'request.course.sec'}; |
Line 7958 sub allowed {
|
Line 8102 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed.=$value; |
$thisallowed.=$value; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 7971 sub allowed {
|
Line 8115 sub allowed {
|
$checkreferer=0; |
$checkreferer=0; |
} |
} |
} |
} |
|
|
if ($checkreferer) { |
if ($checkreferer) { |
my $refuri=$env{'httpref.'.$orguri}; |
my $refuri=$env{'httpref.'.$orguri}; |
unless ($refuri) { |
unless ($refuri) { |
Line 8000 sub allowed {
|
Line 8144 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed.=$value; |
$thisallowed.=$value; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
my @blockers = &has_comm_blocking($priv,'',$refuri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 8086 sub allowed {
|
Line 8230 sub allowed {
|
} |
} |
} |
} |
} |
} |
|
|
# |
# |
# Rest of the restrictions depend on selected course |
# Rest of the restrictions depend on selected course |
# |
# |
Line 8244 sub constructaccess {
|
Line 8388 sub constructaccess {
|
# |
# |
# User for whom data are being temporarily cached. |
# User for whom data are being temporarily cached. |
my $cacheduser=''; |
my $cacheduser=''; |
|
# Course for which data are being temporarily cached. |
|
my $cachedcid=''; |
|
# List of blocks passed to &get_commblock_resources(); |
|
my $cachedblocks=''; |
# Cached blockers for this user (a hash of blocking items). |
# Cached blockers for this user (a hash of blocking items). |
my %cachedblockers=(); |
my %cachedblockers=(); |
# When the data were last cached. |
# When the data were last cached. |
Line 8253 sub load_all_blockers {
|
Line 8401 sub load_all_blockers {
|
my ($uname,$udom,$blocks)=@_; |
my ($uname,$udom,$blocks)=@_; |
if (($uname ne '') && ($udom ne '')) { |
if (($uname ne '') && ($udom ne '')) { |
if (($cacheduser eq $uname.':'.$udom) && |
if (($cacheduser eq $uname.':'.$udom) && |
(abs($cachedlast-time)<5)) { |
($cachedcid eq $env{'request.course.id'}) && |
|
(abs($cachedlast-time)<5) && |
|
(((ref($blocks) eq 'HASH') && |
|
($cachedblocks eq join(',',sort(keys(%{$blocks}))))) || |
|
(!ref($blocks) && $cachedblocks eq ''))) { |
return; |
return; |
} |
} |
} |
} |
$cachedlast=time; |
$cachedlast=time; |
$cacheduser=$uname.':'.$udom; |
$cacheduser=$uname.':'.$udom; |
|
$cachedcid=$env{'request.course.id'}; |
%cachedblockers = &get_commblock_resources($blocks); |
%cachedblockers = &get_commblock_resources($blocks); |
|
if ((ref($blocks) eq 'HASH') && (keys(%{$blocks}) > 0)) { |
|
$cachedblocks = join(',',sort(keys(%{$blocks}))); |
|
} |
|
return; |
} |
} |
|
|
sub get_comm_blocks { |
sub get_comm_blocks { |
Line 8396 sub get_commblock_resources {
|
Line 8553 sub get_commblock_resources {
|
} |
} |
|
|
sub has_comm_blocking { |
sub has_comm_blocking { |
my ($priv,$symb,$uri,$blocks) = @_; |
my ($priv,$symb,$uri,$nosymbcache,$blocked,$blocks) = @_; |
my @blockers; |
my @blockers; |
return unless ($env{'request.course.id'}); |
return unless ($env{'request.course.id'}); |
return unless ($priv eq 'bre'); |
return unless ($priv eq 'bre'); |
Line 8406 sub has_comm_blocking {
|
Line 8563 sub has_comm_blocking {
|
return unless (keys(%cachedblockers) > 0); |
return unless (keys(%cachedblockers) > 0); |
my (%possibles,@symbs); |
my (%possibles,@symbs); |
if (!$symb) { |
if (!$symb) { |
$symb = &symbread($uri,1,1,1,\%possibles); |
$symb = &symbread($uri,1,1,'',\%possibles,$nosymbcache); |
} |
} |
if ($symb) { |
if ($symb) { |
@symbs = ($symb); |
@symbs = ($symb); |
Line 8420 sub has_comm_blocking {
|
Line 8577 sub has_comm_blocking {
|
foreach my $block (keys(%cachedblockers)) { |
foreach my $block (keys(%cachedblockers)) { |
if ($block =~ /^firstaccess____(.+)$/) { |
if ($block =~ /^firstaccess____(.+)$/) { |
my $item = $1; |
my $item = $1; |
if (($item eq $map) || ($item eq $symb)) { |
unless ($blocked) { |
$noblock = 1; |
if (($item eq $map) || ($item eq $symb)) { |
last; |
$noblock = 1; |
|
last; |
|
} |
} |
} |
} |
} |
if (ref($cachedblockers{$block}) eq 'HASH') { |
if (ref($cachedblockers{$block}) eq 'HASH') { |
Line 8433 sub has_comm_blocking {
|
Line 8592 sub has_comm_blocking {
|
} |
} |
} |
} |
} |
} |
} |
if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') { |
if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') { |
if ($cachedblockers{$block}{'maps'}{$map}) { |
if ($cachedblockers{$block}{'maps'}{$map}) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
push(@blockers,$block); |
push(@blockers,$block); |
} |
} |
} |
} |
} |
} |
} |
} |
} |
} |
} |
return if ($noblock); |
unless ($noblock) { |
return @blockers; |
return @blockers; |
|
} |
|
return; |
} |
} |
} |
} |
|
|
Line 9738 sub store_coowners {
|
Line 9899 sub store_coowners {
|
sub modifyuserauth { |
sub modifyuserauth { |
my ($udom,$uname,$umode,$upass)=@_; |
my ($udom,$uname,$umode,$upass)=@_; |
my $uhome=&homeserver($uname,$udom); |
my $uhome=&homeserver($uname,$udom); |
unless (&allowed('mau',$udom)) { return 'refused'; } |
my $allowed; |
|
if (&allowed('mau',$udom)) { |
|
$allowed = 1; |
|
} elsif (($umode eq 'internal') && ($udom eq $env{'user.domain'}) && |
|
($env{'request.course.id'}) && (&allowed('mip',$env{'request.course.id'})) && |
|
(!$env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'})) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if (($cdom ne '') && ($cnum ne '')) { |
|
my $is_owner = &is_course_owner($cdom,$cnum); |
|
if ($is_owner) { |
|
$allowed = 1; |
|
} |
|
} |
|
} |
|
unless ($allowed) { return 'refused'; } |
&logthis('Call to modify user authentication '.$udom.', '.$uname.', '. |
&logthis('Call to modify user authentication '.$udom.', '.$uname.', '. |
$umode.' by '.$env{'user.name'}.' at '.$env{'user.domain'}. |
$umode.' by '.$env{'user.name'}.' at '.$env{'user.domain'}. |
' in domain '.$env{'request.role.domain'}); |
' in domain '.$env{'request.role.domain'}); |
Line 12159 sub symbverify {
|
Line 12335 sub symbverify {
|
|
|
if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', |
&GDBM_READER(),0640)) { |
&GDBM_READER(),0640)) { |
my $noclutter; |
|
if (($thisurl =~ m{^/adm/wrapper/ext/}) || ($thisurl =~ m{^ext/})) { |
if (($thisurl =~ m{^/adm/wrapper/ext/}) || ($thisurl =~ m{^ext/})) { |
$thisurl =~ s/\?.+$//; |
$thisurl =~ s/\?.+$//; |
if ($map =~ m{^uploaded/.+\.page$}) { |
if ($map =~ m{^uploaded/.+\.page$}) { |
$thisurl =~ s{^(/adm/wrapper|)/ext/}{http://}; |
$thisurl =~ s{^(/adm/wrapper|)/ext/}{http://}; |
$thisurl =~ s{^\Qhttp://https://\E}{https://}; |
$thisurl =~ s{^\Qhttp://https://\E}{https://}; |
$noclutter = 1; |
|
} |
} |
} |
} |
my $ids; |
my $ids; |
if ($noclutter) { |
if ($map =~ m{^uploaded/.+\.page$}) { |
$ids=$bighash{'ids_'.$thisurl}; |
$ids=$bighash{'ids_'.&clutter_with_no_wrapper($thisurl)}; |
} else { |
} else { |
$ids=$bighash{'ids_'.&clutter($thisurl)}; |
$ids=$bighash{'ids_'.&clutter($thisurl)}; |
} |
} |
Line 12270 sub deversion {
|
Line 12444 sub deversion {
|
# ------------------------------------------------------ Return symb list entry |
# ------------------------------------------------------ Return symb list entry |
|
|
sub symbread { |
sub symbread { |
my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles)=@_; |
my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles, |
|
$nocache)=@_; |
my $cache_str='request.symbread.cached.'.$thisfn; |
my $cache_str='request.symbread.cached.'.$thisfn; |
if (defined($env{$cache_str})) { |
if (defined($env{$cache_str}) && !$nocache) { |
if ($ignorecachednull) { |
unless (ref($possibles) eq 'HASH') { |
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
if ($ignorecachednull) { |
} else { |
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
return $env{$cache_str}; |
} else { |
|
return $env{$cache_str}; |
|
} |
} |
} |
} |
} |
# no filename provided? try from environment |
# no filename provided? try from environment |
unless ($thisfn) { |
unless ($thisfn) { |
if ($env{'request.symb'}) { |
if ($env{'request.symb'}) { |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
if ($nocache) { |
|
return &symbclean($env{'request.symb'}); |
|
} else { |
|
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
|
} |
} |
} |
$thisfn=$env{'request.filename'}; |
$thisfn=$env{'request.filename'}; |
} |
} |
Line 12290 sub symbread {
|
Line 12471 sub symbread {
|
# is that filename actually a symb? Verify, clean, and return |
# is that filename actually a symb? Verify, clean, and return |
if ($thisfn=~/\_\_\_\d+\_\_\_(.*)$/) { |
if ($thisfn=~/\_\_\_\d+\_\_\_(.*)$/) { |
if (&symbverify($thisfn,$1)) { |
if (&symbverify($thisfn,$1)) { |
return $env{$cache_str}=&symbclean($thisfn); |
if ($nocache) { |
|
return &symbclean($thisfn); |
|
} else { |
|
return $env{$cache_str}=&symbclean($thisfn); |
|
} |
} |
} |
} |
} |
$thisfn=declutter($thisfn); |
$thisfn=declutter($thisfn); |
Line 12305 sub symbread {
|
Line 12490 sub symbread {
|
if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) { |
if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) { |
$targetfn=$1; |
$targetfn=$1; |
} |
} |
if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', |
unless ($nocache) { |
&GDBM_READER(),0640)) { |
if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', |
$syval=$hash{$targetfn}; |
&GDBM_READER(),0640)) { |
untie(%hash); |
$syval=$hash{$targetfn}; |
|
untie(%hash); |
|
} |
|
if ($syval) { |
|
my @blockers = &has_comm_blocking('bre',$syval,$thisfn,$nocache); |
|
if (@blockers) { |
|
$syval=''; |
|
} |
|
} |
} |
} |
# ---------------------------------------------------------- There was an entry |
# ---------------------------------------------------------- There was an entry |
if ($syval) { |
if ($syval) { |
Line 12341 sub symbread {
|
Line 12534 sub symbread {
|
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$resid,$thisfn); |
$resid,$thisfn); |
if (ref($possibles) eq 'HASH') { |
if (ref($possibles) eq 'HASH') { |
$possibles->{$syval} = 1; |
unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) { |
|
$possibles->{$syval} = 1; |
|
} |
} |
} |
if ($checkforblock) { |
if ($checkforblock) { |
my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids}); |
unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) { |
if (@blockers) { |
my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids}); |
$syval = ''; |
if (@blockers) { |
return; |
$syval = ''; |
|
untie(%bighash); |
|
return '' if ($nocache); |
|
return $env{$cache_str}=''; |
|
} |
} |
} |
} |
} |
} elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
} elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
Line 12366 sub symbread {
|
Line 12565 sub symbread {
|
if ($bighash{'map_type_'.$mapid} ne 'page') { |
if ($bighash{'map_type_'.$mapid} ne 'page') { |
my $poss_syval=&encode_symb($bighash{'map_id_'.$mapid}, |
my $poss_syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$resid,$thisfn); |
$resid,$thisfn); |
if (ref($possibles) eq 'HASH') { |
next if ($bighash{'randomout_'.$id} && !$env{'request.role.adv'}); |
$possibles->{$syval} = 1; |
next unless ($bighash{'encrypted_'.$id} eq $env{'request.enc'}); |
} |
|
if ($checkforblock) { |
if ($checkforblock) { |
my @blockers = &has_comm_blocking('bre',$poss_syval,$file); |
my @blockers = &has_comm_blocking('bre',$poss_syval,$file); |
unless (@blockers > 0) { |
if (@blockers > 0) { |
|
$syval = ''; |
|
} else { |
$syval = $poss_syval; |
$syval = $poss_syval; |
$realpossible++; |
$realpossible++; |
} |
} |
Line 12379 sub symbread {
|
Line 12579 sub symbread {
|
$syval = $poss_syval; |
$syval = $poss_syval; |
$realpossible++; |
$realpossible++; |
} |
} |
|
if ($syval) { |
|
if (ref($possibles) eq 'HASH') { |
|
$possibles->{$syval} = 1; |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
Line 12391 sub symbread {
|
Line 12596 sub symbread {
|
} |
} |
} |
} |
if ($syval) { |
if ($syval) { |
return $env{$cache_str}=$syval; |
if ($nocache) { |
|
return $syval; |
|
} else { |
|
return $env{$cache_str}=$syval; |
|
} |
} |
} |
} |
} |
&appenv({'request.ambiguous' => $thisfn}); |
&appenv({'request.ambiguous' => $thisfn}); |
|
return '' if ($nocache); |
return $env{$cache_str}=''; |
return $env{$cache_str}=''; |
} |
} |
|
|
Line 12916 sub repcopy_userfile {
|
Line 13126 sub repcopy_userfile {
|
my $request; |
my $request; |
$uri=~s/^\///; |
$uri=~s/^\///; |
my $homeserver = &homeserver($cnum,$cdom); |
my $homeserver = &homeserver($cnum,$cdom); |
|
my $hostname = &hostname($homeserver); |
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.'/raw/'.$uri); |
my $response=$ua->request($request,$transferfile); |
my $response=$ua->request($request,$transferfile); |
# did it work? |
# did it work? |
if ($response->is_error()) { |
if ($response->is_error()) { |
Line 12942 sub tokenwrapper {
|
Line 13153 sub tokenwrapper {
|
$file=~s|(\?\.*)*$||; |
$file=~s|(\?\.*)*$||; |
&appenv({"userfile.$udom/$uname/$file" => $env{'request.course.id'}}); |
&appenv({"userfile.$udom/$uname/$file" => $env{'request.course.id'}}); |
my $homeserver = &homeserver($uname,$udom); |
my $homeserver = &homeserver($uname,$udom); |
|
my $hostname = &hostname($homeserver); |
my $protocol = $protocol{$homeserver}; |
my $protocol = $protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
return $protocol.'://'.&hostname($homeserver).'/'.$uri. |
return $protocol.'://'.$hostname.'/'.$uri. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
'&tokenissued='.$perlvar{'lonHostID'}; |
'&tokenissued='.$perlvar{'lonHostID'}; |
} else { |
} else { |
Line 12960 sub getuploaded {
|
Line 13172 sub getuploaded {
|
my ($reqtype,$uri,$cdom,$cnum,$info,$rtncode) = @_; |
my ($reqtype,$uri,$cdom,$cnum,$info,$rtncode) = @_; |
$uri=~s/^\///; |
$uri=~s/^\///; |
my $homeserver = &homeserver($cnum,$cdom); |
my $homeserver = &homeserver($cnum,$cdom); |
|
my $hostname = &hostname($homeserver); |
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.'/raw/'.$uri; |
my $ua=new LWP::UserAgent; |
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=$ua->request($request); |
Line 13137 sub shared_institution {
|
Line 13350 sub shared_institution {
|
return $same_intdom; |
return $same_intdom; |
} |
} |
|
|
|
sub uses_sts { |
|
my ($ignore_cache) = @_; |
|
my $lonhost = $perlvar{'lonHostID'}; |
|
my $hostname = &hostname($lonhost); |
|
my $sts_on; |
|
if ($protocol{$lonhost} eq 'https') { |
|
my $cachetime = 12*3600; |
|
if (!$ignore_cache) { |
|
($sts_on,my $cached)=&is_cached_new('stspolicy',$lonhost); |
|
if (defined($cached)) { |
|
return $sts_on; |
|
} |
|
} |
|
my $ua=new LWP::UserAgent; |
|
my $url = $protocol{$lonhost}.'://'.$hostname.'/index.html'; |
|
my $request=new HTTP::Request('HEAD',$url); |
|
my $response=$ua->request($request); |
|
if ($response->is_success) { |
|
my $has_sts = $response->header('Strict-Transport-Security'); |
|
if ($has_sts eq '') { |
|
$sts_on = 0; |
|
} else { |
|
if ($has_sts =~ /\Qmax-age=\E(\d+)/) { |
|
my $maxage = $1; |
|
if ($maxage) { |
|
$sts_on = 1; |
|
} else { |
|
$sts_on = 0; |
|
} |
|
} else { |
|
$sts_on = 0; |
|
} |
|
} |
|
return &do_cache_new('stspolicy',$lonhost,$sts_on,$cachetime); |
|
} |
|
} |
|
return; |
|
} |
|
|
# ------------------------------------------------------------- Declutters URLs |
# ------------------------------------------------------------- Declutters URLs |
|
|
sub declutter { |
sub declutter { |
Line 13909 BEGIN {
|
Line 14161 BEGIN {
|
$deftex = LONCAPA::texengine(); |
$deftex = LONCAPA::texengine(); |
} |
} |
|
|
|
# ------------- set default minimum length for passwords for internal auth users |
|
{ |
|
$passwdmin = LONCAPA::passwd_min(); |
|
} |
|
|
$memcache=new Cache::Memcached({'servers' => ['127.0.0.1:11211'], |
$memcache=new Cache::Memcached({'servers' => ['127.0.0.1:11211'], |
'compress_threshold'=> 20_000, |
'compress_threshold'=> 20_000, |
}); |
}); |