--- loncom/interface/lonindexer.pm 2009/07/03 09:59:06 1.198 +++ loncom/interface/lonindexer.pm 2018/08/09 13:52:07 1.229 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Directory Indexer # -# $Id: lonindexer.pm,v 1.198 2009/07/03 09:59:06 bisitz Exp $ +# $Id: lonindexer.pm,v 1.229 2018/08/09 13:52:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,9 +34,8 @@ ## 1. Description of functions ## ## 2. Modules used by this module ## ## 3. Choices for different output views (detailed, summary, xml, etc) ## -## 4. BEGIN block (to be run once after compilation) ## -## 5. Handling routine called via Apache and mod_perl ## -## 6. Other subroutines ## +## 4. Handling routine called via Apache and mod_perl ## +## 5. Other subroutines ## ## ## ############################################################################### @@ -60,7 +59,6 @@ use LONCAPA qw(:match); # ---------------------------------------- variables used throughout the module my %hash; # global user-specific gdbm file my %dirs; # keys are directories, values are the open/close status -my %language; # has the reference information present in language.tab my %dynhash; # hash of hashes for dynamic metadata my %dynread; # hash of directories already read for dynamic metadata my %fieldnames; # Metadata fieldnames @@ -94,15 +92,9 @@ sub handler { undef (@Omit); %fieldnames=&Apache::lonmeta::fieldnames(); -# ------------------------------------- read in machine configuration variables +# --------------------------------------------------------------- get icon path my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my $domain = $r->dir_config('lonDefDomain'); - my $role = $r->dir_config('lonRole'); - my $loadlim = $r->dir_config('lonLoadLim'); - my $servadm = $r->dir_config('lonAdmEMail'); - my $sysadm = $r->dir_config('lonSysEMail'); - my $lonhost = $r->dir_config('lonHostID'); - my $tabdir = $r->dir_config('lonTabDir'); + my $defdom = &Apache::lonnet::default_login_domain(); #SB my $fileclr='#ffffe6'; my $line; @@ -120,8 +112,8 @@ sub handler { my $colspan=''; $extrafield=''; - my $diropendb = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db"; + my $diropendb = LONCAPA::tempdir() . + "$env{'user.domain'}_$env{'user.name'}_sel_res.db"; %hash = (); { my %dbfile; @@ -165,6 +157,8 @@ sub handler { ENDSUBM $r->print(&Apache::loncommon::start_page(undef,$js, {'only_body' =>1, + 'add_modal' => 1, + 'add_wishlist' => 1, 'add_entries' => {'onload' => "load();"},} ). @@ -184,7 +178,7 @@ ENDSUBM $colspan=" colspan='2' "; my $cl=&mt('Close'); $closebutton=< + END } elsif ($env{'form.catalogmode'} eq 'import') { @@ -196,11 +190,11 @@ END my $cl=&mt('Close'); my $gi=&mt('Import'); $closebutton=< + END $groupimportbutton=< +onclick="javascript:select_group()" /> END } # Additions made by Matthew to make the browser a little easier to deal @@ -321,10 +315,8 @@ function select_group() { function changeURL(val) { if (window.opener.document) { - var elementname = "$element"+"_value"; - var checkboxname = "$element"+"_setparmval"; + var elementname = "$element"; window.opener.document.forms["$form"].elements[elementname].value=val; - window.opener.document.forms["$form"].elements[checkboxname].checked=true; } else { alert("The file you selected is: "+val); } @@ -361,6 +353,7 @@ END my $js = <<"ENDHEADER"; ENDHEADER @@ -413,14 +409,14 @@ ENDHEADER if ($env{'form.catalogmode'}) { # "Popup mode" $r->print(&Apache::loncommon::start_page('Browse published resources',$js, - {'only_body' => 1, + {'only_body' => 1, 'add_wishlist'=>1, 'add_modal' =>1, 'domain' => $headerdom,})); } else { # Only display page header and breadcrumbs in non-popup mode &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb({ 'text' => 'Browse published resources', - 'href' => '/res/fhwfdev/?launch=1', + 'href' => '/res/'.$headerdom.'/?launch=1', }); $r->print(&Apache::loncommon::start_page('Browse published resources',$js, {'domain' => $headerdom,}) @@ -446,30 +442,33 @@ ENDHEADER } } else { for (my $i=0; $i<=16; $i++) { - $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1; + $attrchk[$i] = 'checked="checked"' if $hash{'display_attrs_'.$i} == 1; } } + my @file_categories = &Apache::loncommon::filecategories(); + my %select_file_categories; + my @select_form_order = (''); + $select_file_categories{''} = &mt('All file types'); + foreach my $cat (@file_categories) { + my $types = join(",",&Apache::loncommon::filecategorytypes($cat)); + $select_file_categories{$types} = &mt($cat); + push(@select_form_order,$types); + } + $select_file_categories{'select_form_order'} = \@select_form_order; + my $onchange = 'this.form.submit();'; + my $type_element= + &Apache::loncommon::select_form( + $typeselect, + 'only', + \%select_file_categories,$onchange); + my $type_selector = ''; + # ------------------------------- output state of file attributes to be showing # All versions has to the last item # since it does not take an extra col my %lt=&Apache::lonlocal::texthash( - 'ti' => 'Title', - 'si' => 'Size', - 'la' => 'Last access', - 'lm' => 'Last modified', - 'st' => 'Statistics', - 'au' => 'Author', - 'kw' => 'Keywords', - 'sb' => 'Subject', - 'nt' => 'Notes', - 'ab' => 'Abstract', - 'ln' => 'Language', - 'gl' => 'Grade Level', - 'sd' => 'Standards', - 'sa' => 'Source Available', - 'sr' => 'Show resource', - 'li' => 'Linked/Related Resources', 'av' => 'All versions', 'ud' => 'Update Display', 'pr' => 'Problems', @@ -477,59 +476,61 @@ ENDHEADER 'at' => 'All types', 'hd' => 'Display Options' ); - $r->print(< 'Title', + 4 => 'Author', + 5 => 'Keywords', + 6 => 'Language', + 13 => 'Notes', + 1 => 'Size', + 2 => 'Last access', + 3 => 'Last modified', + 10 => 'Source Available', + 14 => 'Abstract', + 8 => 'Statistics', + 11 => 'Linked/Related Resources', + 7 => 'Show resource', + 12 => 'Subject', + 15 => 'Grade Level', + 16 => 'Standards', + ); + my $cell = 0; + my $numinrow = 4; + $r->print(' +
-$lt{'hd'} - - - - - - - - - - - - - - - - - - - +'.$lt{'hd'}.' +
 
