diff options
author | Eric Wong <e@yhbt.net> | 2020-05-10 06:21:05 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-05-10 06:56:44 +0000 |
commit | 8b44e99ec009508d7e050ee44d34a1cf0f111dd5 (patch) | |
tree | ac28b75f04e2b7e11af9c4764d43f9b0a10dd845 | |
parent | 1dde99e0badebfaf509cee4f15bbfa284996c8fc (diff) | |
download | public-inbox-8b44e99ec009508d7e050ee44d34a1cf0f111dd5.tar.gz |
They're still part of our internal API at this point, but reusing the same names as those used by postfix makes sense for now to reduce cognitive overheads of learning new things. There's no "mime_parts_limit", but the name is consistent with "mime_nesting_limit".
-rw-r--r-- | lib/PublicInbox/Eml.pm | 18 | ||||
-rw-r--r-- | t/eml.t | 4 |
2 files changed, 13 insertions, 9 deletions
diff --git a/lib/PublicInbox/Eml.pm b/lib/PublicInbox/Eml.pm index 2ccbb659..ef401141 100644 --- a/lib/PublicInbox/Eml.pm +++ b/lib/PublicInbox/Eml.pm @@ -38,9 +38,11 @@ my $MIME_Header = find_encoding('MIME-Header'); use PublicInbox::EmlContentFoo qw(parse_content_type parse_content_disposition); $PublicInbox::EmlContentFoo::STRICT_PARAMS = 0; -our $MAXPARTS = 1000; # same as SpamAssassin -our $MAXDEPTH = 20; # seems enough, Perl sucks, here -our $MAXBOUNDLEN = 2048; # same as postfix +our $mime_parts_limit = 1000; # same as SpamAssassin (not in postfix AFAIK) + +# the rest of the limit names are taken from postfix: +our $mime_nesting_limit = 20; # seems enough, Perl sucks, here +our $mime_boundary_length_limit = 2048; # same as postfix our $header_size_limit = 102400; # same as postfix my %MIME_ENC = (qp => \&enc_qp, base64 => \&encode_base64); @@ -151,7 +153,7 @@ sub ct ($) { sub mp_descend ($$) { my ($self, $nr) = @_; # or $once for top-level my $bnd = ct($self)->{attributes}->{boundary} // return; # single-part - return if $bnd eq '' || length($bnd) >= $MAXBOUNDLEN; + return if $bnd eq '' || length($bnd) >= $mime_boundary_length_limit; $bnd = quotemeta($bnd); # "multipart" messages can exist w/o a body @@ -179,7 +181,7 @@ sub mp_descend ($$) { # + 3 since we don't want the last part # processed to include any other excluded # parts ($nr starts at 1, and I suck at math) - $MAXPARTS + 3 - $nr); + $mime_parts_limit + 3 - $nr); if (@parts) { # the usual path if we got this far: undef $bdy; # release memory ASAP if $nr > 0 @@ -218,13 +220,15 @@ sub each_part { $p = [ $p, 0 ]; my @s; # our virtual stack my $nr = 0; - while ((scalar(@{$p->[0]}) || ($p = pop @s)) && ++$nr <= $MAXPARTS) { + while ((scalar(@{$p->[0]}) || ($p = pop @s)) && + ++$nr <= $mime_parts_limit) { ++$p->[-1]; # bump index my (undef, @idx) = @$p; @idx = (join('.', @idx)); my $depth = ($idx[0] =~ tr/././) + 1; my $sub = new_sub(undef, \(shift @{$p->[0]})); - if ($depth < $MAXDEPTH && (my $nxt = mp_descend($sub, $nr))) { + if ($depth < $mime_nesting_limit && + (my $nxt = mp_descend($sub, $nr))) { push(@s, $p) if scalar @{$p->[0]}; $p = [ $nxt, @idx, 0 ]; } else { # a leaf node @@ -282,7 +282,7 @@ if ('maxparts is a feature unique to us') { my @orig; $eml->each_part(sub { push @orig, $_[0]->[0] }); - local $PublicInbox::Eml::MAXPARTS = scalar(@orig); + local $PublicInbox::Eml::mime_parts_limit = scalar(@orig); my $i = 0; $eml->each_part(sub { my $cur = $_[0]->[0]; @@ -290,7 +290,7 @@ if ('maxparts is a feature unique to us') { is($cur->body_raw, $prv->body_raw, "part #$i matches"); }); is($i, scalar(@orig), 'maxparts honored'); - $PublicInbox::Eml::MAXPARTS--; + $PublicInbox::Eml::mime_parts_limit--; my @ltd; $eml->each_part(sub { push @ltd, $_[0]->[0] }); for ($i = 0; $i <= $#ltd; $i++) { |