--- loncom/imspackages/imsprocessor.pm 2013/08/02 12:56:26 1.53 +++ loncom/imspackages/imsprocessor.pm 2017/11/05 22:47:13 1.56 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Processor for IMS Packages # -# $Id: imsprocessor.pm,v 1.53 2013/08/02 12:56:26 raeburn Exp $ +# $Id: imsprocessor.pm,v 1.56 2017/11/05 22:47:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,11 +29,12 @@ package Apache::imsprocessor; use Apache::lonnet; +use Apache::loncommon; use Apache::loncleanup; use Apache::lonlocal; -use LWP::UserAgent; use HTTP::Request::Common; use LONCAPA::Configuration; +use LONCAPA::LWPReq; use strict; sub ims_config { @@ -99,6 +100,9 @@ sub create_tempdir { my ($context,$pathinfo,$timenow) = @_; my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); my $tempdir; + $pathinfo = &Apache::loncommon::clean_path($pathinfo); +# Collapse dots + $pathinfo =~ s/\.+/./g; if ($context eq 'DOCS') { $tempdir = $$configvars{'lonDaemons'}.'/tmp/'.$pathinfo; if (!-e "$tempdir") { @@ -130,6 +134,8 @@ sub uploadzip { $fname=~s/\s+/\_/g; # Replace all other weird characters by nothing $fname=~s/[^\w\.\-]//g; +# Collapse dots + $fname=~s/\.+/./g; # See if there is anything left unless ($fname) { return 'error: no uploaded file'; } # Save the file @@ -387,7 +393,7 @@ sub parse_manifest { ); $p->parse_file($xmlfile); $p->eof; - foreach my $itm (keys %contents) { + foreach my $itm (keys(%contents)) { @{$$items{$itm}{contents}} = @{$contents{$itm}}; } } @@ -438,7 +444,7 @@ sub target_resources { sub copy_resources { my ($context,$cms,$hrefs,$resources,$tempdir,$targets,$url,$crs,$cdom,$destdir,$timenow,$assessmentfiles,$total) = @_; if ($context eq 'DOCS') { - foreach my $key (sort keys %{$hrefs}) { + foreach my $key (sort(keys(%{$hrefs}))) { if (grep/^$key$/,@{$targets}) { %{$$url{$key}} = (); foreach my $file (@{$$hrefs{$key}}) { @@ -617,7 +623,7 @@ sub process_resinfo { } if ($cms eq 'angel5') { my $currboard = ''; - foreach my $key (sort keys %{$resources}) { + foreach my $key (sort(keys(%{$resources}))) { if (grep/^$key$/,@{$targets}) { if ($$resources{$key}{type} eq "BOARD") { push @{$boards}, $key; @@ -646,7 +652,7 @@ sub process_resinfo { } } } elsif ($cms eq 'bb5' || $cms eq 'bb6') { - foreach my $key (sort keys %{$resources}) { + foreach my $key (sort(keys(%{$resources}))) { if (grep/^$key$/,@{$targets}) { if ($$resources{$key}{type} eq "resource/x-bb-document") { unless ($$items{$$resources{$key}{revitm}}{filepath} eq 'Top') { @@ -714,7 +720,7 @@ sub process_resinfo { $$items{'Top'}{'contentscount'} ++; } } elsif ($cms eq 'webctce4') { - foreach my $key (sort keys %{$resources}) { + foreach my $key (sort(keys(%{$resources}))) { if (grep/^$key$/,@{$targets}) { if ($$resources{$key}{type} eq "webcontent") { %{$$resinfo{$key}} = (); @@ -729,7 +735,7 @@ sub process_resinfo { } } } elsif ($cms eq 'webctvista4') { - foreach my $key (sort keys %{$resources}) { + foreach my $key (sort(keys(%{$resources}))) { if (grep/^$key$/,@{$targets}) { %{$$resinfo{$key}} = (); if ($$resources{$key}{type} eq 'webct.question') { @@ -816,7 +822,7 @@ sub build_structure { $srcstem = "/res/$udom/$uname/$newdir"; } - foreach my $key (sort keys %{$items}) { + foreach my $key (sort(keys(%{$items}))) { if ($$includeditems{$key}) { %{$flag{$key}} = ( page => 0, @@ -1034,7 +1040,7 @@ sub build_structure { $filestem = "/res/$udom/$uname/$newdir"; } - foreach my $key (sort keys %pagecontents) { + foreach my $key (sort(keys(%pagecontents))) { for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; my $resource = "$filestem/resfiles/$$items{$pagecontents{$key}[$i][0]}{resnum}.html"; @@ -1350,7 +1356,7 @@ sub process_user { my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); my $xmlstem = $$configvars{'lonDaemons'}."/tmp/".$user_cdom."_".$user_crs."_"; - foreach my $user_id (keys %{$settings}) { + foreach my $user_id (keys(%{$settings})) { if ($$settings{$user_id}{user_role} eq "s") { } elsif ($user_handling eq 'enrollall') { @@ -1870,7 +1876,7 @@ sub addposting { &Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs); } my %record=&Apache::lonnet::restore('_discussion'); - my ($temp)=keys %record; + my ($temp)=keys(%record); unless ($temp=~/^error\:/) { my %newrecord=(); $newrecord{'resource'}=$symb; @@ -3263,7 +3269,7 @@ sub parse_webct4_questionDB { $p->parse_file($xmlfile); $p->eof; my $boxcount; - foreach my $id (keys %{$settings}) { + foreach my $id (keys(%{$settings})) { if ($$settings{$id}{class} eq 'string') { $boxcount = 0; if (@{$$settings{$id}{boxes}} > 1) { @@ -3340,7 +3346,7 @@ sub process_assessment { } } elsif ($cms eq 'webctvista4') { unless($$dbparse) { - foreach my $res (sort keys %{$allquestions}) { + foreach my $res (sort(keys(%{$allquestions}))) { my $parent = $$allquestions{$res}; &parse_webctvista4_question($res,$docroot,$resources,$hrefs,$qzdbsettings,\@allquestids,\%allanswers,\%allchoices,$parent,$catinfo); } @@ -3389,13 +3395,13 @@ sub build_category_sequences { if (!-e "$destdir/sequences") { mkdir("$destdir/sequences",0755); } - my $numcats = scalar(keys %{$catinfo}); + my $numcats = scalar(keys(%{$catinfo})); my $curr_id = 0; my $next_id = 1; my $fh; open($fh,">$destdir/sequences/question_database.sequence"); push @{$sequencesfiles},'question_database.sequence'; - foreach my $category (sort keys %{$catinfo}) { + foreach my $category (sort(keys(%{$catinfo}))) { my $seqname; if ($cms eq 'webctce4') { $seqname = $$catinfo{$category}{title}.'_'.$category; @@ -3962,7 +3968,7 @@ sub write_webct4_questions { } if ($$settings{$id}{class} eq 'numerical') { foreach my $numid (@{$$settings{$id}{numids}}) { - foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) { + foreach my $var (keys(%{$$settings{$id}{$numid}{vars}})) { if ($cms eq 'webctce4') { $$settings{$id}{text} =~ s/{($var)}/\$$1 /g; } elsif ($cms eq 'webctvista4') { @@ -4449,9 +4455,9 @@ $$settings{$id}{$list}{jumbledtext}[$k] |; foreach my $numid (@{$$settings{$id}{numids}}) { my $formula = $$settings{$id}{$numid}{formula}; - my $pattern = join('|',(sort (keys (%mathfns)))); + my $pattern = join('|',(sort(keys(%mathfns)))); $formula =~ s/($pattern)/\&$mathfns{$1}/g; - foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) { + foreach my $var (keys(%{$$settings{$id}{$numid}{vars}})) { my $decnum = $$settings{$id}{$numid}{vars}{$var}{dec}; my $increment = '0.'; if ($decnum == 0) { @@ -4957,9 +4963,9 @@ sub retrieve_image { my ($context,$res,$dirname,$cdom,$cname,$docroot,$destdir,$urlpath,$filename) = @_; my $contents; my $url = $urlpath.$filename; - my $ua=new LWP::UserAgent; + my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; my $request=new HTTP::Request('GET',$url); - my $response=$ua->request($request); + my $response=&LONCAPA::LWPReq::makerequest($lonhost,$request); if ($response->is_success) { $contents = $response->content; if (!-e "$docroot/$res") { @@ -5221,7 +5227,7 @@ sub process_content { if ($$settings{newwindow} eq "true") { $linktag .= qq| target="$res$filecount"|; } - foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) { + foreach my $entry (keys(%{$$settings{files}[$filecount]{registry}})) { $linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|; } $linktag .= qq|>$$settings{files}[$filecount]{linkname}
\n|;