Ask Bjørn Hansen skribis 2008-05-10 14:51 (-0700):
> I thought I did that a while ago - you should be able to put in a  
> module name in the plugins config and it'll load that module rather  
> than do the wrapper around a single plugin file.

Ah, so you did! I had expected this in Qpstmpd::Plugin, but it's in
Qpsmtpd::_load_plugin.

I'm not sure the way to untaint the data is kosher. Essentially,
unvalidated configuration is eval()ed here.

May I suggest to replace the following:

(Comments mine)

  if ($plugin =~ m/::/) {
    # "full" package plugin (My::Plugin)
    $package = $plugin;
    $package =~ s/[^_a-z0-9:]+//gi;
    my $eval = qq[require $package;\n] 
              .qq[sub ${plugin}::plugin_name { '$plugin' }];  # <-- shouldn't 
the first plugin be package??
    $eval =~ m/(.*)/s;  # <-- 
    $eval = $1;         # <-- forced untaint. red flag!
    eval $eval;
    die "Failed loading $package - eval $@" if $@;
    $self->log(LOGDEBUG, "Loading $package ($plugin_line)")  # <-- actually, 
it's already loaded by now.
      unless $plugin_line =~ /logging/;
  }

with:

  if ($plugin =~ /::/) {
    ($plugin) = $plugin =~ /^([A-Za-z0-9_:]+)\z/
      or die "Invalid plugin name '$plugin'";

    $package = $plugin;
    ($filename = "$plugin.pm") =~ s[::][/]g;

    $self->log(LOGDEBUG, "Loading $package ($plugin_line)")
      unless $plugin_line =~ /logging/;

    eval { require $filename }
      or die "Cannot load $filename - eval $@";

    no strict 'refs';
    *{ $package . "::plugin_name" } = sub { $plugin };
  }

No string eval anymore. (Note that I did not yet test this code).
-- 
Met vriendelijke groet,  Kind regards,  Korajn salutojn,

  Juerd Waalboer:  Perl hacker  <[EMAIL PROTECTED]>  <http://juerd.nl/sig>
  Convolution:     ICT solutions and consultancy <[EMAIL PROTECTED]>
1;

Reply via email to