[pmg-devel] [PATCH pmg-api v2 02/10] add PMG::MIMEUtils helper package

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Oct 3 10:26:05 CEST 2019


On Mon, Sep 30, 2019 at 02:55:26PM +0200, Dominik Csapak wrote:
> this package provides some often used MIME funcionality that we use
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>  src/Makefile         |  1 +
>  src/PMG/MIMEUtils.pm | 76 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 77 insertions(+)
>  create mode 100644 src/PMG/MIMEUtils.pm
> 
> diff --git a/src/Makefile b/src/Makefile
> index c864ae8..95e63c9 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -50,6 +50,7 @@ LIBSOURCES =				\
>  	PMG/pmgcfg.pm			\
>  	PMG/RESTEnvironment.pm		\
>  	PMG/Utils.pm			\
> +	PMG/MIMEUtils.pm		\
>  	PMG/HTMLMail.pm			\
>  	PMG/ModGroup.pm			\
>  	PMG/SMTPPrinter.pm		\
> diff --git a/src/PMG/MIMEUtils.pm b/src/PMG/MIMEUtils.pm
> new file mode 100644
> index 0000000..9c2d133
> --- /dev/null
> +++ b/src/PMG/MIMEUtils.pm
> @@ -0,0 +1,76 @@
> +package PMG::MIMEUtils;
> +
> +# provides helpers for dealing with MIME related code
> +
> +use strict;
> +use warnings;
> +
> +use MIME::Parser;
> +use File::Path;
> +
> +# wrapper around MIME::Parser::new which allows to give the config as hash
> +sub new_mime_parser {
> +    my ($params, $dump_under) = @_;
> +
> +    my $parser = new MIME::Parser;
> +
> +    $parser->extract_nested_messages($params->{nested});

I think this should explicitly default to 0. MIME::Parser allows text in
there and has some unchecked `eq` comparisons[1] on this, which, if `undef`,
would cause spurious "use of undefined value" warnings to appear.

[1] https://metacpan.org/release/MIME-tools/source/lib/MIME/Parser.pm#L974

> +    $parser->ignore_errors($params->{ignore_errors} // 1);
> +    $parser->extract_uuencode($params->{extract_uuencode});
> +    $parser->decode_bodies($params->{decode_bodies})
> +	if defined($params->{decode_bodies});
> +    $parser->max_parts($params->{maxfiles})
> +	if defined($params->{maxfiles});
> +
> +    my $dumpdir = $params->{dumpdir};
> +    if (!$dumpdir) {
> +	$parser->output_to_core(1);
> +    } elsif ($dump_under) {
> +	$parser->output_under($dumpdir);
> +    } else {
> +	rmtree $dumpdir;
> +
> +	# Create and set the output directory:
> +	(-d $dumpdir || mkdir($dumpdir ,0755)) ||
> +	die "can't create $dumpdir: $! : ERROR";
> +	(-w $dumpdir) ||
> +	die "can't write to directory $dumpdir: $! : ERROR";
> +
> +	$parser->output_dir($dumpdir);
> +    }
> +
> +    # this has to be done after setting the dumpdir
> +    $parser->filer->ignore_filename($params->{ignore_filename})
> +	if defined($params->{ignore_filename});
> +
> +    return $parser;
> +}
> +
> +# bug fix for content/mimeparser.txt in regression test
> +sub fixup_multipart {
> +    my ($entity) = @_;
> +
> +    if ($entity->mime_type =~ m|multipart/|i && !$entity->head->multipart_boundary) {
> +	$entity->head->mime_attr('Content-type' => "application/x-unparseable-multipart");
> +    }
> +
> +    return $entity;
> +}
> +
> +sub traverse_mime_parts {
> +    my ($entity, $subbefore, $subafter) = @_;
> +
> +    if (defined($subbefore)) {
> +	$subbefore->($entity);
> +    }
> +
> +    foreach my $part ($entity->parts) {
> +	traverse_mime_parts($part, $subbefore, $subafter);
> +    }
> +
> +    if (defined($subafter)) {
> +	$subafter->($entity);
> +    }
> +}
> +
> +1;
> -- 
> 2.20.1



More information about the pmg-devel mailing list