# The LearningOnline Network with CAPA # 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 $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::lontiny; use strict; use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon; use Apache::lonhtmlcommon; use Apache::lonroles; use Apache::lonlocal; use LONCAPA qw(:DEFAULT :match); sub handler { my $r = shift; my %user; my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user); if ($handle ne '') { if ($r->uri =~ m{^/tiny/($match_domain)/(\w+)$}) { my ($cdom,$key) = ($1,$2); if (&Apache::lonnet::domain($cdom) ne '') { my $configuname = &Apache::lonnet::get_domainconfiguser($cdom); my $tinyurl; my ($result,$cached)=&Apache::lonnet::is_cached_new('tiny',$cdom."\0".$key); if (defined($cached)) { $tinyurl = $result; } else { 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) { my ($cnum,$symb) = split(/\&/,$tinyurl); 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; } } } } 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; } } } } 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)$/,@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); } } return OK; } } } } } &generic_error($r); return OK; } else { return FORBIDDEN; } } sub do_redirect { my ($r,$destination) = @_; my $windowname = 'loncapaclient'; if ($env{'request.lti.login'}) { $windowname .= 'lti'; } my $header = ''; my $args = {'bread_crumbs' => [{'href' => '','text' => 'Role initialization'},],}; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print(&Apache::loncommon::start_page('Valid link',$header,$args). &Apache::lonhtmlcommon::scripttag('self.name="'.$windowname.'";'). '

'.&mt('Welcome').'

'. '

'.&mt('Welcome to the Learning[_1]Online[_2] Network with CAPA. Please wait while your session is being set up.','','').'

'. ''.&mt('Continue').'

'. &Apache::loncommon::end_page()); return; } sub show_roles { my ($r,$crsenv,$possroles,$hassection,$hascustom) = @_; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; my ($crsdesc,$crstype,$cdom,$cnum,$header,$title,$preamble,$datatable,$js,$args); if (ref($crsenv) eq 'HASH') { $crsdesc = $crsenv->{'description'}; $crstype = $crsenv->{'type'}; $cdom = $crsenv->{'domain'}; $cnum = $crsenv->{'num'}; } if ($crstype eq '') { $crstype = 'Course'; } my $lc_crstype = lc($crstype); if ($crsdesc ne '') { $header = &mt("The page you requested belongs to the following $lc_crstype: [_1]", ''.$crsdesc.''); } if (ref($possroles) eq 'HASH') { if (keys(%{$possroles}) > 0) { $args = {'bread_crumbs' => [{'href' => '','text' => "Choose role in $lc_crstype"},],}; $title = 'Choose a role'; #Do not localize. if ($crstype eq 'Community') { $preamble = &mt('You have the following active roles in this community:'); } else { $preamble = &mt('You have the following active roles in this course:'); } $datatable = '
'. ''. ''. ''. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('User role').''; if ($hassection) { $datatable .= ''.&mt('Section').''; } if ($hascustom) { $datatable .= ''.&mt('Information').''; } $datatable .= &Apache::loncommon::end_data_table_header_row(); my @available = sort(keys(%{$possroles})); foreach my $role ('ad','in','ta','ep','st','cr') { foreach my $key (@available) { if ($key =~ m{^$role($|/)}) { my $trolecode = "$key./$cdom/$cnum"; my $rolename = &Apache::lonnet::plaintext($key,$crstype,$cdom.'_'.$cnum); my $sec = $possroles->{$key}; if ($sec ne '') { $trolecode .= '/'.$sec; } my $buttonname=$trolecode; $buttonname=~s/\W//g; $datatable .= &Apache::loncommon::start_data_table_row(). ''; if ($key =~ /^cr\//) { my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$key); $datatable .= ''.$rolename.''; if ($hassection) { $datatable .= ''.$sec.''; } $datatable.= ''. &mt('Custom role defined by [_1]',$rauthor.':'.$rdomain). ''; } else { if ($hassection) { $datatable .= ''.$rolename.''; if ($hascustom) { $datatable .= ''.$sec.''; } else { $datatable .= ''.$sec.''; } } elsif ($hascustom) { $datatable .= ''.$rolename.''; } else { $datatable .= ''.$rolename.''; } } $datatable .= &Apache::loncommon::end_data_table_row(); } } } $datatable .= &Apache::loncommon::end_data_table(). ''; my $standby = &mt('Role selected. Please stand by.'); $js = <<"ENDJS"; ENDJS } else { $title = 'No active role'; $preamble = &mt("You have no active roles in this $lc_crstype so the page is currently unavailable to you."); $args = {'bread_crumbs' => [{'href' => '','text' => 'Role status'},],}; } } &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print(&Apache::loncommon::start_page($title,$js,$args). '

'.$header.'

'. '
'.$preamble.'
'. $datatable. &Apache::loncommon::end_page()); return; } sub generic_error { my ($r) = @_; 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 $msg = &mt('The page you requested does not exist.'); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; my $args = {'bread_crumbs' => [{'href' => '','text' => 'Link status'},],}; $r->print(&Apache::loncommon::start_page('Invalid URL',undef,$args). '
'.$msg.'
'. '

'.$continuelink.'

'. &Apache::loncommon::end_page()); return; } 1;