sub set_config()

in lib/Mail/SpamAssassin/Plugin/URILocalBL.pm [147:320]


sub set_config {
  my ($self, $conf) = @_;
  my @cmds;

  push (@cmds, {
    setting => 'uri_block_cc',
    type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
    is_priv => 1,
    code => sub {
      my ($self, $key, $value, $line) = @_;

      if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }
      my $name = $1;
      my $args = $2;
      my @added;

      foreach my $cc (split(/\s+/, uc($args))) {
        # this should match all country codes including satellite providers
        if ($cc =~ /^((\!)?([a-z][a-z0-9]))$/i) {
          if (defined $2) {
            $self->{urilocalbl}->{$name}{countries_neg} = 1;
            $self->{urilocalbl}->{$name}{countries}{$3} = 0;
          } else {
            $self->{urilocalbl}->{$name}{countries}{$3} = 1;
          }
          push @added, $1;
        } else {
          return $Mail::SpamAssassin::Conf::INVALID_VALUE;
        }
      }

      my %checkneg = map { $_ => 1 } values %{$self->{urilocalbl}->{$name}{countries}};
      if (scalar keys %checkneg > 1) {
        dbg("config: uri_block_cc $name failed: trying to combine negations and non-negations");
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }

      dbg("config: uri_block_cc $name added: ".join(' ', @added));
      $self->{parser}->add_test($name, 'check_uri_local_bl()',
        $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
      $self->{parser}->{conf}->{priority}->{$name} = -100;
    }
  });

  push (@cmds, {
    setting => 'uri_block_cont',
    type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
    is_priv => 1,
    code => sub {
      my ($self, $key, $value, $line) = @_;

      if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }
      my $name = $1;
      my $args = $2;
      my @added;

      foreach my $cc (split(/\s+/, uc($args))) {
        # this should match all continent codes
        if ($cc =~ /^((\!)?([a-z]{2}))$/i) {
          if (defined $2) {
            $self->{urilocalbl}->{$name}{continents_neg} = 1;
            $self->{urilocalbl}->{$name}{continents}{$3} = 0;
          } else {
            $self->{urilocalbl}->{$name}{continents}{$3} = 1;
          }
          push @added, $1;
        } else {
          return $Mail::SpamAssassin::Conf::INVALID_VALUE;
        }
      }

      my %checkneg = map { $_ => 1 } values %{$self->{urilocalbl}->{$name}{continents}};
      if (scalar keys %checkneg > 1) {
        dbg("config: uri_block_cont $name failed: trying to combine negations and non-negations");
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }

      dbg("config: uri_block_cont $name added: ".join(' ', @added));
      $self->{parser}->add_test($name, 'check_uri_local_bl()',
        $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
      $self->{parser}->{conf}->{priority}->{$name} = -100;
    }
  });
  
  push (@cmds, {
    setting => 'uri_block_isp',
    type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
    is_priv => 1,
    code => sub {
      my ($self, $key, $value, $line) = @_;

      if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }
      my $name = $1;
      my $args = $2;
      my @added;

      # gather up possibly quoted strings
      while ($args =~ /("[^"]*"|(?<!")\S+(?!"))/g) {
        my $isp = $1;
        $isp =~ s/"//g;
        my $ispkey = uc($isp); $ispkey =~ s/\s+//gs;
        $self->{urilocalbl}->{$name}{isps}{$ispkey} = $isp;
        push @added, "\"$isp\"";
      }

      if (!defined $self->{urilocalbl}->{$name}{isps}) {
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }

      dbg("config: uri_block_isp $name added: ". join(', ', @added));
      $self->{parser}->add_test($name, 'check_uri_local_bl()',
        $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
      $self->{parser}->{conf}->{priority}->{$name} = -100;
    }
  });

  push (@cmds, {
    setting => 'uri_block_cidr',
    type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
    is_priv => 1,
    code => sub {
      my ($self, $key, $value, $line) = @_;

      if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }
      my $name = $1;
      my $args = $2;

      foreach my $addr (split(/\s+/, $args)) {
        if ($addr =~ m!^$IP_ADDRESS(?:/\d{1,3})?$!o) {
          $self->{urilocalbl}->{$name}{cidr}{$addr} = 1;
        } else {
          return $Mail::SpamAssassin::Conf::INVALID_VALUE;
        }
      }

      $self->{parser}->add_test($name, 'check_uri_local_bl()',
        $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
      $self->{parser}->{conf}->{priority}->{$name} = -100;
    }
  });

  push (@cmds, {
    setting => 'uri_block_exclude',
    type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
    is_priv => 1,
    code => sub {
      my ($self, $key, $value, $line) = @_;

      if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
      }
      my $name = $1;
      my $args = $2;

      foreach my $arg (split(/\s+/, $args)) {
        $self->{urilocalbl}->{$name}{exclusions}{lc($arg)} = 1;
      }

      $self->{parser}->add_test($name, 'check_uri_local_bl()',
        $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
      $self->{parser}->{conf}->{priority}->{$name} = -100;
    }
  });

  $conf->{parser}->register_commands(\@cmds);
}