X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FConfig.pm;h=289c36a6ccf1a6c6e5518cd4dff12f4e8cd63fce;hb=3d41aa23f35501ca92aab8aa42980fa73f7fa74f;hp=5eae1f1d105ab67decf7850d70f20cbf69a0d368;hpb=b0f783fe601cfcaf89b30de461a540434f63b3ee;p=public-inbox.git diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 5eae1f1d..289c36a6 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -1,5 +1,5 @@ -# Copyright (C) 2014-2015 all contributors -# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) +# Copyright (C) 2014-2018 all contributors +# License: AGPL-3.0+ # # Used throughout the project for reading configuration package PublicInbox::Config; @@ -20,7 +20,28 @@ sub new { $self->{-by_addr} ||= {}; $self->{-by_name} ||= {}; $self->{-by_newsgroup} ||= {}; + $self->{-no_obfuscate} ||= {}; $self->{-limiters} ||= {}; + + if (my $no = delete $self->{'publicinbox.noobfuscate'}) { + $no = [ $no ] if ref($no) ne 'ARRAY'; + my @domains; + foreach my $n (@$no) { + my @n = split(/\s+/, $n); + foreach (@n) { + if (/\S+@\S+/) { # full address + $self->{-no_obfuscate}->{lc $_} = 1; + } else { + # allow "example.com" or "@example.com" + s/\A@//; + push @domains, quotemeta($_); + } + } + } + my $nod = join('|', @domains); + $self->{-no_obfuscate_re} = qr/(?:$nod)\z/i; + } + $self; } @@ -90,17 +111,11 @@ sub limiter { my ($self, $name) = @_; $self->{-limiters}->{$name} ||= do { require PublicInbox::Qspawn; - my $key = "limiter.$name.max"; - PublicInbox::Qspawn::Limiter->new($self->{$key}); + my $max = $self->{"publicinboxlimiter.$name.max"}; + PublicInbox::Qspawn::Limiter->new($max); }; } -sub get { - my ($self, $inbox, $key) = @_; - - $self->{"publicinbox.$inbox.$key"}; -} - sub config_dir { $ENV{PI_DIR} || "$ENV{HOME}/.public-inbox" } sub default_file { @@ -117,7 +132,7 @@ sub git_config_dump { my $fh = popen_rd(\@cmd) or die "popen_rd failed for $file: $!\n"; my %rv; local $/ = "\n"; - foreach my $line (<$fh>) { + while (defined(my $line = <$fh>)) { chomp $line; my ($k, $v) = split(/=/, $line, 2); my $cur = $rv{$k}; @@ -133,6 +148,7 @@ sub git_config_dump { } } close $fh or die "failed to close ($cmd) pipe: $?"; + \%rv; } @@ -140,12 +156,26 @@ sub _fill { my ($self, $pfx) = @_; my $rv = {}; - foreach my $k (qw(mainrepo address filter url newsgroup - infourl watch watchheader httpbackendmax)) { + foreach my $k (qw(mainrepo filter url newsgroup + infourl watch watchheader httpbackendmax + replyto feedmax nntpserver)) { my $v = $self->{"$pfx.$k"}; $rv->{$k} = $v if defined $v; } - foreach my $k (qw(altid)) { # TODO: more arrays + foreach my $k (qw(obfuscate)) { + my $v = $self->{"$pfx.$k"}; + defined $v or next; + if ($v =~ /\A(?:false|no|off|0)\z/) { + $rv->{$k} = 0; + } elsif ($v =~ /\A(?:true|yes|on|1)\z/) { + $rv->{$k} = 1; + } else { + warn "Ignoring $pfx.$k=$v in config, not boolean\n"; + } + } + # TODO: more arrays, we should support multi-value for + # more things to encourage decentralization + foreach my $k (qw(address altid nntpmirror)) { if (defined(my $v = $self->{"$pfx.$k"})) { $rv->{$k} = ref($v) eq 'ARRAY' ? $v : [ $v ]; } @@ -157,16 +187,21 @@ sub _fill { $rv->{name} = $name; $rv->{-pi_config} = $self; $rv = PublicInbox::Inbox->new($rv); - my $v = $rv->{address}; - if (ref($v) eq 'ARRAY') { - $self->{-by_addr}->{lc($_)} = $rv foreach @$v; - } else { - $self->{-by_addr}->{lc($v)} = $rv; + foreach (@{$rv->{address}}) { + my $lc_addr = lc($_); + $self->{-by_addr}->{$lc_addr} = $rv; + $self->{-no_obfuscate}->{$lc_addr} = 1; } if (my $ng = $rv->{newsgroup}) { $self->{-by_newsgroup}->{$ng} = $rv; } $self->{-by_name}->{$name} = $rv; + if ($rv->{obfuscate}) { + $rv->{-no_obfuscate} = $self->{-no_obfuscate}; + $rv->{-no_obfuscate_re} = $self->{-no_obfuscate_re}; + each_inbox($self, sub {}); # noop to populate -no_obfuscate + } + $rv } 1;