--- loncom/homework/bridgetask.pm 2012/09/12 05:14:09 1.260 +++ loncom/homework/bridgetask.pm 2016/08/31 19:08:18 1.267 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.260 2012/09/12 05:14:09 raeburn Exp $ +# $Id: bridgetask.pm,v 1.267 2016/08/31 19:08:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -83,7 +83,7 @@ sub proctor_check_auth { } } if ($authenticated) { - my $check = &check_in($type,$user,$domain,$slot_name); + my $check = &check_in($type,$user,$domain,$slot_name,$slot->{'iptied'}); if ($check =~ /^error:/) { return 0; } @@ -95,25 +95,30 @@ sub proctor_check_auth { } sub check_in { - my ($type,$user,$domain,$slot_name) = @_; + my ($type,$user,$domain,$slot_name,$needsiptied) = @_; my $useslots = &Apache::lonnet::EXT("resource.0.useslots"); + my $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'}; if ( $useslots eq 'map_map') { - my $result = &check_in_sequence($user,$domain,$slot_name); + my $result = &check_in_sequence($user,$domain,$slot_name,$ip,$needsiptied); if ($result =~ /^error: /) { return $result; } } else { - &create_new_version($type,$user,$domain,$slot_name); - &Apache::structuretags::finalize_storage(); + my ($symb) = &Apache::lonnet::whichuser(); + my $result = &create_new_version($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied); + if ($result eq 'ok') { + &Apache::structuretags::finalize_storage(); + } + return $result; } return 1; } sub check_in_sequence { - my ($user,$domain,$slot_name) = @_; + my ($user,$domain,$slot_name,$ip,$needsiptied) = @_; my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { - return 'error: '; + return 'error: No navmap'; } my ($symb) = &Apache::lonnet::whichuser(); my ($map) = &Apache::lonnet::decode_symb($symb); @@ -122,20 +127,43 @@ sub check_in_sequence { my %old_history = %Apache::lonhomework::history; my %old_results = %Apache::lonhomework::results; + my $errorcount; foreach my $res (@resources) { &Apache::lonxml::debug("doing ".$res->src); &Apache::structuretags::initialize_storage($res->symb); my $type = ($res->is_task()) ? 'Task' : 'problem'; - &create_new_version($type,$user,$domain,$slot_name); - &Apache::structuretags::finalize_storage($res->symb); + my $result = &create_new_version($type,$user,$domain,$slot_name,$res->symb,$ip,$needsiptied); + if ($result eq 'ok') { + &Apache::structuretags::finalize_storage($res->symb); + } else { + $errorcount ++; + } } %Apache::lonhomework::history = %old_history; %Apache::lonhomework::results = %old_results; + if ($errorcount) { + return 'error: IP taken'; + } } sub create_new_version { - my ($type,$user,$domain,$slot_name) = @_; + my ($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied) = @_; + + if ($needsiptied) { + my $uniqkey = "$slot_name\0$symb\0$ip"; + my ($cdom,$cnum); + if ($env{'request.course.id'}) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my %hash = ( + "$slot_name\0$symb\0$ip" => $env{'user.name'}.':'.$env{'user.domain'}, + ); + unless (&Apache::lonnet::newput('slot_uniqueips',\%hash,$cdom,$cnum) eq 'ok') { + return 'error: IP taken'; + } + } + } my $id = '0'; if ($type eq 'Task') { @@ -169,11 +197,13 @@ sub create_new_version { $Apache::lonhomework::results{"resource.$id.checkedin"}= $user.':'.$domain; + $Apache::lonhomework::results{"resource.$id.checkedin.ip"}=$ip; if (defined($slot_name)) { $Apache::lonhomework::results{"resource.$id.checkedin.slot"}= $slot_name; } + return 'ok'; } sub get_version { @@ -252,11 +282,11 @@ sub add_grading_button { $size=scalar(keys(%sections))+2; } my $sec_select = "\n".'\n"; + $sec_select .= "\t".'\n\n"; my $uri=$env{'request.uri'}; if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); } @@ -681,7 +711,8 @@ sub start_Task { $target eq 'tex') { if ($env{'form.markaccess'}) { my @interval=&Apache::lonnet::EXT("resource.0.interval"); - &Apache::lonnet::set_first_access($interval[1]); + my ($timelimit) = ($interval[0] =~ /^(\d+)/); + &Apache::lonnet::set_first_access($interval[1],$timelimit); } } @@ -709,10 +740,14 @@ sub start_Task { if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) { # CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access # thus self-checkedin - my $check = &check_in('Task',undef,undef,$slot_name); - if ($check =~ /^error: /) { + my $needsiptied; + if (ref($slot)) { + $needsiptied = $slot->{'iptied'}; + } + my $check = &check_in('Task',undef,undef,$slot_name,$needsiptied); + if ($check =~ /^error:\s+(.*)$/) { my $symb=&Apache::lonnet::symbread(); - &Apache::lonnet::logthis("Error during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name"); + &Apache::lonnet::logthis("Error: $1 during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name"); } &add_to_queue('gradingqueue',{'type' => 'Task', 'time' => time, @@ -765,6 +800,8 @@ sub start_Task { } elsif ($status eq 'NOT_YET_VIEWED') { my $symb=&Apache::lonnet::symbread(); $msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb); + } elsif ($status eq 'NEED_DIFFERENT_IP') { +#FIXME } else { $msg.='
'.&mt('Not open to be viewed').'
'; } @@ -996,7 +1033,7 @@ sub get_key_todo { my $classlist=&get_limited_classlist(); if (!&allow_grade_user($classlist->{$uname.':'.$udom})) { return (undef,'not_allowed', - &mt('Requested student ([_1]) is in a section you aren\'t allowed to grade.',$uname.':'.$udom)); + &mt("Requested student ([_1]) is in a section you aren't allowed to grade.",$uname.':'.$udom)); } } my $gradingkey=&encode_queue_key($symb,$udom,$uname); @@ -1407,7 +1444,7 @@ DONEBUTTON if ($canstore) { &Apache::structuretags::finalize_storage(); my @interval = &Apache::lonnet::EXT("resource.0.interval"); - if ($interval[0] =~ /^\d+$/ && $interval[1] eq 'resource') { + if ($interval[0] =~ /^\d+/ && $interval[1] eq 'resource') { my $key=$courseid."\0".$symb; my %times=&Apache::lonnet::get('firstaccesstimes', [$key],$domain,$name); @@ -1796,7 +1833,7 @@ sub show_queue { $result.=(<