Advertisement
Guest User

Untitled

a guest
Jul 9th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.51 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use MIME::Parser;
  4. use Sys::Hostname;
  5.  
  6. #--------------------------------------------------------------------------------#
  7. sub tempfail{
  8.         print STDERR join("\n",@_),"\n";
  9.         # indicate temporary failure to qmail
  10.         exit 111;
  11. }
  12. #--------------------------------------------------------------------------------#
  13. sub getnames {
  14.         my ($ent,$name) = @_;
  15.         defined($name) or $name = "'anonymous'";
  16.  
  17.         my @parts = $ent->parts;
  18.         if (@parts) {
  19.                 my $i;
  20.                 foreach $i (0 .. $#parts) {       # dump each part...
  21.                         getnames($parts[$i], ("$name, part ".(1+$i)));
  22.                 }
  23.         } else {
  24.                 my $type = $ent->effective_type;
  25.                 my $io;
  26.                 my $tmpbod;
  27.                 my $line;
  28.                 unless ($type =~ /^(text|message|multipart)/) {
  29.                         $name=$ent->head->recommended_filename;
  30.                         push(@names,$name);
  31.                 }
  32.         return 0;
  33.         }
  34. }
  35. #--------------------------------------------------------------------------------#
  36. sub mangle {
  37.         my ($ent,$name) = @_;
  38.         my $mystring;
  39.         my $maxlines=80;
  40.         defined($name) or $name = "'anonymous'";
  41.         $mystring="***NOTE: This message has been altered\n"
  42.                 . "***NOTE: The following large attachments have been removed:\n"
  43.                 . join("\n",@names) . "\n***NOTE: Original message follows:\n\n";
  44.  
  45.         my @parts = $ent->parts;
  46.         if (@parts) {
  47.                 my $i;
  48.                 foreach $i (0 .. $#parts) {       # dump each part...
  49.                         mangle($parts[$i], ("$name, part ".(1+$i)));
  50.                 }
  51.         } else {
  52.                 my $type = $ent->effective_type;
  53.                 my $io;
  54.                 my $tmpbod;
  55.                 my $line;
  56.                 if ($type =~ /^text\/(plain|html)$/) {
  57.                         my $j=1;
  58.                         if ($io = $ent->bodyhandle->open("r")) {
  59.                                 while ((defined($line = $io->getline)) && ($j <= $maxlines)){
  60.                                         $tmpbod .= $line;
  61.                                         $j++;
  62.                                 }
  63.                                 $io->close;
  64.                         } else { tmpfail("Grr, argh: $!"); }
  65.  
  66.                         if ($type eq "text/plain"){
  67.                                 $tmpbod = "$mystring" . $tmpbod;
  68.                                 if ($j >= $maxlines){
  69.                                         $tmpbod .= "\n\n***NOTE: This message has been truncated to $maxlines lines\n\n";
  70.                                 }
  71.                         } elsif ($type eq "text/html"){
  72.                                 $tmpbod =~ s@(<body>)@$1\n<pre>\n$mystring</pre>\n@i;
  73.                                 if ($j >= $maxlines){
  74.                                         $tmpbod .= "</table></div></table></div></table></div></table><pre>\n\n***NOTE: This message has been truncated to $maxlines lines</pre></body></html>\n\n";
  75.                                 }
  76.                         }
  77.  
  78.                         if ($io = $ent->bodyhandle->open("w")) {
  79.                                 $io->print($tmpbod);
  80.                                 $io->close;
  81.                         } else { tmpfail("Grr, argh: $!"); }
  82.                 }
  83.         return 0;
  84.         }
  85. }
  86. #--------------------------------------------------------------------------------#
  87.  
  88. my $parser = new MIME::Parser;
  89.    
  90. # Create and set the output directory:
  91. $host = hostname;
  92. $date = time();
  93. $pid = $$;
  94. $tmpdir="/var/tmp/mime-tmp-dir-${host}-${date}-${pid}";
  95. (-d "$tmpdir") or mkdir("$tmpdir",0755) or tmpfail("$!");
  96. (-w "$tmpdir") or tmpfail("Can't write to $tmpdir");
  97. $parser->output_dir("$tmpdir");
  98.    
  99. # parse the message
  100. $entity = $parser->read(\*STDIN) or tmpfail("couldn't parse MIME stream");
  101.  
  102. # add text strings
  103. @names=();
  104. getnames($entity);
  105. mangle($entity);
  106. chomp ($subject=$entity->head->get('Subject',0));
  107. $entity->head->replace('Subject', "$subject - ***large attachments deleted*** ");
  108.  
  109. # delete all parts that aren't text or mime multipart
  110. $entity->parts([ grep { $_->effective_type =~ /^(text|message|multipart)\// } $entity->parts ]);
  111.  
  112. # Fixup (or create) content-length headers
  113. $entity->sync_headers(Length => 'COMPUTE', Nonstandard => 'ERASE');
  114.  
  115. # dump it
  116. $entity->print(\*STDOUT);
  117.  
  118. # Clean up tmpfiles and then go to sleep
  119. $parser->filer->purge;
  120. rmdir("$tmpdir");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement