summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xBugzilla/WebService.pm20
-rwxr-xr-xBugzilla/WebService/Bugzilla.pm6
-rwxr-xr-xBugzilla/WebService/Constants.pm11
-rwxr-xr-xBugzilla/WebService/User.pm6
-rwxr-xr-xxmlrpc.cgi25
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;