about summary refs log tree commit homepage
path: root/lib/PublicInbox/Config.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/Config.pm')
-rw-r--r--lib/PublicInbox/Config.pm20
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index a2b721d2..bea26176 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -152,6 +152,23 @@ sub git_config_dump {
         \%rv;
 }
 
+sub valid_inbox_name ($) {
+        my ($name) = @_;
+
+        # Similar rules found in git.git/remote.c::valid_remote_nick
+        # and git.git/refs.c::check_refname_component
+        # We don't reject /\.lock\z/, however, since we don't lock refs
+        if ($name eq '' || $name =~ /\@\{/ ||
+            $name =~ /\.\./ || $name =~ m![/:\?\[\]\^~\s\f[:cntrl:]\*]! ||
+            $name =~ /\A\./ || $name =~ /\.\z/) {
+                return 0;
+        }
+
+        # Note: we allow URL-unfriendly characters; users may configure
+        # non-HTTP-accessible inboxes
+        1;
+}
+
 sub _fill {
         my ($self, $pfx) = @_;
         my $rv = {};
@@ -185,8 +202,7 @@ sub _fill {
         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 '..') {
+        if (!valid_inbox_name($name)) {
                 warn "invalid inbox name: '$name'\n";
                 return;
         }