[LON-CAPA-cvs] cvs: loncom / lontrans.pm /interface lontiny.pm

raeburn raeburn at source.lon-capa.org
Sat Jan 19 21:42:41 EST 2019


raeburn		Sun Jan 20 02:42:41 2019 EDT

  Modified files:              
    /loncom	lontrans.pm 
    /loncom/interface	lontiny.pm 
  Log:
  - Bug 6400 Tiny URL for deep-linking.
    - For user's with an existing active session URL translation of deep link
      (i.e., /tiny/$domain/$uniqkey) moved from PerlTransHandler (lontrans.pm)
      to lontiny.pm.
    - Checks made to see if course session needs updating, and if so,
      lonuserstate::readmap() is called for top-level map.
  
  
-------------- next part --------------
Index: loncom/lontrans.pm
diff -u loncom/lontrans.pm:1.24 loncom/lontrans.pm:1.25
--- loncom/lontrans.pm:1.24	Thu Jul 26 19:01:25 2018
+++ loncom/lontrans.pm	Sun Jan 20 02:42:35 2019
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # URL translation for User Files
 #
-# $Id: lontrans.pm,v 1.24 2018/07/26 19:01:25 raeburn Exp $
+# $Id: lontrans.pm,v 1.25 2019/01/20 02:42:35 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -29,88 +29,16 @@
 package Apache::lontrans;
 
 use strict;
-use Apache::Constants qw(:common :remotehost REDIRECT :http);
+use Apache::Constants qw(:common :remotehost REDIRECT);
 use Apache::lonnet;
 use Apache::File();
 use LONCAPA qw(:DEFAULT :match);
 
 sub handler {
     my $r = shift;
-    # FIXME line remove when mod_perl fixes BUG#4948 
+    # FIXME line remove when mod_perl fixes BUG#4948
     $r->notes->set('error-notes' => '');
-    if ($r->uri =~ m{^/+tiny/+($match_domain)/+(\w+)$}) {
-        my ($cdom,$key) = ($1,$2);
-        if (&Apache::lonnet::domain($cdom) ne '') {
-            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 ($env{'request.course.id'}) {
-                    my $tinyurl;
-                    my ($result,$cached)=&Apache::lonnet::is_cached_new('tiny',$cdom."\0".$key);
-                    if (defined($cached)) {
-                        $tinyurl = $result;
-                    } else {
-                        my $configuname = &Apache::lonnet::get_domainconfiguser($cdom);
-                        my %currtiny = &Apache::lonnet::get('tiny',[$key],$cdom,$configuname);
-                        if ($currtiny{$key} ne '') {
-                            $tinyurl = $currtiny{$key};
-                            &Apache::lonnet::do_cache_new('tiny',$cdom."\0".$key,$currtiny{$key},600);
-                        }
-                    }
-                    if ($tinyurl ne '') {
-                        my ($cnum,$symb) = split(/\&/,$tinyurl);
-                        if (($cnum =~ /^$match_courseid$/) &&
-                            (&Apache::lonnet::homeserver($cnum,$cdom) ne 'no_host')) {
-                            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 $host = $r->headers_in->get('Host');
-                                    if ($r->is_initial_req() || !$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;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    } elsif ($r->uri=~m{^/raw/}) {
+    if ($r->uri=~m{^/raw/}) {
         my $host = $r->headers_in->get('Host');
         if ($host) {
             unless ($host =~ /^internal\-/) {
Index: loncom/interface/lontiny.pm
diff -u loncom/interface/lontiny.pm:1.4 loncom/interface/lontiny.pm:1.5
--- loncom/interface/lontiny.pm:1.4	Sun Jul  1 00:03:44 2018
+++ loncom/interface/lontiny.pm	Sun Jan 20 02:42:41 2019
@@ -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::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 @@
     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 @@
                     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 $update;
+                                    # Check if course needs to be re-initialized
+                                    my $loncaparev = $r->dir_config('lonVersion');
+                                    my ($result, at 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;
+                                    }
                                 }
-                            }
-                            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'});
+                            } 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;
+                                            }
+                                        }
                                     }
                                 }
-                                if ($env{'form.selectrole'}) {
-                                    foreach my $role (@allposs) {
-                                        my $newrole = "$role./$cdom/$cnum";
-                                        if ($possroles{$allposs[0]} ne '') {
-                                            $newrole .= "/$possroles{$role}";
+                                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.$newrole"}) {
-                                            my $destination .= '/adm/roles?selectrole=1&'.$newrole.'=1'.
-                                                               '&destinationurl='.&HTML::Entities::encode($r->uri);
-                                            if ($env{'form.ltitarget'} eq 'iframe') {
-                                                $destination .= '&ltitarget=iframe';
+                                    }
+                                    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 .= '&ltitarget=iframe';
+                                                }
+                                                &do_redirect($r,$destination);
+                                                return OK;
                                             }
-                                            &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 $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)$/, at 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\//, at allposs)) {
-                                        $hascustom = 1;
+                                } elsif (keys(%possroles) > 1) {
+                                    if (grep(/^(cc|co)$/, at 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\//, at allposs)) {
+                                            $hascustom = 1;
+                                        }
+                                        &show_roles($r,\%crsenv,\%possroles,$hassection,$hascustom);
                                     }
-                                    &show_roles($r,\%crsenv,\%possroles,$hassection,$hascustom);
                                 }
+                                return OK;
                             }
-                            return OK;
                         }
                     }
                 }


More information about the LON-CAPA-cvs mailing list