diff options
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/CGI.pm | 49 | ||||
-rw-r--r-- | Bugzilla/Search/Recent.pm | 9 | ||||
-rw-r--r-- | Bugzilla/User.pm | 4 |
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; } |