summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
authormkanat%bugzilla.org <>2008-08-07 06:38:22 +0200
committermkanat%bugzilla.org <>2008-08-07 06:38:22 +0200
commit70540fb131c58cf4fb012854759eef2d73528a30 (patch)
tree82b80ac0bebf506a2852a71606f52bda32f195d0 /Bugzilla
parentbea9199267de2fe96c3214f17b4119ae87dd6a26 (diff)
downloadbugzilla-70540fb131c58cf4fb012854759eef2d73528a30.tar.gz
bugzilla-70540fb131c58cf4fb012854759eef2d73528a30.tar.xz
Bug 438435: Need code hooks for authentication
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat
Diffstat (limited to 'Bugzilla')
-rw-r--r--Bugzilla/Auth/Login/Stack.pm16
-rw-r--r--Bugzilla/Auth/Verify/Stack.pm16
-rw-r--r--Bugzilla/Config.pm12
-rw-r--r--Bugzilla/Config/Common.pm8
-rw-r--r--Bugzilla/Hook.pm82
5 files changed, 117 insertions, 17 deletions
diff --git a/Bugzilla/Auth/Login/Stack.pm b/Bugzilla/Auth/Login/Stack.pm
index d51003861..ab9a93bce 100644
--- a/Bugzilla/Auth/Login/Stack.pm
+++ b/Bugzilla/Auth/Login/Stack.pm
@@ -26,16 +26,24 @@ use fields qw(
_stack
successful
);
+use Hash::Util qw(lock_keys);
+use Bugzilla::Hook;
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
my $list = shift;
+ my %methods = map { $_ => "Bugzilla/Auth/Login/$_.pm" } split(',', $list);
+ lock_keys(%methods);
+ Bugzilla::Hook::process('auth-login_methods', { modules => \%methods });
+
$self->{_stack} = [];
- foreach my $login_method (split(',', $list)) {
- require "Bugzilla/Auth/Login/${login_method}.pm";
- push(@{$self->{_stack}},
- "Bugzilla::Auth::Login::$login_method"->new(@_));
+ foreach my $login_method (keys %methods) {
+ my $module = $methods{$login_method};
+ require $module;
+ $module =~ s|/|::|g;
+ $module =~ s/.pm$//;
+ push(@{$self->{_stack}}, $module->new(@_));
}
return $self;
}
diff --git a/Bugzilla/Auth/Verify/Stack.pm b/Bugzilla/Auth/Verify/Stack.pm
index 577b5a22f..0ddb9a441 100644
--- a/Bugzilla/Auth/Verify/Stack.pm
+++ b/Bugzilla/Auth/Verify/Stack.pm
@@ -21,16 +21,24 @@ use fields qw(
_stack
successful
);
+use Hash::Util qw(lock_keys);
+use Bugzilla::Hook;
sub new {
my $class = shift;
my $list = shift;
my $self = $class->SUPER::new(@_);
+ my %methods = map { $_ => "Bugzilla/Auth/Verify/$_.pm" } split(',', $list);
+ lock_keys(%methods);
+ Bugzilla::Hook::process('auth-verify_methods', { modules => \%methods });
+
$self->{_stack} = [];
- foreach my $verify_method (split(',', $list)) {
- require "Bugzilla/Auth/Verify/${verify_method}.pm";
- push(@{$self->{_stack}},
- "Bugzilla::Auth::Verify::$verify_method"->new(@_));
+ foreach my $verify_method (keys %methods) {
+ my $module = $methods{$verify_method};
+ require $module;
+ $module =~ s|/|::|g;
+ $module =~ s/.pm$//;
+ push(@{$self->{_stack}}, $module->new(@_));
}
return $self;
}
diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm
index 428c13fe5..3666861f0 100644
--- a/Bugzilla/Config.pm
+++ b/Bugzilla/Config.pm
@@ -34,6 +34,7 @@ use strict;
use base qw(Exporter);
use Bugzilla::Constants;
+use Bugzilla::Hook;
use Data::Dumper;
use File::Temp;
@@ -54,15 +55,21 @@ our %params;
# Load in the param definitions
sub _load_params {
my $panels = param_panels();
+ my %hook_panels;
foreach my $panel (keys %$panels) {
my $module = $panels->{$panel};
eval("require $module") || die $@;
- my @new_param_list = "$module"->get_param_list();
+ my @new_param_list = $module->get_param_list();
+ $hook_panels{lc($panel)} = { params => \@new_param_list };
foreach my $item (@new_param_list) {
$params{$item->{'name'}} = $item;
}
push(@param_list, @new_param_list);
}
+ # This hook is also called in editparams.cgi. This call here is required
+ # to make SetParam work.
+ Bugzilla::Hook::process('config-modify_panels',
+ { panels => \%hook_panels });
}
# END INIT CODE
@@ -77,7 +84,8 @@ sub param_panels {
$param_panels->{$module} = "Bugzilla::Config::$module" unless $module eq 'Common';
}
# Now check for any hooked params
- Bugzilla::Hook::process('config', { config => $param_panels });
+ Bugzilla::Hook::process('config-add_panels',
+ { panel_modules => $param_panels });
return $param_panels;
}
diff --git a/Bugzilla/Config/Common.pm b/Bugzilla/Config/Common.pm
index e6f0398e3..39fc114d6 100644
--- a/Bugzilla/Config/Common.pm
+++ b/Bugzilla/Config/Common.pm
@@ -277,10 +277,7 @@ sub check_user_verify_class {
for my $class (split /,\s*/, $list) {
my $res = check_multi($class, $entry);
return $res if $res;
- if ($class eq 'DB') {
- # No params
- }
- elsif ($class eq 'RADIUS') {
+ if ($class eq 'RADIUS') {
eval "require Authen::Radius";
return "Error requiring Authen::Radius: '$@'" if $@;
return "RADIUS servername (RADIUS_server) is missing" unless Bugzilla->params->{"RADIUS_server"};
@@ -292,9 +289,6 @@ sub check_user_verify_class {
return "LDAP servername (LDAPserver) is missing" unless Bugzilla->params->{"LDAPserver"};
return "LDAPBaseDN is empty" unless Bugzilla->params->{"LDAPBaseDN"};
}
- else {
- return "Unknown user_verify_class '$class' in check_user_verify_class";
- }
}
return "";
}
diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm
index 1b4a5ad32..4fb1424f8 100644
--- a/Bugzilla/Hook.pm
+++ b/Bugzilla/Hook.pm
@@ -198,6 +198,88 @@ The definition is structured as:
=back
+=head2 auth-login_methods
+
+This allows you to add new login types to Bugzilla.
+(See L<Bugzilla::Auth::Login>.)
+
+Params:
+
+=over
+
+=item C<modules>
+
+This is a hash--a mapping from login-type "names" to the actual module on
+disk. The keys will be all the values that were passed to
+L<Bugzilla::Auth/login> for the C<Login> parameter. The values are the
+actual path to the module on disk. (For example, if the key is C<DB>, the
+value is F<Bugzilla/Auth/Login/DB.pm>.)
+
+For your extension, the path will start with
+F<extensions/yourextension/lib/>. (See the code in the example extension.)
+
+If your login type is in the hash as a key, you should set that key to the
+right path to your module. That module's C<new> method will be called,
+probably with empty parameters. If your login type is I<not> in the hash,
+you should not set it.
+
+You will be prevented from adding new keys to the hash, so make sure your
+key is in there before you modify it. (In other words, you can't add in
+login methods that weren't passed to L<Bugzilla::Auth/login>.)
+
+=back
+
+=head2 auth-verify_methods
+
+This works just like L</auth-login_methods> except it's for
+login verification methods (See L<Bugzilla::Auth::Verify>.) It also
+takes a C<modules> parameter, just like L</auth-login_methods>.
+
+=head2 config-add_panels
+
+If you want to add new panels to the Parameters administrative interface,
+this is where you do it.
+
+Params:
+
+=over
+
+=item C<panel_modules>
+
+A hashref, where the keys are the "name" of the module and the value
+is the Perl module containing that config module. For example, if
+the name is C<Auth>, the value would be C<Bugzilla::Config::Auth>.
+
+For your extension, the Perl module name must start with
+C<extensions::yourextension::lib>. (See the code in the example
+extension.)
+
+=back
+
+=head2 config-modify_panels
+
+This is how you modify already-existing panels in the Parameters
+administrative interface. For example, if you wanted to add a new
+Auth method (modifying Bugzilla::Config::Auth) this is how you'd
+do it.
+
+Params:
+
+=over
+
+=item C<panels>
+
+A hashref, where the keys are lower-case panel "names" (like C<auth>,
+C<admin>, etc.) and the values are hashrefs. The hashref contains a
+single key, C<params>. C<params> is an arrayref--the return value from
+C<get_param_list> for that module. You can modify C<params> and
+your changes will be reflected in the interface.
+
+Adding new keys to C<panels> will have no effect. You should use
+L</config-add_panels> if you want to add new panels.
+
+=back
+
=head2 enter_bug-entrydefaultvars
This happens right before the template is loaded on enter_bug.cgi.