Diff for /loncom/homework/daxeopen.pm between versions 1.7 and 1.11

version 1.7, 2023/08/23 20:33:06 version 1.11, 2023/08/23 22:34:48
Line 28 Line 28
 ###  ###
   
 package Apache::daxeopen;  package Apache::daxeopen;
   use strict;
   
 use Apache::Constants;  use Apache::Constants qw(:common);
 use DateTime;  use DateTime;
 use Try::Tiny;  use Try::Tiny;
 use File::stat;  use File::stat;
Line 41  use Apache::lonnet; Line 42  use Apache::lonnet;
 use Apache::pre_xml;  use Apache::pre_xml;
 use Apache::html_to_xml;  use Apache::html_to_xml;
 use Apache::post_xml;  use Apache::post_xml;
   use Apache::lonlocal;
   
 sub handler {  sub handler {
     my $request = shift;      my $request = shift;
Line 61  sub handler { Line 62  sub handler {
   
 sub convert_problem {  sub convert_problem {
     my ($uri, $request) = @_;      my ($uri, $request) = @_;
       
     if ($uri =~ m{^/priv/([^/]+)/([^/]+)/}) {      if ($uri =~ m{^/priv/([^/]+)/([^/]+)/}) {
         my ($domain, $user) = ($1, $2);          my ($domain, $user) = ($1, $2);
         my ($uname, $udom) = ($env{'user.name'}, $env{'user.domain'});          my ($uname, $udom) = ($env{'user.name'}, $env{'user.domain'});
         if (!defined $uname || !defined $udom || $domain ne $udom || $user ne $uname) {          if (!defined $uname || !defined $udom || $domain ne $udom || $user ne $uname) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("Forbidden URI: $uri");              $request->print(&mt('Forbidden URI: [_1]',$uri));
             $request->status(403);              $request->status(403);
             return OK;              return OK;
         }          }
Line 88  sub convert_problem { Line 88  sub convert_problem {
           $case_sensitive = 0;            $case_sensitive = 0;
         }          }
         $textref = &Apache::html_to_xml::html_to_xml($textref, $warnings, $case_sensitive);          $textref = &Apache::html_to_xml::html_to_xml($textref, $warnings, $case_sensitive);
         my $text = &Apache::post_xml::post_xml($textref, $file, $perlvar{'lonDocRoot'}, $warnings);          my $text = &Apache::post_xml::post_xml($textref, $file, $Apache::lonnet::perlvar{'lonDocRoot'}, $warnings);
         &Apache::loncommon::content_type($request, 'text/xml', 'utf-8');          &Apache::loncommon::content_type($request, 'text/xml', 'utf-8');
         $request->print($text);          $request->print($text);
         return OK;          return OK;
     } catch {      } catch {
         $request->content_type('text/plain');          $request->content_type('text/plain');
         $request->print("convert failed for $file: $_");          $request->print(&mt('convert failed for [_1]:',$file)." $_");
         $request->status(406);          $request->status(406);
         return OK;          return OK;
     };      };
Line 108  sub directory_listing { Line 108  sub directory_listing {
         $res .= "<directory name=\"/\">\n";          $res .= "<directory name=\"/\">\n";
         $res .= "<directory name=\"priv\"/>\n";          $res .= "<directory name=\"priv\"/>\n";
         $res .= "<directory name=\"res\"/>\n";          $res .= "<directory name=\"res\"/>\n";
     } elsif ($uri !~ /^\/(priv|res)\//) {      } elsif ($uri !~ m{^/(priv|res)/}) {
         $request->content_type('text/plain');          $request->content_type('text/plain');
         $request->print("Not found: $uri");          $request->print(&mt('Not found: [_1]',$uri));
         $request->status(404);          $request->status(404);
         return OK;          return OK;
     } elsif ($uri =~ m{^/res/}) {      } elsif ($uri =~ m{^/res/}) {
         # NOTE: dirlist does not return an error for /res/idontexist/          # NOTE: dirlist does not return an error for /res/idontexist/
  (my $listref, $listerror) = &Apache::lonnet::dirlist($uri);   my ($listref, $listerror) = &Apache::lonnet::dirlist($uri);
  if ($listerror) {   if ($listerror) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("listing error: $listerror");              $request->print(&mt('listing error: [_1]',$listerror));
             $request->status(406);              $request->status(406);
             return OK;              return OK;
  } elsif ($uri =~ m{^/res/[^/]+/$} && scalar(@{$listref}) == 0) {   } elsif ($uri =~ m{^/res/[^/]+/$} && scalar(@{$listref}) == 0) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("Not found: $uri");              $request->print(&mt('Not found: [_1]',$uri));
             $request->status(404);              $request->status(404);
             return OK;              return OK;
  }   }
Line 166  sub directory_listing { Line 166  sub directory_listing {
         my $udom = $env{'user.domain'};          my $udom = $env{'user.domain'};
         if (!defined $udom) {          if (!defined $udom) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("Forbidden URI: $uri");              $request->print(&mt('Forbidden URI: [_1]',$uri));
             $request->status(403);              $request->status(403);
             return OK;              return OK;
         }          }
Line 177  sub directory_listing { Line 177  sub directory_listing {
         my ($uname, $udom) = ($env{'user.name'}, $env{'user.domain'});          my ($uname, $udom) = ($env{'user.name'}, $env{'user.domain'});
         if (!defined $uname || !defined $udom || $domain ne $udom) {          if (!defined $uname || !defined $udom || $domain ne $udom) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("Forbidden URI: $uri");              $request->print(&mt('Forbidden URI: [_1]',$uri));
             $request->status(403);              $request->status(403);
             return OK;              return OK;
         }          }
Line 188  sub directory_listing { Line 188  sub directory_listing {
         my ($uname, $udom) = ($env{'user.name'}, $env{'user.domain'});          my ($uname, $udom) = ($env{'user.name'}, $env{'user.domain'});
         if (!defined $uname || !defined $udom || $domain ne $udom || $user ne $uname) {          if (!defined $uname || !defined $udom || $domain ne $udom || $user ne $uname) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("Forbidden URI: $uri");              $request->print(&mt('Forbidden URI: [_1]',$uri));
             $request->status(403);              $request->status(403);
             return OK;              return OK;
         }          }
         my $dirpath = &Apache::lonnet::filelocation('', $uri);          my $dirpath = &Apache::lonnet::filelocation('', $uri);
         if (! -e $dirpath) {          if (! -e $dirpath) {
             $request->content_type('text/plain');              $request->content_type('text/plain');
             $request->print("Not found: $uri");              $request->print(&mt('Not found: [_1]',$uri));
             $request->status(404);              $request->status(404);
             return OK;              return OK;
         }          }
         $dirpath =~ s{/$}{};          $dirpath =~ s{/$}{};
         opendir my $dir, $dirpath or die "Cannot open directory: $dirpath";          my @files;
         my @files = readdir $dir;          if (opendir(my $dir, $dirpath)) {
         closedir $dir;              @files = readdir($dir);
               closedir($dir);
           } else {
               $request->content_type('text/plain');
               $request->print(&mt('Error opening directory: [_1]',$dirpath));
               $request->status(403);
               return OK;
           }
         my $dirname = $dirpath;          my $dirname = $dirpath;
         $dirname =~ s{^.*/([^/]*)$}{$1};          $dirname =~ s{^.*/([^/]*)$}{$1};
         $res .= "<directory name=\"$dirname\">\n";          $res .= "<directory name=\"$dirname\">\n";
Line 213  sub directory_listing { Line 220  sub directory_listing {
             if ($name =~ /\.(bak|log|meta|save)$/) {              if ($name =~ /\.(bak|log|meta|save)$/) {
                 next;                  next;
             }              }
             $sb = stat($dirpath.'/'.$name);              my $sb = stat($dirpath.'/'.$name);
             my $mode = $sb->mode;              my $mode = $sb->mode;
             if (S_ISDIR($mode)) {              if (S_ISDIR($mode)) {
                 $res .= "<directory name=\"$name\"/>\n";                  $res .= "<directory name=\"$name\"/>\n";
Line 230  sub directory_listing { Line 237  sub directory_listing {
         }          }
     } else {      } else {
         $request->content_type('text/plain');          $request->content_type('text/plain');
         $request->print("Not found: $uri");          $request->print(&mt('Not found: [_1]',$uri));
         $request->status(404);          $request->status(404);
         return OK;          return OK;
     }      }

Removed from v.1.7  
changed lines
  Added in v.1.11


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>