]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 615574: Make every search done by buglist.cgi create a list_id, so that
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 27 Dec 2010 22:14:29 +0000 (14:14 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 27 Dec 2010 22:14:29 +0000 (14:14 -0800)
even Saved Searches get "last list" support.
r=LpSolit, a=LpSolit

Bugzilla/CGI.pm
Bugzilla/Search/Recent.pm
Bugzilla/User.pm
buglist.cgi

index bd948fc49a2b6877978314d6d3d01653f89122dd..106944d74a30630baf7fa51192f3f96c91ce65f8 100644 (file)
@@ -27,6 +27,7 @@ use strict;
 use Bugzilla::Constants;
 use Bugzilla::Error;
 use Bugzilla::Util;
+use Bugzilla::Search::Recent;
 
 use File::Basename;
 
@@ -409,6 +410,54 @@ sub remove_cookie {
                        '-value'   => 'X');
 }
 
+# This helps implement Bugzilla::Search::Recent, and also shortens search
+# URLs that get POSTed to buglist.cgi.
+sub redirect_search_url {
+    my $self = shift;
+    # If we're retreiving an old list, we never need to redirect or
+    # do anything related to Bugzilla::Search::Recent.
+    return if $self->param('regetlastlist');
+
+    my $user = Bugzilla->user;
+
+    if ($user->id) {
+        # There are two conditions that could happen here--we could get a URL
+        # with no list id, and we could get a URL with a list_id that isn't
+        # ours.
+        my $list_id = $self->param('list_id');
+        my $last_search;
+        if ($list_id) {
+            # If we have a valid list_id, no need to redirect or clean.
+            return if Bugzilla::Search::Recent->check_quietly(
+                { id => $list_id });
+        }
+    }
+    elsif ($self->request_method ne 'POST') {
+        # Logged-out users who do a GET don't get a list_id, don't get
+        # their URLs cleaned, and don't get redirected.
+        return;
+    }
+
+    $self->clean_search_url();
+
+    if ($user->id) {
+        # Insert a placeholder Bugzilla::Search::Recent, so that we know what
+        # the id of the resulting search will be. This is then pulled out
+        # of the Referer header when viewing show_bug.cgi to know what
+        # bug list we came from.
+        my $recent_search = Bugzilla::Search::Recent->create_placeholder;
+        $self->param('list_id', $recent_search->id);
+    }
+
+    # GET requests that lacked a list_id are always redirected. POST requests
+    # are only redirected if they're under the CGI_URI_LIMIT though.
+    my $uri_length = length($self->self_url());
+    if ($self->request_method() ne 'POST' or $uri_length < CGI_URI_LIMIT) {
+        print $self->redirect(-url => $self->self_url());
+        exit;
+    }
+}
+
 sub redirect_to_https {
     my $self = shift;
     my $sslbase = Bugzilla->params->{'sslbase'};
index d7d595ecc41c9bade591d25bf237b5a3b1020754..89d9cf6ff94792833159a5e5e34fc7740d3b87fc 100644 (file)
@@ -90,6 +90,15 @@ sub check {
     return $search;
 }
 
+sub check_quietly {
+    my $class = shift;
+    my $error_mode = Bugzilla->error_mode;
+    Bugzilla->error_mode(ERROR_MODE_DIE);
+    my $search = eval { $class->check(@_) };
+    Bugzilla->error_mode($error_mode);
+    return $search;
+}
+
 sub new_from_cookie {
     my ($invocant, $bug_ids) = @_;
     my $class = ref($invocant) || $invocant;
index be1517c736377ce556c7eabf0772538e4ec2a52c..30c4e629318bbff01c0858ce30546edb824bcca3 100644 (file)
@@ -408,8 +408,8 @@ sub recent_search_for {
         if ($list_id && $list_id ne 'cookie') {
             # If we got a bad list_id (either some other user's or an expired
             # one) don't crash, just don't return that list.
-            my $search = 
-                eval { Bugzilla::Search::Recent->check({ id => $list_id }) };
+            my $search = Bugzilla::Search::Recent->check_quietly(
+                { id => $list_id });
             return $search if $search;
         }
 
index 0ed8975ceb029fc508f87e47af361162269eb8e5..1b00148f0248142a5138e5ef099c7493a04e23c8 100755 (executable)
@@ -81,29 +81,7 @@ if (grep { $_ =~ /^cmd\-/ } $cgi->param()) {
     exit;
 }
 
-# If query was POSTed, clean the URL from empty parameters and redirect back to
-# itself. This will make advanced search URLs more tolerable.
-#
-if ($cgi->request_method() eq 'POST') {
-    $cgi->clean_search_url();
-    my $uri_length = length($cgi->self_url());
-
-    if (!$cgi->param('regetlastlist') and !$cgi->param('list_id')
-        and $user->id) 
-    {
-        # Insert a placeholder Bugzilla::Search::Recent, so that we know what
-        # the id of the resulting search will be. This is then pulled out
-        # of the Referer header when viewing show_bug.cgi to know what
-        # bug list we came from.
-        my $recent_search = Bugzilla::Search::Recent->create_placeholder;
-        $cgi->param('list_id', $recent_search->id);
-    }
-
-    if ($uri_length < CGI_URI_LIMIT) {
-        print $cgi->redirect(-url => $cgi->self_url());
-        exit;
-    }
-}
+$cgi->redirect_search_url();
 
 # Determine whether this is a quicksearch query.
 my $searchstring = $cgi->param('quicksearch');