Fall back correctly between config methods

hook_user_config no falls back to global hook_config followed by
file-based config followed by %defaults
This commit is contained in:
Jared Johnson 2014-09-12 12:53:26 -05:00
parent 5b8138971a
commit 18bfc45d0b
2 changed files with 15 additions and 14 deletions

View File

@ -145,25 +145,25 @@ sub config {
$self->log(LOGDEBUG, "in config($c)"); $self->log(LOGDEBUG, "in config($c)");
my $is_address = (ref $type and $type->can('address')); # first run the hooks
my @args = $is_address ? ('user_config',$type,$c) : ('config',$c); my ($rc, @config);
my ($rc, @config) = $self->run_hooks_no_respond(@args); ($rc, @config) = $self->run_hooks_no_respond('user_config',$type,$c)
return wantarray ? @config : $config[0] if $is_address; if ref $type and $type->can('address');
return wantarray ? @config : $config[0]
if defined $rc and $rc == OK;
($rc, @config) = $self->run_hooks_no_respond('config',$c);
$self->log(LOGDEBUG, "config($c): hook returned ($rc, @config) "); $self->log(LOGDEBUG, "config($c): hook returned ($rc, @config) ");
if ($rc == OK) { return wantarray ? @config : $config[0]
return wantarray ? @config : $config[0]; if defined $rc and $rc == OK;
}
# and then get_qmail_config # and then get_qmail_config
@config = $self->get_qmail_config($c, $type); @config = $self->get_qmail_config($c, $type);
if (@config) { return wantarray ? @config : $config[0]
return wantarray ? @config : $config[0]; if @config;
}
# finally we use the default if there is any: # finally we use the default if there is any:
if (exists($defaults{$c})) { return wantarray ? ($defaults{$c}) : $defaults{$c}
return wantarray ? @config : $config[0]; if exists $defaults{$c};
}
return; return;
} }

View File

@ -18,7 +18,8 @@ sub __config {
ok( $qp->command('HELO test') ); ok( $qp->command('HELO test') );
ok( $qp->command('MAIL FROM:<test@example.com>') ); ok( $qp->command('MAIL FROM:<test@example.com>') );
my $sender = $qp->transaction->sender; my $sender = $qp->transaction->sender;
$qp->hooks->{user_config} = []; $qp->hooks->{user_config} = undef;
is( $qp->config('size_threshold'), 10000, 'use global config when user_config is absent' );
is( $sender->config('test config'), undef, 'no user_config plugins exist' ); is( $sender->config('test config'), undef, 'no user_config plugins exist' );
$qp->hooks->{user_config} = [{ name => 'test hook', code => sub { return DECLINED } }]; $qp->hooks->{user_config} = [{ name => 'test hook', code => sub { return DECLINED } }];
is( $sender->config('test config'), undef, 'no user_config plugins return OK' ); is( $sender->config('test config'), undef, 'no user_config plugins return OK' );