Commit 22ac4064 authored by bbaetz%acm.org's avatar bbaetz%acm.org

Bug 428941 – Allow extension webservices to override LOGIN_EXEMPT

r/a=mkanat
parent 32b928ba
...@@ -42,10 +42,24 @@ sub datetime_format { ...@@ -42,10 +42,24 @@ sub datetime_format {
} }
sub handle_login { sub handle_login {
my ($self, $module, $method) = @_; my ($classes, $action, $uri, $method) = @_;
my $exempt = LOGIN_EXEMPT->{$module};
return if $exempt && grep { $_ eq $method } @$exempt; my $class = $classes->{$uri};
eval "require $class";
return if $class->login_exempt($method);
Bugzilla->login; 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; 1;
......
...@@ -26,6 +26,12 @@ import SOAP::Data qw(type); ...@@ -26,6 +26,12 @@ import SOAP::Data qw(type);
use Time::Zone; use Time::Zone;
# Basic info that is needed before logins
use constant LOGIN_EXEMPT => {
timezone => 1,
version => 1,
};
sub version { sub version {
return { version => type('string')->value(BUGZILLA_VERSION) }; return { version => type('string')->value(BUGZILLA_VERSION) };
} }
......
...@@ -27,8 +27,6 @@ use base qw(Exporter); ...@@ -27,8 +27,6 @@ use base qw(Exporter);
ERROR_AUTH_NODATA ERROR_AUTH_NODATA
ERROR_UNIMPLEMENTED ERROR_UNIMPLEMENTED
LOGIN_EXEMPT
); );
# This maps the error names in global/*-error.html.tmpl to numbers. # This maps the error names in global/*-error.html.tmpl to numbers.
...@@ -108,13 +106,4 @@ use constant ERROR_AUTH_NODATA => 410; ...@@ -108,13 +106,4 @@ use constant ERROR_AUTH_NODATA => 410;
use constant ERROR_UNIMPLEMENTED => 910; use constant ERROR_UNIMPLEMENTED => 910;
use constant ERROR_GENERAL => 999; 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; 1;
...@@ -30,6 +30,12 @@ use Bugzilla::User; ...@@ -30,6 +30,12 @@ use Bugzilla::User;
use Bugzilla::Util qw(trim); use Bugzilla::Util qw(trim);
use Bugzilla::Token; use Bugzilla::Token;
# Don't need auth to login
use constant LOGIN_EXEMPT => {
login => 1,
offer_account_by_email => 1,
};
############## ##############
# User Login # # User Login #
############## ##############
......
...@@ -35,12 +35,23 @@ my %hook_dispatch; ...@@ -35,12 +35,23 @@ my %hook_dispatch;
Bugzilla::Hook::process('webservice', { dispatch => \%hook_dispatch }); Bugzilla::Hook::process('webservice', { dispatch => \%hook_dispatch });
local @INC = (bz_locations()->{extensionsdir}, @INC); local @INC = (bz_locations()->{extensionsdir}, @INC);
my $response = Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI my $dispatch = {
->dispatch_with({'Bugzilla' => 'Bugzilla::WebService::Bugzilla', 'Bugzilla' => 'Bugzilla::WebService::Bugzilla',
'Bug' => 'Bugzilla::WebService::Bug', 'Bug' => 'Bugzilla::WebService::Bug',
'User' => 'Bugzilla::WebService::User', 'User' => 'Bugzilla::WebService::User',
'Product' => 'Bugzilla::WebService::Product', 'Product' => 'Bugzilla::WebService::Product',
%hook_dispatch %hook_dispatch
}) };
->on_action(\&Bugzilla::WebService::handle_login)
# 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($dispatch)
->on_action(sub { Bugzilla::WebService::handle_login($dispatch, @_) } )
->handle; ->handle;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment