Annotation of loncom/auth/lonslotcheck.pm, revision 1.2

1.1       raeburn     1: # Checks slot access settings - disable subsequent 
                      2: # PerlHandlers unless access availble
1.2     ! raeburn     3: # $Id: lonslotcheck.pm,v 1.1 2018/01/31 15:29:07 raeburn Exp $
1.1       raeburn     4: #
                      5: # Copyright Michigan State University Board of Trustees
                      6: #
                      7: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      8: #
                      9: # LON-CAPA is free software; you can redistribute it and/or modify
                     10: # it under the terms of the GNU General Public License as published by
                     11: # the Free Software Foundation; either version 2 of the License, or
                     12: # (at your option) any later version.
                     13: #
                     14: # LON-CAPA is distributed in the hope that it will be useful,
                     15: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     16: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     17: # GNU General Public License for more details.
                     18: #
                     19: # You should have received a copy of the GNU General Public License
                     20: # along with LON-CAPA; if not, write to the Free Software
                     21: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     22: #
                     23: # /home/httpd/html/adm/gpl.txt
                     24: #
                     25: # http://www.lon-capa.org/
                     26: #
                     27: 
                     28: package Apache::lonslotcheck;
                     29: 
                     30: use strict;
                     31: use Apache::lonnet;
                     32: use Apache::lonlocal;
                     33: use Apache::loncommon();
                     34: use Apache::structuretags();
                     35: use Apache::lonhomework();
                     36: use Apache::bridgetask();
                     37: use Apache::Constants qw(:common :http :methods);
                     38: 
                     39: sub handler {
                     40:     my ($r) = @_;
                     41:     if (($r->uri !~ /ext\.tool$/) ||
                     42:         (&Apache::lonnet::EXT('resource.0.gradable',$env{'request.symb'}) =~ /^yes$/i)) {
                     43:         return DECLINED;
                     44:     }
                     45:     my ($symb,$courseid,$udom,$uname) = &Apache::lonnet::whichuser();
                     46:     my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
                     47:     if ($useslots ne 'resource' && $useslots ne 'map'
                     48:         && $useslots ne 'map_map') {
                     49:         return DECLINED;
                     50:     }
                     51:     my ($status,$accessmsg,$slot_name,$slot,$ipused) = 
                     52:         &check_slot_access($symb,$courseid,$udom,$uname);
                     53: 
                     54:     my $output;
                     55:     if ($status eq 'CHECKED_IN') {
                     56:         if ($slot_name ne '') {
                     57:             my $checkin = 'resource.0.checkedin';
                     58:             if (($Apache::lonhomework::history{$checkin}) &&
                     59:                 ($Apache::lonhomework::history{"$checkin.slot"} eq $slot_name)) {
                     60:                 &do_cleanup();
                     61:                 return DECLINED;
                     62:             } else {
                     63:                 my $closedate = &Apache::lonnet::EXT("resource.0.contentclose",$symb,
                     64:                                                      $udom,$uname);
                     65:                 &Apache::structuretags::selfcheckin_resource($closedate,$slot_name,$slot,$symb);
                     66:                 if ($Apache::lonhomework::results{$checkin}) {
                     67:                     &Apache::structuretags::finalize_storage();
                     68:                     &do_cleanup();
                     69:                     return DECLINED;
                     70:                 } else {
                     71:                     $output = '<p class="LC_error">'.&mt('Error during self-checkin to slot').
                     72:                               '</p>';
                     73:                 }
                     74:             }
                     75:         } else {
                     76:             $output = '<p class="LC_error">'.&mt('Error no slot available for self-checkin').
                     77:                           '</p>';
                     78:         }
                     79:     } elsif ($status eq 'NEEDS_CHECKIN') {
                     80:         if (defined($env{'form.submitted'}) && defined($env{'form.validate'})) {
                     81:             if (&Apache::bridgetask::proctor_check_auth($slot_name,$slot)) {
                     82:                 &Apache::structuretags::finalize_storage();
                     83:                 &do_cleanup();
                     84:                 return DECLINED;
                     85:             } else {
                     86:                 $output =  '<p class="LC_error">'.&mt('Check-in failed').'</p>'.
                     87:                            &Apache::bridgetask::proctor_validation_screen($slot);
                     88:             }
                     89:         } else {
                     90:             $output = &Apache::bridgetask::proctor_validation_screen($slot);
                     91:         }
                     92:     } elsif (( $status eq 'NOT_IN_A_SLOT' ) ||
                     93:              ( $status eq 'NOTRESERVABLE') ||
                     94:              ( $status eq 'RESERVABLE') ||
                     95:              ( $status eq 'RESERVABLE_LATER') ||
                     96:              ( $status eq 'NEED_DIFFERENT_IP')) {
                     97:         $output = &Apache::structuretags::access_status_msg('tool',$status,$symb,
                     98:                                                             'web',$ipused,$accessmsg);
                     99:     }
                    100: 
                    101:     $r->set_handlers('PerlHandler'=>undef);
                    102:     &Apache::loncommon::content_type($r,'text/html');
                    103:     $r->send_http_header;
                    104:     if ($r->header_only) {
                    105:         &do_cleanup();
                    106:         return OK;
                    107:     }
                    108: 
1.2     ! raeburn   109:     my $target;
        !           110:     my ($marker,$exttool) = (split(m{/},$r->uri))[4,5];
        !           111:     $marker=~s/\D//g;
        !           112:     if (($marker) && ($exttool) && ($env{'request.course.id'})) {
        !           113:         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
        !           114:         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
        !           115:         my ($idx,$crstool,$is_tool,%toolhash,%toolsettings);
        !           116:         if ($r->uri eq "/adm/$cdom/$cnum/$marker/$exttool") {
        !           117:             my %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum);
        !           118:             $target = $toolsettings{'target'};
        !           119:         }
        !           120:     }
        !           121:     my $args = {'bgcolor'        => '#FFFFFF',
        !           122:                 'force_register' => 1,};
        !           123:     if ($target eq 'iframe') {
        !           124:         $args->{'only_body'} = 1;
        !           125:     }