'."\n"); + foreach my $item (@disp_order) { + my $style = 'padding-left: 12px; padding-right: 8px;'; + if ($cell%$numinrow == 0) { + $r->print(''); + } + $cell ++; + if ($cell > 3 * $numinrow) { + $style .= ' padding-bottom: 6px;'; + } + if (defined($disp_options{$item})) { + $r->print(''."\n"); + } + if ($cell > 1 && $cell%$numinrow == 0) { + $r->print(''); + } + } + $r->print(< - - - - - - + +
'. + '
  + +$type_selector
-END - my @file_categories = &Apache::loncommon::filecategories(); - my %select_file_categories; - my @select_form_order = (''); - $select_file_categories{''} = &mt('All file types'); - foreach my $cat (@file_categories) { - my $types = join(",",&Apache::loncommon::filecategorytypes($cat)); - $select_file_categories{$types} = $cat; - push(@select_form_order,$types); - } - $select_file_categories{'select_form_order'} = \@select_form_order; - my $type_element= - &Apache::loncommon::select_form($typeselect,'only', - %select_file_categories); - $type_element = ''; - $r->print($type_element - .'
'); - $r->print(< + $closebutton $groupimportbutton @@ -541,11 +542,21 @@ END $storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; $storeuri=~s/\/+/\//g; # ---------------------------------------------------------------- Bread crumbs - $r->print(&Apache::lonhtmlcommon::crumbs($storeuri,'','', - (($env{'form.catalogmode'} eq 'import')? - 'document.forms.fileattr':'')). - &Apache::lonhtmlcommon::select_recent('residx','resrecent', -'window.status=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();')); + $r->print( + '

' + .&Apache::lonhtmlcommon::crumbs( + $storeuri, + '', + '', + (($env{'form.catalogmode'} eq 'import')? + 'document.forms.fileattr':'')) + .'
' + .&Apache::lonhtmlcommon::select_recent( + 'residx', + 'resrecent', + 'window.status=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();') + .'

' + ); # -------------------------------------------------------- Resource Home Button my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'}; if ($reshome) { @@ -555,7 +566,7 @@ END } else { $r->print($reshome); } - $r->print("'>".&mt('Home').''); + $r->print("'>".&mt('Home directory').''); } $r->print(''); # ------------------------------------------------------ Remember where we were @@ -563,17 +574,17 @@ END &Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri); # -------------------------------------------------- Check All and Uncheck all if ($env{'form.catalogmode'} eq 'import') { - $r->print('
'); - $r->print(''); + $r->print('

