How can my CGI program access non-browseable files?
- by Zerobu
I was wondering if it was possible to read a text file that was located in a directory called
"/home/user/files"
I wanted to read it from my cgi-bin which is located in /home/user/cgi-bi/
Below is my code,
#!/usr/bin/perl
use strict;
use CGI;
#Virtual Directory
#Steffan Harris
eval
{
use constant PASSWORD => 'perl';
use constant UPLOAD_DIR => '/home/sharris2/files';
sub mapToFile
{
   print chdir UPLOAD_DIR;
}
#This function will list all files in a directory.
sub  listDirectoryFiles
{
    chdir UPLOAD_DIR;
    my @files = <*>;
    mapToFile;
    print<<LIST;
    <h2>Current Files</h2>
      <ul>
LIST
     if(!$files[0])
     {
     print" </ul>\n<em>No files in directory</em>";
     }
    foreach(@files)
    {
    print"      <li>$_</li>";
    }
    print "     </ul>\n";
}
#This function generates a 404 Not Found error
sub generate404
{
print<<RESPONSE;
Status: 404 Not Found
Content-Type: text/html
      <html>
          <head><title>404 Not Found</title></head>
      <body>
        <p>
          <h1>404 - Not Found</h1>
        </p>
        The requested URL <b>$ENV{"HTTP_HOST"}$ENV{"REQUEST_URI"}</b> was not found on the server.
      </body>
      </html>
RESPONSE
exit;
}
#This function checks the path info to see if it matches a file in the UPLOAD_DIR directory, If it does not, then it returns a 404 error
sub checkExsistence
{
    if($ENV{"PATH_INFO"})
    {
    chdir UPLOAD_DIR;
    my @files = <*>;
    if(!$files[0] and $ENV{"PATH_INFO"} eq "/")
    {
        return;
    }
    foreach(@files)
    {
        if($ENV{"PATH_INFO"} eq "/".$_ || $ENV{"PATH_INFO"} eq "/")
        {
        print "yes";
        return;
        }
    }
    generate404;
    }
}
sub checkPassword
{
    my ($password, $cgi);
    $cgi = new CGI;
    $password = $cgi->param('passwd');
    unless($password eq PASSWORD)
    {
    print<<RESPONSE;
Status: 200 OK
Content-Type: text/html
     <html>
       <head>
         <title>Incorrect Password</title>
       </head>
       <body>
         <h1>Invalid password entered.</h1>
     <h3><a href="/~sharris2/cgi-bin/files/">Go Back</a></h3>
       </body>
RESPONSE
    exit;
    }
}
sub upLoadFile
{
    checkPassword;
    my ($uploadfile, $cgi);
    $cgi = new CGI;
    $uploadfile = $cgi->upload('uploadfile');
    chdir UPLOAD_DIR;
    $uploadfile
    or die "Did not receive a file to upload";
    open my $FILE, '>', UPLOAD_DIR."/$uploadfile" or
    die "$!";
    while(<$uploadfile>)
    {
    print $FILE $_;
    }
}
#Start of main  part of program
my $cgi = new CGI;
if(!$ENV{"PATH_INFO"})
{
    print $cgi->redirect('/~sharris2/cgi-bin/files/');
}
checkExsistence;
if($ENV{"REQUEST_METHOD"} eq "POST")
{
    upLoadFile;
}
print <<"HEADERS";
Status: 200 OK
Content-Type: text/html
HEADERS
    print <<"HTML";
<html>
    <head>
       <title>Virtual Directory</title> 
    </head>
    <body>
HTML
    listDirectoryFiles;
  print<<HTML;
       <h2>Upload a new file</h2>
      <form method = "POST" enctype = "multipart/form-data" action = "/~sharris2/cgi-bin/files/" />
          File:<input type = "file" name="uploadfile"/>
             <p>Password:
              <input type = "password" name ="passwd"/></p>
             <p><input type = "submit" value= "Submit File" /></p>
       </form>
    </body>
</html>
HTML
};