--- loncom/interface/londocs.pm	2019/02/06 16:41:42	1.484.2.72.2.6
+++ loncom/interface/londocs.pm	2020/04/07 18:21:04	1.484.2.72.4.1
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.484.2.72.2.6 2019/02/06 16:41:42 raeburn Exp $
+# $Id: londocs.pm,v 1.484.2.72.4.1 2020/04/07 18:21:04 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -43,7 +43,6 @@ use Apache::lonnavdisplay();
 use Apache::lonextresedit();
 use Apache::lontemplate();
 use Apache::lonsimplepage();
-use Apache::loncourserespicker();
 use HTML::Entities;
 use HTML::TokeParser;
 use GDBM_File;
@@ -657,7 +656,7 @@ sub group_import {
                 my $marker = $2;
                 my $info = $3;
                 my ($toolid,%toolhash,%toolsettings);
-                my @extras = ('linktext','explanation','crslabel','crstitle'); 
+                my @extras = ('linktext','explanation','crslabel','crstitle');
                 my @toolinfo = split(/:/,$info);
                 if ($residx) {
                     %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$coursedom,$coursenum);
@@ -1326,8 +1325,7 @@ sub print_paste_buffer {
                         }
                         $is_uploaded_map = 1;
                     }
-                } elsif (($url =~ m{^/res/lib/templates/\w+\.problem$}) ||
-                         ($url =~ m{^/adm/($match_domain)/($match_username)/\d+/(bulletinboard|smppg|ext\.tool)$})) {
+                } elsif ($url =~ m{^/adm/($match_domain)/($match_username)/\d+/(bulletinboard|smppg|ext\.tool)$}) {
                     if ($cid ne $env{'request.course.id'}) {
                         my ($srcdom,$srcnum) = split(/_/,$cid);
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
@@ -1348,7 +1346,7 @@ sub print_paste_buffer {
                push(@pasteable,$suffix);
             }
             my $buffer;
-            if ($is_external) { 
+            if ($is_external) {
                 $buffer = &mt('External Resource').': '.
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.
                     &LONCAPA::map::qtescape($url).')';
@@ -1661,7 +1659,8 @@ sub do_paste_from_buffer {
             }
             $srcdom{$suffix} = $srcd;
             $srcnum{$suffix} = $srcn;
-        } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {
+        } elsif (($url =~ m{^/adm/$match_domain/$match_username/\d+/(bulletinboard|smppg)$}) || 
+                 ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$})) {
             my ($srcd,$srcn) = split(/_/,$cid);
 # When paste buffer was populated using an active role in a different course
 # check for mdc privilege in the course from which the resource was pasted
@@ -1729,7 +1728,7 @@ sub do_paste_from_buffer {
     %msgs = &Apache::lonlocal::texthash (
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
-                notindom  => 'Paste failed: Item is an external tool from a course in a different donain.', 
+                notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
             );
 
@@ -1838,7 +1837,7 @@ sub do_paste_from_buffer {
                 }
             }
         }
-        if ($url=~ m{/(ext\.tool)$}) {
+        if ($url=~ m{/(bulletinboard|smppg|ext\.tool)$}) {
             my $prefix = $1;
             my $fromothercrs;
             #need to copy the db contents to a new one, unless this is a move.
@@ -1862,7 +1861,11 @@ sub do_paste_from_buffer {
                     $url = $newurl;
                     $title=&mt('Copy of').' '.$title;
                 } else {
-                    if ($prefix eq 'ext.tool') {
+                    if ($prefix eq 'smppg') {
+                        $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;
+                    } elsif ($prefix eq 'bulletinboard') {
+                        $msg = &mt('Paste failed: An error occurred when copying the discussion board.').' '.$errtext;
+                    } elsif ($prefix eq 'ext.tool') {
                         $msg = &mt('Paste failed: An error occurred when copying the external tool.').' '.$errtext;
                     }
                     $results{$suffix} = $result;
@@ -2599,8 +2602,7 @@ sub apply_fixups {
                     }
                 }
             }
-            my $total = scalar(@LONCAPA::map::order) - 1;
-            for (my $i=$total; $i>=0; $i--) {
+            for (my $i=0; $i<@LONCAPA::map::order; $i++) {
                 my $idx = $LONCAPA::map::order[$i];
                 if (defined($LONCAPA::map::resources[$idx])) {
                     my $changed;
@@ -2610,7 +2612,7 @@ sub apply_fixups {
                         splice(@LONCAPA::map::order,$i,1);
                         if (ref($currparam{$idx}) eq 'ARRAY') {
                             foreach my $name (@{$currparam{$idx}}) {
-                                &LONCAPA::map::delparameter($idx,$name);
+                                &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                             }
                         }
                         next;
@@ -2652,7 +2654,7 @@ sub apply_fixups {
             foreach my $idx (keys(%remparam)) {
                 if (ref($remparam{$idx}) eq 'ARRAY') {
                     foreach my $name (@{$remparam{$idx}}) {   
-                        &LONCAPA::map::delparameter($idx,$name);
+                        &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                     }
                 }
             }
@@ -3927,7 +3929,7 @@ END
                     }
                 }
                 if ($url ne '') {
-                    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
+                    $url.=(($url=~/\?/)?'&':'?').'symb='.&HTML::Entities::encode($shownsymb,'"<>&');
                 }
             } elsif (!$env{'request.role.adv'}) {
                 my $checkencrypt;
@@ -3948,7 +3950,7 @@ END
                     my $shownsymb = &Apache::lonenc::encrypted($symb);
                     my $shownurl = &Apache::lonenc::encrypted($url);
                     if (&Apache::lonnet::symbverify($shownsymb,$shownurl)) {
-                        $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
+                        $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&HTML::Entities::encode($shownsymb,'"<>&');
                         if ($env{'request.enc'} ne '') {
                             delete($env{'request.enc'});
                         }
@@ -4088,7 +4090,8 @@ $form_end;
         if ($isexternal) {
             ($editlink,$extresform) = 
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,
-                                                     undef,undef,undef,$disabled);
+                                                     undef,undef,undef,undef,undef,undef,
+                                                     undef,$disabled);
         } elsif ($orig_url =~ m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {
             ($editlink,$extresform) =
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,
@@ -4497,47 +4500,6 @@ sub list_symbs {
     $r->print(&endContentScreen());
 }
 
-sub short_urls {
-    my ($r,$canedit) = @_;
-    my $crstype = &Apache::loncommon::course_type();
-    my $formname = 'shortenurl';
-    $r->print(&Apache::loncommon::start_page('Display/Set Shortened URLs'));
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Shortened URLs'));
-    $r->print(&startContentScreen('tools'));
-    my ($navmap,$errormsg) =
-        &Apache::loncourserespicker::get_navmap_object($crstype,'shorturls');
-    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
-    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
-    my (%maps,%resources,%titles);
-    if (!ref($navmap)) {
-        $r->print($errormsg.
-                  &endContentScreen());
-        return '';
-    } else {
-        $r->print('<h4 class="LC_info">'.&mt('Tiny URLs for deep-linking into course').'</h4>'."\n");
-        $r->rflush();
-        my $readonly;
-        if ($canedit) {
-            my ($numnew,$errors) = &Apache::loncommon::make_short_symbs($cdom,$cnum,$navmap);
-            if ($numnew) {
-                $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');
-            }
-            if ((ref($errors) eq 'ARRAY') && (@{$errors} > 0)) {
-                $r->print(&mt('The following errors occurred when processing your request to create shortened URLs:').'<br /><ul>');
-                foreach my $error (@{$errors}) {
-                    $r->print('<li>'.$error.'</li>');
-                }
-                $r->print('</ul><br />');
-            }
-        } else {
-            $readonly = 1;
-        }
-        my %currtiny = &Apache::lonnet::dump('tiny',$cdom,$cnum);
-        $r->print(&Apache::loncourserespicker::create_picker($navmap,'shorturls',$formname,$crstype,undef,
-                                                             undef,undef,undef,undef,undef,\%currtiny,$readonly));
-    }
-    $r->print(&endContentScreen());
-}
 
 sub verifycontent {
     my ($r) = @_;
@@ -4994,8 +4956,8 @@ sub handler {
 	               'Adding_External_Resource','Adding_External_Tool',
                        'Navigate_Content','Adding_Folders','Docs_Overview',
 	               'Load_Map','Supplemental','Score_Upload_Form',
-                       'Adding_Pages','Importing_LON-CAPA_Resource',
-                       'Importing_IMS_Course','Uploading_From_Harddrive',
+	               'Adding_Pages','Importing_LON-CAPA_Resource',
+	               'Importing_IMS_Course','Uploading_From_Harddrive',
                        'Course_Roster','Web_Page','Dropbox','Simple_Problem') {
 	$help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }
@@ -5028,20 +4990,12 @@ sub handler {
         $disabled = ' disabled="disabled"';
     }
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);
-    if ($env{'form.inhibitmenu'}) {
-        unless ($env{'form.inhibitmenu'} eq 'yes') {
-            delete($env{'form.inhibitmenu'});
-        }
-    }
   if ($allowed && $env{'form.verify'}) {
       &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content');
       &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {
       &init_breadcrumbs('listsymbs','List Content IDs');
       &list_symbs($r);
-  } elsif ($allowed && $env{'form.shorturls'}) {
-      &init_breadcrumbs('shorturls','Set/Display Shortened URLs','Docs_Short_URLs');
-      &short_urls($r,$canedit);
   } elsif ($allowed && $env{'form.docslog'}) {
       &init_breadcrumbs('docslog','Show Log');
       my $folder = $env{'form.folder'};
@@ -5069,25 +5023,6 @@ sub handler {
                                              'forcesupplement','forcestandard',
                                              'tools','symb','command','supppath']);
 
-    foreach my $item ('forcesupplement','forcestandard','tools') {
-        next if ($env{'form.'.$item} eq '');
-        unless ($env{'form.'.$item} eq '1') {
-            delete($env{'form.'.$item});
-        }
-    }
-
-    if ($env{'form.command'}) {
-        unless ($env{'form.command'} =~ /^(direct|directnav|editdocs|editsupp|contents|home)$/) {
-            delete($env{'form.command'});
-        }
-    }
-
-    if ($env{'form.symb'}) {
-        my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'});
-        unless (($id =~ /^\d+$/) && (&Apache::lonnet::is_on_map($resurl))) {
-            delete($env{'form.symb'});
-        }
-    }
 # standard=1: this is a "new-style" course with an uploaded map as top level
 # standard=2: this is a "old-style" course, and there is nothing we can do
 
@@ -5110,38 +5045,6 @@ sub handler {
     my $toolsflag=0;
     if ($env{'form.tools'}) { $toolsflag=1; }
 
-    if ($env{'form.folderpath'} ne '') {
-        my @items = split(/\&/,$env{'form.folderpath'});
-        my $badpath;
-        for (my $i=0; $i<@items; $i++) {
-            my $odd = $i%2;
-            if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) {
-                $badpath = 1;
-            } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) {
-                $badpath = 1;
-            }
-            last if ($badpath);
-        }
-        if ($badpath) {
-            delete($env{'form.folderpath'});
-        }
-    }
-
-    if ($env{'form.supppath'} ne '') {
-        my @items = split(/\&/,$env{'form.supppath'});
-        my $badpath;
-        for (my $i=0; $i<@items; $i++) {
-            my $odd = $i%2;
-            if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {
-                $badpath = 1;
-            }
-            last if ($badpath);
-        }
-        if ($badpath) {
-            delete($env{'form.supppath'});
-        }
-    }
-
     my $script='';
     my $showdoc=0;
     my $addentries = {};
@@ -5411,7 +5314,6 @@ sub handler {
 	  undef($hadchanges);
           $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,
                                               \%allfiles,\%codebase,$context,$crstype);
-          undef($navmap);
 	  if ($hadchanges) {
 	      &mark_hash_old();
 	  }
@@ -5639,7 +5541,7 @@ SEDFFORM
         my $extresourcesform =
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Resource'},
-                                                 undef,undef,$disabled);
+                                                 undef,undef,undef,undef,undef,undef,$disabled);
         my $exttoolform =
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Tool'},undef,
@@ -5945,10 +5847,9 @@ unless ($container eq 'page') {
              $r->print('<p><span class="LC_error">'.$error.'</span></p>');
           }
           if ($hadchanges) {
-             unless (&is_hash_old()) {
-                 &mark_hash_old();
-             }
+             &mark_hash_old();
           }
+
           &changewarning($r,'');
         }
     }
@@ -6007,7 +5908,8 @@ SNFFORM
         my $supextform =
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Resource'},
-                                                 undef,undef,$disabled);
+                                                 undef,undef,undef,undef,undef,undef,
+                                                 $disabled);
 
         my $supexttoolform =
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,
@@ -6141,7 +6043,6 @@ my %suporderhash = (
 sub embedded_form_elems {
     my ($phase,$primaryurl,$newidx) = @_;
     my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
-    $newidx =~s /\D+//g;
     return <<STATE;
     <input type="hidden" name="folderpath" value="$folderpath" />
     <input type="hidden" name="cmd" value="upload_embedded" />
@@ -6162,11 +6063,7 @@ sub embedded_destination {
     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
         $destination .=  $2.'/';
     }
-    my $newidx = $env{'form.newidx'};
-    $newidx =~s /\D+//g;
-    if ($newidx) {
-        $destination .= $newidx;
-    }
+    $destination .= $env{'form.newidx'};
     my $dir_root = '/userfiles';
     return ($destination,$dir_root);
 }
@@ -6192,9 +6089,6 @@ sub decompression_info {
     }
     unshift(@hiddens,$pathitem);
     foreach my $item (@hiddens) {
-        if ($item eq 'newidx') {
-            next if ($env{'form.'.$item} =~ /\D/);
-        }
         if ($env{'form.'.$item}) {
             $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
                            &HTML::Entities::encode($env{'form.'.$item},'<>&"').'" />'."\n";
@@ -6307,7 +6201,6 @@ sub generate_admin_menu {
                                          'vc'   => 'Verify Content',
                                          'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',
-                                         'ct'   => 'Display/Set Shortened URLs for Deep-linking',          
                                          'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Copy $crstype Content to Authoring Space",
             );
@@ -6358,13 +6251,6 @@ sub generate_admin_menu {
                     icon       => 'symbs.png',
                     linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"
                 },
-                {   linktext   => $lt{'ct'},
-                    url        => "javascript:injectData(document.courseverify,'dummy','shorturls','$lt{'ct'}')",
-                    permission => 'F',
-                    help       => 'Docs_Short_URLs',
-                    icon       => 'shorturls.png',
-                    linktitle  => "Set shortened URLs for a resource or folder in your $lc_crstype for use in deep-linking"
-                },
                 ]
         });
     if ($canedit) {
@@ -6567,13 +6453,8 @@ sub editing_js {
                 } else {
                     $url = $res;
                 }
-                $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($url),'<>&"');
-                if ($backtourl =~ m{^\Q/uploaded/$coursedom/$coursenum/\Edefault_\d+\.sequence$}) {
-                    $backtourl .= '?navmap=1';
-                } else {
-                    $backtourl .= '?symb='.
-                                  &HTML::Entities::encode($caller,'<>&"');
-                }
+                $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($url),'<>&"').'?symb='.
+                             &HTML::Entities::encode($caller,'<>&"');
                 if ($anchor ne '') {
                     $backtourl .= '#'.&HTML::Entities::encode($anchor,'<>&"');
                 }
@@ -7788,9 +7669,7 @@ check on this
 
 Verify Content
 
-=item devalidateversioncache() 
-
-=item checkversions()
+=item devalidateversioncache() & checkversions()
 
 Check Versions