version 1.16, 2022/07/08 03:05:18
|
version 1.23, 2024/11/17 04:48:15
|
Line 68 sub handler {
|
Line 68 sub handler {
|
my $chome = &Apache::lonnet::homeserver($cnum,$cdom); |
my $chome = &Apache::lonnet::homeserver($cnum,$cdom); |
if ($chome ne 'no_host') { |
if ($chome ne 'no_host') { |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['ttoken']); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['ttoken']); |
my ($linkprot,$linkprotuser,$linkprotexit,$ltoken); |
my ($linkprot,$linkprotuser,$linkprotexit,$ltoken,$linkprotpbid,$linkprotpburl); |
if ($env{'form.ttoken'}) { |
if ($env{'form.ttoken'}) { |
my %link_info = &Apache::lonnet::tmpget($env{'form.ttoken'}); |
my %link_info = &Apache::lonnet::tmpget($env{'form.ttoken'}); |
if ($link_info{'origurl'} eq $r->uri) { |
if ($link_info{'origurl'} eq $r->uri) { |
Line 78 sub handler {
|
Line 78 sub handler {
|
$linkprot = $ltoken_info{'linkprot'}; |
$linkprot = $ltoken_info{'linkprot'}; |
$linkprotuser = $ltoken_info{'linkprotuser'}; |
$linkprotuser = $ltoken_info{'linkprotuser'}; |
$linkprotexit = $ltoken_info{'linkprotexit'}; |
$linkprotexit = $ltoken_info{'linkprotexit'}; |
|
$linkprotpbid = $ltoken_info{'linkprotpbid'}; |
|
$linkprotpburl = $ltoken_info{'linkprotpburl'}; |
} elsif ($link_info{'linkprot'}) { |
} elsif ($link_info{'linkprot'}) { |
$linkprot = $link_info{'linkprot'}; |
$linkprot = $link_info{'linkprot'}; |
if ($link_info{'linkprotuser'}) { |
if ($link_info{'linkprotuser'}) { |
Line 86 sub handler {
|
Line 88 sub handler {
|
if ($link_info{'linkprotexit'}) { |
if ($link_info{'linkprotexit'}) { |
$linkprotexit = $link_info{'linkprotexit'}; |
$linkprotexit = $link_info{'linkprotexit'}; |
} |
} |
|
if ($link_info{'linkprotpbid'}) { |
|
$linkprotpbid = $link_info{'linkprotpbid'}; |
|
} |
|
if ($link_info{'linkprotpburl'}) { |
|
$linkprotpburl = $link_info{'linkprotpburl'}; |
|
} |
} |
} |
} |
} |
} |
} |
if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { |
if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { |
# Check for ttoken |
# Check for ttoken |
my $newlauncher = &launch_check($r->uri,$symb); |
my $newlauncher = &launch_check($r->uri,$symb,$cdom,$cnum); |
my ($map,$resid,$url) = &Apache::lonnet::decode_symb($symb); |
my ($map,$resid,$url) = &Apache::lonnet::decode_symb($symb); |
if (&Apache::lonnet::is_on_map($url)) { |
if (&Apache::lonnet::is_on_map($url)) { |
my $realuri; |
my $realuri; |
Line 118 sub handler {
|
Line 126 sub handler {
|
$realuri .= '?symb='.$symb; |
$realuri .= '?symb='.$symb; |
} |
} |
} |
} |
my $update; |
my ($update,$reinitresult); |
# Check if course needs to be re-initialized |
# Check if course needs to be re-initialized |
if ($newlauncher) { |
if ($newlauncher) { |
$update = 1; |
$update = 1; |
} else { |
} else { |
my $loncaparev = $r->dir_config('lonVersion'); |
my $loncaparev = $r->dir_config('lonVersion'); |
my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); |
($reinitresult,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); |
if ($result eq 'update') { |
if (($reinitresult eq 'main') || ($reinitresult eq 'both')) { |
$update = 1; |
$update = 1; |
} elsif (!-e $env{'request.course.fn'}.'.db') { |
} elsif (!-e $env{'request.course.fn'}.'.db') { |
$update = 1; |
$update = 1; |
Line 155 sub handler {
|
Line 163 sub handler {
|
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
} |
} |
|
if (($reinitresult eq 'both') || ($reinitresult eq 'supp')) { |
|
my $possdel; |
|
if ($reinitresult eq 'supp') { |
|
$possdel = 1; |
|
} |
|
my ($supplemental,$refs_updated) = &Apache::loncommon::get_supplemental($cnum,$cdom,'',$possdel); |
|
unless ($refs_updated) { |
|
&Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental,$possdel); |
|
} |
|
} |
my $host = $r->headers_in->get('Host'); |
my $host = $r->headers_in->get('Host'); |
if (!$host) { |
if (!$host) { |
$r->internal_redirect($realuri); |
$r->internal_redirect($realuri); |
Line 237 sub handler {
|
Line 255 sub handler {
|
} |
} |
} |
} |
if (@allposs == 0) { |
if (@allposs == 0) { |
&show_roles($r,\%crsenv,\%active,'','',\%future,\%expired,$linkprot,$linkprotuser,$linkprotexit,$ltoken); |
&show_roles($r,\%crsenv,\%active,'','',\%future,\%expired,$linkprot,$linkprotuser, |
|
$linkprotexit,$linkprotpbid,$linkprotpburl,$ltoken); |
} elsif (@allposs == 1) { |
} elsif (@allposs == 1) { |
my $newrole = "$allposs[0]./$cdom/$cnum"; |
my $newrole = "$allposs[0]./$cdom/$cnum"; |
$newrole = "$allposs[0]./$cdom/$cnum"; |
$newrole = "$allposs[0]./$cdom/$cnum"; |
Line 288 sub handler {
|
Line 307 sub handler {
|
} |
} |
|
|
sub launch_check { |
sub launch_check { |
my ($linkuri,$symb) = @_; |
my ($linkuri,$symb,$cdom,$cnum) = @_; |
my ($linkprotector,$linkproturi,$linkprotexit,$linkkey,$newlauncher); |
my ($linkprotector,$linkproturi,$linkprotexit,$linkprotpbid,$linkprotpburl, |
|
$linkkey,$newlauncher,$prevlaunch); |
if ($env{'form.ttoken'}) { |
if ($env{'form.ttoken'}) { |
my %link_info = &Apache::lonnet::tmpget($env{'form.ttoken'}); |
my %link_info = &Apache::lonnet::tmpget($env{'form.ttoken'}); |
&Apache::lonnet::tmpdel($env{'form.ttoken'}); |
&Apache::lonnet::tmpdel($env{'form.ttoken'}); |
Line 330 sub launch_check {
|
Line 350 sub launch_check {
|
if ($link_info{'linkprotexit'}) { |
if ($link_info{'linkprotexit'}) { |
$linkprotexit = $link_info{'linkprotexit'}; |
$linkprotexit = $link_info{'linkprotexit'}; |
} |
} |
|
if ($link_info{'linkprotpbid'}) { |
|
$linkprotpbid = $link_info{'linkprotpbid'}; |
|
} |
|
if ($link_info{'linkprotpburl'}) { |
|
$linkprotpburl = $link_info{'linkprotpburl'}; |
|
} |
} elsif ($link_info{'linkkey'} ne '') { |
} elsif ($link_info{'linkkey'} ne '') { |
$linkkey = $link_info{'linkkey'}; |
$linkkey = $link_info{'linkkey'}; |
my $keyedlinkuri = $linkuri; |
my $keyedlinkuri = $linkuri; |
Line 355 sub launch_check {
|
Line 381 sub launch_check {
|
if ($link_info{'checklaunch'}) { |
if ($link_info{'checklaunch'}) { |
$newlauncher = 1; |
$newlauncher = 1; |
} |
} |
|
if ($link_info{'prevlaunch'} ne '') { |
|
$prevlaunch = $link_info{'prevlaunch'}; |
|
} |
} |
} |
my $currdeeplinklogin = $env{'request.deeplink.login'}; |
my $currdeeplinklogin = $env{'request.deeplink.login'}; |
my $deeplink; |
my $deeplink; |
Line 403 sub launch_check {
|
Line 432 sub launch_check {
|
if ($env{'request.linkprotexit'} ne '') { |
if ($env{'request.linkprotexit'} ne '') { |
&Apache::lonnet::delenv('request.linkprotexit'); |
&Apache::lonnet::delenv('request.linkprotexit'); |
} |
} |
|
if ($env{'request.linkprotpbid'} ne '') { |
|
&Apache::lonnet::delenv('request.linkprotpbid'); |
|
} |
|
if ($env{'request.linkprotpburl'} ne '') { |
|
&Apache::lonnet::delenv('request.linkprotpburl'); |
|
} |
} |
} |
} else { |
} else { |
unless ($currdeeplinklogin eq $linkuri) { |
unless ($currdeeplinklogin eq $linkuri) { |
if (($linkprotector) || ($linkkey ne '')) { |
if (($linkprotector) || ($linkkey ne '')) { |
if ($linkprotector) { |
$newlauncher = 1; |
&Apache::lonnet::appenv({'request.linkprot' => $linkprotector.':'.$linkproturi}); |
} |
} elsif ($env{'request.linkprot'}) { |
} |
&Apache::lonnet::delenv('request.linkprot'); |
if ($linkprotector) { |
} |
&Apache::lonnet::appenv({'request.linkprot' => $linkprotector.':'.$linkproturi}); |
|
if ($linkprotpburl && $linkprotpbid) { |
|
my ($res,$error) = &store_passback_info($cdom,$cnum,$linkuri,$linkprotector, |
|
$scope,$symb,$linkprotpbid,$linkprotpburl, |
|
$currdeeplinklogin); |
|
} |
|
} elsif ($env{'request.linkprot'}) { |
|
&Apache::lonnet::delenv('request.linkprot'); |
|
} |
|
if ($linkkey ne '') { |
|
&Apache::lonnet::appenv({'request.linkkey' => $linkkey}); |
|
} elsif ($env{'request.linkkey'} ne '') { |
|
&Apache::lonnet::delenv('request.linkkey'); |
|
} |
|
if (($linkprotector) || ($linkkey ne '')) { |
|
if ($linkprotexit ne $env{'request.linkprotexit'}) { |
if ($linkprotexit) { |
if ($linkprotexit) { |
&Apache::lonnet::appenv({'request.linkprotexit' => $linkprotexit}); |
&Apache::lonnet::appenv({'request.linkprotexit' => $linkprotexit}); |
} elsif ($env{'request.linkprotexit'}) { |
} elsif ($env{'request.linkprotexit'}) { |
&Apache::lonnet::delenv('request.linkprotexit'); |
&Apache::lonnet::delenv('request.linkprotexit'); |
} |
} |
if ($linkkey ne '') { |
} |
&Apache::lonnet::appenv({'request.linkkey' => $linkkey}); |
if ($linkprotpbid ne $env{'request.linkprotpbid'}) { |
} elsif ($env{'request.linkkey'} ne '') { |
if ($linkprotpbid) { |
&Apache::lonnet::delenv('request.linkkey'); |
&Apache::lonnet::appenv({'request.linkprotpbid' => $linkprotpbid}); |
|
} elsif ($env{'request.linkprotpbid'}) { |
|
&Apache::lonnet::delenv('request.linkprotpbid'); |
|
} |
|
} |
|
if ($linkprotpburl ne $env{'request.linkprotpburl'}) { |
|
if ($linkprotpburl) { |
|
&Apache::lonnet::appenv({'request.linkprotpburl' => $linkprotpburl}); |
|
} elsif ($env{'request.linkprotpburl'}) { |
|
&Apache::lonnet::delenv('request.linkprotpburl'); |
|
} |
|
} |
|
} elsif ($prevlaunch) { |
|
foreach my $requestkey ('linkprotpbid','linkprotpburl','linkprotexit') { |
|
if ($env{"request.$requestkey"}) { |
|
&Apache::lonnet::delenv("request.$requestkey"); |
} |
} |
$newlauncher = 1; |
|
} |
} |
} |
} |
&Apache::lonnet::appenv({'request.deeplink.login' => $linkuri}); |
&Apache::lonnet::appenv({'request.deeplink.login' => $linkuri}); |
Line 443 sub launch_check {
|
Line 507 sub launch_check {
|
} elsif ($env{'request.linkprotexit'}) { |
} elsif ($env{'request.linkprotexit'}) { |
&Apache::lonnet::delenv('request.linkprotexit'); |
&Apache::lonnet::delenv('request.linkprotexit'); |
} |
} |
|
if ($linkprotpbid) { |
|
&Apache::lonnet::appenv({'request.linkprotpbid' => $linkprotpbid}); |
|
} elsif ($env{'request.linkprotpbid'}) { |
|
&Apache::lonnet::delenv('request.linkprotpbid'); |
|
} |
|
if ($linkprotpburl) { |
|
&Apache::lonnet::appenv({'request.linkprotpburl' => $linkprotpburl}); |
|
} elsif ($env{'request.linkprotpburl'}) { |
|
&Apache::lonnet::delenv('request.linkprotpburl'); |
|
} |
if ($linkkey ne '') { |
if ($linkkey ne '') { |
&Apache::lonnet::appenv({'request.linkkey' => $linkkey}); |
&Apache::lonnet::appenv({'request.linkkey' => $linkkey}); |
} else { |
} else { |
Line 456 sub launch_check {
|
Line 530 sub launch_check {
|
return $newlauncher; |
return $newlauncher; |
} |
} |
|
|
|
# |
|
# Store linkprotpburl and linkprotpbid in user's nohist_$cid_linkprot_pb.db |
|
# $linkuri\0$linkprotector\0$scope = [$linkprotpbid,$linkprotpburl] |
|
# Separately store $symb in course's nohist_linkprot_passback.db |
|
# which should trigger passback: |
|
# $symb => {$linkuri\0$linkprotector\0$scope => 1}; |
|
# |
|
|
|
sub store_passback_info { |
|
my ($cdom,$cnum,$linkuri,$linkprotector,$scope,$symb, |
|
$linkprotpbid,$linkprotpburl,$currdeeplinklogin) = @_; |
|
my $key = join("\0",($linkuri,$linkprotector,$scope)); |
|
my $namespace = 'nohist_'.$cdom.'_'.$cnum.'_linkprot_pb'; |
|
if ($linkuri eq $currdeeplinklogin) { |
|
my %pbinfo = &Apache::lonnet::get($namespace,[$key]); |
|
if (ref($pbinfo{$key}) eq 'ARRAY') { |
|
if (($pbinfo{$key}[0] eq $linkprotpbid) && |
|
($pbinfo{$key}[1] eq $linkprotpburl)) { |
|
return ('ok'); |
|
} |
|
} |
|
} |
|
my $now = time; |
|
my $result = &Apache::lonnet::cput($namespace,{$key => [$linkprotpbid,$linkprotpburl]}); |
|
my $error; |
|
if (($result eq 'ok') || ($result eq 'con_delayed')) { |
|
$namespace = 'nohist_linkprot_passback'; |
|
my %triggers = &Apache::lonnet::get($namespace,[$symb],$cdom,$cnum); |
|
my $newtrigger; |
|
if ((exists($triggers{$symb})) && (ref($triggers{$symb}) eq 'HASH')) { |
|
unless (exists($triggers{$symb}{$key})) { |
|
$newtrigger = 1; |
|
} |
|
} else { |
|
$newtrigger = 1; |
|
} |
|
if ($newtrigger) { |
|
my ($lockhash,$tries,$gotlock); |
|
$lockhash = { |
|
lock => $env{'user.name'}. |
|
':'.$env{'user.domain'}, |
|
}; |
|
$tries = 0; |
|
$gotlock = &Apache::lonnet::newput($namespace,$lockhash,$cdom,$cnum); |
|
while (($gotlock ne 'ok') && ($tries<10)) { |
|
$tries ++; |
|
sleep (0.1); |
|
$gotlock = &Apache::lonnet::newput($namespace,$lockhash,$cdom,$cnum); |
|
} |
|
if ($gotlock eq 'ok') { |
|
%triggers = &Apache::lonnet::get($namespace,[$symb],$cdom,$cnum); |
|
$triggers{$symb}{$key} = 1; |
|
$result = &Apache::lonnet::cput($namespace,{$symb => $triggers{$symb}},$cdom,$cnum); |
|
my $dellockoutcome = &Apache::lonnet::del($namespace,['lock'],$cdom,$cnum); |
|
} else { |
|
$error = 'nolock'; |
|
} |
|
} |
|
} |
|
return ($result,$error); |
|
} |
|
|
sub do_redirect { |
sub do_redirect { |
my ($r,$destination,$linkprot) = @_; |
my ($r,$destination,$linkprot) = @_; |
my $windowname = 'loncapaclient'; |
my $windowname = 'loncapaclient'; |
Line 485 sub do_redirect {
|
Line 621 sub do_redirect {
|
} |
} |
|
|
sub show_roles { |
sub show_roles { |
my ($r,$crsenv,$possroles,$hassection,$hascustom,$futureroles,$expiredroles,$linkprot,$linkprotuser,$linkprotexit,$ltoken) = @_; |
my ($r,$crsenv,$possroles,$hassection,$hascustom,$futureroles,$expiredroles, |
|
$linkprot,$linkprotuser,$linkprotexit,$linkprotpbid,$linkprotpburl,$ltoken) = @_; |
my ($crsdesc,$crstype,$cdom,$cnum,$header,$title,$preamble,$datatable,$js,$args); |
my ($crsdesc,$crstype,$cdom,$cnum,$header,$title,$preamble,$datatable,$js,$args); |
if (ref($crsenv) eq 'HASH') { |
if (ref($crsenv) eq 'HASH') { |
$crsdesc = $crsenv->{'description'}; |
$crsdesc = $crsenv->{'description'}; |
Line 626 ENDJS
|
Line 763 ENDJS
|
origurl => $r->uri, |
origurl => $r->uri, |
linkprot => $linkprot, |
linkprot => $linkprot, |
linkprotexit => $linkprotexit, |
linkprotexit => $linkprotexit, |
|
linkprotpbid => $linkprotpbid, |
|
linkprotpburl => $linkprotpburl, |
); |
); |
my $token = |
my $token = |
&Apache::lonnet::tmpput(\%data,$r->dir_config('lonHostID'),'retry'); |
&Apache::lonnet::tmpput(\%data,$r->dir_config('lonHostID'),'retry'); |