--- loncom/interface/lontiny.pm 2018/04/14 02:29:44 1.2 +++ loncom/interface/lontiny.pm 2019/01/27 15:44:18 1.6 @@ -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.2 2018/04/14 02:29:44 raeburn Exp $ +# $Id: lontiny.pm,v 1.6 2019/01/27 15:44:18 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); @@ -42,7 +44,9 @@ sub handler { my $r = shift; my %user; my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user); - if ($handle ne '') { + 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,61 +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'); + 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 $update; + # Check if course needs to be re-initialized + my $loncaparev = $r->dir_config('lonVersion'); + my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); + 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; + } + } } 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; + 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; + } } } } - } - my @allposs = keys(%possroles); - 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; } } } @@ -276,13 +382,16 @@ ENDJS sub generic_error { my ($r) = @_; - my $linktext; - if ($env{'user.adv'}) { - $linktext = &mt('Continue to your roles page'); - } else { - $linktext = &mt('Continue to your courses page'); + my $continuelink; + unless ($env{'request.lti.login'}) { + my $linktext; + if ($env{'user.adv'}) { + $linktext = &mt('Continue to your roles page'); + } else { + $linktext = &mt('Continue to your courses page'); + } + $continuelink=''.$linktext.''; } - my $continuelink=''.$linktext.''; my $msg = &mt('The page you requested does not exist.'); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header;