about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/Address.pm25
-rw-r--r--lib/PublicInbox/Feed.pm10
-rw-r--r--lib/PublicInbox/Import.pm19
-rw-r--r--lib/PublicInbox/MDA.pm9
-rw-r--r--lib/PublicInbox/SearchMsg.pm6
-rw-r--r--lib/PublicInbox/SearchView.pm1
-rw-r--r--lib/PublicInbox/View.pm15
7 files changed, 49 insertions, 36 deletions
diff --git a/lib/PublicInbox/Address.pm b/lib/PublicInbox/Address.pm
new file mode 100644
index 00000000..ef4cbdc6
--- /dev/null
+++ b/lib/PublicInbox/Address.pm
@@ -0,0 +1,25 @@
+# Copyright (C) 2016 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+package PublicInbox::Address;
+use strict;
+use warnings;
+
+# very loose regexes, here.  We don't need RFC-compliance,
+# just enough to make thing sanely displayable and pass to git
+
+sub emails { ($_[0] =~ /([^<\s]+\@[^>\s]+)/g) }
+
+sub from_name {
+        my ($val) = @_;
+        my $name = $val;
+        $name =~ s/\s*\S+\@\S+\s*\z//;
+        if ($name !~ /\S/ || $name =~ /[<>]/) { # git does not like [<>]
+                ($name) = emails($val);
+                $name =~ s/\@.*//;
+        }
+        $name =~ tr/\r\n\t/ /;
+        $name =~ s/\A\s*//;
+        $name;
+}
+
+1;
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm
index 6ed00856..81895dbf 100644
--- a/lib/PublicInbox/Feed.pm
+++ b/lib/PublicInbox/Feed.pm
@@ -5,13 +5,13 @@
 package PublicInbox::Feed;
 use strict;
 use warnings;
-use Email::Address;
 use Email::MIME;
 use Date::Parse qw(strptime);
 use PublicInbox::Hval qw/ascii_html/;
 use PublicInbox::Git;
 use PublicInbox::View;
 use PublicInbox::MID qw/mid_clean mid2path/;
+use PublicInbox::Address;
 use POSIX qw/strftime/;
 use constant {
         DATEFMT => '%Y-%m-%dT%H:%M:%SZ', # Atom standard
@@ -86,7 +86,6 @@ sub _no_thread {
 
 sub end_feed {
         my ($fh) = @_;
-        Email::Address->purge_cache;
         $fh->write('</feed>');
         $fh->close;
 }
@@ -171,7 +170,6 @@ sub emit_index_nosrch {
                 PublicInbox::View::index_entry($mime, 0, $state);
                 1;
         });
-        Email::Address->purge_cache;
         $last;
 }
 
