X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FApp%2FEdwardNG.pm;h=f6b54a4254cffe720246bd503447c89763f024ac;hb=d03d611f3dd49549200b266ff84b70bd7a69ba4f;hp=88046414814dfe4af44f5cbe016a4bbf50be60f7;hpb=1f08c3525c33b88f5b67e84b573f695ec2d4643e;p=app-edwardng.git diff --git a/lib/App/EdwardNG.pm b/lib/App/EdwardNG.pm index 8804641..f6b54a4 100644 --- a/lib/App/EdwardNG.pm +++ b/lib/App/EdwardNG.pm @@ -8,7 +8,9 @@ our $VERSION = '0.001'; our @EXPORT = qw/process_message/; use Email::Sender::Simple qw/sendmail/; +use File::Share qw/dist_file/; use File::Slurp qw/read_file/; +use File::Spec::Functions qw/rel2abs/; use Getopt::Long; use MIME::Entity; use MIME::Parser; @@ -31,30 +33,22 @@ sub mg { sub first_part{ my ($ent) = @_; - return first_part $ent->parts(0) if $ent->parts; - $ent->bodyhandle->as_string + return first_part ($ent->parts(0)) if $ent->parts; + stringify [$ent->bodyhandle->as_lines] } sub process_message { - my ($msg) = @_; + my ($in) = @_; + my $msg; my $parser = MIME::Parser->new; $parser->decode_bodies(0); $parser->output_to_core(1); - if (ref $msg eq 'MIME::Entity') { - debug 'Got MIME::Entity'; - } elsif (ref $msg eq 'IO') { - debug 'Parsing from filehandle'; - $msg = $parser->parse($msg) - } elsif (ref $msg eq 'SCALAR') { - debug 'Parsing from string'; - $msg = $parser->parse_data($$msg) - } elsif (!ref $msg) { - debug "Parsing from file $msg"; - $msg = $parser->parse_open($msg) - } else { - die "Don't know how to parse $msg" - } + $msg = $in if ref $in eq 'MIME::Entity'; + $msg = $parser->parse ($in) if ref $in eq 'IO'; + $msg = $parser->parse_data ($in) if ref $in eq 'SCALAR'; + $msg = $parser->parse_open ($in) unless ref $in; + die "Don't know how to parse $in" unless $msg; if ($msg->mime_type ne 'multipart/signed' && $msg->mime_type ne 'multipart/encrypted') { # PGP/Inline requires decoding @@ -102,14 +96,19 @@ sub run { 'from=s' => \$ENV{EDWARDNG_FROM}, 'key=s' => \$ENV{EDWARDNG_KEY}, 'keydir=s' => \$ENV{EDWARDNG_KEYDIR}, + 'logfile=s' => \$ENV{EDWARDNG_LOGFILE}, 'passphrase=s' => \$ENV{EDWARDNG_PASSPHRASE}, + 'tmpl-path=s' => \$ENV{EDWARDNG_TMPL_PATH}, 'use-agent!' => \$ENV{EDWARDNG_USE_AGENT}, ); + my $tmpl_path = $ENV{EDWARDNG_TMPL_PATH} // 'en'; + open STDERR, '>>', $ENV{EDWARDNG_LOGFILE} if $ENV{EDWARDNG_LOGFILE}; my $parser = MIME::Parser->new; $parser->decode_bodies(0); $parser->output_to_core(1); my $in = $parser->parse(\*STDIN); + debug 'Received mail from ', $in->get('From'); my ($tmpl, %params); try { @@ -117,22 +116,24 @@ sub run { } catch { ($tmpl, %params) = (error => message => $_) }; + debug "Result is $tmpl, GnuPG said:\n", $params{message}; $params{plaintext} = first_part $params{decrypted} if $params{decrypted}; - my $tt = Template->new(INCLUDE_PATH => 'tmpl/en'); - my ($data, $subject); + my $tt = Template->new(INCLUDE_PATH => rel2abs $tmpl_path, dist_file 'App-EdwardNG', 'tmpl'); + my $data; $tt->process($tmpl, \%params, \$data); - $tt->process('subject', undef, \$subject); my $email = MIME::Entity->build( From => $ENV{EDWARDNG_FROM}, To => $in->get('From'), - Subject => $subject, + Subject => 'Re: ' . $in->get('Subject'), Data => $data); + my $email_unencrypted = $email->dup; my $mg = mg always_trust => 1; - $mg->mime_signencrypt($email, $in->get('From') =~ /<(.*)>/) and debug 'Could not encrypt message. GnuPG said ', stringify $mg->{last_message}; - sendmail $email + my $encrypt_failed = $mg->mime_signencrypt($email, $in->get('From') =~ /<(.*)>/); + debug 'Could not encrypt message, sending unencrypted. GnuPG said:', "\n", stringify $mg->{last_message} if $encrypt_failed; + sendmail $encrypt_failed ? $email_unencrypted : $email } 1; @@ -170,8 +171,6 @@ App::EdwardNG - GnuPG email sign/encrypt testing bot EdwardNG is a reimplementation of the Edward reply bot referenced in L. -It takes mail messages, checks them for PGP signatures and encryption, then replies appropriately. - This module exports a single function, B, which takes a single parameter representing the message. This parameter can be: =over