version 1.1389, 2018/11/24 16:19:20
|
version 1.1401, 2019/01/27 14:40:02
|
Line 184 sub create_connection {
|
Line 184 sub create_connection {
|
Type => SOCK_STREAM, |
Type => SOCK_STREAM, |
Timeout => 10); |
Timeout => 10); |
return 0 if (!$client); |
return 0 if (!$client); |
print $client (join(':',$hostname,$lonid,&machine_ids($hostname))."\n"); |
print $client (join(':',$hostname,$lonid,&machine_ids($hostname),$loncaparevs{$lonid})."\n"); |
my $result = <$client>; |
my $result = <$client>; |
chomp($result); |
chomp($result); |
return 1 if ($result eq 'done'); |
return 1 if ($result eq 'done'); |
Line 311 sub get_server_loncaparev {
|
Line 311 sub get_server_loncaparev {
|
$answer = &reply('serverloncaparev',$lonhost); |
$answer = &reply('serverloncaparev',$lonhost); |
if (($answer eq 'unknown_cmd') || ($answer eq 'con_lost')) { |
if (($answer eq 'unknown_cmd') || ($answer eq 'con_lost')) { |
if ($caller eq 'loncron') { |
if ($caller eq 'loncron') { |
|
my $hostname = &hostname($lonhost); |
my $protocol = $protocol{$lonhost}; |
my $protocol = $protocol{$lonhost}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
my $url = $protocol.'://'.&hostname($lonhost).'/adm/about.html'; |
my $url = $protocol.'://'.$hostname.'/adm/about.html'; |
my $request=new HTTP::Request('GET',$url); |
my $request=new HTTP::Request('GET',$url); |
my $response=&LONCAPA::LWPReq::makerequest($lonhost,$request,'',\%perlvar,4,1); |
my $response=&LONCAPA::LWPReq::makerequest($lonhost,$request,'',\%perlvar,4,1); |
unless ($response->is_error()) { |
unless ($response->is_error()) { |
Line 458 sub reply {
|
Line 459 sub reply {
|
unless (defined(&hostname($server))) { return 'no_such_host'; } |
unless (defined(&hostname($server))) { return 'no_such_host'; } |
my $answer=subreply($cmd,$server); |
my $answer=subreply($cmd,$server); |
if (($answer=~/^refused/) || ($answer=~/^rejected/)) { |
if (($answer=~/^refused/) || ($answer=~/^rejected/)) { |
&logthis("<font color=\"blue\">WARNING:". |
my $logged = $cmd; |
" $cmd to $server returned $answer</font>"); |
if ($cmd =~ /^encrypt:([^:]+):/) { |
|
my $subcmd = $1; |
|
if (($subcmd eq 'auth') || ($subcmd eq 'passwd') || |
|
($subcmd eq 'changeuserauth') || ($subcmd eq 'makeuser') || |
|
($subcmd eq 'putdom') || ($subcmd eq 'autoexportgrades')) { |
|
(undef,undef,my @rest) = split(/:/,$cmd); |
|
if (($subcmd eq 'auth') || ($subcmd eq 'putdom')) { |
|
splice(@rest,2,1,'Hidden'); |
|
} elsif ($subcmd eq 'passwd') { |
|
splice(@rest,2,2,('Hidden','Hidden')); |
|
} elsif (($subcmd eq 'changeuserauth') || ($subcmd eq 'makeuser') || |
|
($subcmd eq 'autoexportgrades')) { |
|
splice(@rest,3,1,'Hidden'); |
|
} |
|
$logged = join(':',('encrypt:'.$subcmd,@rest)); |
|
} |
|
} |
|
&logthis("<font color=\"blue\">WARNING:". |
|
" $logged to $server returned $answer</font>"); |
} |
} |
return $answer; |
return $answer; |
} |
} |
Line 671 sub check_for_valid_session {
|
Line 690 sub check_for_valid_session {
|
$lonid=$cookies{$secure}; |
$lonid=$cookies{$secure}; |
} elsif (exists($cookies{$name})) { |
} elsif (exists($cookies{$name})) { |
$lonid=$cookies{$name}; |
$lonid=$cookies{$name}; |
} elsif (exists($cookies{$linkname})) { |
} elsif ((exists($cookies{$linkname})) && ($ENV{'SERVER_PORT'} != 443)) { |
$lonid=$cookies{$linkname}; |
$lonid=$cookies{$linkname}; |
} elsif (exists($cookies{$pubname})) { |
} elsif (exists($cookies{$pubname})) { |
$lonid=$cookies{$pubname}; |
$lonid=$cookies{$pubname}; |
Line 711 sub check_for_valid_session {
|
Line 730 sub check_for_valid_session {
|
|
|
if (!defined($disk_env{'user.name'}) |
if (!defined($disk_env{'user.name'}) |
|| !defined($disk_env{'user.domain'})) { |
|| !defined($disk_env{'user.domain'})) { |
|
untie(%disk_env); |
return undef; |
return undef; |
} |
} |
|
|
Line 723 sub check_for_valid_session {
|
Line 743 sub check_for_valid_session {
|
$userhashref->{'ltiuri'} = $disk_env{'request.lti.uri'}; |
$userhashref->{'ltiuri'} = $disk_env{'request.lti.uri'}; |
} |
} |
} |
} |
|
untie(%disk_env); |
|
|
return $handle; |
return $handle; |
} |
} |
Line 747 sub timed_flock {
|
Line 768 sub timed_flock {
|
} |
} |
} |
} |
|
|
|
sub get_sessionfile_vars { |
|
my ($handle,$lonidsdir,$storearr) = @_; |
|
my %returnhash; |
|
unless (ref($storearr) eq 'ARRAY') { |
|
return %returnhash; |
|
} |
|
if (-l "$lonidsdir/$handle.id") { |
|
my $link = readlink("$lonidsdir/$handle.id"); |
|
if ((-e $link) && ($link =~ m{^\Q$lonidsdir\E/(.+)\.id$})) { |
|
$handle = $1; |
|
} |
|
} |
|
if ((-e "$lonidsdir/$handle.id") && |
|
($handle =~ /^($match_username)\_\d+\_($match_domain)\_(.+)$/)) { |
|
my ($possuname,$possudom,$possuhome) = ($1,$2,$3); |
|
if ((&domain($possudom) ne '') && (&homeserver($possuname,$possudom) eq $possuhome)) { |
|
if (open(my $idf,'+<',"$lonidsdir/$handle.id")) { |
|
flock($idf,LOCK_SH); |
|
if (tie(my %disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
|
&GDBM_READER(),0640)) { |
|
foreach my $item (@{$storearr}) { |
|
$returnhash{$item} = $disk_env{$item}; |
|
} |
|
untie(%disk_env); |
|
} |
|
} |
|
} |
|
} |
|
return %returnhash; |
|
} |
|
|
# ---------------------------------------------------------- Append Environment |
# ---------------------------------------------------------- Append Environment |
|
|
sub appenv { |
sub appenv { |
Line 900 sub userload {
|
Line 952 sub userload {
|
while ($filename=readdir(LONIDS)) { |
while ($filename=readdir(LONIDS)) { |
next if ($filename eq '.' || $filename eq '..'); |
next if ($filename eq '.' || $filename eq '..'); |
next if ($filename =~ /publicuser_\d+\.id/); |
next if ($filename =~ /publicuser_\d+\.id/); |
|
next if ($filename =~ /^[a-f0-9]+_linked\.id$/); |
my ($mtime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[9]; |
my ($mtime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[9]; |
if ($curtime-$mtime < 1800) { $numusers++; } |
if ($curtime-$mtime < 1800) { $numusers++; } |
} |
} |
Line 955 sub spareserver {
|
Line 1008 sub spareserver {
|
} |
} |
|
|
if (!$want_server_name) { |
if (!$want_server_name) { |
my $protocol = 'http'; |
|
if ($protocol{$spare_server} eq 'https') { |
|
$protocol = $protocol{$spare_server}; |
|
} |
|
if (defined($spare_server)) { |
if (defined($spare_server)) { |
my $hostname = &hostname($spare_server); |
my $hostname = &hostname($spare_server); |
if (defined($hostname)) { |
if (defined($hostname)) { |
|
my $protocol = 'http'; |
|
if ($protocol{$spare_server} eq 'https') { |
|
$protocol = $protocol{$spare_server}; |
|
} |
$spare_server = $protocol.'://'.$hostname; |
$spare_server = $protocol.'://'.$hostname; |
} |
} |
} |
} |
Line 1434 sub get_lonbalancer_config {
|
Line 1487 sub get_lonbalancer_config {
|
sub check_loadbalancing { |
sub check_loadbalancing { |
my ($uname,$udom,$caller) = @_; |
my ($uname,$udom,$caller) = @_; |
my ($is_balancer,$currtargets,$currrules,$dom_in_use,$homeintdom, |
my ($is_balancer,$currtargets,$currrules,$dom_in_use,$homeintdom, |
$rule_in_effect,$offloadto,$otherserver,$setcookie); |
$rule_in_effect,$offloadto,$otherserver,$setcookie,$dom_balancers); |
my $lonhost = $perlvar{'lonHostID'}; |
my $lonhost = $perlvar{'lonHostID'}; |
my @hosts = ¤t_machine_ids(); |
my @hosts = ¤t_machine_ids(); |
my $uprimary_id = &Apache::lonnet::domain($udom,'primary'); |
my $uprimary_id = &Apache::lonnet::domain($udom,'primary'); |
Line 1461 sub check_loadbalancing {
|
Line 1514 sub check_loadbalancing {
|
} |
} |
} |
} |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
($is_balancer,$currtargets,$currrules,$setcookie) = |
($is_balancer,$currtargets,$currrules,$setcookie,$dom_balancers) = |
&check_balancer_result($result,@hosts); |
&check_balancer_result($result,@hosts); |
if ($is_balancer) { |
if ($is_balancer) { |
if (ref($currrules) eq 'HASH') { |
if (ref($currrules) eq 'HASH') { |
Line 1522 sub check_loadbalancing {
|
Line 1575 sub check_loadbalancing {
|
} |
} |
} |
} |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
($is_balancer,$currtargets,$currrules,$setcookie) = |
($is_balancer,$currtargets,$currrules,$setcookie,$dom_balancers) = |
&check_balancer_result($result,@hosts); |
&check_balancer_result($result,@hosts); |
if ($is_balancer) { |
if ($is_balancer) { |
if (ref($currrules) eq 'HASH') { |
if (ref($currrules) eq 'HASH') { |
Line 1598 sub check_loadbalancing {
|
Line 1651 sub check_loadbalancing {
|
undef($setcookie); |
undef($setcookie); |
} |
} |
} |
} |
return ($is_balancer,$otherserver,$setcookie); |
return ($is_balancer,$otherserver,$setcookie,$offloadto,$dom_balancers); |
} |
} |
|
|
sub check_balancer_result { |
sub check_balancer_result { |
my ($result,@hosts) = @_; |
my ($result,@hosts) = @_; |
my ($is_balancer,$currtargets,$currrules,$setcookie); |
my ($is_balancer,$currtargets,$currrules,$setcookie,$dom_balancers); |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
if ($result->{'lonhost'} ne '') { |
if ($result->{'lonhost'} ne '') { |
my $currbalancer = $result->{'lonhost'}; |
my $currbalancer = $result->{'lonhost'}; |
Line 1612 sub check_balancer_result {
|
Line 1665 sub check_balancer_result {
|
$currtargets = $result->{'targets'}; |
$currtargets = $result->{'targets'}; |
$currrules = $result->{'rules'}; |
$currrules = $result->{'rules'}; |
} |
} |
|
$dom_balancers = $currbalancer; |
} else { |
} else { |
foreach my $key (keys(%{$result})) { |
if (keys(%{$result})) { |
if (($key ne '') && (grep(/^\Q$key\E$/,@hosts)) && |
foreach my $key (keys(%{$result})) { |
(ref($result->{$key}) eq 'HASH')) { |
if (($key ne '') && (grep(/^\Q$key\E$/,@hosts)) && |
$is_balancer = 1; |
(ref($result->{$key}) eq 'HASH')) { |
$currrules = $result->{$key}{'rules'}; |
$is_balancer = 1; |
$currtargets = $result->{$key}{'targets'}; |
$currrules = $result->{$key}{'rules'}; |
$setcookie = $result->{$key}{'cookie'}; |
$currtargets = $result->{$key}{'targets'}; |
last; |
$setcookie = $result->{$key}{'cookie'}; |
|
last; |
|
} |
} |
} |
|
$dom_balancers = join(',',sort(keys(%{$result}))); |
} |
} |
} |
} |
} |
} |
return ($is_balancer,$currtargets,$currrules,$setcookie); |
return ($is_balancer,$currtargets,$currrules,$setcookie,$dom_balancers); |
} |
} |
|
|
sub get_loadbalancer_targets { |
sub get_loadbalancer_targets { |
Line 1703 sub trusted_domains {
|
Line 1760 sub trusted_domains {
|
if (&domain($calldom) eq '') { |
if (&domain($calldom) eq '') { |
return ($trusted,$untrusted); |
return ($trusted,$untrusted); |
} |
} |
unless ($cmdtype =~ /^(content|shared|enroll|coaurem|domroles|catalog|reqcrs|msg)$/) { |
unless ($cmdtype =~ /^(content|shared|enroll|coaurem|othcoau|domroles|catalog|reqcrs|msg)$/) { |
return ($trusted,$untrusted); |
return ($trusted,$untrusted); |
} |
} |
my $callprimary = &domain($calldom,'primary'); |
my $callprimary = &domain($calldom,'primary'); |
Line 1725 sub trusted_domains {
|
Line 1782 sub trusted_domains {
|
map { $possexc{$_} = 1; } @{$trustconfig->{$cmdtype}->{'exc'}}; |
map { $possexc{$_} = 1; } @{$trustconfig->{$cmdtype}->{'exc'}}; |
} |
} |
if (ref($trustconfig->{$cmdtype}->{'inc'}) eq 'ARRAY') { |
if (ref($trustconfig->{$cmdtype}->{'inc'}) eq 'ARRAY') { |
|
$possinc{$intcalldom} = 1; |
map { $possinc{$_} = 1; } @{$trustconfig->{$cmdtype}->{'inc'}}; |
map { $possinc{$_} = 1; } @{$trustconfig->{$cmdtype}->{'inc'}}; |
} |
} |
} |
} |
Line 1759 sub trusted_domains {
|
Line 1817 sub trusted_domains {
|
} |
} |
foreach my $exc (@allexc) { |
foreach my $exc (@allexc) { |
if (ref($doms_by_intdom{$exc}) eq 'ARRAY') { |
if (ref($doms_by_intdom{$exc}) eq 'ARRAY') { |
$untrusted = $doms_by_intdom{$exc}; |
push(@{$untrusted},@{$doms_by_intdom{$exc}}); |
} |
} |
} |
} |
foreach my $inc (@allinc) { |
foreach my $inc (@allinc) { |
if (ref($doms_by_intdom{$inc}) eq 'ARRAY') { |
if (ref($doms_by_intdom{$inc}) eq 'ARRAY') { |
$trusted = $doms_by_intdom{$inc}; |
push(@{$trusted},@{$doms_by_intdom{$inc}}); |
} |
} |
} |
} |
} |
} |
Line 3319 sub remove_stale_resfile {
|
Line 3377 sub remove_stale_resfile {
|
(grep { $_ eq $homeserver } ¤t_machine_ids())) { |
(grep { $_ eq $homeserver } ¤t_machine_ids())) { |
my $fname = &filelocation('',$url); |
my $fname = &filelocation('',$url); |
if (-e $fname) { |
if (-e $fname) { |
my $protocol = $protocol{$homeserver}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
my $hostname = &hostname($homeserver); |
my $hostname = &hostname($homeserver); |
if ($hostname) { |
if ($hostname) { |
|
my $protocol = $protocol{$homeserver}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
my $uri = &declutter($url); |
my $uri = &declutter($url); |
my $request=new HTTP::Request('HEAD',$protocol.'://'.$hostname.'/raw/'.$uri); |
my $request=new HTTP::Request('HEAD',$protocol.'://'.$hostname.'/raw/'.$uri); |
my $response = &LONCAPA::LWPReq::makerequest($homeserver,$request,'',\%perlvar,5,0,1); |
my $response = &LONCAPA::LWPReq::makerequest($homeserver,$request,'',\%perlvar,5,0,1); |
Line 3847 sub resizeImage {
|
Line 3905 sub resizeImage {
|
# input: $formname - the contents of the file are in $env{"form.$formname"} |
# input: $formname - the contents of the file are in $env{"form.$formname"} |
# the desired filename is in $env{"form.$formname.filename"} |
# the desired filename is in $env{"form.$formname.filename"} |
# $context - possible values: coursedoc, existingfile, overwrite, |
# $context - possible values: coursedoc, existingfile, overwrite, |
# canceloverwrite, or ''. |
# canceloverwrite, scantron or ''. |
# if 'coursedoc': upload to the current course |
# if 'coursedoc': upload to the current course |
# if 'existingfile': write file to tmp/overwrites directory |
# if 'existingfile': write file to tmp/overwrites directory |
# if 'canceloverwrite': delete file written to tmp/overwrites directory |
# if 'canceloverwrite': delete file written to tmp/overwrites directory |
# $context is passed as argument to &finishuserfileupload |
# $context is passed as argument to &finishuserfileupload |
# $subdir - directory in userfile to store the file into |
# $subdir - directory in userfile to store the file into |
# $parser - instruction to parse file for objects ($parser = parse) |
# $parser - instruction to parse file for objects ($parser = parse) or |
|
# if context is 'scantron', $parser is hashref of csv column mapping |
|
# (e.g.,{ PaperID => 0, LastName => 1, FirstName => 2, ID => 3, |
|
# Section => 4, CODE => 5, FirstQuestion => 9 }). |
# $allfiles - reference to hash for embedded objects |
# $allfiles - reference to hash for embedded objects |
# $codebase - reference to hash for codebase of java objects |
# $codebase - reference to hash for codebase of java objects |
# $desuname - username for permanent storage of uploaded file |
# $desuname - username for permanent storage of uploaded file |
Line 4043 sub finishuserfileupload {
|
Line 4104 sub finishuserfileupload {
|
} |
} |
} |
} |
} |
} |
if ($parser eq 'parse') { |
if (($context ne 'scantron') && ($parser eq 'parse')) { |
if ((ref($mimetype)) && ($$mimetype eq 'text/html')) { |
if ((ref($mimetype)) && ($$mimetype eq 'text/html')) { |
my $parse_result = &extract_embedded_items($filepath.'/'.$file, |
my $parse_result = &extract_embedded_items($filepath.'/'.$file, |
$allfiles,$codebase); |
$allfiles,$codebase); |
Line 4052 sub finishuserfileupload {
|
Line 4113 sub finishuserfileupload {
|
' for embedded media: '.$parse_result); |
' for embedded media: '.$parse_result); |
} |
} |
} |
} |
|
} elsif (($context eq 'scantron') && (ref($parser) eq 'HASH')) { |
|
my $format = $env{'form.scantron_format'}; |
|
&bubblesheet_converter($docudom,$filepath.'/'.$file,$parser,$format); |
} |
} |
if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) { |
if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) { |
my $input = $filepath.'/'.$file; |
my $input = $filepath.'/'.$file; |
Line 4292 sub embedded_dependency {
|
Line 4356 sub embedded_dependency {
|
return; |
return; |
} |
} |
|
|
|
sub bubblesheet_converter { |
|
my ($cdom,$fullpath,$config,$format) = @_; |
|
if ((&domain($cdom) ne '') && |
|
($fullpath =~ m{^\Q$perlvar{'lonDocRoot'}/userfiles/$cdom/$match_courseid/scantron_orig}) && |
|
(-e $fullpath) && (ref($config) eq 'HASH') && ($format ne '')) { |
|
my %csvcols = %{$config}; |
|
my %csvbynum = reverse(%csvcols); |
|
my %scantronconf = &get_scantron_config($format,$cdom); |
|
if (keys(%scantronconf)) { |
|
my %bynum = ( |
|
$scantronconf{CODEstart} => 'CODEstart', |
|
$scantronconf{IDstart} => 'IDstart', |
|
$scantronconf{PaperID} => 'PaperID', |
|
$scantronconf{FirstName} => 'FirstName', |
|
$scantronconf{LastName} => 'LastName', |
|
$scantronconf{Qstart} => 'Qstart', |
|
); |
|
my @ordered; |
|
foreach my $item (sort { $a <=> $b } keys(%bynum)) { |
|
push (@ordered,$bynum{$item})); |
|
} |
|
my %mapstart = ( |
|
CODEstart => 'CODE', |
|
IDstart => 'ID', |
|
PaperID => 'PaperID', |
|
FirstName => 'FirstName', |
|
LastName => 'LastName', |
|
Qstart => 'FirstQuestion', |
|
); |
|
my %maplength = ( |
|
CODEstart => 'CODElength', |
|
IDstart => 'IDlength', |
|
PaperID => 'PaperIDlength', |
|
FirstName => 'FirstNamelength', |
|
LastName => 'LastNamelength', |
|
); |
|
if (open(my $fh,'<',$fullpath)) { |
|
my $output; |
|
while (my $line=<$fh>) { |
|
$line =~ s{[\r\n]+$}{}; |
|
my %found; |
|
my @values = split(/,/,$line); |
|
my ($qstart,$record); |
|
for (my $i=0; $i<@values; $i++) { |
|
if (($qstart ne '') && ($i > $qstart)) { |
|
$found{'FirstQuestion'} .= $values[$i]; |
|
} elsif (exists($csvbynum{$i})) { |
|
if ($csvbynum{$i} eq 'FirstQuestion') { |
|
$qstart = $i; |
|
} else { |
|
$values[$i] =~ s/^\s+//; |
|
if ($csvbynum{$i} eq 'PaperID') { |
|
while (length($values[$i]) < $scantronconf{$maplength{$csvbynum{$i}}}) { |
|
$values[$i] = '0'.$values[$i]; |
|
} |
|
} |
|
} |
|
$found{$csvbynum{$i}} = $values[$i]; |
|
} |
|
} |
|
foreach my $item (@ordered) { |
|
my $currlength = 1+length($record); |
|
my $numspaces = $scantronconf{$item} - $currlength; |
|
if ($numspaces > 0) { |
|
$record .= (' ' x $numspaces); |
|
} |
|
if (($mapstart{$item} ne '') && (exists($found{$mapstart{$item}}))) { |
|
unless ($item eq 'Qstart') { |
|
if (length($found{$mapstart{$item}}) > $scantronconf{$maplength{$item}}) { |
|
$found{$mapstart{$item}} = substr($found{$mapstart{$item}},0,$scantronconf{$maplength{$item}}); |
|
} |
|
} |
|
$record .= $found{$mapstart{$item}}; |
|
} |
|
} |
|
$output .= "$record\n"; |
|
} |
|
close($fh); |
|
if ($output) { |
|
if (open(my $fh,'>',$fullpath)) { |
|
print $fh $output; |
|
close($fh); |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
} |
|
|
|
sub get_scantron_config { |
|
my ($which,$cdom) = @_; |
|
my @lines = &get_scantronformat_file($cdom); |
|
my %config; |
|
#FIXME probably should move to XML it has already gotten a bit much now |
|
foreach my $line (@lines) { |
|
my ($name,$descrip)=split(/:/,$line); |
|
if ($name ne $which ) { next; } |
|
chomp($line); |
|
my @config=split(/:/,$line); |
|
$config{'name'}=$config[0]; |
|
$config{'description'}=$config[1]; |
|
$config{'CODElocation'}=$config[2]; |
|
$config{'CODEstart'}=$config[3]; |
|
$config{'CODElength'}=$config[4]; |
|
$config{'IDstart'}=$config[5]; |
|
$config{'IDlength'}=$config[6]; |
|
$config{'Qstart'}=$config[7]; |
|
$config{'Qlength'}=$config[8]; |
|
$config{'Qoff'}=$config[9]; |
|
$config{'Qon'}=$config[10]; |
|
$config{'PaperID'}=$config[11]; |
|
$config{'PaperIDlength'}=$config[12]; |
|
$config{'FirstName'}=$config[13]; |
|
$config{'FirstNamelength'}=$config[14]; |
|
$config{'LastName'}=$config[15]; |
|
$config{'LastNamelength'}=$config[16]; |
|
$config{'BubblesPerRow'}=$config[17]; |
|
last; |
|
} |
|
return %config; |
|
} |
|
|
|
sub get_scantronformat_file { |
|
my ($cdom) = @_; |
|
if ($cdom eq '') { |
|
$cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
} |
|
my %domconfig = &get_dom('configuration',['scantron'],$cdom); |
|
my $gottab = 0; |
|
my @lines; |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if ($domconfig{'scantron'}{'scantronformat'} ne '') { |
|
my $formatfile = &getfile($perlvar{'lonDocRoot'}.$domconfig{'scantron'}{'scantronformat'}); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
} |
|
if (!$gottab) { |
|
my $confname = $cdom.'-domainconfig'; |
|
my $default = $perlvar{'lonDocRoot'}.'/res/'.$cdom.'/'.$confname.'/default.tab'; |
|
my $formatfile = &getfile($default); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
if (!$gottab) { |
|
my @domains = ¤t_machine_domains(); |
|
if (grep(/^\Q$cdom\E$/,@domains)) { |
|
if (open(my $fh,'<',$perlvar{'lonTabDir'}.'/scantronformat.tab')) { |
|
@lines = <$fh>; |
|
close($fh); |
|
} |
|
} else { |
|
if (open(my $fh,'<',$perlvar{'lonTabDir'}.'/default_scantronformat.tab')) { |
|
@lines = <$fh>; |
|
close($fh); |
|
} |
|
} |
|
} |
|
return @lines; |
|
} |
|
|
sub removeuploadedurl { |
sub removeuploadedurl { |
my ($url)=@_; |
my ($url)=@_; |
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
Line 5317 sub set_first_access {
|
Line 5547 sub set_first_access {
|
my $firstaccess=&get_first_access($type,$symb,$map); |
my $firstaccess=&get_first_access($type,$symb,$map); |
if ($firstaccess) { |
if ($firstaccess) { |
&logthis("First access time already set ($firstaccess) when attempting ". |
&logthis("First access time already set ($firstaccess) when attempting ". |
"to set new value (type: $type, extent: $res) for $uname:$udom ". |
"to set new value (type: $type, extent: $res) for $uname:$udom ". |
"in $courseid"); |
"in $courseid"); |
return 'already_set'; |
return 'already_set'; |
} else { |
} else { |
my $start = time; |
my $start = time; |
Line 13300 sub repcopy_userfile {
|
Line 13530 sub repcopy_userfile {
|
my $request; |
my $request; |
$uri=~s/^\///; |
$uri=~s/^\///; |
my $homeserver = &homeserver($cnum,$cdom); |
my $homeserver = &homeserver($cnum,$cdom); |
|
my $hostname = &hostname($homeserver); |
my $protocol = $protocol{$homeserver}; |
my $protocol = $protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
$request=new HTTP::Request('GET',$protocol.'://'.&hostname($homeserver).'/raw/'.$uri); |
$request=new HTTP::Request('GET',$protocol.'://'.$hostname.'/raw/'.$uri); |
my $response = &LONCAPA::LWPReq::makerequest($homeserver,$request,$transferfile,\%perlvar,'',0,1); |
my $response = &LONCAPA::LWPReq::makerequest($homeserver,$request,$transferfile,\%perlvar,'',0,1); |
# did it work? |
# did it work? |
if ($response->is_error()) { |
if ($response->is_error()) { |
Line 13326 sub tokenwrapper {
|
Line 13557 sub tokenwrapper {
|
$file=~s|(\?\.*)*$||; |
$file=~s|(\?\.*)*$||; |
&appenv({"userfile.$udom/$uname/$file" => $env{'request.course.id'}}); |
&appenv({"userfile.$udom/$uname/$file" => $env{'request.course.id'}}); |
my $homeserver = &homeserver($uname,$udom); |
my $homeserver = &homeserver($uname,$udom); |
|
my $hostname = &hostname($homeserver); |
my $protocol = $protocol{$homeserver}; |
my $protocol = $protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
return $protocol.'://'.&hostname($homeserver).'/'.$uri. |
return $protocol.'://'.$hostname.'/'.$uri. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
'&tokenissued='.$perlvar{'lonHostID'}; |
'&tokenissued='.$perlvar{'lonHostID'}; |
} else { |
} else { |
Line 13344 sub getuploaded {
|
Line 13576 sub getuploaded {
|
my ($reqtype,$uri,$cdom,$cnum,$info,$rtncode) = @_; |
my ($reqtype,$uri,$cdom,$cnum,$info,$rtncode) = @_; |
$uri=~s/^\///; |
$uri=~s/^\///; |
my $homeserver = &homeserver($cnum,$cdom); |
my $homeserver = &homeserver($cnum,$cdom); |
|
my $hostname = &hostname($homeserver); |
my $protocol = $protocol{$homeserver}; |
my $protocol = $protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
$uri = $protocol.'://'.&hostname($homeserver).'/raw/'.$uri; |
$uri = $protocol.'://'.$hostname.'/raw/'.$uri; |
my $request=new HTTP::Request($reqtype,$uri); |
my $request=new HTTP::Request($reqtype,$uri); |
my $response=&LONCAPA::LWPReq::makerequest($homeserver,$request,'',\%perlvar,'',0,1); |
my $response=&LONCAPA::LWPReq::makerequest($homeserver,$request,'',\%perlvar,'',0,1); |
$$rtncode = $response->code; |
$$rtncode = $response->code; |
Line 13499 sub default_login_domain {
|
Line 13732 sub default_login_domain {
|
return $domain; |
return $domain; |
} |
} |
|
|
|
sub uses_sts { |
|
my ($ignore_cache) = @_; |
|
my $lonhost = $perlvar{'lonHostID'}; |
|
my $hostname = &hostname($lonhost); |
|
my $sts_on; |
|
if ($protocol{$lonhost} eq 'https') { |
|
my $cachetime = 12*3600; |
|
if (!$ignore_cache) { |
|
($sts_on,my $cached)=&is_cached_new('stspolicy',$lonhost); |
|
if (defined($cached)) { |
|
return $sts_on; |
|
} |
|
} |
|
my $url = $protocol{$lonhost}.'://'.$hostname.'/index.html'; |
|
my $request=new HTTP::Request('HEAD',$url); |
|
my $response=&LONCAPA::LWPReq::makerequest($lonhost,$request,'',\%perlvar,'','','',1); |
|
if ($response->is_success) { |
|
my $has_sts = $response->header('Strict-Transport-Security'); |
|
if ($has_sts eq '') { |
|
$sts_on = 0; |
|
} else { |
|
if ($has_sts =~ /\Qmax-age=\E(\d+)/) { |
|
my $maxage = $1; |
|
if ($maxage) { |
|
$sts_on = 1; |
|
} else { |
|
$sts_on = 0; |
|
} |
|
} else { |
|
$sts_on = 0; |
|
} |
|
} |
|
return &do_cache_new('stspolicy',$lonhost,$sts_on,$cachetime); |
|
} |
|
} |
|
return; |
|
} |
|
|
# ------------------------------------------------------------- Declutters URLs |
# ------------------------------------------------------------- Declutters URLs |
|
|
sub declutter { |
sub declutter { |
Line 15036 Returns:
|
Line 15307 Returns:
|
|
|
=back |
=back |
|
|
|
=head2 Bubblesheet Configuration |
|
|
|
=over 4 |
|
|
|
=item * |
|
|
|
get_scantron_config($which) |
|
|
|
$which - the name of the configuration to parse from the file. |
|
|
|
Parses and returns the bubblesheet configuration line selected as a |
|
hash of configuration file fields. |
|
|
|
|
|
Returns: |
|
If the named configuration is not in the file, an empty |
|
hash is returned. |
|
|
|
a hash with the fields |
|
name - internal name for the this configuration setup |
|
description - text to display to operator that describes this config |
|
CODElocation - if 0 or the string 'none' |
|
- no CODE exists for this config |
|
if -1 || the string 'letter' |
|
- a CODE exists for this config and is |
|
a string of letters |
|
Unsupported value (but planned for future support) |
|
if a positive integer |
|
- The CODE exists as the first n items from |
|
the question section of the form |
|
if the string 'number' |
|
- The CODE exists for this config and is |
|
a string of numbers |
|
CODEstart - (only matter if a CODE exists) column in the line where |
|
the CODE starts |
|
CODElength - length of the CODE |
|
IDstart - column where the student/employee ID starts |
|
IDlength - length of the student/employee ID info |
|
Qstart - column where the information from the bubbled |
|
'questions' start |
|
Qlength - number of columns comprising a single bubble line from |
|
the sheet. (usually either 1 or 10) |
|
Qon - either a single character representing the character used |
|
to signal a bubble was chosen in the positional setup, or |
|
the string 'letter' if the letter of the chosen bubble is |
|
in the final, or 'number' if a number representing the |
|
chosen bubble is in the file (1->A 0->J) |
|
Qoff - the character used to represent that a bubble was |
|
left blank |
|
PaperID - if the scanning process generates a unique number for each |
|
sheet scanned the column that this ID number starts in |
|
PaperIDlength - number of columns that comprise the unique ID number |
|
for the sheet of paper |
|
FirstName - column that the first name starts in |
|
FirstNameLength - number of columns that the first name spans |
|
|
|
LastName - column that the last name starts in |
|
LastNameLength - number of columns that the last name spans |
|
BubblesPerRow - number of bubbles available in each row used to |
|
bubble an answer. (If not specified, 10 assumed). |
|
|
|
|
|
=item * |
|
|
|
get_scantronformat_file($cdom) |
|
|
|
$cdom - the course's domain (optional); if not supplied, uses |
|
domain for current $env{'request.course.id'}. |
|
|
|
Returns an array containing lines from the scantron format file for |
|
the domain of the course. |
|
|
|
If a url for a custom.tab file is listed in domain's configuration.db, |
|
lines are from this file. |
|
|
|
Otherwise, if a default.tab has been published in RES space by the |
|
domainconfig user, lines are from this file. |
|
|
|
Otherwise, fall back to getting lines from the legacy file on the |
|
local server: /home/httpd/lonTabs/default_scantronformat.tab |
|
|
|
=back |
|
|
=head2 Resource Subroutines |
=head2 Resource Subroutines |
|
|
=over 4 |
=over 4 |
Line 15733 userspace, probably shouldn't be called
|
Line 16087 userspace, probably shouldn't be called
|
formname: same as for userfileupload() |
formname: same as for userfileupload() |
fname: filename (including subdirectories) for the file |
fname: filename (including subdirectories) for the file |
parser: if 'parse', will parse (html) file to extract references to objects, links etc. |
parser: if 'parse', will parse (html) file to extract references to objects, links etc. |
|
if hashref, and context is scantron, will convert csv format to standard format |
allfiles: reference to hash used to store objects found by parser |
allfiles: reference to hash used to store objects found by parser |
codebase: reference to hash used for codebases of java objects found by parser |
codebase: reference to hash used for codebases of java objects found by parser |
thumbwidth: width (pixels) of thumbnail to be created for uploaded image |
thumbwidth: width (pixels) of thumbnail to be created for uploaded image |