Diff for /loncom/lonnet/perl/lonnet.pm between versions 1.1172.2.118.2.21 and 1.1172.2.119

version 1.1172.2.118.2.21, 2021/06/20 19:53:37 version 1.1172.2.119, 2020/01/20 17:48:49
Line 125  our @EXPORT = qw(%env); Line 125  our @EXPORT = qw(%env);
  $logid ++;   $logid ++;
         my $now = time();          my $now = time();
  my $id=$now.'00000'.$$.'00000'.$logid;   my $id=$now.'00000'.$$.'00000'.$logid;
         my $ip = &get_requestor_ip();  
         my $logentry = {          my $logentry = {
                          $id => {                           $id => {
                                   'exe_uname' => $env{'user.name'},                                    'exe_uname' => $env{'user.name'},
                                   'exe_udom'  => $env{'user.domain'},                                    'exe_udom'  => $env{'user.domain'},
                                   'exe_time'  => $now,                                    'exe_time'  => $now,
                                   'exe_ip'    => $ip,                                    'exe_ip'    => $ENV{'REMOTE_ADDR'},
                                   'delflag'   => $delflag,                                    'delflag'   => $delflag,
                                   'logentry'  => $storehash,                                    'logentry'  => $storehash,
                                   'uname'     => $uname,                                    'uname'     => $uname,
Line 264  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.'/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=$ua->request($request);
                     unless ($response->is_error()) {                      unless ($response->is_error()) {
Line 955  sub spareserver { Line 953  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 1083  sub check_for_balancer_cookie { Line 1081  sub check_for_balancer_cookie {
     return ($otherserver,$cookie);      return ($otherserver,$cookie);
 }  }
   
 sub updatebalcookie {  
     my ($cookie,$balancer,$lastentry)=@_;  
     if ($cookie =~ /^($match_domain)\_($match_username)\_[a-f0-9]{32}$/) {  
         my ($udom,$uname) = ($1,$2);  
         my $uprimary_id = &domain($udom,'primary');  
         my $uintdom = &internet_dom($uprimary_id);  
         my $intdom = &internet_dom($balancer);  
         my $serverhomedom = &host_domain($balancer);  
         if (($uintdom ne '') && ($uintdom eq $intdom)) {  
             return &reply('updatebalcookie:'.&escape($cookie).':'.&escape($lastentry),$balancer);  
         }  
     }  
     return;  
 }  
   
 sub delbalcookie {  sub delbalcookie {
     my ($cookie,$balancer) =@_;      my ($cookie,$balancer) =@_;
     if ($cookie =~ /^($match_domain)\_($match_username)\_[a-f0-9]{32}$/) {      if ($cookie =~ /^($match_domain)\_($match_username)\_[a-f0-9]{32}$/) {
Line 1107  sub delbalcookie { Line 1090  sub delbalcookie {
         my $intdom = &internet_dom($balancer);          my $intdom = &internet_dom($balancer);
         my $serverhomedom = &host_domain($balancer);          my $serverhomedom = &host_domain($balancer);
         if (($uintdom ne '') && ($uintdom eq $intdom)) {          if (($uintdom ne '') && ($uintdom eq $intdom)) {
             return &reply('delbalcookie:'.&escape($cookie),$balancer);              return &reply("delbalcookie:$cookie",$balancer);
         }          }
     }      }
 }  }
Line 1178  sub choose_server { Line 1161  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 1376  sub spare_can_host { Line 1337  sub spare_can_host {
             $canhost = 0;              $canhost = 0;
         }          }
     }      }
     if ($canhost) {  
         if (ref($defdomdefaults{'offloadoth'}) eq 'HASH') {  
             if ($defdomdefaults{'offloadoth'}{$try_server}) {  
                 unless (&shared_institution($udom,$try_server)) {  
                     $canhost = 0;  
                 }  
             }  
         }  
     }  
     if (($canhost) && ($uint_dom)) {      if (($canhost) && ($uint_dom)) {
         my @intdoms;          my @intdoms;
         my $internet_names = &get_internet_names($try_server);          my $internet_names = &get_internet_names($try_server);
Line 1603  sub check_loadbalancing { Line 1555  sub check_loadbalancing {
     if ($domneedscache) {      if ($domneedscache) {
         &do_cache_new('loadbalancing',$domneedscache,$is_balancer,$cachetime);          &do_cache_new('loadbalancing',$domneedscache,$is_balancer,$cachetime);
     }      }
     if (($is_balancer) && ($caller ne 'switchserver')) {      if ($is_balancer) {
         my $lowest_load = 30000;          my $lowest_load = 30000;
         if (ref($offloadto) eq 'HASH') {          if (ref($offloadto) eq 'HASH') {
             if (ref($offloadto->{'primary'}) eq 'ARRAY') {              if (ref($offloadto->{'primary'}) eq 'ARRAY') {
Line 1643  sub check_loadbalancing { Line 1595  sub check_loadbalancing {
                 }                  }
             }              }
         }          }
     }          unless ($homeintdom) {
     if (($is_balancer) && (!$homeintdom)) {              undef($setcookie);
         undef($setcookie);          }
     }      }
     return ($is_balancer,$otherserver,$setcookie);      return ($is_balancer,$otherserver,$setcookie);
 }  }
Line 1898  sub get_dom { Line 1850  sub get_dom {
         }          }
     }      }
     if ($udom && $uhome && ($uhome ne 'no_host')) {      if ($udom && $uhome && ($uhome ne 'no_host')) {
         my $rep;          my $rep=&reply("getdom:$udom:$namespace:$items",$uhome);
         if (grep { $_ eq $uhome } &current_machine_ids()) {  
             # domain information is hosted on this machine  
             my $cmd = 'getdom';  
             if ($namespace =~ /^enc/) {  
                 $cmd = 'egetdom';  
             }  
             $rep = &LONCAPA::Lond::get_dom("$cmd:$udom:$namespace:$items");  
         } else {  
             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 1956  sub put_dom { Line 1894  sub put_dom {
             $items.=&escape($item).'='.&freeze_escape($$storehash{$item}).'&';              $items.=&escape($item).'='.&freeze_escape($$storehash{$item}).'&';
         }          }
         $items=~s/\&$//;          $items=~s/\&$//;
         if ($namespace =~ /^enc/) {          return &reply("putdom:$udom:$namespace:$items",$uhome);
             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 2443  sub get_domain_defaults { Line 2377  sub get_domain_defaults {
         if (ref($domconfig{'usersessions'}{'offloadnow'}) eq 'HASH') {          if (ref($domconfig{'usersessions'}{'offloadnow'}) eq 'HASH') {
             $domdefaults{'offloadnow'} = $domconfig{'usersessions'}{'offloadnow'};              $domdefaults{'offloadnow'} = $domconfig{'usersessions'}{'offloadnow'};
         }          }
         if (ref($domconfig{'usersessions'}{'offloadoth'}) eq 'HASH') {  
             $domdefaults{'offloadoth'} = $domconfig{'usersessions'}{'offloadoth'};  
         }  
     }      }
     if (ref($domconfig{'selfenrollment'}) eq 'HASH') {      if (ref($domconfig{'selfenrollment'}) eq 'HASH') {
         if (ref($domconfig{'selfenrollment'}{'admin'}) eq 'HASH') {          if (ref($domconfig{'selfenrollment'}{'admin'}) eq 'HASH') {
Line 2580  sub get_passwdconf { Line 2511  sub get_passwdconf {
     return %passwdconf;      return %passwdconf;
 }  }
   
 sub course_portal_url {  
     my ($cnum,$cdom) = @_;  
     my $chome = &homeserver($cnum,$cdom);  
     my $hostname = &hostname($chome);  
     my $protocol = $protocol{$chome};  
     $protocol = 'http' if ($protocol ne 'https');  
     my %domdefaults = &get_domain_defaults($cdom);  
     my $firsturl;  
     if ($domdefaults{'portal_def'}) {  
         $firsturl = $domdefaults{'portal_def'};  
     } else {  
         $firsturl = $protocol.'://'.$hostname;  
     }  
     return $firsturl;  
 }  
   
 # --------------------------------------------------- Assign a key to a student  # --------------------------------------------------- Assign a key to a student
   
 sub assign_access_key {  sub assign_access_key {
Line 3131  sub repcopy { Line 3046  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 } &current_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 3278  sub remove_stale_resfile { Line 3172  sub remove_stale_resfile {
                     (grep { $_ eq $homeserver } &current_machine_ids())) {                      (grep { $_ eq $homeserver } &current_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 3310  sub remove_stale_resfile { Line 3204  sub remove_stale_resfile {
                                     $stale = 1;                                      $stale = 1;
                                 }                                  }
                                 if ($stale) {                                  if ($stale) {
                                     if (unlink($fname)) {                                      unlink($fname);
                                         if ($uri!~/\.meta$/) {                                      if ($uri!~/\.meta$/) {
                                             if (-e $fname.'.meta') {                                          unlink($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 3471  sub can_edit_resource { Line 3359  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/wrapper/adm/$cdom/$cnum/\d+/ext\.tool$}) {  
                     $incourse = 1;  
                     if ($env{'form.forceedit'}) {  
                         $forceview = 1;  
                     } else {  
                         $forceedit = 1;  
                     }  
                     $cfile = $resurl;  
                 } elsif ($resurl =~ m{^/?adm/viewclasslist$}) {                  } elsif ($resurl =~ m{^/?adm/viewclasslist$}) {
                     $incourse = 1;                      $incourse = 1;
                     if ($env{'form.forceedit'}) {                      if ($env{'form.forceedit'}) {
Line 3515  sub can_edit_resource { Line 3383  sub can_edit_resource {
                     $forceedit = 1;                      $forceedit = 1;
                 }                  }
                 $cfile = $resurl;                  $cfile = $resurl;
             } elsif (($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/ext\.tool$}) && ($env{'form.folderpath'} =~ /^supplemental/)) {  
                 $incourse = 1;  
                 if ($env{'form.forceedit'}) {  
                     $forceview = 1;  
                 } else {  
                     $forceedit = 1;  
                 }  
                 $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 3532  sub can_edit_resource { Line 3392  sub can_edit_resource {
                     $cfile = &clutter($res);                      $cfile = &clutter($res);
                 } else {                  } else {
                     $cfile = $env{'form.suppurl'};                      $cfile = $env{'form.suppurl'};
                     my $escfile = &unescape($cfile);                      $cfile =~ s{^http://}{};
                     if ($escfile =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) {                      $cfile = '/adm/wrapper/ext/'.$cfile;
                         $cfile = '/adm/wrapper'.$escfile;  
                     } else {  
                         $escfile =~ s{^http://}{};  
                         $cfile = &escape("/adm/wrapper/ext/$escfile");  
                     }  
                 }                  }
             } elsif ($resurl =~ m{^/?adm/viewclasslist$}) {              } elsif ($resurl =~ m{^/?adm/viewclasslist$}) {
                 if ($env{'form.forceedit'}) {                  if ($env{'form.forceedit'}) {
Line 3785  sub clean_filename { Line 3640  sub clean_filename {
 # Replace all .\d. sequences with _\d. so they no longer look like version  # Replace all .\d. sequences with _\d. so they no longer look like version
 # numbers  # numbers
     $fname=~s/\.(\d+)(?=\.)/_$1/g;      $fname=~s/\.(\d+)(?=\.)/_$1/g;
 # Replace three or more adjacent underscores with one for consistency  
 # with loncfile::filename_check() so complete url can be extracted by  
 # lonnet::decode_symb()  
     $fname=~s/_{3,}/_/g;  
     return $fname;      return $fname;
 }  }
   
Line 4759  sub courseacclog { Line 4610  sub courseacclog {
                 if ($formitem =~ /^HWFILE(?:SIZE|TOOBIG)/) {                  if ($formitem =~ /^HWFILE(?:SIZE|TOOBIG)/) {
                     $what.=':'.$formitem.'='.$env{$key};                      $what.=':'.$formitem.'='.$env{$key};
                 } elsif ($formitem !~ /^HWFILE(?:[^.]+)$/) {                  } elsif ($formitem !~ /^HWFILE(?:[^.]+)$/) {
                     if ($formitem eq 'proctorpassword') {                      $what.=':'.$formitem.'='.$env{$key};
                         $what.=':'.$formitem.'=' . '*' x length($env{$key});  
                     } else {  
                         $what.=':'.$formitem.'='.$env{$key};  
                     }  
                 }                  }
             }              }
         }          }
Line 5519  my %cachedtimes=(); Line 5366  my %cachedtimes=();
 my $cachedtime='';  my $cachedtime='';
   
 sub load_all_first_access {  sub load_all_first_access {
     my ($uname,$udom,$ignorecache)=@_;      my ($uname,$udom)=@_;
     if (($cachedkey eq $uname.':'.$udom) &&      if (($cachedkey eq $uname.':'.$udom) &&
         (abs($cachedtime-time)<5) && (!$env{'form.markaccess'}) &&          (abs($cachedtime-time)<5) && (!$env{'form.markaccess'})) {
         (!$ignorecache)) {  
         return;          return;
     }      }
     $cachedtime=time;      $cachedtime=time;
Line 5531  sub load_all_first_access { Line 5377  sub load_all_first_access {
 }  }
   
 sub get_first_access {  sub get_first_access {
     my ($type,$argsymb,$argmap,$ignorecache)=@_;      my ($type,$argsymb,$argmap)=@_;
     my ($symb,$courseid,$udom,$uname)=&whichuser();      my ($symb,$courseid,$udom,$uname)=&whichuser();
     if ($argsymb) { $symb=$argsymb; }      if ($argsymb) { $symb=$argsymb; }
     my ($map,$id,$res)=&decode_symb($symb);      my ($map,$id,$res)=&decode_symb($symb);
Line 5543  sub get_first_access { Line 5389  sub get_first_access {
     } else {      } else {
  $res=$symb;   $res=$symb;
     }      }
     &load_all_first_access($uname,$udom,$ignorecache);      &load_all_first_access($uname,$udom);
     return $cachedtimes{"$courseid\0$res"};      return $cachedtimes{"$courseid\0$res"};
 }  }
   
Line 5595  sub checkout { Line 5441  sub checkout {
     my ($symb,$tuname,$tudom,$tcrsid)=@_;      my ($symb,$tuname,$tudom,$tcrsid)=@_;
     my $now=time;      my $now=time;
     my $lonhost=$perlvar{'lonHostID'};      my $lonhost=$perlvar{'lonHostID'};
     my $ip = &get_requestor_ip();  
     my $infostr=&escape(      my $infostr=&escape(
                  'CHECKOUTTOKEN&'.                   'CHECKOUTTOKEN&'.
                  $tuname.'&'.                   $tuname.'&'.
                  $tudom.'&'.                   $tudom.'&'.
                  $tcrsid.'&'.                   $tcrsid.'&'.
                  $symb.'&'.                   $symb.'&'.
                  $now.'&'.$ip);                   $now.'&'.$ENV{'REMOTE_ADDR'});
     my $token=&reply('tmpput:'.$infostr,$lonhost);      my $token=&reply('tmpput:'.$infostr,$lonhost);
     if ($token=~/^error\:/) {      if ($token=~/^error\:/) {
         &logthis("<font color=\"blue\">WARNING: ".          &logthis("<font color=\"blue\">WARNING: ".
Line 5616  sub checkout { Line 5461  sub checkout {
   
     my %infohash=('resource.0.outtoken' => $token,      my %infohash=('resource.0.outtoken' => $token,
                   'resource.0.checkouttime' => $now,                    'resource.0.checkouttime' => $now,
                   'resource.0.outremote' => $ip);                    'resource.0.outremote' => $ENV{'REMOTE_ADDR'});
   
     unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') {      unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') {
        return '';         return '';
Line 5647  sub checkin { Line 5492  sub checkin {
     $lonhost=~tr/A-Z/a-z/;      $lonhost=~tr/A-Z/a-z/;
     my $dtoken=$ta.'_'.&hostname($lonhost).'_'.$tb;      my $dtoken=$ta.'_'.&hostname($lonhost).'_'.$tb;
     $dtoken=~s/\W/\_/g;      $dtoken=~s/\W/\_/g;
     my $ip = &get_requestor_ip();  
     my ($dummy,$tuname,$tudom,$tcrsid,$symb,$chtim,$rmaddr)=      my ($dummy,$tuname,$tudom,$tcrsid,$symb,$chtim,$rmaddr)=
                  split(/\&/,&unescape(&reply('tmpget:'.$dtoken,$lonhost)));                   split(/\&/,&unescape(&reply('tmpget:'.$dtoken,$lonhost)));
   
Line 5664  sub checkin { Line 5508  sub checkin {
   
     my %infohash=('resource.0.intoken' => $token,      my %infohash=('resource.0.intoken' => $token,
                   'resource.0.checkintime' => $now,                    'resource.0.checkintime' => $now,
                   'resource.0.inremote' => $ip);                    'resource.0.inremote' => $ENV{'REMOTE_ADDR'});
   
     unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') {      unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') {
        return '';         return '';
Line 5932  sub tmpreset { Line 5776  sub tmpreset {
   if (!$domain) { $domain=$env{'user.domain'}; }    if (!$domain) { $domain=$env{'user.domain'}; }
   if (!$stuname) { $stuname=$env{'user.name'}; }    if (!$stuname) { $stuname=$env{'user.name'}; }
   if ($domain eq 'public' && $stuname eq 'public') {    if ($domain eq 'public' && $stuname eq 'public') {
       $stuname=&get_requestor_ip();        $stuname=$ENV{'REMOTE_ADDR'};
   }    }
   my $path=LONCAPA::tempdir();    my $path=LONCAPA::tempdir();
   my %hash;    my %hash;
Line 5969  sub tmpstore { Line 5813  sub tmpstore {
   if (!$domain) { $domain=$env{'user.domain'}; }    if (!$domain) { $domain=$env{'user.domain'}; }
   if (!$stuname) { $stuname=$env{'user.name'}; }    if (!$stuname) { $stuname=$env{'user.name'}; }
   if ($domain eq 'public' && $stuname eq 'public') {    if ($domain eq 'public' && $stuname eq 'public') {
       $stuname=&get_requestor_ip();        $stuname=$ENV{'REMOTE_ADDR'};
   }    }
   my $now=time;    my $now=time;
   my %hash;    my %hash;
Line 6013  sub tmprestore { Line 5857  sub tmprestore {
   if (!$domain) { $domain=$env{'user.domain'}; }    if (!$domain) { $domain=$env{'user.domain'}; }
   if (!$stuname) { $stuname=$env{'user.name'}; }    if (!$stuname) { $stuname=$env{'user.name'}; }
   if ($domain eq 'public' && $stuname eq 'public') {    if ($domain eq 'public' && $stuname eq 'public') {
       $stuname=&get_requestor_ip();        $stuname=$ENV{'REMOTE_ADDR'};
   }    }
   my %returnhash;    my %returnhash;
   $namespace=~s/\//\_/g;    $namespace=~s/\//\_/g;
Line 6069  sub store { Line 5913  sub store {
     }      }
     if (!$home) { $home=$env{'user.home'}; }      if (!$home) { $home=$env{'user.home'}; }
   
     $$storehash{'ip'}=&get_requestor_ip();      $$storehash{'ip'}=$ENV{'REMOTE_ADDR'};
     $$storehash{'host'}=$perlvar{'lonHostID'};      $$storehash{'host'}=$perlvar{'lonHostID'};
   
     my $namevalue='';      my $namevalue='';
Line 6105  sub cstore { Line 5949  sub cstore {
     }      }
     if (!$home) { $home=$env{'user.home'}; }      if (!$home) { $home=$env{'user.home'}; }
   
     $$storehash{'ip'}=&get_requestor_ip();      $$storehash{'ip'}=$ENV{'REMOTE_ADDR'};
     $$storehash{'host'}=$perlvar{'lonHostID'};      $$storehash{'host'}=$perlvar{'lonHostID'};
   
     my $namevalue='';      my $namevalue='';
Line 6962  sub currentdump { Line 6806  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 7097  sub putstore { Line 6941  sub putstore {
        foreach my $key (keys(%{$storehash})) {         foreach my $key (keys(%{$storehash})) {
            $namevalue.=&escape($key).'='.&freeze_escape($storehash->{$key}).'&';             $namevalue.=&escape($key).'='.&freeze_escape($storehash->{$key}).'&';
        }         }
        my $ip = &get_requestor_ip();         $namevalue .= 'ip='.&escape($ENV{'REMOTE_ADDR'}).
        $namevalue .= 'ip='.&escape($ip).  
                      '&host='.&escape($perlvar{'lonHostID'}).                       '&host='.&escape($perlvar{'lonHostID'}).
                      '&version='.$esc_v.                       '&version='.$esc_v.
                      '&by='.&escape($env{'user.name'}.':'.$env{'user.domain'});                       '&by='.&escape($env{'user.name'}.':'.$env{'user.domain'});
Line 7879  sub customaccess { Line 7722  sub customaccess {
 # ------------------------------------------------- Check for a user privilege  # ------------------------------------------------- Check for a user privilege
   
 sub allowed {  sub allowed {
     my ($priv,$uri,$symb,$role,$clientip,$noblockcheck,$ignorecache)=@_;      my ($priv,$uri,$symb,$role,$clientip,$noblockcheck)=@_;
     my $ver_orguri=$uri;      my $ver_orguri=$uri;
     $uri=&deversion($uri);      $uri=&deversion($uri);
     my $orguri=$uri;      my $orguri=$uri;
Line 7896  sub allowed { Line 7739  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|viewclasslist|aboutme|ext\.tool)$}))       if (((($uri=~/^adm\//) && ($uri !~ m{/(?:smppg|bulletinboard)$})) 
  || (($uri=~/\.meta$/) && ($uri!~m|^uploaded/|) ))    || (($uri=~/\.meta$/) && ($uri!~m|^uploaded/|) )) 
  && ($priv eq 'bre')) {   && ($priv eq 'bre')) {
  return 'F';   return 'F';
Line 8002  sub allowed { Line 7845  sub allowed {
                         my $adom = $1;                          my $adom = $1;
                         foreach my $key (keys(%env)) {                          foreach my $key (keys(%env)) {
                             if ($key =~ m{^user\.role\.(ca|aa)/\Q$adom\E}) {                              if ($key =~ m{^user\.role\.(ca|aa)/\Q$adom\E}) {
                                 my ($start,$end) = split(/\./,$env{$key});                                  my ($start,$end) = split('.',$env{$key});
                                 if (($now >= $start) && (!$end || $end > $now)) {                                  if (($now >= $start) && (!$end || $end < $now)) {
                                     $ownaccess = 1;                                      $ownaccess = 1;
                                     last;                                      last;
                                 }                                  }
Line 8015  sub allowed { Line 7858  sub allowed {
                         foreach my $role ('ca','aa') {                           foreach my $role ('ca','aa') { 
                             if ($env{"user.role.$role./$adom/$aname"}) {                              if ($env{"user.role.$role./$adom/$aname"}) {
                                 my ($start,$end) =                                  my ($start,$end) =
                                     split(/\./,$env{"user.role.$role./$adom/$aname"});                                      split('.',$env{"user.role.$role./$adom/$aname"});
                                 if (($now >= $start) && (!$end || $end > $now)) {                                  if (($now >= $start) && (!$end || $end < $now)) {
                                     $ownaccess = 1;                                      $ownaccess = 1;
                                     last;                                      last;
                                 }                                  }
Line 8104  sub allowed { Line 7947  sub allowed {
                 if ($noblockcheck) {                  if ($noblockcheck) {
                     $thisallowed.=$value;                      $thisallowed.=$value;
                 } else {                  } else {
                     my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache);                      my @blockers = &has_comm_blocking($priv,$symb,$uri);
                     if (@blockers > 0) {                      if (@blockers > 0) {
                         $thisallowed = 'B';                          $thisallowed = 'B';
                     } else {                      } else {
Line 8124  sub allowed { Line 7967  sub allowed {
                         if ($noblockcheck) {                          if ($noblockcheck) {
                             $thisallowed='F';                              $thisallowed='F';
                         } else {                          } else {
                             my @blockers = &has_comm_blocking($priv,'',$refuri,'',1);                              my @blockers = &has_comm_blocking($priv,$symb,$refuri);
                             if (@blockers > 0) {                              if (@blockers > 0) {
                                 $thisallowed = 'B';                                  $thisallowed = 'B';
                             } else {                              } else {
Line 8143  sub allowed { Line 7986  sub allowed {
  && &is_portfolio_url($uri)) {   && &is_portfolio_url($uri)) {
  $thisallowed = &portfolio_access($uri,$clientip);   $thisallowed = &portfolio_access($uri,$clientip);
     }      }
       
 # Full access at system, domain or course-wide level? Exit.  # Full access at system, domain or course-wide level? Exit.
     if ($thisallowed=~/F/) {      if ($thisallowed=~/F/) {
  return 'F';   return 'F';
Line 8197  sub allowed { Line 8040  sub allowed {
                    if ($noblockcheck) {                     if ($noblockcheck) {
                        $thisallowed.=$value;                         $thisallowed.=$value;
                    } else {                     } else {
                        my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache);                         my @blockers = &has_comm_blocking($priv,$symb,$uri);
                        if (@blockers > 0) {                         if (@blockers > 0) {
                            $thisallowed = 'B';                             $thisallowed = 'B';
                        } else {                         } else {
Line 8210  sub allowed { Line 8053  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 8239  sub allowed { Line 8082  sub allowed {
                       if ($noblockcheck) {                        if ($noblockcheck) {
                           $thisallowed.=$value;                            $thisallowed.=$value;
                       } else {                        } else {
                           my @blockers = &has_comm_blocking($priv,'',$refuri,'',1);                            my @blockers = &has_comm_blocking($priv,$symb,$refuri);
                           if (@blockers > 0) {                            if (@blockers > 0) {
                               $thisallowed = 'B';                                $thisallowed = 'B';
                           } else {                            } else {
Line 8281  sub allowed { Line 8124  sub allowed {
 #  #
   
 # Possibly locked functionality, check all courses  # Possibly locked functionality, check all courses
 # In roles.tab, L (unless locked) available for bre, pch, plc, pac and sma.  
 # Locks might take effect only after 10 minutes cache expiration for other  # Locks might take effect only after 10 minutes cache expiration for other
 # courses, and 2 minutes for current course, in which user has st or ta role  # courses, and 2 minutes for current course
 # which is neither expired nor a future role (unless current course).  
   
     my ($needlockcheck,$now,$crsonly);      my $envkey;
     if ($thisallowed=~/L/) {      if ($thisallowed=~/L/) {
         $now = time;          foreach $envkey (keys(%env)) {
         if ($priv eq 'bre') {  
             if ($uri ne '') {  
                 if ($orguri =~ m{^/+res/}) {  
                     if ($uri =~ m{^lib/templates/}) {  
                         if ($env{'request.course.id'}) {  
                             $crsonly = 1;  
                             $needlockcheck = 1;  
                         }  
                     } else {  
                         $needlockcheck = 1;  
                     }  
                 } elsif ($env{'request.course.id'}) {  
                     my ($crsdom,$crsnum) = split('_',$env{'request.course.id'});  
                     if (($uri =~ m{^(adm|uploaded|public)/$crsdom/$crsnum/}) ||  
                         ($uri =~ m{^adm/$match_domain/$match_username/\d+/(smppg|bulletinboard)$})) {  
                         $crsonly = 1;  
                     }  
                     $needlockcheck = 1;  
                 }  
             }  
         } elsif (($priv eq 'pch') || ($priv eq 'plc') || ($priv eq 'pac') || ($priv eq 'sma')) {  
             $needlockcheck = 1;  
         }  
     }  
     if ($needlockcheck) {  
         foreach my $envkey (keys(%env)) {  
            if ($envkey=~/^user\.role\.(st|ta)\.([^\.]*)/) {             if ($envkey=~/^user\.role\.(st|ta)\.([^\.]*)/) {
                my $courseid=$2;                 my $courseid=$2;
                my $roleid=$1.'.'.$2;                 my $roleid=$1.'.'.$2;
                $courseid=~s/^\///;                 $courseid=~s/^\///;
                unless ($env{'request.role'} eq $roleid) {  
                    my ($start,$end) = split(/\./,$env{$envkey});  
                    next unless (($now >= $start) && (!$end || $end > $now));  
                }  
                my $expiretime=600;                 my $expiretime=600;
                if ($env{'request.role'} eq $roleid) {                 if ($env{'request.role'} eq $roleid) {
   $expiretime=120;    $expiretime=120;
Line 8345  sub allowed { Line 8156  sub allowed {
                }                 }
                if (($env{$prefix.'priv.'.$priv.'.lock.sections'}=~/\,\Q$csec\E\,/)                 if (($env{$prefix.'priv.'.$priv.'.lock.sections'}=~/\,\Q$csec\E\,/)
                 || ($env{$prefix.'priv.'.$priv.'.lock.sections'} eq 'all')) {                  || ($env{$prefix.'priv.'.$priv.'.lock.sections'} eq 'all')) {
    if ($env{$prefix.'priv.'.$priv.'.lock.expire'}>time) {     if ($env{'priv.'.$priv.'.lock.expire'}>time) {
                        &log($env{'user.domain'},$env{'user.name'},                         &log($env{'user.domain'},$env{'user.name'},
                             $env{'user.home'},                              $env{'user.home'},
                             'Locked by priv: '.$priv.' for '.$uri.' due to '.                              'Locked by priv: '.$priv.' for '.$uri.' due to '.
Line 8357  sub allowed { Line 8168  sub allowed {
    }     }
        }         }
     }      }
      
 #  #
 # Rest of the restrictions depend on selected course  # Rest of the restrictions depend on selected course
 #  #
Line 8515  sub constructaccess { Line 8326  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='';  
 # 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.
 my $cachedlast='';  my $cachedlast='';
   
 sub load_all_blockers {  sub load_all_blockers {
     my ($uname,$udom)=@_;      my ($uname,$udom,$blocks)=@_;
     if (($uname ne '') && ($udom ne '')) {      if (($uname ne '') && ($udom ne '')) {
         if (($cacheduser eq $uname.':'.$udom) &&          if (($cacheduser eq $uname.':'.$udom) &&
             ($cachedcid eq $env{'request.course.id'}) &&  
             (abs($cachedlast-time)<5)) {              (abs($cachedlast-time)<5)) {
             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();  
     return;  
 }  }
   
 sub get_comm_blocks {  sub get_comm_blocks {
Line 8615  sub get_commblock_resources { Line 8421  sub get_commblock_resources {
                             if ($mapsymb) {                              if ($mapsymb) {
                                 if (ref($navmap)) {                                  if (ref($navmap)) {
                                     my $mapres = $navmap->getBySymb($mapsymb);                                      my $mapres = $navmap->getBySymb($mapsymb);
                                     if (ref($mapres)) {                                      @to_test = $mapres->retrieveResources($mapres,undef,0,0,0,1);
                                         my $first = $mapres->map_start();                                      foreach my $res (@to_test) {
                                         my $finish = $mapres->map_finish();                                          my $symb = $res->symb();
                                         my $it = $navmap->getIterator($first,$finish,undef,0,0);                                          next if ($symb eq $mapsymb);
                                         if (ref($it)) {                                          if ($symb ne '') {
                                             my $res;                                              @interval=&EXT("resource.0.interval",$symb);
                                             while ($res = $it->next(undef,1)) {                                              if ($interval[1] eq 'map') {
                                                 next unless (ref($res));                                                  last;
                                                 my $symb = $res->symb();  
                                                 next if (($symb eq $mapsymb) || ($symb eq ''));  
                                                 @interval=&EXT("resource.0.interval",$symb);  
                                                 if ($interval[1] eq 'map') {  
                                                     if ($res->answerable()) {  
                                                         push(@to_test,$res);  
                                                         last;  
                                                     }  
                                                 }  
                                             }                                              }
                                         }                                          }
                                     }                                      }
Line 8639  sub get_commblock_resources { Line 8436  sub get_commblock_resources {
                             }                              }
                         }                          }
                     }                      }
                     if ($interval[0] =~ /^(\d+)/) {                      if ($interval[0] =~ /^\d+$/) {
                         my $timelimit = $1;   
                         my $first_access;                          my $first_access;
                         if ($type eq 'resource') {                          if ($type eq 'resource') {
                             $first_access=&get_first_access($interval[1],$item);                              $first_access=&get_first_access($interval[1],$item);
Line 8650  sub get_commblock_resources { Line 8446  sub get_commblock_resources {
                             $first_access=&get_first_access($interval[1]);                              $first_access=&get_first_access($interval[1]);
                         }                          }
                         if ($first_access) {                          if ($first_access) {
                             my $timesup = $first_access+$timelimit;                              my $timesup = $first_access+$interval[0];
                             if ($timesup > $now) {                              if ($timesup > $now) {
                                 my $activeblock;                                  my $activeblock;
                                 foreach my $res (@to_test) {                                  foreach my $res (@to_test) {
Line 8682  sub get_commblock_resources { Line 8478  sub get_commblock_resources {
 }  }
   
 sub has_comm_blocking {  sub has_comm_blocking {
     my ($priv,$symb,$uri,$ignoresymbdb,$noenccheck,$blocked,$blocks) = @_;      my ($priv,$symb,$uri,$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');
     return if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/);      return if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/);
     return if ($env{'request.state'} eq 'construct');      return if ($env{'request.state'} eq 'construct');
     my %blockinfo;      &load_all_blockers($env{'user.name'},$env{'user.domain'},$blocks);
     if (ref($blocks) eq 'HASH') {      return unless (keys(%cachedblockers) > 0);
         %blockinfo = &get_commblock_resources($blocks);  
     } else {  
         &load_all_blockers($env{'user.name'},$env{'user.domain'});  
         %blockinfo = %cachedblockers;  
     }  
     return unless (keys(%blockinfo) > 0);  
     my (%possibles,@symbs);      my (%possibles,@symbs);
     if (!$symb) {      if (!$symb) {
         $symb = &symbread($uri,1,1,1,\%possibles,$ignoresymbdb,$noenccheck);          $symb = &symbread($uri,1,1,1,\%possibles);
     }      }
     if ($symb) {      if ($symb) {
         @symbs = ($symb);          @symbs = ($symb);
Line 8709  sub has_comm_blocking { Line 8499  sub has_comm_blocking {
     foreach my $symb (@symbs) {      foreach my $symb (@symbs) {
         last if ($noblock);          last if ($noblock);
         my ($map,$resid,$resurl)=&decode_symb($symb);          my ($map,$resid,$resurl)=&decode_symb($symb);
         foreach my $block (keys(%blockinfo)) {          foreach my $block (keys(%cachedblockers)) {
             if ($block =~ /^firstaccess____(.+)$/) {              if ($block =~ /^firstaccess____(.+)$/) {
                 my $item = $1;                  my $item = $1;
                 unless ($blocked) {                  if (($item eq $map) || ($item eq $symb)) {
                     if (($item eq $map) || ($item eq $symb)) {                      $noblock = 1;
                         $noblock = 1;                      last;
                         last;  
                     }  
                 }                  }
             }              }
             if (ref($blockinfo{$block}) eq 'HASH') {              if (ref($cachedblockers{$block}) eq 'HASH') {
                 if (ref($blockinfo{$block}{'resources'}) eq 'HASH') {                  if (ref($cachedblockers{$block}{'resources'}) eq 'HASH') {
                     if ($blockinfo{$block}{'resources'}{$symb}) {                      if ($cachedblockers{$block}{'resources'}{$symb}) {
                         unless (grep(/^\Q$block\E$/,@blockers)) {                          unless (grep(/^\Q$block\E$/,@blockers)) {
                             push(@blockers,$block);                              push(@blockers,$block);
                         }                          }
                     }                      }
                 }                  }
                 if (ref($blockinfo{$block}{'maps'}) eq 'HASH') {              }
                     if ($blockinfo{$block}{'maps'}{$map}) {              if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') {
                         unless (grep(/^\Q$block\E$/,@blockers)) {                  if ($cachedblockers{$block}{'maps'}{$map}) {
                             push(@blockers,$block);                      unless (grep(/^\Q$block\E$/,@blockers)) {
                         }                          push(@blockers,$block);
                     }                      }
                 }                  }
             }              }
         }          }
     }      }
     unless ($noblock) {      return if ($noblock);
         return @blockers;      return @blockers;
     }  
     return;  
 }  }
 }  }
   
Line 9138  sub auto_validate_instcode { Line 8924  sub auto_validate_instcode {
     return ($outcome,$description,$defaultcredits);      return ($outcome,$description,$defaultcredits);
 }  }
   
 sub auto_validate_inst_crosslist {  
     my ($cnum,$cdom,$instcode,$inst_xlist,$coowner) = @_;  
     my ($homeserver,$response);  
     if (($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)) {  
         $homeserver = &homeserver($cnum,$cdom);  
     }  
     if (!defined($homeserver)) {  
         if ($cdom =~ /^$match_domain$/) {  
             $homeserver = &domain($cdom,'primary');  
         }  
     }  
     unless (($homeserver eq '') || ($homeserver eq 'no_host')) {  
         $response=&reply('autovalidateinstcrosslist:'.$cdom.':'.  
                          &escape($instcode).':'.&escape($inst_xlist).':'.  
                          &escape($coowner),$homeserver);  
     }  
     return $response;  
 }  
   
 sub auto_create_password {  sub auto_create_password {
     my ($cnum,$cdom,$authparam,$udom) = @_;      my ($cnum,$cdom,$authparam,$udom) = @_;
     my ($homeserver,$response);      my ($homeserver,$response);
Line 9428  sub auto_validate_class_sec { Line 9195  sub auto_validate_class_sec {
     return $response;      return $response;
 }  }
   
 sub auto_instsec_reformat {  
     my ($cdom,$action,$instsecref) = @_;  
     return unless(($action eq 'clutter') || ($action eq 'declutter'));  
     my @homeservers;  
     if (defined(&domain($cdom,'primary'))) {  
         push(@homeservers,&domain($cdom,'primary'));  
     } else {  
         my %servers = &get_servers($cdom,'library');  
         foreach my $tryserver (keys(%servers)) {  
             if (!grep(/^\Q$tryserver\E$/,@homeservers)) {  
                 push(@homeservers,$tryserver);  
             }  
         }  
     }  
     my $response;  
     my %reformatted = %{$instsecref};  
     foreach my $server (@homeservers) {  
         if (ref($instsecref) eq 'HASH') {  
             my $info = &freeze_escape($instsecref);  
             my $response=&reply('autoinstsecreformat:'.$cdom.':'.  
                                 $action.':'.$info,$server);  
             next if ($response =~ /(con_lost|error|no_such_host|refused|unknown_command)/);  
             my @items = split(/&/,$response);  
             foreach my $item (@items) {  
                 my ($key,$value) = split(/=/,$item);  
                 $reformatted{&unescape($key)} = &thaw_unescape($value);  
             }  
         }  
     }  
     return %reformatted;  
 }  
   
 sub auto_validate_instclasses {  sub auto_validate_instclasses {
     my ($cdom,$cnum,$owners,$classesref) = @_;      my ($cdom,$cnum,$owners,$classesref) = @_;
     my ($homeserver,%validations);      my ($homeserver,%validations);
Line 10004  sub autoupdate_coowners { Line 9739  sub autoupdate_coowners {
         if ($domdesign{$cdom.'.autoassign.co-owners'}) {          if ($domdesign{$cdom.'.autoassign.co-owners'}) {
             my %coursehash = &coursedescription($cdom.'_'.$cnum);              my %coursehash = &coursedescription($cdom.'_'.$cnum);
             my $instcode = $coursehash{'internal.coursecode'};              my $instcode = $coursehash{'internal.coursecode'};
             my $xlists = $coursehash{'internal.crosslistings'};  
             if ($instcode ne '') {              if ($instcode ne '') {
                 if (($start && $start <= $now) && ($end == 0) || ($end > $now)) {                  if (($start && $start <= $now) && ($end == 0) || ($end > $now)) {
                     unless ($coursehash{'internal.courseowner'} eq $uname.':'.$udom) {                      unless ($coursehash{'internal.courseowner'} eq $uname.':'.$udom) {
                         my ($delcoowners,@newcoowners,$putresult,$delresult,$coowners);                          my ($delcoowners,@newcoowners,$putresult,$delresult,$coowners);
                         my ($result,$desc) = &auto_validate_instcode($cnum,$cdom,$instcode,$uname.':'.$udom);                          my ($result,$desc) = &auto_validate_instcode($cnum,$cdom,$instcode,$uname.':'.$udom);
                         unless ($result eq 'valid') {  
                             if ($xlists ne '') {  
                                 foreach my $xlist (split(',',$xlists)) {  
                                     my ($inst_crosslist,$lcsec) = split(':',$xlist);  
                                     $result =  
                                         &auto_validate_inst_crosslist($cnum,$cdom,$instcode,  
                                                                       $inst_crosslist,$uname.':'.$udom);  
                                     last if ($result eq 'valid');  
                                 }  
                             }  
                         }  
                         if ($result eq 'valid') {                          if ($result eq 'valid') {
                             if ($coursehash{'internal.co-owners'}) {                              if ($coursehash{'internal.co-owners'}) {
                                 foreach my $coowner (split(',',$coursehash{'internal.co-owners'})) {                                  foreach my $coowner (split(',',$coursehash{'internal.co-owners'})) {
Line 10033  sub autoupdate_coowners { Line 9756  sub autoupdate_coowners {
                             } else {                              } else {
                                 push(@newcoowners,$uname.':'.$udom);                                  push(@newcoowners,$uname.':'.$udom);
                             }                              }
                         } elsif ($coursehash{'internal.co-owners'}) {                          } else {
                             foreach my $coowner (split(',',$coursehash{'internal.co-owners'})) {                              if ($coursehash{'internal.co-owners'}) {
                                 unless ($coowner eq $uname.':'.$udom) {                                  foreach my $coowner (split(',',$coursehash{'internal.co-owners'})) {
                                     push(@newcoowners,$coowner);                                      unless ($coowner eq $uname.':'.$udom) {
                                           push(@newcoowners,$coowner);
                                       }
                                   }
                                   unless (@newcoowners > 0) {
                                       $delcoowners = 1;
                                       $coowners = '';
                                 }                                  }
                             }  
                             unless (@newcoowners > 0) {  
                                 $delcoowners = 1;  
                                 $coowners = '';  
                             }                              }
                         }                          }
                         if (@newcoowners || $delcoowners) {                          if (@newcoowners || $delcoowners) {
Line 10116  sub modifyuserauth { Line 9841  sub modifyuserauth {
              ' in domain '.$env{'request.role.domain'});                 ' in domain '.$env{'request.role.domain'});  
     my $reply=&reply('encrypt:changeuserauth:'.$udom.':'.$uname.':'.$umode.':'.      my $reply=&reply('encrypt:changeuserauth:'.$udom.':'.$uname.':'.$umode.':'.
      &escape($upass),$uhome);       &escape($upass),$uhome);
     my $ip = &get_requestor_ip();  
     &log($env{'user.domain'},$env{'user.name'},$env{'user.home'},      &log($env{'user.domain'},$env{'user.name'},$env{'user.home'},
         'Authentication changed for '.$udom.', '.$uname.', '.$umode.          'Authentication changed for '.$udom.', '.$uname.', '.$umode.
          '(Remote '.$ip.'): '.$reply);           '(Remote '.$ENV{'REMOTE_ADDR'}.'): '.$reply);
     &log($udom,,$uname,$uhome,      &log($udom,,$uname,$uhome,
         'Authentication changed by '.$env{'user.domain'}.', '.          'Authentication changed by '.$env{'user.domain'}.', '.
                                      $env{'user.name'}.', '.$umode.                                       $env{'user.name'}.', '.$umode.
          '(Remote '.$ip.'): '.$reply);           '(Remote '.$ENV{'REMOTE_ADDR'}.'): '.$reply);
     unless ($reply eq 'ok') {      unless ($reply eq 'ok') {
         &logthis('Authentication mode error: '.$reply);          &logthis('Authentication mode error: '.$reply);
  return 'error: '.$reply;   return 'error: '.$reply;
Line 10448  sub writecoursepref { Line 10172  sub writecoursepref {
   
 sub createcourse {  sub createcourse {
     my ($udom,$description,$url,$course_server,$nonstandard,$inst_code,      my ($udom,$description,$url,$course_server,$nonstandard,$inst_code,
         $course_owner,$crstype,$cnum,$context,$category,$callercontext)=@_;          $course_owner,$crstype,$cnum,$context,$category)=@_;
     $url=&declutter($url);      $url=&declutter($url);
     my $cid='';      my $cid='';
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         my $can_create = 0;          my $can_create = 0;
         my ($ownername,$ownerdom) = split(':',$course_owner);          my ($ownername,$ownerdom) = split(':',$course_owner);
         if ($udom eq $ownerdom) {          if ($udom eq $ownerdom) {
             my $reload;              if (&usertools_access($ownername,$ownerdom,$category,undef,
             if (($callercontext eq 'auto') &&  
                ($ownerdom eq $env{'user.domain'}) && ($ownername eq $env{'user.name'})) {  
                 $reload = 'reload';  
             }  
             if (&usertools_access($ownername,$ownerdom,$category,$reload,  
                                   $context)) {                                    $context)) {
                 $can_create = 1;                  $can_create = 1;
             }              }
Line 10644  sub store_userdata { Line 10363  sub store_userdata {
             if (($uhome eq '') || ($uhome eq 'no_host')) {              if (($uhome eq '') || ($uhome eq 'no_host')) {
                 $result = 'error: no_host';                  $result = 'error: no_host';
             } else {              } else {
                 $storehash->{'ip'} = &get_requestor_ip();                  $storehash->{'ip'} = $ENV{'REMOTE_ADDR'};
                 $storehash->{'host'} = $perlvar{'lonHostID'};                  $storehash->{'host'} = $perlvar{'lonHostID'};
   
                 my $namevalue='';                  my $namevalue='';
Line 11469  sub get_userresdata { Line 11188  sub get_userresdata {
 #  Parameters:  #  Parameters:
 #     $name      - Course/user name.  #     $name      - Course/user name.
 #     $domain    - Name of the domain the user/course is registered on.  #     $domain    - Name of the domain the user/course is registered on.
 #     $type      - Type of thing $name is (must be 'course' or 'user')  #     $type      - Type of thing $name is (must be 'course' or 'user'
 #     @which     - Array of names of resources desired.  #     @which     - Array of names of resources desired.
 #  Returns:  #  Returns:
 #     The value of the first reasource in @which that is found in the  #     The value of the first reasource in @which that is found in the
Line 11490  sub resdata { Line 11209  sub resdata {
     foreach my $item (@which) {      foreach my $item (@which) {
  if (defined($result->{$item->[0]})) {   if (defined($result->{$item->[0]})) {
     return [$result->{$item->[0]},$item->[1]];      return [$result->{$item->[0]},$item->[1]];
         }   }
     }      }
     return undef;      return undef;
 }  }
   
 sub get_domain_lti {  
     my ($cdom,$context) = @_;  
     my ($name,%lti);  
     if ($context eq 'consumer') {  
         $name = 'ltitools';  
     } elsif ($context eq 'provider') {  
         $name = 'lti';  
     } else {  
         return %lti;  
     }  
     my ($result,$cached)=&is_cached_new($name,$cdom);  
     if (defined($cached)) {  
         if (ref($result) eq 'HASH') {  
             %lti = %{$result};  
         }  
     } else {  
         my %domconfig = &get_dom('configuration',[$name],$cdom);  
         if (ref($domconfig{$name}) eq 'HASH') {  
             %lti = %{$domconfig{$name}};  
             my %encdomconfig = &get_dom('encconfig',[$name],$cdom);  
             if (ref($encdomconfig{$name}) eq 'HASH') {  
                 foreach my $id (keys(%lti)) {  
                     if (ref($encdomconfig{$name}{$id}) eq 'HASH') {  
                         foreach my $item ('key','secret') {  
                             $lti{$id}{$item} = $encdomconfig{$name}{$id}{$item};  
                         }  
                     }  
                 }  
             }  
         }  
         my $cachetime = 24*60*60;  
         &do_cache_new($name,$cdom,\%lti,$cachetime);  
     }  
     return %lti;  
 }  
   
 sub get_numsuppfiles {  sub get_numsuppfiles {
     my ($cnum,$cdom,$ignorecache)=@_;      my ($cnum,$cdom,$ignorecache)=@_;
     my $hashid=$cnum.':'.$cdom;      my $hashid=$cnum.':'.$cdom;
Line 11986  sub metadata { Line 11669  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|ext\.tool)$})) ||       ($uri !~ m|^adm/includes|) && ($uri !~ m{/(smppg|bulletinboard)$})) ||
         ($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) {          ($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) {
  return undef;   return undef;
     }      }
Line 12573  sub symbverify { Line 12256  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 ($map =~ m{^uploaded/.+\.page$}) {          if ($noclutter) {
             $ids=$bighash{'ids_'.&clutter_with_no_wrapper($thisurl)};              $ids=$bighash{'ids_'.$thisurl};
         } else {          } else {
             $ids=$bighash{'ids_'.&clutter($thisurl)};              $ids=$bighash{'ids_'.&clutter($thisurl)};
         }          }
Line 12682  sub deversion { Line 12367  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)=@_;
         $ignoresymbdb,$noenccheck)=@_;  
     my $cache_str='request.symbread.cached.'.$thisfn;      my $cache_str='request.symbread.cached.'.$thisfn;
     if (defined($env{$cache_str})) {      if (defined($env{$cache_str})) {
         unless (ref($possibles) eq 'HASH') {          if ($ignorecachednull) {
             if ($ignorecachednull) {              return $env{$cache_str} unless ($env{$cache_str} eq '');
                 return $env{$cache_str} unless ($env{$cache_str} eq '');          } else {
             } else {              return $env{$cache_str};
                 return $env{$cache_str};  
             }  
         }          }
     }      }
 # no filename provided? try from environment  # no filename provided? try from environment
Line 12720  sub symbread { Line 12402  sub symbread {
  if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) {   if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) {
     $targetfn=$1;      $targetfn=$1;
  }   }
         unless ($ignoresymbdb) {          if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
             if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',                        &GDBM_READER(),0640)) {
                           &GDBM_READER(),0640)) {      $syval=$hash{$targetfn};
         $syval=$hash{$targetfn};              untie(%hash);
                 untie(%hash);  
             }  
             if ($syval && $checkforblock) {  
                 my @blockers = &has_comm_blocking('bre',$syval,$thisfn,$ignoresymbdb,$noenccheck);  
                 if (@blockers) {  
                     $syval='';  
                 }  
             }  
         }          }
 # ---------------------------------------------------------- There was an entry  # ---------------------------------------------------------- There was an entry
         if ($syval) {          if ($syval) {
Line 12764  sub symbread { Line 12438  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') {
                          unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) {                           $possibles->{$syval} = 1;
                              $possibles->{$syval} = 1;  
                          }  
                      }                       }
                      if ($checkforblock) {                       if ($checkforblock) {
                          unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) {                           my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids});
                              my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids},'',$noenccheck);                           if (@blockers) {
                              if (@blockers) {                               $syval = '';
                                  $syval = '';                               return;
                                  untie(%bighash);  
                                  return $env{$cache_str}='';  
                              }  
                          }                           }
                      }                       }
                  } elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) {                   } elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) {
Line 12794  sub symbread { Line 12463  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);
                                  next if ($bighash{'randomout_'.$id} && !$env{'request.role.adv'});                                   if (ref($possibles) eq 'HASH') {
                                  next unless (($noenccheck) || ($bighash{'encrypted_'.$id} eq $env{'request.enc'}));                                       $possibles->{$syval} = 1;
                                    }
                                  if ($checkforblock) {                                   if ($checkforblock) {
                                      my @blockers = &has_comm_blocking('bre',$poss_syval,$file,'',$noenccheck);                                       my @blockers = &has_comm_blocking('bre',$poss_syval,$file);
                                      if (@blockers > 0) {                                       unless (@blockers > 0) {
                                          $syval = '';  
                                      } else {  
                                          $syval = $poss_syval;                                           $syval = $poss_syval;
                                          $realpossible++;                                           $realpossible++;
                                      }                                       }
Line 12808  sub symbread { Line 12476  sub symbread {
                                      $syval = $poss_syval;                                       $syval = $poss_syval;
                                      $realpossible++;                                       $realpossible++;
                                  }                                   }
                                  if ($syval) {  
                                      if (ref($possibles) eq 'HASH') {  
                                          $possibles->{$syval} = 1;  
                                      }  
                                  }  
                              }                               }
  }   }
                      }                       }
Line 13350  sub repcopy_userfile { Line 13013  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.'/raw/'.$uri);      $request=new HTTP::Request('GET',$protocol.'://'.&hostname($homeserver).'/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 13377  sub tokenwrapper { Line 13039  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.'/'.$uri.          return $protocol.'://'.&hostname($homeserver).'/'.$uri.
                (($uri=~/\?/)?'&':'?').'token='.$token.                 (($uri=~/\?/)?'&':'?').'token='.$token.
                                '&tokenissued='.$perlvar{'lonHostID'};                                 '&tokenissued='.$perlvar{'lonHostID'};
     } else {      } else {
Line 13396  sub getuploaded { Line 13057  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.'/raw/'.$uri;      $uri = $protocol.'://'.&hostname($homeserver).'/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 13554  sub default_login_domain { Line 13214  sub default_login_domain {
 }  }
   
 sub shared_institution {  sub shared_institution {
     my ($dom,$lonhost) = @_;      my ($dom) = @_;
     if ($lonhost eq '') {  
         $lonhost = $perlvar{'lonHostID'};  
     }  
     my $same_intdom;      my $same_intdom;
     my $hostintdom = &internet_dom($lonhost);      my $hostintdom = &internet_dom($perlvar{'lonHostID'});
     if ($hostintdom ne '') {      if ($hostintdom ne '') {
         my %iphost = &get_iphost();          my %iphost = &get_iphost();
         my $primary_id = &domain($dom,'primary');          my $primary_id = &domain($dom,'primary');
Line 13577  sub shared_institution { Line 13234  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;  
 }  
   
 sub get_requestor_ip {  
     my ($r,$nolookup,$noproxy) = @_;  
     my $from_ip;  
     if (ref($r)) {  
         $from_ip = $r->get_remote_host($nolookup);  
     } else {  
         $from_ip = $ENV{'REMOTE_ADDR'};  
     }  
     return $from_ip;  
 }  
   
 # ------------------------------------------------------------- Declutters URLs  # ------------------------------------------------------------- Declutters URLs
   
 sub declutter {  sub declutter {
Line 13677  sub clutter { Line 13284  sub clutter {
 # &logthis("Got a blank emb style");  # &logthis("Got a blank emb style");
     }      }
  }   }
     } elsif ($thisfn =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {  
         $thisfn='/adm/wrapper'.$thisfn;  
     }      }
     return $thisfn;      return $thisfn;
 }  }

Removed from v.1.1172.2.118.2.21  
changed lines
  Added in v.1.1172.2.119


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>