diff options
author | mkanat%bugzilla.org <> | 2006-11-13 12:07:57 +0100 |
---|---|---|
committer | mkanat%bugzilla.org <> | 2006-11-13 12:07:57 +0100 |
commit | 49838aefe6590fd9a5474853beb5c7d937029534 (patch) | |
tree | 529998634ff356eb7679a7d7f3da976f94a2cc65 /Bugzilla | |
parent | a3ae4ab4b3dacb799e7e370c4785a64e9f4596af (diff) | |
download | bugzilla-49838aefe6590fd9a5474853beb5c7d937029534.tar.gz bugzilla-49838aefe6590fd9a5474853beb5c7d937029534.tar.xz |
Bug 360028: Bugzilla::Search::Saved should have create() and update(), and buglist.cgi should use it
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=justdave
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/CGI.pm | 25 | ||||
-rw-r--r-- | Bugzilla/Constants.pm | 5 | ||||
-rw-r--r-- | Bugzilla/Search/Saved.pm | 78 |
3 files changed, 108 insertions, 0 deletions
diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index 091362306..7b76f6af0 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -135,6 +135,31 @@ sub canonicalise_query { return join("&", @parameters); } +sub clean_search_url { + my $self = shift; + # Delete any empty URL parameter + my @cgi_params = $self->param; + + foreach my $param (@cgi_params) { + if (defined $self->param($param) && $self->param($param) eq '') { + $self->delete($param); + $self->delete("${param}_type"); + } + + # Boolean Chart stuff is empty if it's "noop" + if ($param =~ /\d-\d-\d/ && defined $self->param($param) + && $self->param($param) eq 'noop') + { + $self->delete($param); + } + } + + # Delete certain parameters if the associated parameter is empty. + $self->delete('bugidtype') if !$self->param('bug_id'); + $self->delete('emailtype1') if !$self->param('email1'); + $self->delete('emailtype2') if !$self->param('email2'); +} + # Overwrite to ensure nph doesn't get set, and unset HEADERS_ONCE sub multipart_init { my $self = shift; diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 7fb95e8f2..9c2cf77b4 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -128,6 +128,8 @@ use File::Basename; MAX_TOKEN_AGE SAFE_PROTOCOLS + + MAX_LEN_QUERY_NAME ); @Bugzilla::Constants::EXPORT_OK = qw(contenttypes); @@ -350,6 +352,9 @@ use constant ROOT_USER => $^O =~ /MSWin32/i ? 'Administrator' : 'root'; # True if we're on Win32. use constant ON_WINDOWS => ($^O =~ /MSWin32/i); +# The longest that a saved search name can be. +use constant MAX_LEN_QUERY_NAME => 64; + sub bz_locations { # We know that Bugzilla/Constants.pm must be in %INC at this point. # So the only question is, what's the name of the directory diff --git a/Bugzilla/Search/Saved.pm b/Bugzilla/Search/Saved.pm index 2cb53439d..1ef10c36b 100644 --- a/Bugzilla/Search/Saved.pm +++ b/Bugzilla/Search/Saved.pm @@ -29,6 +29,7 @@ use Bugzilla::Constants; use Bugzilla::Group; use Bugzilla::Search qw(IsValidQueryType); use Bugzilla::User; +use Bugzilla::Util; ############# # Constants # @@ -44,6 +45,76 @@ use constant DB_COLUMNS => qw( query_type ); +use constant REQUIRED_CREATE_FIELDS => qw(name query); + +use constant VALIDATORS => { + name => \&_check_name, + query => \&_check_query, + query_type => \&_check_query_type, + link_in_footer => \&_check_link_in_footer, +}; + +use constant UPDATE_COLUMNS => qw(query query_type); + +############## +# Validators # +############## + +sub _check_link_in_footer { return $_[1] ? 1 : 0; } + +sub _check_name { + my ($invocant, $name) = @_; + $name = trim($name); + $name || ThrowUserError("query_name_missing"); + $name !~ /[<>&]/ || ThrowUserError("illegal_query_name"); + if (length($name) > MAX_LEN_QUERY_NAME) { + ThrowUserError("query_name_too_long"); + } + return $name; +} + +sub _check_query { + my ($invocant, $query) = @_; + $query || ThrowUserError("buglist_parameters_required"); + my $cgi = new Bugzilla::CGI($query); + $cgi->clean_search_url; + return $cgi->query_string; +} + +sub _check_query_type { + my ($invocant, $type) = @_; + # Right now the only query type is LIST_OF_BUGS. + return $type ? LIST_OF_BUGS : QUERY_LIST; +} + +######################### +# Database Manipulation # +######################### + +sub create { + my $class = shift; + Bugzilla->login(LOGIN_REQUIRED); + my $dbh = Bugzilla->dbh; + $class->check_required_create_fields(@_); + my $params = $class->run_create_validators(@_); + + # Right now you can only create a Saved Search for the current user. + $params->{userid} = Bugzilla->user->id; + + $dbh->bz_lock_tables('namedqueries WRITE', + 'namedqueries_link_in_footer WRITE'); + my $lif = delete $params->{link_in_footer}; + my $obj = $class->insert_create_data($params); + if ($lif) { + $dbh->do('INSERT INTO namedqueries_link_in_footer + (user_id, namedquery_id) VALUES (?,?)', + undef, $params->{userid}, $obj->id); + } + $dbh->bz_unlock_tables(); + + return $obj; +} + ##################### # Complex Accessors # ##################### @@ -112,6 +183,13 @@ sub user { return $self->{user}; } +############ +# Mutators # +############ + +sub set_url { $_[0]->set('query', $_[1]); } +sub set_query_type { $_[0]->set('query_type', $_[1]); } + 1; __END__ |