From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.0 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, T_RP_MATCHES_RCVD shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: meta@public-inbox.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 4181A1FD2E for ; Wed, 2 Sep 2015 06:59:42 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 6/7] view: avoid links to unknown compressed Message-IDs Date: Wed, 2 Sep 2015 06:59:38 +0000 Message-Id: <1441177179-16628-7-git-send-email-e@80x24.org> In-Reply-To: <1441177179-16628-1-git-send-email-e@80x24.org> References: <1441177179-16628-1-git-send-email-e@80x24.org> List-Id: Compressed Message-IDs are irreversible and may not be used at other sites. So avoid compressing Message-IDs we do not know about so users have a chance of finding the message in other archives by doing a Message-ID lookup. --- lib/PublicInbox/Hval.pm | 4 ++-- lib/PublicInbox/View.pm | 33 +++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm index 21efe40..0445e57 100644 --- a/lib/PublicInbox/Hval.pm +++ b/lib/PublicInbox/Hval.pm @@ -25,9 +25,9 @@ sub new { } sub new_msgid { - my ($class, $msgid) = @_; + my ($class, $msgid, $no_compress) = @_; $msgid = mid_clean($msgid); - $class->new($msgid, mid_compress($msgid)); + $class->new($msgid, $no_compress ? $msgid : mid_compress($msgid)); } sub new_oneline { diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 98fc133..1528a87 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -132,7 +132,7 @@ sub index_entry { if (defined $irt) { unless (defined $parent_anchor) { - my $v = PublicInbox::Hval->new_msgid($irt); + my $v = PublicInbox::Hval->new_msgid($irt, 1); $v = $v->as_href; $parent_anchor = "${path}$v/"; } @@ -452,22 +452,25 @@ sub thread_inline { if ($nr <= 1) { $$dst .= "\n[no followups, yet]\n"; - return; + return (undef, in_reply_to($cur)); } my $upfx = $full_pfx ? '' : '../'; $$dst .= "\n\n~$nr messages in thread: ". "(expand)\n"; my $subj = $srch->subject_path($cur->header('Subject')); + my $parent = in_reply_to($cur); my $state = { seen => { $subj => 1 }, srch => $srch, cur => $mid, + parent_cmp => $parent ? mid_compress($parent) : '', + parent => $parent, }; for (thread_results(load_results($res))->rootset) { inline_dump($dst, $state, $upfx, $_, 0); } - $state->{next_msg}; + ($state->{next_msg}, $state->{parent}); } sub _parent_headers_nosrch { @@ -476,7 +479,7 @@ sub _parent_headers_nosrch { my $irt = in_reply_to($header_obj); if (defined $irt) { - my $v = PublicInbox::Hval->new_msgid($irt); + my $v = PublicInbox::Hval->new_msgid($irt, 1); my $html = $v->as_html; my $href = $v->as_href; $rv .= "In-Reply-To: <"; @@ -493,7 +496,7 @@ sub _parent_headers_nosrch { foreach my $ref (@raw_refs) { next if $seen{$ref}; $seen{$ref} = 1; - push @refs, linkify_ref($ref); + push @refs, linkify_ref_nosrch($ref); } if (@refs) { @@ -536,12 +539,11 @@ sub html_footer { my $upfx = $full_pfx ? '../' : '../../'; my $idx = $standalone ? " index" : ''; if ($idx && $srch) { - my $next = thread_inline(\$idx, $ctx, $mime, $full_pfx); - $irt = in_reply_to($mime->header_obj); - if (defined $irt) { - $irt = PublicInbox::Hval->new_msgid($irt); - $irt = $irt->as_href; - $irt = "parent "; + my ($next, $p) = thread_inline(\$idx, $ctx, $mime, $full_pfx); + if (defined $p) { + $p = PublicInbox::Hval->new_oneline($p); + $p = $p->as_href; + $irt = "parent "; } else { $irt = ' ' x length('parent '); } @@ -557,8 +559,8 @@ sub html_footer { "$irtreply' . $idx; } -sub linkify_ref { - my $v = PublicInbox::Hval->new_msgid($_[0]); +sub linkify_ref_nosrch { + my $v = PublicInbox::Hval->new_msgid($_[0], 1); my $html = $v->as_html; my $href = $v->as_href; "<$html>"; @@ -699,8 +701,11 @@ sub _inline_header { sub inline_dump { my ($dst, $state, $upfx, $node, $level) = @_; return unless $node; - return if $state->{stopped}; if (my $mime = $node->message) { + my $mid = mid_clean($mime->header('Message-ID')); + if ($mid eq $state->{parent_cmp}) { + $state->{parent} = $mid; + } _inline_header($dst, $state, $upfx, $mime, $level); } inline_dump($dst, $state, $upfx, $node->child, $level+1); -- EW