'); + $r->print('

'); } # ----------------- output starting row to the indexed file/directory hierarchy #$r->print(&initdebug()); #$r->print(&writedebug("Omit:@Omit")) if (@Omit); #$r->print(&writedebug("Only:@Only")) if (@Only); - $r->print('

'); $r->print(&Apache::loncommon::start_data_table("LC_tableBrowseRes") .&Apache::loncommon::start_data_table_header_row()); $r->print("".&mt('Name')."\n"); + $r->print("\n"); $r->print("".&mt('Title')."\n") if ($hash{'display_attrs_0'} == 1); $r->print(''.&mt("Size")." (".&mt("bytes").") ". @@ -613,7 +624,7 @@ END # ----------------- read in what directories have previously been set to "open" - foreach (keys %hash) { + foreach (keys(%hash)) { if ($_ =~ /^diropen_status_/) { my $key = $_; $key =~ s/^diropen_status_//; @@ -654,12 +665,12 @@ END pop @uri_com; my $upone = join('/',@uri_com); my @list = qw (0); - &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list); + &display_line ($r,$defdom,'opened',$upone.'&viewOneUp',0,$upone,@list); $indent = 1; } # -------- recursively go through all the directories and output as appropriate - &scanDir ($r,$toplevel,$indent,\%hash); + &scanDir ($r,$toplevel,$indent,\%hash,$defdom); # -------------------------------------------------------------- end the tables $r->print(&Apache::loncommon::end_data_table()); @@ -687,7 +698,7 @@ END # ----------------------------------------------- recursive scan of a directory sub scanDir { - my ($r,$startdir,$indent,$hashref)=@_; + my ($r,$startdir,$indent,$hashref,$defdom)=@_; my $c = $r->connection(); my ($compuri,$curdir); my $dirptr=16384; @@ -699,7 +710,20 @@ sub scanDir { return if ($c->aborted()); #This is a kludge, sorry aboot this my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); - next if($strip =~ /.*\.meta$/ | $obs eq '1'); + next if (($strip =~ /\.meta$/) || ($obs)); + if ($dom ne 'domain') { + my ($udom,$uname); + if ($dom eq 'user') { + ($udom) = ($startdir =~ m{^/res/($match_domain)}); + $uname = $strip; + } else { + ($udom,$uname) = ($startdir =~ m{^/res/($match_domain)/($match_courseid)}); + } + if ($udom ne '' && $uname ne '') { + # Don't display "course author" directory. + next if (&Apache::lonnet::is_course($udom,$uname)); + } + } my (@fileparts) = split(/\./,$strip); if ($hash{'display_attrs_9'} != 1) { # if not all versions to be shown @@ -730,8 +754,8 @@ sub scanDir { } } } - &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list); - &scanDir ($r,$compuri,$indent) if $diropen eq 'opened'; + &display_line($r,$defdom,$diropen,$line,$indent,$curdir,$hashref,@list); + &scanDir ($r,$compuri,$indent,undef,$defdom) if $diropen eq 'opened'; } $indent--; } @@ -740,9 +764,11 @@ sub scanDir { sub get_list { my ($r,$uri)=@_; my @list=(); + my $listerror; + (my $luri = $uri) =~ s/\//_/g; if ($env{'form.updatedisplay'}) { - foreach (keys %hash) { + foreach (keys(%hash)) { delete $hash{$_} if ($_ =~ /^dirlist_files_/); delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/); } @@ -763,10 +789,20 @@ sub get_list { $hash{'dirlist_files_'.$luri} = join("\n",@list); } else { # is really a directory - @list = &Apache::lonnet::dirlist($uri); + (my $listref,$listerror) = &Apache::lonnet::dirlist($uri); + if (ref($listref) eq 'ARRAY') { + @list = @{$listref}; + } $hash{'dirlist_files_'.$luri} = join("\n",@list); $hash{'dirlist_timestamp_files_'.$luri} = time; } +#Checking for error messages associated with empty directories or inaccessible servers (See Bug 4984) + if (($listerror eq 'no_such_dir') || ($listerror eq 'no_such_host') || ($listerror eq 'no_host')) { + $r->print("

" . &mt("Directory does not exist."). "

"); + } elsif ($listerror eq 'con_lost') { + $r->print("

" . &mt("Directory temporarily not accessible."). "

"); + } + return @list=&match_ext($r,@list); } @@ -849,7 +885,7 @@ sub match_ext { # ------------------------------- displays one line in appropriate table format sub display_line { - my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_; + my ($r,$defdom,$diropen,$line,$indent,$startdir,$hashref,@list)=@_; my (@pathfn, $fndir); # there could be relative paths (files actually belonging into this directory) # or absolute paths (for example, from sequences) @@ -897,7 +933,7 @@ sub display_line { $r->print("\n"); $r->print ('
'."\n"); @@ -905,16 +941,24 @@ sub display_line { $r->print (''."\n"); $r->print (''."\n"); - $r->print ('print (' name="'.$msg.'" type="image" class="LC_fileicon" />'. + $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); - $r->print(&mt("Up")."
$tabtag"); + $r->print(&mt("Up")."$tabtag"); $r->print(&Apache::loncommon::end_data_table_row()); return OK; } # Do we have permission to look at this? + if($filecom[15] ne '1') { return OK if ((!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])) && (!&Apache::lonnet::allowed('bro',$pathprefix.$filecom[0]))); } - if($filecom[15] ne '1') { return OK if (!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])); } + if (($filecom[1] eq 'domain') && ($defdom ne $listname)) { + unless (&Apache::lonnet::will_trust('shared',$listname,$defdom)) { + return OK; + } + unless (&Apache::lonnet::will_trust('content',$defdom,$listname)) { + return OK; + } + } # make absolute links appear on different background #SB if ($absolute) { $fileclr='#ccdd99'; } @@ -932,8 +976,8 @@ sub display_line { $anchor =~ s/\W//g; $r->print (''); $r->print (''); - $r->print ('print (' name="'.$msg.'" type="image" class="LC_fileicon" />'. + $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]); $r->print ('(".&Apache::lonnet::domain($listname,'description'). ")"); } - $r->print("$tabtag"); + $r->print("$tabtag"); $r->print(&Apache::loncommon::end_data_table_row()); return OK; # display user directory } + if ($filecom[1] eq 'user') { + my $domain=(split(m|/|,$startdir))[2]; + if ($defdom ne $domain) { + unless (&Apache::lonnet::will_trust('shared',$domain,$defdom)) { + return OK; + } + unless (&Apache::lonnet::will_trust('content',$defdom,$domain)) { + return OK; + } + } # $r->print("$extrafield"); my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; @@ -962,12 +1016,15 @@ $r->print (''."\n"); $r->print (''); - $r->print (''); + $r->print (''); $r->print ('print (' name="'.$msg.'"/>'. + $r->print (' alt="'.$msg.'"/>'. "\n"); my $quotable_curdir = &Apache::loncommon::escape_single($curdir); + my $quotable_startdir = &Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + $r->print (''.$msg.''); @@ -976,7 +1033,12 @@ $r->print ('print(''.$tabtag); +# Wishlistlink + $r->print(''. + ''.$tabtag); $r->print(&Apache::loncommon::end_data_table_row()); return OK; } @@ -1010,17 +1072,17 @@ $r->print ('"); $r->print("\"\"". "\n"); - $r->print(''); + $r->print(''); } elsif ($env{'form.catalogmode'} eq 'import') { $r->print("
\n"); $r->print("print("checked"); } $r->print(" />\n"); - $r->print('
'); + $r->print(''); $hash{"pre_${fnum}_link"}=$filelink; $hash{"pre_${fnum}_title"}=$title; if (!$hash{"pre_${fnum}_title"}) { @@ -1037,8 +1099,8 @@ $r->print ('\n"); + $r->print(''); $count++; } # Sequence open/close icon @@ -1048,29 +1110,33 @@ $r->print (''); $r->print (''); - $r->print (''); + $r->print (''); $r->print ('print (' name="'.$msg.'" type="image" class="LC_fileicon" />'. + $r->print (' alt="'.$msg.'" />'. "\n"); } # Filetype icons $r->print("\"\"\n"); my $quotable_filelink = &Apache::loncommon::escape_single($filelink); + my $quotable_startdir = Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); - $r->print (" $listname "); + $r->print (" $listname "); $quotable_filelink = &Apache::loncommon::escape_single($filelink.'.meta'); &Apache::loncommon::inhibit_menu_check(\$quotable_filelink); - $r->print (" (".&mt('metadata').") "); + $r->print (" (".&mt('metadata').") "); # Close form to open/close sequence if ($filelink=~/\.(page|sequence)$/) { $r->print(''); } - $r->print("\n"); + $r->print("\n"); +# Wishlistlink + $r->print(''. + ''); if ($hash{'display_attrs_0'} == 1) { $r->print(' '.($title eq '' ? ' ' : $title). ' '."\n"); @@ -1147,7 +1213,7 @@ $r->print (''.($output eq '' ? ' ':$output). " \n"); } @@ -1199,26 +1265,34 @@ $r->print ('\n"); + $r->print (''); $count++; } $r->print (''); $r->print (''); - $r->print ('print (' name="'.$msg.'" class="LC_fileicon" />'. + $r->print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); my $quotable_curdir = &Apache::loncommon::escape_single($curdir); - + my $quotable_startdir = &Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons"); my $icon = "navmap.folder.".($nowOpen ? "open":"closed").'.gif'; - $r->print ('' - .''.&mt('Open Folder').''. - "\n"); - $r->print ("$listname\n"); + $r->print ('' + .''.&mt('Open Folder').'' + ."\n"); + $r->print ("$listname"); +# Wishlistlink + $r->print(''. + ''); # Attributes my $filelink = $startdir.$filecom[0].'/default'; @@ -1263,8 +1337,8 @@ $r->print (''.$output.'
'; } elsif ($embstyle eq 'img') { $output=''.&mt('Preview').''; } elsif ($filelink=~m{^/res/($match_domain)/($match_username)/}) { @@ -1377,7 +1453,7 @@ sub begin_form { $uri=&Apache::loncommon::escape_single($uri); $r->print ('
'."\n"); $r->print (''. @@ -1396,7 +1472,7 @@ sub start_fresh_session { delete $hash->{'form.element'}; delete $hash->{'form.omit'}; delete $hash->{'form.only'}; - foreach (keys %{$hash}) { + foreach (keys(%{$hash})) { delete $hash->{$_} if (/^(pre_|store)/); } } @@ -1447,18 +1523,6 @@ This module enables a scheme of browsing This is part of the LearningOnline Network with CAPA project described at http://www.lon-capa.org. -=head1 BEGIN SUBROUTINE - -This routine is only run once after compilation. - -=over 4 - -=item * - -Initializes %language hash table. - -=back - =head1 HANDLER SUBROUTINE This routine is called by Apache and mod_perl.