X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=autodns.pl;h=a2b4dd9fb6f52e24b3d91ac6e4930abb723d01b3;hb=3c571e259ea33befdc6dff62ea6024415cbdcb7e;hp=2b973ee4efe39c52273c1e31e9465d7c72e8537b;hpb=96c671ffe24694d4d9cf92052cabcd1ca4a13122;p=autodns.git diff --git a/autodns.pl b/autodns.pl index 2b973ee..a2b4dd9 100755 --- a/autodns.pl +++ b/autodns.pl @@ -5,12 +5,14 @@ # http://www.earth.li/projectpurple/progs/autodns.html # Released under the GPL. # -# $Id: autodns.pl,v 1.4 2004/04/08 10:48:35 noodles Exp $ +# $Id: autodns.pl,v 1.6 2005/04/08 11:37:16 noodles Exp $ # use strict; -use IPC::Open3; use Fcntl qw(:flock); +use File::Temp qw(tempfile); +use IPC::Open3; +use MIME::Parser; $ENV{'PATH'}="/usr/local/bin:/usr/bin:/bin:/usr/sbin"; @@ -211,21 +213,72 @@ Released under the GPL. EOF # -# Now run GPG against our incoming mail, first making sure that our locale is -# set to C so that we get the messages in English as we expect. +# Throw the mail at MIME::Parser and see if it accepts it. +# +my $parser = new MIME::Parser; +$parser->output_to_core(1); # No temporary files +my $entity = $parser->parse_data(\@MAIL); + +# +# Make sure locale is set to C so we get messages in English as we expect. # $ENV{'LC_ALL'}="C"; -open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch"); -# Feed it the mail. -print GPGIN @MAIL; -close GPGIN; +if ($entity->parts) { + # MIME + + my ($got_sig, $got_text) = (0, 0); + my ($sig_name,$sig_fh,$text_name,$text_fh); + ($sig_fh, $sig_name) = tempfile(); + ($text_fh, $text_name) = tempfile(); + + foreach my $subent ($entity->parts) { + if ($subent->effective_type eq "text/plain") { + @COMMANDS = split /\n/,$subent->bodyhandle->as_string; + + my $str = $subent->as_string; + $str =~ s/=\n$//; + $str =~ s/\n/\r\n/g; + print $text_fh $str; + close($text_fh); + $got_text++; + } elsif ($subent->effective_type eq + "application/pgp-signature") { + print $sig_fh $subent->as_string; + close($sig_fh); + $got_sig++; + } + } + + if ($got_sig && $got_text) { + open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch --verify ". + $sig_name." ".$text_name); + + close GPGIN; -# And grab what it has to say. -@GPGERROR=; -@COMMANDS=; -close GPGERR; -close GPGOUT; + @GPGERROR=; + my @GPGOUTPUT=; + close GPGERR; + close GPGOUT; + + unlink($text_name); + unlink($sig_name); + } +} else { + # Clear text. + + open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch"); + + # Feed it the mail. + print GPGIN @MAIL; + close GPGIN; + + # And grab what it has to say. + @GPGERROR=; + @COMMANDS=; + close GPGERR; + close GPGOUT; +} # Check who it's from and if the signature was a good one. $gpggood=1; @@ -283,6 +336,13 @@ foreach my $cfgfile (@cfgfiles) { getzones($cfgfile); } +# Force existance of the $domainlistroot$user file +if (! -e $domainlistroot.$user) { + open (DOMAINLIST, ">>$domainlistroot$user") or + &fatalerror("Couldn't create domains file.\n"); + close DOMAINLIST; +} + foreach (@COMMANDS) { # Remove trailing CRs and leading/trailing whitespace chomp;