about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Config.pm20
-rw-r--r--lib/PublicInbox/WWW.pm4
2 files changed, 21 insertions, 3 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;
         }
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index c1c39265..3562e46c 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -19,7 +19,9 @@ use URI::Escape qw(uri_unescape);
 use PublicInbox::MID qw(mid_escape);
 require PublicInbox::Git;
 use PublicInbox::GitHTTPBackend;
-our $INBOX_RE = qr!\A/([\w\.\-]+)!;
+
+# TODO: consider a routing tree now that we have more endpoints:
+our $INBOX_RE = qr!\A/([\w\-][\w\.\-]*)!;
 our $MID_RE = qr!([^/]+)!;
 our $END_RE = qr!(T/|t/|t\.mbox(?:\.gz)?|t\.atom|raw|)!;
 our $ATTACH_RE = qr!(\d[\.\d]*)-([[:alnum:]][\w\.-]+[[:alnum:]])!i;