summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla')
-rw-r--r--Bugzilla/CGI.pm49
-rw-r--r--Bugzilla/Search/Recent.pm9
-rw-r--r--Bugzilla/User.pm4
3 files changed, 60 insertions, 2 deletions
diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm
index 7c42d6f63..f9c15d1d9 100644
--- a/Bugzilla/CGI.pm
+++ b/Bugzilla/CGI.pm
@@ -27,6 +27,7 @@ use strict;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Util;
+use Bugzilla::Search::Recent;
use File::Basename;
@@ -397,6 +398,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'};
diff --git a/Bugzilla/Search/Recent.pm b/Bugzilla/Search/Recent.pm
index d7d595ecc..89d9cf6ff 100644
--- a/Bugzilla/Search/Recent.pm
+++ b/Bugzilla/Search/Recent.pm
@@ -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;
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index 47f923f20..d15113959 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -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;
}