--- loncom/interface/lontiny.pm 2018/07/01 00:03:44 1.4 +++ loncom/interface/lontiny.pm 2019/01/20 02:42:41 1.5 @@ -2,7 +2,7 @@ # Extract domain, courseID, and symb from a shortened URL, # and switch role to a role in designated course. # -# $Id: lontiny.pm,v 1.4 2018/07/01 00:03:44 raeburn Exp $ +# $Id: lontiny.pm,v 1.5 2019/01/20 02:42:41 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,6 +35,8 @@ use Apache::lonnet; use Apache::loncommon; use Apache::lonhtmlcommon; use Apache::lonroles; +use Apache::lonuserstate; +use Apache::lonnavmaps; use Apache::lonlocal; use LONCAPA qw(:DEFAULT :match); @@ -43,6 +45,8 @@ sub handler { my %user; my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user); if ($handle ne '') { + my $lonidsdir=$r->dir_config('lonIDsDir'); + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle); if ($r->uri =~ m{^/tiny/($match_domain)/(\w+)$}) { my ($cdom,$key) = ($1,$2); if (&Apache::lonnet::domain($cdom) ne '') { @@ -63,87 +67,163 @@ sub handler { if ($cnum =~ /^$match_courseid$/) { my $chome = &Apache::lonnet::homeserver($cnum,$cdom); if ($chome ne 'no_host') { - my %crsenv = &Apache::lonnet::coursedescription("$cdom/$cnum"); - my @possroles = ('in','ta','ep','st','cr','ad'); - if ($crsenv{'type'} eq 'Community') { - unshift(@possroles,'co'); - } else { - unshift(@possroles,'cc'); - } - my %roleshash = &Apache::lonnet::get_my_roles($env{'user.uname'}, - $env{'user.domain'}, - 'userroles',undef, - \@possroles,[$cdom],1); - my (%possroles,$hassection); - if (keys(%roleshash)) { - foreach my $entry (keys(%roleshash)) { - if ($entry =~ /^\Q$cnum:$cdom:\E([^:]+):([^:]*)$/) { - $possroles{$1} = $2; - if ($2 ne '') { - $hassection = 1; + if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { + my ($map,$resid,$url) = &Apache::lonnet::decode_symb($symb); + if (&Apache::lonnet::is_on_map($url)) { + my $realuri; + if ((&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) && + (!$env{'request.role.adv'})) { + $env{'user.error.msg'}=$r->uri.':bre:1:1:Access to resource denied'; + return HTTP_NOT_ACCEPTABLE; + } + if ((&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i) && + (!$env{'request.role.adv'})) { + $realuri = &Apache::lonenc::encrypted(&Apache::lonnet::clutter($url)); + if (($url =~ /\.sequence$/) && + ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { + $realuri .= '?navmap=1'; + } else { + $realuri .= '?symb='.&Apache::lonenc::encrypted($symb); + } + } else { + $realuri = &Apache::lonnet::clutter($url); + if (($url =~ /\.sequence$/) && + ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { + $realuri .= '?navmap=1'; + } else { + $realuri .= '?symb='.$symb; } } - } - } - my @allposs = keys(%possroles); - if ($env{'request.lti.login'}) { - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); - if ($env{'request.lti.target'} eq '') { - if ($env{'form.ltitarget'} eq 'iframe') { - &Apache::lonnet::appenv({'request.lti.target' => 'iframe'}); - delete($env{'form.ltitarget'}); + my $update; + # Check if course needs to be re-initialized + my $loncaparev = $r->dir_config('lonVersion'); + my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev,20); + if ($result eq 'update') { + $update = 1; + } elsif (!-e $env{'request.course.fn'}.'.db') { + $update = 1; + } elsif (!$env{'request.role.adv'}) { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my $res = $navmap->getBySymb($symb); + if (ref($res)) { + my ($enc_in_bighash,$enc_in_parm); + $enc_in_bighash = $res->encrypted(); + if (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i) { + $enc_in_parm = 1; + } + if ($enc_in_bighash ne $enc_in_parm) { + $update = 1; + } + } + } + } + if ($update) { + my ($furl,$ferr)= + &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + if ($ferr) { + $env{'user.error.msg'}=$r->uri.':bre:0:0:Course not initialized'; + $env{'user.reinit'} = 1; + return HTTP_NOT_ACCEPTABLE; + } + } + my $host = $r->headers_in->get('Host'); + if (!$host) { + $r->internal_redirect($realuri); + return OK; + } else { + my $protocol = 'http'; + if ($r->get_server_port == 443) { + $protocol = 'https'; + } + my $location = $protocol.'://'.$host.$realuri; + $r->headers_out->set(Location => $location); + return REDIRECT; } } - if ($env{'form.selectrole'}) { - foreach my $role (@allposs) { - my $newrole = "$role./$cdom/$cnum"; - if ($possroles{$allposs[0]} ne '') { - $newrole .= "/$possroles{$role}"; - } - if ($env{"form.$newrole"}) { - my $destination .= '/adm/roles?selectrole=1&'.$newrole.'=1'. - '&destinationurl='.&HTML::Entities::encode($r->uri); - if ($env{'form.ltitarget'} eq 'iframe') { - $destination .= '<itarget=iframe'; + } else { + my %crsenv = &Apache::lonnet::coursedescription("$cdom/$cnum"); + my @possroles = ('in','ta','ep','st','cr','ad'); + if ($crsenv{'type'} eq 'Community') { + unshift(@possroles,'co'); + } else { + unshift(@possroles,'cc'); + } + my %roleshash = &Apache::lonnet::get_my_roles($env{'user.uname'}, + $env{'user.domain'}, + 'userroles',undef, + \@possroles,[$cdom],1); + my (%possroles,$hassection); + if (keys(%roleshash)) { + foreach my $entry (keys(%roleshash)) { + if ($entry =~ /^\Q$cnum:$cdom:\E([^:]+):([^:]*)$/) { + $possroles{$1} = $2; + if ($2 ne '') { + $hassection = 1; } - &do_redirect($r,$destination); - return OK; } } } - } - if (@allposs == 0) { - &show_roles($r,\%crsenv,\%possroles); - } elsif (@allposs == 1) { - my $newrole = "$allposs[0]./$cdom/$cnum"; - $newrole = "$allposs[0]./$cdom/$cnum"; - if ($possroles{$allposs[0]} ne '') { - $newrole .= "/$possroles{$allposs[0]}"; + my @allposs = keys(%possroles); + if ($env{'request.lti.login'}) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); + if ($env{'request.lti.target'} eq '') { + if ($env{'form.ltitarget'} eq 'iframe') { + &Apache::lonnet::appenv({'request.lti.target' => 'iframe'}); + delete($env{'form.ltitarget'}); + } + } + if ($env{'form.selectrole'}) { + foreach my $role (@allposs) { + my $newrole = "$role./$cdom/$cnum"; + if ($possroles{$allposs[0]} ne '') { + $newrole .= "/$possroles{$role}"; + } + if ($env{"form.$newrole"}) { + my $destination .= '/adm/roles?selectrole=1&'.$newrole.'=1'. + '&destinationurl='.&HTML::Entities::encode($r->uri); + if ($env{'form.ltitarget'} eq 'iframe') { + $destination .= '<itarget=iframe'; + } + &do_redirect($r,$destination); + return OK; + } + } + } } - my $destination .= '/adm/roles?selectrole=1&'.$newrole.'=1'. - '&destinationurl='.&HTML::Entities::encode($r->uri); - &do_redirect($r,$destination); - } elsif (keys(%possroles) > 1) { - if (grep(/^(cc|co)$/,@allposs)) { - my $newrole; - if (exists($possroles{'cc'})) { - $newrole = 'cc'; - } else { - $newrole = 'co'; + if (@allposs == 0) { + &show_roles($r,\%crsenv,\%possroles); + } elsif (@allposs == 1) { + my $newrole = "$allposs[0]./$cdom/$cnum"; + $newrole = "$allposs[0]./$cdom/$cnum"; + if ($possroles{$allposs[0]} ne '') { + $newrole .= "/$possroles{$allposs[0]}"; } - $newrole .= "./$cdom/$cnum"; my $destination .= '/adm/roles?selectrole=1&'.$newrole.'=1'. '&destinationurl='.&HTML::Entities::encode($r->uri); &do_redirect($r,$destination); - } else { - my $hascustom; - if (grep(/^cr\//,@allposs)) { - $hascustom = 1; + } elsif (keys(%possroles) > 1) { + if (grep(/^(cc|co)$/,@allposs)) { + my $newrole; + if (exists($possroles{'cc'})) { + $newrole = 'cc'; + } else { + $newrole = 'co'; + } + $newrole .= "./$cdom/$cnum"; + my $destination .= '/adm/roles?selectrole=1&'.$newrole.'=1'. + '&destinationurl='.&HTML::Entities::encode($r->uri); + &do_redirect($r,$destination); + } else { + my $hascustom; + if (grep(/^cr\//,@allposs)) { + $hascustom = 1; + } + &show_roles($r,\%crsenv,\%possroles,$hassection,$hascustom); } - &show_roles($r,\%crsenv,\%possroles,$hassection,$hascustom); } + return OK; } - return OK; } } }