From 22ac4064da3f75f68df8bc939e6d5399f57a3ba8 Mon Sep 17 00:00:00 2001 From: "bbaetz%acm.org" <> Date: Thu, 17 Apr 2008 18:26:12 +0000 Subject: Bug 428941 – Allow extension webservices to override LOGIN_EXEMPT r/a=mkanat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bugzilla/WebService.pm | 20 +++++++++++++++++--- Bugzilla/WebService/Bugzilla.pm | 6 ++++++ Bugzilla/WebService/Constants.pm | 11 ----------- Bugzilla/WebService/User.pm | 6 ++++++ xmlrpc.cgi | 25 ++++++++++++++++++------- 5 files changed, 47 insertions(+), 21 deletions(-) diff --git a/Bugzilla/WebService.pm b/Bugzilla/WebService.pm index 72994cb65..a2313803d 100755 --- a/Bugzilla/WebService.pm +++ b/Bugzilla/WebService.pm @@ -42,10 +42,24 @@ sub datetime_format { } sub handle_login { - my ($self, $module, $method) = @_; - my $exempt = LOGIN_EXEMPT->{$module}; - return if $exempt && grep { $_ eq $method } @$exempt; + my ($classes, $action, $uri, $method) = @_; + + my $class = $classes->{$uri}; + eval "require $class"; + + return if $class->login_exempt($method); Bugzilla->login; + + return; +} + +# For some methods, we shouldn't call Bugzilla->login before we call them +use constant LOGIN_EXEMPT => { }; + +sub login_exempt { + my ($class, $method) = @_; + + return $class->LOGIN_EXEMPT->{$method}; } 1; diff --git a/Bugzilla/WebService/Bugzilla.pm b/Bugzilla/WebService/Bugzilla.pm index c6b0218cf..dde9cfd4b 100755 --- a/Bugzilla/WebService/Bugzilla.pm +++ b/Bugzilla/WebService/Bugzilla.pm @@ -26,6 +26,12 @@ import SOAP::Data qw(type); use Time::Zone; +# Basic info that is needed before logins +use constant LOGIN_EXEMPT => { + timezone => 1, + version => 1, +}; + sub version { return { version => type('string')->value(BUGZILLA_VERSION) }; } diff --git a/Bugzilla/WebService/Constants.pm b/Bugzilla/WebService/Constants.pm index 85640d1bc..42ad43120 100755 --- a/Bugzilla/WebService/Constants.pm +++ b/Bugzilla/WebService/Constants.pm @@ -27,8 +27,6 @@ use base qw(Exporter); ERROR_AUTH_NODATA ERROR_UNIMPLEMENTED - - LOGIN_EXEMPT ); # This maps the error names in global/*-error.html.tmpl to numbers. @@ -108,13 +106,4 @@ use constant ERROR_AUTH_NODATA => 410; use constant ERROR_UNIMPLEMENTED => 910; use constant ERROR_GENERAL => 999; -# For some methods, we shouldn't call Bugzilla->login before we call them. -# This is a hash--package names pointing to an arrayref of method names. -use constant LOGIN_EXEMPT => { - # Callers may have to know the Bugzilla version before logging in, - # even on a requirelogin installation. - Bugzilla => ['version', 'timezone'], - User => ['offer_account_by_email', 'login'], -}; - 1; diff --git a/Bugzilla/WebService/User.pm b/Bugzilla/WebService/User.pm index f839e2a9d..d0ce706f0 100755 --- a/Bugzilla/WebService/User.pm +++ b/Bugzilla/WebService/User.pm @@ -30,6 +30,12 @@ use Bugzilla::User; use Bugzilla::Util qw(trim); use Bugzilla::Token; +# Don't need auth to login +use constant LOGIN_EXEMPT => { + login => 1, + offer_account_by_email => 1, +}; + ############## # User Login # ############## diff --git a/xmlrpc.cgi b/xmlrpc.cgi index a802ac43f..324382ea2 100755 --- a/xmlrpc.cgi +++ b/xmlrpc.cgi @@ -35,12 +35,23 @@ my %hook_dispatch; Bugzilla::Hook::process('webservice', { dispatch => \%hook_dispatch }); local @INC = (bz_locations()->{extensionsdir}, @INC); +my $dispatch = { + 'Bugzilla' => 'Bugzilla::WebService::Bugzilla', + 'Bug' => 'Bugzilla::WebService::Bug', + 'User' => 'Bugzilla::WebService::User', + 'Product' => 'Bugzilla::WebService::Product', + %hook_dispatch +}; + +# The on_action sub needs to be wrapped so that we can work out which +# class to use; when the XMLRPC module calls it theres no indication +# of which dispatch class will be handling it. +# Note that using this to get code thats called before the actual routine +# is a bit of a hack; its meant to be for modifying the SOAPAction +# headers, which XMLRPC doesn't use; it relies on the XMLRPC modules +# using SOAP::Lite internally.... + my $response = Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI - ->dispatch_with({'Bugzilla' => 'Bugzilla::WebService::Bugzilla', - 'Bug' => 'Bugzilla::WebService::Bug', - 'User' => 'Bugzilla::WebService::User', - 'Product' => 'Bugzilla::WebService::Product', - %hook_dispatch - }) - ->on_action(\&Bugzilla::WebService::handle_login) + ->dispatch_with($dispatch) + ->on_action(sub { Bugzilla::WebService::handle_login($dispatch, @_) } ) ->handle; -- cgit v1.2.3-24-g4f1b