]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 473646 - WebService methods should check list parameters for scalars and convert...
authordkl%redhat.com <>
Mon, 26 Jan 2009 20:40:22 +0000 (20:40 +0000)
committerdkl%redhat.com <>
Mon, 26 Jan 2009 20:40:22 +0000 (20:40 +0000)
Patch by Dave Lawrence <dkl@redhat.com> - r/a=mkanat

Bugzilla/WebService/Bug.pm
Bugzilla/WebService/Product.pm
Bugzilla/WebService/User.pm
Bugzilla/WebService/Util.pm

index 1c0df32acc296a050dedb780a3d0c5094cf8a42f..21645af3d638b856a65074c442cd6ab8cf7c6a91 100755 (executable)
@@ -27,7 +27,7 @@ use Bugzilla::Constants;
 use Bugzilla::Error;
 use Bugzilla::Field;
 use Bugzilla::WebService::Constants;
-use Bugzilla::WebService::Util qw(filter);
+use Bugzilla::WebService::Util qw(filter validate);
 use Bugzilla::Bug;
 use Bugzilla::BugMail;
 use Bugzilla::Util qw(trim);
@@ -67,7 +67,8 @@ BEGIN { *get_bugs = \&get }
 ###########
 
 sub comments {
-    my ($self, $params) = @_;
+    my ($self, $params) = validate(@_, 'bug_ids', 'comment_ids');
+
     if (!(defined $params->{bug_ids} || defined $params->{comment_ids})) {
         ThrowCodeError('params_required',
                        { function => 'Bug.comments',
@@ -145,7 +146,8 @@ sub _translate_comment {
 }
 
 sub get {
-    my ($self, $params) = @_;
+    my ($self, $params) = validate(@_, 'ids');
+
     my $ids = $params->{ids};
     defined $ids || ThrowCodeError('param_required', { param => 'ids' });
 
@@ -162,7 +164,7 @@ sub get {
 # it can be called as the following:
 # $call = $rpc->call( 'Bug.get_history', { ids => [1,2] });
 sub get_history {
-    my ($self, $params) = @_;
+    my ($self, $params) = validate(@_, 'ids');
 
     my $ids = $params->{ids};
     defined $ids || ThrowCodeError('param_required', { param => 'ids' });
index 4dd8944539138c4f8c454917aa7b82c0d1bc2fd8..eaec012a471175922bdf0ff6e3b9bbbda1def051 100755 (executable)
@@ -21,6 +21,7 @@ use strict;
 use base qw(Bugzilla::WebService);
 use Bugzilla::Product;
 use Bugzilla::User;
+use Bugzilla::WebService::Util qw(validate);
 
 ##################################################
 # Add aliases here for method name compatibility #
@@ -45,7 +46,7 @@ sub get_accessible_products {
 
 # Get a list of actual products, based on list of ids
 sub get {
-    my ($self, $params) = @_;
+    my ($self, $params) = validate(@_, 'ids');
     
     # Only products that are in the users accessible products, 
     # can be allowed to be returned
index 6283f55a15d11b87bf7e5cabb97d32edfb17aa1e..790a9da7c2a8f2393dc2db4cd66387fe5bc74078 100755 (executable)
@@ -28,7 +28,7 @@ use Bugzilla::Error;
 use Bugzilla::User;
 use Bugzilla::Util qw(trim);
 use Bugzilla::Token;
-use Bugzilla::WebService::Util qw(filter);
+use Bugzilla::WebService::Util qw(filter validate);
 
 # Don't need auth to login
 use constant LOGIN_EXEMPT => {
@@ -131,7 +131,7 @@ sub create {
 # $call = $rpc->call( 'User.get', { ids => [1,2,3], 
 #         names => ['testusera@redhat.com', 'testuserb@redhat.com'] });
 sub get {
-    my ($self, $params) = @_;
+    my ($self, $params) = validate(@_, 'names', 'ids');
 
     my @user_objects;
     @user_objects = map { Bugzilla::User->check($_) } @{ $params->{names} }
index cd75bee8cd83f4348d0a689787ca51fa2da9605a..74c1f2f02f3199521f22ba1d0adc170fcfa79e66 100644 (file)
@@ -24,7 +24,7 @@ use strict;
 
 use base qw(Exporter);
 
-our @EXPORT_OK = qw(filter);
+our @EXPORT_OK = qw(filter validate);
 
 sub filter ($$) {
     my ($params, $hash) = @_;
@@ -44,6 +44,23 @@ sub filter ($$) {
     return \%newhash;
 }
 
+sub validate  {
+    my ($self, $params, @keys) = @_;
+    
+    # If @keys is not empty then we convert any named 
+    # parameters that have scalar values to arrayrefs
+    # that match.
+    foreach my $key (@keys) {
+        if (exists $params->{$key}) {
+            $params->{$key} = ref $params->{$key} 
+                              ? $params->{$key} 
+                              : [ $params->{$key} ];
+        }
+    }
+
+    return ($self, $params);
+}
+
 __END__
 
 =head1 NAME
@@ -61,6 +78,8 @@ internally in the WebService code.
  filter({ include_fields => ['id', 'name'], 
           exclude_fields => ['name'] }, $hash);
 
+ validate(@_, 'ids');
+
 =head1 METHODS
 
 =over
@@ -72,4 +91,11 @@ of WebService methods. Given a hash (the second argument to this subroutine),
 this will remove any keys that are I<not> in C<include_fields> and then remove
 any keys that I<are> in C<exclude_fields>.
 
+=item C<validate>
+
+This helps in the validation of parameters passed into the WebSerice
+methods. Currently it converts listed parameters into an array reference
+if the client only passed a single scalar value. It modifies the parameters
+hash in place so other parameters should be unaltered.
+
 =back