1.1       raeburn   126:     my $start_page =
1.2     ! raeburn   127:         &Apache::loncommon::start_page('Not Open',undef,$args);
1.1       raeburn   128:     my $end_page =
                    129:         &Apache::loncommon::end_page({'discussion' => 1});
                    130:         $r->print($start_page.$output.$end_page);
                    131:     &do_cleanup();
                    132:     return OK;
                    133: }
                    134: 
                    135: sub check_slot_access {
                    136:     my ($symb,$courseid,$udom,$uname) = @_;
                    137:     &Apache::structuretags::initialize_storage($symb);
                    138:     my $checkin = 'resource.0.checkedin';
                    139:     my $checkedin = $Apache::lonhomework::history{$checkin};
                    140:     my ($returned_slot,$slot_name,$checkinslot,$ipused,$blockip,$now,$ip,
                    141:         $consumed_uniq);
                    142:     $now = time;
                    143:     $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'};
                    144:     if ($checkedin) {
                    145:         $checkinslot = $Apache::lonhomework::history{"$checkin.slot"};
                    146:         my %slot=&Apache::lonnet::get_slot($checkinslot);
                    147:         $consumed_uniq = $slot{'uniqueperiod'};
                    148:         if ($slot{'iptied'}) {
                    149:             $ipused = $Apache::lonhomework::history{"$checkin.ip"};
                    150:             unless (($ip ne '') && ($ipused eq $ip)) {
                    151:                 $blockip = $slot{'iptied'};
                    152:                 $slot_name = $checkinslot;
                    153:                 $returned_slot = \%slot;
                    154:                 return ('NEED_DIFFERENT_IP','',$slot_name,$returned_slot,$ipused);
                    155:             }
                    156:         }
                    157:     }
                    158: 
                    159:     my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent",$symb);
                    160:     my $available = &Apache::lonnet::EXT("resource.0.available",$symb);
                    161:     my @slots= (split(':',$availablestudent),split(':',$available));
                    162: 
                    163:     my $slotstatus='NOT_IN_A_SLOT';
                    164:     my $num_usable_slots = 0;
                    165:     my $datemsg;
                    166: 
                    167:     foreach my $slot (@slots) {
                    168:         $slot =~ s/(^\s*|\s*$)//g;
                    169:         my %slot=&Apache::lonnet::get_slot($slot);
                    170:         next if ($slot{'endtime'} < $now);
                    171:         $num_usable_slots ++;
                    172:         if ($slot{'starttime'} < $now &&
                    173:             $slot{'endtime'} > $now &&
                    174:             &Apache::loncommon::check_ip_acc($slot{'ip'})) {
                    175:             if ($slot{'iptied'}) {
                    176:                 if ($env{'request.course.id'}) {
                    177:                     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    178:                     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    179:                     if ($slot eq $checkinslot) {
                    180:                         if ($ip eq $ipused) {
                    181:                             $slotstatus ='NEEDS_CHECKIN';
                    182:                         } else {
                    183:                             $slotstatus = 'NEED_DIFFERENT_IP';
                    184:                             $slot_name = $slot;
                    185:                             $returned_slot = \%slot;
                    186:                             last;
                    187:                         }
                    188:                     } elsif ($ip) {
                    189:                         my $uniqkey = "$slot\0$symb\0$ip";
                    190:                         my %used_ip = &Apache::lonnet::get('slot_uniqueips',[$uniqkey],$cdom,$cnum);
                    191:                         if ($used_ip{$uniqkey}) {
                    192:                             $slotstatus = 'NEED_DIFFERENT_IP';
                    193:                         } else {
                    194:                             $slotstatus ='NEEDS_CHECKIN';
                    195:                         }
                    196:                     }
                    197:                 }
                    198:             } else {
                    199:                 $slotstatus='NEEDS_CHECKIN';
                    200:             }
                    201:             if ($slotstatus eq 'NEEDS_CHECKIN') {
                    202:                 $returned_slot=\%slot;
                    203:                 $slot_name=$slot;
                    204:                 last;
                    205:             }
                    206:         }
                    207:     }
                    208: 
                    209:     if (($slotstatus eq 'NEEDS_CHECKIN') && (ref($returned_slot) eq 'HASH')) {
                    210:         if (&Apache::lonhomework::proctor_checked_in($slot_name,$returned_slot,'tool')) {
                    211:             $slotstatus = 'CHECKED_IN';
                    212:             return ($slotstatus,$datemsg,$slot_name,$returned_slot,$ipused);
                    213:         }
                    214:     }
                    215: 
                    216:     # Previously used slot is no longer open, and has been checked in.
                    217:     # However, the resource is not closed, and potentially, another slot might be
                    218:     # used to gain access to it, until the content close date is reached.
                    219:     # Therefore return the slotstatus -
                    220:     # (which will be one of: NOT_IN_A_SLOT, RESERVABLE, RESERVABLE_LATER, or NOTRESERVABLE).
                    221: 
                    222:     if (!defined($slot_name)) {
                    223:         if ($slotstatus eq 'NOT_IN_A_SLOT') {
                    224:             if (!$num_usable_slots) {
                    225:                 ($slotstatus,$datemsg) = &Apache::lonhomework::check_reservable_slot($slotstatus,$symb,$now,
                    226:                                                                                      $checkedin,$consumed_uniq);
                    227:             }
                    228:         }
                    229:     }
                    230:     return ($slotstatus,$datemsg,$slot_name,$returned_slot,$ipused);
                    231: }
                    232: 
                    233: sub do_cleanup {
                    234:     undef(%Apache::lonhomework::results);
                    235:     undef(%Apache::lonhomework::history);
                    236: }
                    237: 
                    238: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>