]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 428941 รข\80\93 Allow extension webservices to override LOGIN_EXEMPT
authorbbaetz%acm.org <>
Thu, 17 Apr 2008 18:26:12 +0000 (18:26 +0000)
committerbbaetz%acm.org <>
Thu, 17 Apr 2008 18:26:12 +0000 (18:26 +0000)
r/a=mkanat

Bugzilla/WebService.pm
Bugzilla/WebService/Bugzilla.pm
Bugzilla/WebService/Constants.pm
Bugzilla/WebService/User.pm
xmlrpc.cgi

index 72994cb659c79269c57f8741cb6dcfc91e4fe4ab..a2313803d57e4e0a68eada9e91f143b250da52a8 100755 (executable)
@@ -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;
index c6b0218cf6d4cbcb102b521fcd865e8a28d1accc..dde9cfd4b8baf251e8d22f5828ccbf84cddd7738 100755 (executable)
@@ -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) };
 }
index 85640d1bca4f50181ea4177ea885607b09548d1d..42ad43120c533815dc40230bf0ac7518745f6a71 100755 (executable)
@@ -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;
index f839e2a9d4841c3dcea5176cec2b714c02734780..d0ce706f04d70b4feefcf8c5e9bfba89ea8a24ce 100755 (executable)
@@ -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 #
 ##############
index a802ac43fd5a419231457b59c33ca94b18cda259..324382ea282938c57bc64df126222beac6a9e8c2 100755 (executable)
@@ -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;