]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchView.pm
searchview: do not allow non-ASCII offsets and limits
[public-inbox.git] / lib / PublicInbox / SearchView.pm
index 1c4442e4d7b8a300775c817aac435b47da9abb56..b089de9c91412cb1e4e42a431256b97c8ebafa63 100644 (file)
@@ -10,7 +10,7 @@ use PublicInbox::SearchMsg;
 use PublicInbox::Hval qw/ascii_html obfuscate_addrs/;
 use PublicInbox::View;
 use PublicInbox::WwwAtomStream;
-use PublicInbox::MID qw(mid2path mid_mime mid_clean mid_escape MID_ESC);
+use PublicInbox::MID qw(MID_ESC);
 use PublicInbox::MIME;
 require PublicInbox::Git;
 require PublicInbox::SearchThread;
@@ -29,6 +29,8 @@ sub mbox_results {
 
 sub sres_top_html {
        my ($ctx) = @_;
+       my $srch = $ctx->{-inbox}->search or
+               return PublicInbox::WWW::need($ctx, 'Search');
        my $q = PublicInbox::SearchQuery->new($ctx->{qp});
        my $x = $q->{x};
        my $query = $q->{'q'};
@@ -44,7 +46,7 @@ sub sres_top_html {
        my ($mset, $total, $err, $cb);
 retry:
        eval {
-               $mset = $ctx->{srch}->query($query, $opts);
+               $mset = $srch->query($query, $opts);
                $total = $mset->get_matches_estimated;
        };
        $err = $@;
@@ -98,8 +100,8 @@ sub mset_summary {
        my $pad = length("$total");
        my $pfx = ' ' x $pad;
        my $res = \($ctx->{-html_tip});
-       my $srch = $ctx->{srch};
        my $ibx = $ctx->{-inbox};
+       my $srch = $ibx->search;
        my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef;
        foreach my $m ($mset->items) {
                my $rank = sprintf("%${pad}d", $m->get_rank + 1);
@@ -118,11 +120,12 @@ sub mset_summary {
                        obfuscate_addrs($obfs_ibx, $s);
                        obfuscate_addrs($obfs_ibx, $f);
                }
-               my $ts = PublicInbox::View::fmt_ts($smsg->ts);
+               my $date = PublicInbox::View::fmt_ts($smsg->ds);
                my $mid = PublicInbox::Hval->new_msgid($smsg->mid)->{href};
+               $s = '(no subject)' if $s eq '';
                $$res .= qq{$rank. <b><a\nhref="$mid/">}.
                        $s . "</a></b>\n";
-               $$res .= "$pfx  - by $f @ $ts UTC [$pct%]\n\n";
+               $$res .= "$pfx  - by $f @ $date UTC [$pct%]\n\n";
        }
        $$res .= search_nav_bot($mset, $q);
        *noop;
@@ -181,10 +184,9 @@ sub search_nav_top {
 sub search_nav_bot {
        my ($mset, $q) = @_;
        my $total = $mset->get_matches_estimated;
-       my $nr = scalar $mset->items;
        my $o = $q->{o};
        my $l = $q->{l};
-       my $end = $o + $nr;
+       my $end = $o + $mset->size;
        my $beg = $o + 1;
        my $rv = '</pre><hr><pre id=t>';
        if ($beg <= $end) {
@@ -220,8 +222,8 @@ sub sort_relevance {
 sub mset_thread {
        my ($ctx, $mset, $q) = @_;
        my %pct;
-       my $srch = $ctx->{srch};
-       my $msgs = $srch->retry_reopen(sub { [ map {
+       my $ibx = $ctx->{-inbox};
+       my $msgs = $ibx->search->retry_reopen(sub { [ map {
                my $i = $_;
                my $smsg = PublicInbox::SearchMsg->load_doc($i->get_document);
                $pct{$smsg->mid} = $i->get_percent;
@@ -229,10 +231,9 @@ sub mset_thread {
        } ($mset->items) ]});
        my $r = $q->{r};
        my $rootset = PublicInbox::SearchThread::thread($msgs,
-               $r ? sort_relevance(\%pct) : *PublicInbox::View::sort_ts,
-               $srch);
+               $r ? sort_relevance(\%pct) : *PublicInbox::View::sort_ds,
+               $ctx);
        my $skel = search_nav_bot($mset, $q). "<pre>";
-       my $inbox = $ctx->{-inbox};
        $ctx->{-upfx} = '';
        $ctx->{anchor_idx} = 1;
        $ctx->{cur_level} = 0;
@@ -241,7 +242,6 @@ sub mset_thread {
        $ctx->{pct} = \%pct;
        $ctx->{prev_attr} = '';
        $ctx->{prev_level} = 0;
-       $ctx->{seen} = {};
        $ctx->{s_nr} = scalar(@$msgs).'+ results';
 
        # reduce hash lookups in skel_dump
@@ -250,15 +250,14 @@ sub mset_thread {
                *PublicInbox::View::pre_thread);
 
        @$msgs = reverse @$msgs if $r;
-       my $mime;
        sub {
                return unless $msgs;
-               while ($mime = pop @$msgs) {
-                       $mime = $inbox->msg_by_smsg($mime) and last;
+               my $smsg;
+               while (my $m = pop @$msgs) {
+                       $smsg = $ibx->smsg_mime($m) and last;
                }
-               if ($mime) {
-                       $mime = PublicInbox::MIME->new($mime);
-                       return PublicInbox::View::index_entry($mime, $ctx,
+               if ($smsg) {
+                       return PublicInbox::View::index_entry($smsg, $ctx,
                                scalar @$msgs);
                }
                $msgs = undef;
@@ -288,12 +287,11 @@ sub adump {
        my $ibx = $ctx->{-inbox};
        my @items = $mset->items;
        $ctx->{search_query} = $q;
-       my $srch = $ctx->{srch};
+       my $srch = $ibx->search;
        PublicInbox::WwwAtomStream->response($ctx, 200, sub {
                while (my $x = shift @items) {
                        $x = load_doc_retry($srch, $x);
-                       $x = $ibx->msg_by_smsg($x) and
-                                       return PublicInbox::MIME->new($x);
+                       $x = $ibx->smsg_mime($x) and return $x;
                }
                return undef;
        });
@@ -310,12 +308,12 @@ sub new {
        my ($class, $qp) = @_;
 
        my $r = $qp->{r};
-       my ($l) = (($qp->{l} || '') =~ /(\d+)/);
+       my ($l) = (($qp->{l} || '') =~ /([0-9]+)/);
        $l = $LIM if !$l || $l > $LIM;
        bless {
                q => $qp->{'q'},
                x => $qp->{x} || '',
-               o => (($qp->{o} || '0') =~ /(\d+)/),
+               o => (($qp->{o} || '0') =~ /([0-9]+)/),
                l => $l,
                r => (defined $r && $r ne '0'),
        }, $class;
@@ -340,7 +338,7 @@ sub qs_html {
                $qs .= "&amp;o=$o";
        }
        if (my $l = $self->{l}) {
-               $qs .= "&amp;l=$l";
+               $qs .= "&amp;l=$l" unless $l == $LIM;
        }
        if (my $r = $self->{r}) {
                $qs .= "&amp;r";