home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 November / PCWorld_2000-11_cd.bin / Komunik / sambar444 / _SETUP.1 / mailit.pl < prev    next >
Text File  |  1999-11-21  |  4KB  |  181 lines

  1. #
  2. # Perl-based Mail Tool
  3. #
  4. # Copyright 1998 Tod Sambar
  5. # All rights reserved.
  6. #
  7. # Arbitrary Mail Form Data can be pre-pended to the mail
  8. # message by adding input parameters that begin with the 
  9. # characters: FD
  10. #
  11.  
  12. #
  13. # Only allow localhost to dump environment variables 
  14. # (ONLY remove after reading the syshelp/security.htm documentation)
  15. #
  16. $host_test = $ENV{'REMOTE_ADDR'};
  17. if (!($host_test eq '127.0.0.1'))
  18. {
  19.     print "Only localhost is allowed to use this script!\n";
  20.     exit(1);
  21. }
  22.  
  23. #
  24. # PARSE THE CGI FORM
  25. #
  26.  
  27.     # Buffer the POST content
  28.     read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  29.  
  30.     # Process the name=value argument pairs
  31.     my $data;
  32.     my $pair;
  33.     my $name;
  34.     my $value;
  35.     my @args = split(/&/, $buffer);
  36.  
  37.     $data = '';
  38.     foreach $pair (@args) 
  39.     {
  40.         ($name, $value) = split(/=/, $pair);
  41.  
  42.         # Unescape the argument value 
  43.         $value =~ tr/+/ /;
  44.         $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  45.  
  46.         # Any fields starting with FD (form-data) are prepended
  47.         if ($name =~ /^FD/)
  48.         {
  49.             $name =~ s/FD//;
  50.             $name =~ tr/+/ /;
  51.             $data .= $name." : ".$value."\n";
  52.         }
  53.         else
  54.         {
  55.             # Save the name=value pair for use below.
  56.             $FORM{$name} = $value;
  57.         }
  58.     }
  59.  
  60. #
  61. # VERIFY THE FORM DATA
  62. #
  63.     $server = $FORM{'server'};
  64.     $from = $FORM{'from'};
  65.     $to = $FORM{'recipient'};
  66.     if (!($server) || !($from) || !($to))
  67.     {
  68.         print "<HTML><TITLE>Missing fields</TITLE><BODY>\n";
  69.         print "Missing one of the following required arguments:<BR>\n";
  70.         print "<I>server</I> <I>from</I> <I>to</I>\n";
  71.         print "</BODY></HTML>\n";
  72.         exit(1);
  73.     }
  74.  
  75.     $subject = $FORM{'subject'};
  76.     if (!($subject))
  77.     {
  78.         $subject = "none";
  79.     }
  80.  
  81.     $bodyfile = '';
  82.     $body = $FORM{'body'};
  83.     if ($data)
  84.     {
  85.         $body = $data."\n\n".$body;
  86.     }
  87.  
  88.     $attach = $FORM{'attach'};
  89.  
  90. #
  91. # CLOSE SECURITY PROBLEMS.
  92. #
  93.     if (($server =~ /[;><&\*'\|]/ ) ||
  94.         ($from =~ /[;><&\*'\|]/ ) ||
  95.         ($subject =~ /[;><&\*'\|]/ ) ||
  96.         ($attach =~ /[;><&\*'\|]/ ) ||
  97.         ($to =~ /[;><&\*'\|]/ ))
  98.     {
  99.         print "<HTML><TITLE>Invalid fields</TITLE><BODY>\n";
  100.         print "One or more the following fields have invalid characters:<BR>\n";
  101.         print "<I>server</I> <I>from</I> <I>to</I> <I>subject</I> <I>attach</I>\n";
  102.         print "</BODY></HTML>\n";
  103.         exit(1);
  104.     }
  105.  
  106.     if ($attach =~ /([^\.]+)\//)
  107.     {
  108.         print "<HTML><TITLE>Invalid attachment path</TITLE><BODY>\n";
  109.         print "An invalid attachment path was specified.<BR>\n";
  110.         print "</BODY></HTML>\n";
  111.         exit(1);
  112.     }
  113.  
  114. #
  115. # Prepare the BODY of the message
  116. #
  117.     if ($body)
  118.     {
  119.         # Write the body to a temporary file.
  120.         do {
  121.             $bodyfile = int(rand(99999999))."mit";
  122.         } until !(-e $bodyfile);
  123.  
  124.         open(FILE, ">$bodyfile") || exit(1);
  125.  
  126.         print FILE $body;
  127.         close FILE;
  128.     }
  129.     
  130.     # Fixup any quote characters...
  131.     $server =~ s/"/\\"/g;
  132.     $from =~ s/"/\\"/g;
  133.     $to =~ s/"/\\"/g;
  134.     $subject =~ s/"/\\"/g;
  135.     $attach =~ s/"/\\"/g;
  136.         
  137.  
  138. #
  139. # BUILD THE MAIL COMMAND
  140. #
  141. # Syntax:  mailit <server> <from> <to> <subject> [<body-file> [<attach1>]]
  142. #
  143.  
  144.     $commandline = "..\\bin\\mailit.exe ";
  145.     $commandline .= " \"$server\"";
  146.     $commandline .= " \"$from\"";
  147.     $commandline .= " \"$to\"";
  148.     $commandline .= " \"$subject\"";
  149.     $commandline .= " $bodyfile" if $bodyfile;
  150.     $commandline .= " $attach" if $attach;
  151.  
  152.  
  153. #
  154. # EXECUTE THE MAILIT COMMAND
  155. #
  156.     system($commandline);
  157.     $result = $?;
  158.  
  159.     # Remove the body file.
  160.     if ($bodyfile)
  161.     {
  162.         unlink($bodyfile);
  163.     }
  164.  
  165.     # Test the result...
  166.     if ($result != 0)
  167.     {
  168.         print "\nMailIt Failed [$result].\n";
  169.         print "Command: ".$commandline;
  170.         exit(1);
  171.     }
  172.  
  173.  
  174. #
  175. # DONE
  176. #
  177.     print "MailIt Succeeded.\n";
  178.  
  179. exit(0);
  180.  
  181.