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 {
}
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;
......
......@@ -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) };
}
......
......@@ -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;
......@@ -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 #
##############
......
......@@ -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;
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