]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1090275: WebServices modules should maintain a whitelist of methods that are...
authorDavid Lawrence <dkl@mozilla.com>
Wed, 21 Jan 2015 20:41:11 +0000 (20:41 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Wed, 21 Jan 2015 20:41:11 +0000 (20:41 +0000)
r=dylan,a=glob

Bugzilla/WebService.pm
Bugzilla/WebService/Bug.pm
Bugzilla/WebService/Bugzilla.pm
Bugzilla/WebService/Classification.pm
Bugzilla/WebService/Group.pm
Bugzilla/WebService/Product.pm
Bugzilla/WebService/Server/JSONRPC.pm
Bugzilla/WebService/Server/XMLRPC.pm
Bugzilla/WebService/User.pm
extensions/Example/lib/WebService.pm

index ac4cd25ce53f71c1b95cc7e3e8dbd4d0b9d69607..5646e381d5a5faebea4a9eeb8479e7d96facfc9d 100644 (file)
@@ -23,6 +23,10 @@ use constant LOGIN_EXEMPT => { };
 # Methods that can modify data MUST not be listed here.
 use constant READ_ONLY => ();
 
+# Whitelist of methods that a client is allowed to access when making
+# an API call.
+use constant PUBLIC_METHODS => ();
+
 sub login_exempt {
     my ($class, $method) = @_;
     return $class->LOGIN_EXEMPT->{$method};
index 7dedc5badd3856da1fc88d954eb6ae42df7f599f..419e5aac6e0e73480693b0364d5d6726a4f7406a 100644 (file)
@@ -49,6 +49,24 @@ use constant READ_ONLY => qw(
     search
 );
 
+use constant PUBLIC_METHODS => qw(
+    add_attachment
+    add_comment
+    attachments
+    comments
+    create
+    fields
+    get
+    history
+    legal_values
+    possible_duplicates
+    render_comment
+    search
+    update
+    update_see_also
+    update_tags
+);
+
 ######################################################
 # Add aliases here for old method name compatibility #
 ######################################################
index 9513e4183e6482ae047fabec0b3bbe69dd1a36fa..a6037e67ed9cf122996cfcd1393e24fae7aed80d 100644 (file)
@@ -31,6 +31,15 @@ use constant READ_ONLY => qw(
     version
 );
 
+use constant PUBLIC_METHODS => qw(
+    extensions
+    last_audit_time
+    parameters
+    time
+    timezone
+    version
+);
+
 # Logged-out users do not need to know more than that.
 use constant PARAMETERS_LOGGED_OUT => qw(
     maintainer
index 753b52638293a60c15500676d3aa5bd15a1b20ab..f2c3ec51ecfefa00758bf673e8800a5a16f9f220 100644 (file)
@@ -19,6 +19,10 @@ use constant READ_ONLY => qw(
     get
 );
 
+use constant PUBLIC_METHODS => qw(
+    get
+);
+
 sub get {
     my ($self, $params) = validate(@_, 'names', 'ids');
 
index d7506aa3d9b4c6e38cabe54edbcef5ebc96162db..72c948aa4ec32631090b0f201b97c17380d0c497 100644 (file)
@@ -13,6 +13,11 @@ use Bugzilla::Constants;
 use Bugzilla::Error;
 use Bugzilla::WebService::Util qw(validate translate params_to_objects);
 
+use constant PUBLIC_METHODS => qw(
+    create
+    update
+);
+
 use constant MAPPED_RETURNS => {
     userregexp => 'user_regexp',
     isactive => 'is_active'
index bb61ac434e95ead3c50e56fd612c3d8930f06018..1c8d75bb4c060e14f9cca96728df444113108fdd 100644 (file)
@@ -23,6 +23,15 @@ use constant READ_ONLY => qw(
     get_selectable_products
 );
 
+use constant PUBLIC_METHODS => qw(
+    create
+    get
+    get_accessible_products
+    get_enterable_products
+    get_selectable_products
+    update
+);
+
 use constant MAPPED_FIELDS => {
     has_unconfirmed => 'allows_unconfirmed',
     is_open => 'is_active',
index c2d1e8c745b57169d97f231f5c3aa14a00a79e1d..aba5d310b8276582539b0ddd24b053460da4d1fa 100644 (file)
@@ -28,6 +28,7 @@ use Bugzilla::Util qw(correct_urlbase trim disable_utf8);
 
 use HTTP::Message;
 use MIME::Base64 qw(decode_base64 encode_base64);
+use List::MoreUtils qw(none);
 
 #####################################
 # Public JSON::RPC Method Overrides #
@@ -378,6 +379,11 @@ sub _argument_type_check {
         }
     }
 
+    # Only allowed methods to be used from our whitelist
+    if (none { $_ eq $method} $pkg->PUBLIC_METHODS) {
+        ThrowUserError('unknown_method', { method => $self->bz_method_name });
+    }
+
     # This is the best time to do login checks.
     $self->handle_login();
 
index 03590bd1cd3698f921fb48f36ab2119cabc1e116..5f9cb4515766f58c9c3638e74c895eb26513cc04 100644 (file)
@@ -17,6 +17,9 @@ if ($ENV{MOD_PERL}) {
 }
 
 use Bugzilla::WebService::Constants;
+use Bugzilla::Error;
+
+use List::MoreUtils qw(none);
 
 # Allow WebService methods to call XMLRPC::Lite's type method directly
 BEGIN {
@@ -65,6 +68,14 @@ sub handle_login {
     my ($self, $classes, $action, $uri, $method) = @_;
     my $class = $classes->{$uri};
     my $full_method = $uri . "." . $method;
+    # Only allowed methods to be used from the module's whitelist
+    my $file = $class;
+    $file =~ s{::}{/}g;
+    $file .= ".pm";
+    require $file;
+    if (none { $_ eq $method } $class->PUBLIC_METHODS) {
+        ThrowCodeError('unknown_method', { method => $full_method });
+    }
     $self->SUPER::handle_login($class, $method, $full_method);
     return;
 }
index 171017eb79a14f5b12e9a198a6f4a69414e44e4a..5a7f25036f9c957238a5fa999cf5ae0ef599f1d6 100644 (file)
@@ -32,6 +32,15 @@ use constant READ_ONLY => qw(
     get
 );
 
+use constant PUBLIC_METHODS => qw(
+    create
+    get
+    login
+    logout
+    offer_account_by_email
+    update
+);
+
 use constant MAPPED_FIELDS => {
     email => 'login',
     full_name => 'name',
index 659189d2f9f74a2bef00654818fccbbecb7c5ed9..56adc8cb8de185926803e30ad8348f485937a1a5 100644 (file)
@@ -11,6 +11,11 @@ use warnings;
 use base qw(Bugzilla::WebService);
 use Bugzilla::Error;
 
+use constant PUBLIC_METHODS => qw(
+    hello
+    throw_an_error
+);
+
 # This can be called as Example.hello() from the WebService.
 sub hello { return 'Hello!'; }