X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FEmailParser.pm;h=2954505ff8e622779125f9c34023c9cb33a15a1e;hp=630730abd34e4861f4a1b7164dd8383f1ba49851;hb=9aee669886202be7035e6c6049fc71bc99dd3013;hpb=ed1f84b4e8f626245995ecda5afcf83092c153b2 diff --git a/rt/lib/RT/EmailParser.pm b/rt/lib/RT/EmailParser.pm index 630730abd..2954505ff 100644 --- a/rt/lib/RT/EmailParser.pm +++ b/rt/lib/RT/EmailParser.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -122,10 +122,8 @@ sub SmartParseMIMEEntityFromScalar { close($fh); if ( -f $temp_file ) { - # We have to trust the temp file's name -- untaint it - $temp_file =~ /(.*)/; - my $entity = $self->ParseMIMEEntityFromFile( $1, $args{'Decode'}, $args{'Exact'} ); - unlink($1); + my $entity = $self->ParseMIMEEntityFromFile( $temp_file, $args{'Decode'}, $args{'Exact'} ); + unlink($temp_file); return $entity; } } @@ -328,6 +326,8 @@ sub IsRTAddress { my $self = shift; my $address = shift; + return undef unless defined($address) and $address =~ /\S/; + if ( my $address_re = RT->Config->Get('RTAddressRegexp') ) { return $address =~ /$address_re/i ? 1 : undef; } @@ -526,30 +526,45 @@ we can use that removes the bandaid =cut +use Email::Address::List; + sub ParseEmailAddress { my $self = shift; my $address_string = shift; - $address_string =~ s/^\s+|\s+$//g; + my @list = Email::Address::List->parse( + $address_string, + skip_comments => 1, + skip_groups => 1, + ); + my $logger = sub { RT->Logger->error( + "Unable to parse an email address from $address_string: ". shift + ) }; my @addresses; - # if it looks like a username / local only email - if ($address_string !~ /@/ && $address_string =~ /^\w+$/) { - my $user = RT::User->new( RT->SystemUser ); - my ($id, $msg) = $user->Load($address_string); - if ($id) { - push @addresses, Email::Address->new($user->Name,$user->EmailAddress); + foreach my $e ( @list ) { + if ($e->{'type'} eq 'mailbox') { + if ($e->{'not_ascii'}) { + $logger->($e->{'value'} ." contains not ASCII values"); + next; + } + push @addresses, $e->{'value'} + } elsif ( $e->{'value'} =~ /^\s*(\w+)\s*$/ ) { + my $user = RT::User->new( RT->SystemUser ); + $user->Load( $1 ); + if ($user->id) { + push @addresses, Email::Address->new($user->Name, $user->EmailAddress); + } else { + $logger->($e->{'value'} ." is not a valid email address and is not user name"); + } } else { - $RT::Logger->error("Unable to parse an email address from $address_string: $msg"); + $logger->($e->{'value'} ." is not a valid email address"); } - } else { - @addresses = Email::Address->parse($address_string); } $self->CleanupAddresses(@addresses); return @addresses; - } =head2 CleanupAddresses ARRAY