Re: filter assistance requested

2019-08-20 Thread Edgar Pettijohn

On Aug 20, 2019 4:29 AM, Gilles Chehade  wrote:
>
> On Mon, Aug 19, 2019 at 01:48:05PM -0500, Edgar Pettijohn wrote:
> > Nothing urgent here. Probably can wait for filter documentation. However, 
> > I've been
> > playing with filters off and on with limited success. It seems like 
> > data-line will 
> > be the most useful to filter on so thats been my focus lately. I have the 
> > following
> > script:
> > 
> > #!/usr/bin/perl
> > 
> > use strict;
> > use warnings;
> > use diagnostics;
> > 
> > open(my $fh, '>', '/tmp/log.txt') or die $!;
> > 
> > # remove line buffering
> > select(STDOUT);
> > $|++;
> > select($fh);
> > $|++;
> > 
> > print STDOUT "register|filter|smtp-in|data-line\n";
> > print STDOUT "register|ready\n";
> > 
> > while ( <> ) {
> > chomp; # get rid of newline
> > 
> > my @report = split /\|/;
> > 
> > next if $report[0] eq 'config';
> > 
> > foreach (@report) {
> > print $fh "$_\|"; # just to see whats there
> > }
> >  print $fh "\n";
> > 
> > my $inbody = 0;
> > my ($sid, $token, $line);
> > $sid = $report[5];
> > $token = $report[6];
> > $line = $report[$#report];
> > if ($report[0] eq 'filter' and $report[3] eq 'smtp-in' and 
> >$report[4] eq 'data-line') {
> > die "invalid filter command" if (scalar @report < 7);
> > if ($line eq '') { print $fh "end of headers\n"; $inbody++; 
> >}
> > if ($line eq '.') { print $fh "end of message\n"; 
> >$inbody--; }
> > print $fh "filter-dataline|$token|$sid|$line\n";
> > print STDOUT "filter-dataline|$token|$sid|$line\n";
> > }
> > }
> > 
> > close $fh;
> > 
> > 0;
> > 
> > It prints the following in /tmp/log.txt after a 
> > $ echo "HI" | mail edgar
> > 
> > filter|0|1566239933.835511|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|Received:
> >  from localhost (deathstar.my.domain [local])|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|Received: from localhost 
> > (deathstar.my.domain [local])
> > filter|0|1566239933.835523|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> >  by deathstar.my.domain (OpenSMTPD) with ESMTPA id 7052ea5a|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|  by 
> > deathstar.my.domain (OpenSMTPD) with ESMTPA id 7052ea5a
> > filter|0|1566239933.835529|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> >  for ;|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|  for 
> > ;
> > filter|0|1566239933.835533|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> >  Mon, 19 Aug 2019 13:38:53 -0500 (CDT)|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|  Mon, 19 Aug 2019 
> > 13:38:53 -0500 (CDT)
> > filter|0|1566239933.836673|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|From:
> >  Edgar Pettijohn |
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|From: Edgar Pettijohn 
> > 
> > filter|0|1566239933.836681|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|Date:
> >  Mon, 19 Aug 2019 13:38:53 -0500 (CDT)|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|Date: Mon, 19 Aug 2019 
> > 13:38:53 -0500 (CDT)
> > filter|0|1566239933.836685|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|To:
> >  edgar|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|To: edgar
> > filter|0|1566239933.836688|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|ef8747a12860387a
> > filter|0|1566239933.836692|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|HI|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|HI
> > filter|0|1566239933.836695|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|.|
> > end of message
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|.
> > 
> > I get the following response:
> > deathstar$ sendmail: command failed: 550 5.7.1 Delivery not authorized, 
> > message refused: Message is not RFC 2822 compliant
> > 
> > I see the same from a telnet session as well.
> > 
> > So there are 2 problems. First my script doesn't appear to acurately 
> > determine that the headers are finished. Second mail
> > doesn't go through. Any suggestions are appreciated.
> > 
>
> This error occurs when you don't have at least an empty line to separate
> headers from the body.

That's what I thought so not sure why the mail command would mess it up.

>
> Based on your output, it seems that you are generating a bad line:
>
> > filter|0|1566239933.836688|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> > filter-dataline|ef8747a12860387a|c0002b41f6bd164d|ef8747a12860387a
>
> There should be a | at the end of your filter-dataline because it is not
> valid as is, I'll check why smtpd did not hit a fatal.
>

I originally used spaces as the delimiter and it errors out with misbehaving 
filter. Then i realized it probably wanted the same input as it gives. Just 
didn't notice the trailing pipe.

Thanks,

Edgar
>
> -- 
> 

Re: filter assistance requested

2019-08-20 Thread Gilles Chehade
On Mon, Aug 19, 2019 at 01:48:05PM -0500, Edgar Pettijohn wrote:
> Nothing urgent here. Probably can wait for filter documentation. However, 
> I've been
> playing with filters off and on with limited success. It seems like data-line 
> will 
> be the most useful to filter on so thats been my focus lately. I have the 
> following
> script:
> 
> #!/usr/bin/perl
> 
> use strict;
> use warnings;
> use diagnostics;
> 
> open(my $fh, '>', '/tmp/log.txt') or die $!;
> 
> # remove line buffering
> select(STDOUT);
> $|++;
> select($fh);
> $|++;
> 
> print STDOUT "register|filter|smtp-in|data-line\n";
> print STDOUT "register|ready\n";
> 
> while ( <> ) {
> chomp; # get rid of newline
> 
> my @report = split /\|/;
> 
> next if $report[0] eq 'config';
> 
> foreach (@report) {
> print $fh "$_\|"; # just to see whats there
> }
>   print $fh "\n";
> 
> my $inbody = 0;
> my ($sid, $token, $line);
> $sid = $report[5];
> $token = $report[6];
> $line = $report[$#report];
> if ($report[0] eq 'filter' and $report[3] eq 'smtp-in' and $report[4] 
> eq 'data-line') {
> die "invalid filter command" if (scalar @report < 7);
> if ($line eq '') { print $fh "end of headers\n"; $inbody++; }
> if ($line eq '.') { print $fh "end of message\n"; $inbody--; }
> print $fh "filter-dataline|$token|$sid|$line\n";
> print STDOUT "filter-dataline|$token|$sid|$line\n";
> }
> }
> 
> close $fh;
> 
> 0;
> 
> It prints the following in /tmp/log.txt after a 
> $ echo "HI" | mail edgar
> 
> filter|0|1566239933.835511|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|Received:
>  from localhost (deathstar.my.domain [local])|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|Received: from localhost 
> (deathstar.my.domain [local])
> filter|0|1566239933.835523|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
>  by deathstar.my.domain (OpenSMTPD) with ESMTPA id 7052ea5a|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|  by 
> deathstar.my.domain (OpenSMTPD) with ESMTPA id 7052ea5a
> filter|0|1566239933.835529|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
>  for ;|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|  for 
> ;
> filter|0|1566239933.835533|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
>  Mon, 19 Aug 2019 13:38:53 -0500 (CDT)|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|  Mon, 19 Aug 2019 
> 13:38:53 -0500 (CDT)
> filter|0|1566239933.836673|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|From:
>  Edgar Pettijohn |
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|From: Edgar Pettijohn 
> 
> filter|0|1566239933.836681|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|Date:
>  Mon, 19 Aug 2019 13:38:53 -0500 (CDT)|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|Date: Mon, 19 Aug 2019 
> 13:38:53 -0500 (CDT)
> filter|0|1566239933.836685|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|To:
>  edgar|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|To: edgar
> filter|0|1566239933.836688|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|ef8747a12860387a
> filter|0|1566239933.836692|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|HI|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|HI
> filter|0|1566239933.836695|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|.|
> end of message
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|.
> 
> I get the following response:
> deathstar$ sendmail: command failed: 550 5.7.1 Delivery not authorized, 
> message refused: Message is not RFC 2822 compliant
> 
> I see the same from a telnet session as well.
> 
> So there are 2 problems. First my script doesn't appear to acurately 
> determine that the headers are finished. Second mail
> doesn't go through. Any suggestions are appreciated.
> 

This error occurs when you don't have at least an empty line to separate
headers from the body.

Based on your output, it seems that you are generating a bad line:

> filter|0|1566239933.836688|smtp-in|data-line|c0002b41f6bd164d|ef8747a12860387a|
> filter-dataline|ef8747a12860387a|c0002b41f6bd164d|ef8747a12860387a

There should be a | at the end of your filter-dataline because it is not
valid as is, I'll check why smtpd did not hit a fatal.


-- 
Gilles Chehade @poolpOrg

https://www.poolp.orgpatreon: https://www.patreon.com/gilles