]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: relax name inbox name restrictions
authorEric Wong <e@80x24.org>
Tue, 1 Jan 2019 10:18:47 +0000 (10:18 +0000)
committerEric Wong <e@80x24.org>
Wed, 2 Jan 2019 08:33:37 +0000 (08:33 +0000)
Since "publicinbox" sections are analogous to git remotes, we
may use the same rules for naming git remotes to reduce
cognitive overhead.

Most notably, this allows '.' in the middle of inbox names,
(e.g. "foo.bar") as it's common for email addresses, too.

lib/PublicInbox/Config.pm

index 78586560cf0f7a20e38c3752b536a20e03c6301d..a2b721d2a33c212f9f76dd3c0ac728f559fb7e7a 100644 (file)
@@ -54,7 +54,7 @@ sub lookup {
        my $pfx;
 
        foreach my $k (keys %$self) {
-               $k =~ /\A(publicinbox\.[\w-]+)\.address\z/ or next;
+               $k =~ m!\A(publicinbox\.[^/]+)\.address\z! or next;
                my $v = $self->{$k};
                if (ref($v) eq "ARRAY") {
                        foreach my $alias (@$v) {
@@ -81,7 +81,7 @@ sub each_inbox {
        my ($self, $cb) = @_;
        my %seen;
        foreach my $k (keys %$self) {
-               $k =~ /\Apublicinbox\.([A-Z0-9a-z-]+)\.mainrepo\z/ or next;
+               $k =~ m!\Apublicinbox\.([^/]+)\.mainrepo\z! or next;
                next if $seen{$1};
                $seen{$1} = 1;
                my $ibx = lookup_name($self, $1) or next;
@@ -96,7 +96,7 @@ sub lookup_newsgroup {
        return $rv if $rv;
 
        foreach my $k (keys %$self) {
-               $k =~ /\A(publicinbox\.[\w-]+)\.newsgroup\z/ or next;
+               $k =~ m!\A(publicinbox\.[^/]+)\.newsgroup\z! or next;
                my $v = $self->{$k};
                my $pfx = $1;
                if ($v eq $ng) {
@@ -184,6 +184,13 @@ sub _fill {
        return unless $rv->{mainrepo};
        my $name = $pfx;
        $name =~ s/\Apublicinbox\.//;
+
+       # same rules as git.git/remote.c::valid_remote_nick
+       if ($name eq '' || $name =~ m!/! || $name eq '.' || $name eq '..') {
+               warn "invalid inbox name: '$name'\n";
+               return;
+       }
+
        $rv->{name} = $name;
        $rv->{-pi_config} = $self;
        $rv = PublicInbox::Inbox->new($rv);