@@ -330,9 +328,9 @@ sub add_to_feed {
         $title = title_tag($title);
 
         my $from = $header_obj->header('From') or return 0;
-        my @from = Email::Address->parse($from) or return 0;
-        my $name = ascii_html($from[0]->name);
-        my $email = $from[0]->address;
+        my ($email) = PublicInbox::Address::emails($from);
+        my $name = PublicInbox::Address::from_name($from);
+        $name = ascii_html($name);
         $email = ascii_html($email);
 
         if (delete $feed_opts->{emit_header}) {
diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm
index 1afcf5d2..e3d65f4a 100644
--- a/lib/PublicInbox/Import.pm
+++ b/lib/PublicInbox/Import.pm
@@ -8,7 +8,6 @@ package PublicInbox::Import;
 use strict;
 use warnings;
 use Fcntl qw(:flock :DEFAULT);
-use Email::Address;
 use PublicInbox::Spawn qw(spawn);
 use PublicInbox::MID qw(mid_mime mid2path);
 
@@ -141,21 +140,21 @@ sub add {
         my ($self, $mime) = @_; # mime = Email::MIME
 
         my $from = $mime->header('From');
-        my @from = Email::Address->parse($from);
-        my $name = $from[0]->name;
-        my $email = $from[0]->address;
-        my $date = $mime->header('Date');
-        my $subject = $mime->header('Subject');
-        $subject = '(no subject)' unless defined $subject;
-        my $mid = mid_mime($mime);
-        my $path = mid2path($mid);
-
+        my ($email) = ($from =~ /([^<\s]+\@[^>\s]+)/g);
+        my $name = $from;
+        $name =~ s/\s*\S+\@\S+\s*\z//;
         # git gets confused with:
         #  "'A U Thor <u@example.com>' via foo" <foo@example.com>
         # ref:
         # <CAD0k6qSUYANxbjjbE4jTW4EeVwOYgBD=bXkSu=akiYC_CB7Ffw@mail.gmail.com>
         $name =~ tr/<>// and $name = $email;
 
+        my $date = $mime->header('Date');
+        my $subject = $mime->header('Subject');
+        $subject = '(no subject)' unless defined $subject;
+        my $mid = mid_mime($mime);
+        my $path = mid2path($mid);
+
         my ($r, $w) = $self->gfi_start;
         my $tip = $self->{tip};
         if ($tip ne '') {
diff --git a/lib/PublicInbox/MDA.pm b/lib/PublicInbox/MDA.pm
index e1207b56..2e6e9ec5 100644
--- a/lib/PublicInbox/MDA.pm
+++ b/lib/PublicInbox/MDA.pm
@@ -6,7 +6,6 @@ package PublicInbox::MDA;
 use strict;
 use warnings;
 use Email::Simple;
-use Email::Address;
 use Date::Parse qw(strptime);
 use constant MAX_SIZE => 1024 * 500; # same as spamc default, should be tunable
 use constant MAX_MID_SIZE => 244; # max term size - 1 in Xapian
@@ -62,13 +61,13 @@ sub alias_specified {
 
         my @address = ref($address) eq 'ARRAY' ? @$address : ($address);
         my %ok = map {
-                my @recip = Email::Address->parse($_);
-                lc(__drop_plus($recip[0]->address)) => 1;
+                lc(__drop_plus($_)) => 1;
         } @address;
 
         foreach my $line ($filter->cc, $filter->to) {
-                foreach my $addr (Email::Address->parse($line)) {
-                        if ($ok{lc(__drop_plus($addr->address))}) {
+                my @addrs = ($line =~ /([^<\s]+\@[^>\s]+)/g);
+                foreach my $addr (@addrs) {
+                        if ($ok{lc(__drop_plus($addr))}) {
                                 return 1;
                         }
                 }
diff --git a/lib/PublicInbox/SearchMsg.pm b/lib/PublicInbox/SearchMsg.pm
index 1244aeea..0fb2a07e 100644
--- a/lib/PublicInbox/SearchMsg.pm
+++ b/lib/PublicInbox/SearchMsg.pm
@@ -7,10 +7,10 @@ package PublicInbox::SearchMsg;
 use strict;
 use warnings;
 use Search::Xapian;
-use Email::Address qw//;
 use POSIX qw//;
 use Date::Parse qw/str2time/;
 use PublicInbox::MID qw/mid_clean/;
+use PublicInbox::Address;
 use Encode qw/find_encoding/;
 my $enc_utf8 = find_encoding('UTF-8');
 our $PFX2TERM_RE = undef;
@@ -87,9 +87,7 @@ sub from ($) {
         my ($self) = @_;
         my $from = __hdr($self, 'from');
         if (defined $from && !defined $self->{from_name}) {
-                $from =~ tr/\t\r\n/ /;
-                my @from = Email::Address->parse($from);
-                $self->{from_name} = $from[0]->name;
+                $self->{from_name} = PublicInbox::Address::from_name($from);
         }
         $from;
 }
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index e3dc22f7..0ae05052 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -176,7 +176,6 @@ sub tdump {
         $ctx->{searchview} = 1;
         tdump_ent($git, $state, $_, 0) for @rootset;
         PublicInbox::View::thread_adj_level($state, 0);
-        Email::Address->purge_cache;
 
         $fh->write(search_nav_bot($mset, $q). "\n\n" .
                         foot($ctx). '</pre></body></html>');
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 43609914..a78ce31d 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -14,6 +14,7 @@ use PublicInbox::Hval qw/ascii_html/;
 use PublicInbox::Linkify;
 use PublicInbox::MID qw/mid_clean id_compress mid2path mid_mime/;
 use PublicInbox::MsgIter;
+use PublicInbox::Address;
 require POSIX;
 
 use constant INDENT => '  ';
@@ -99,9 +100,7 @@ sub index_entry {
         $seen->{$id} = "#$id"; # save the anchor for children, later
 
         my $mid = PublicInbox::Hval->new_msgid($mid_raw);
-        my $from = $hdr->header('From');
-        my @from = Email::Address->parse($from);
-        $from = $from[0]->name;
+        my $from = PublicInbox::Address::from_name($hdr->header('From'));
 
         my $root_anchor = $state->{root_anchor} || '';
         my $path = $root_anchor ? '../../' : '';
@@ -191,7 +190,6 @@ sub emit_thread_html {
                                 ('</ul></li>' x ($max - 1)) . '</ul>');
                 }
         }
-        Email::Address->purge_cache;
 
         # there could be a race due to a message being deleted in git
         # but still being in the Xapian index:
@@ -339,8 +337,7 @@ sub headers_to_html_header {
                 $v = PublicInbox::Hval->new($v);
 
                 if ($h eq 'From') {
-                        my @from = Email::Address->parse($v->raw);
-                        $title[1] = ascii_html($from[0]->name);
+                        $title[1] = PublicInbox::Address::from_name($v->raw);
                 } elsif ($h eq 'Subject') {
                         $title[0] = $v->as_html;
                         if ($srch) {
@@ -449,15 +446,13 @@ sub mailto_arg_link {
         foreach my $h (qw(From To Cc)) {
                 my $v = $hdr->header($h);
                 defined($v) && ($v ne '') or next;
-                my @addrs = Email::Address->parse($v);
-                foreach my $recip (@addrs) {
-                        my $address = $recip->address;
+                my @addrs = PublicInbox::Address::emails($v);
+                foreach my $address (@addrs) {
                         my $dst = lc($address);
                         $cc{$dst} ||= $address;
                         $to ||= $dst;
                 }
         }
-        Email::Address->purge_cache;
         my @arg;
 
         my $subj = $hdr->header('Subject') || '';