]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
www: remove unused ctx_get sub
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 50b6950cf6aca523e6dc8e708cab6bb193f28af8..4b7177c1b157b2e4c2b5a7f8841123f287c928a1 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2018 all contributors <meta@public-inbox.org>
+# Copyright (C) 2014-2019 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Main web interface for mailing list archives
@@ -74,10 +74,11 @@ sub call {
        my $method = $env->{REQUEST_METHOD};
 
        if ($method eq 'POST') {
-               if ($path_info =~ m!$INBOX_RE/(?:(\d+)/)?(git-upload-pack)\z!) {
-                       my ($part, $path) = ($2, $3);
+               if ($path_info =~ m!$INBOX_RE/(?:(?:git/)?([0-9]+)(?:\.git)?/)?
+                                       (git-upload-pack)\z!x) {
+                       my ($epoch, $path) = ($2, $3);
                        return invalid_inbox($ctx, $1) ||
-                               serve_git($ctx, $part, $path);
+                               serve_git($ctx, $epoch, $path);
                } elsif ($path_info =~ m!$INBOX_RE/!o) {
                        return invalid_inbox($ctx, $1) || mbox_results($ctx);
                }
@@ -87,7 +88,7 @@ sub call {
        }
 
        # top-level indices and feeds
-       if ($path_info eq '/') {
+       if ($path_info eq '/' || $path_info eq '/manifest.js.gz') {
                www_listing($self)->call($env);
        } elsif ($path_info =~ m!$INBOX_RE\z!o) {
                invalid_inbox($ctx, $1) || r301($ctx, $1);
@@ -97,11 +98,11 @@ sub call {
                invalid_inbox($ctx, $1) || get_atom($ctx);
        } elsif ($path_info =~ m!$INBOX_RE/new\.html\z!o) {
                invalid_inbox($ctx, $1) || get_new($ctx);
-       } elsif ($path_info =~ m!$INBOX_RE/(?:(\d+)/)?
+       } elsif ($path_info =~ m!$INBOX_RE/(?:(?:git/)?([0-9]+)(?:\.git)?/)?
                                ($PublicInbox::GitHTTPBackend::ANY)\z!ox) {
-               my ($part, $path) = ($2, $3);
-               invalid_inbox($ctx, $1) || serve_git($ctx, $part, $path);
-       } elsif ($path_info =~ m!$INBOX_RE/([\w-]+).mbox\.gz\z!o) {
+               my ($epoch, $path) = ($2, $3);
+               invalid_inbox($ctx, $1) || serve_git($ctx, $epoch, $path);
+       } elsif ($path_info =~ m!$INBOX_RE/([a-zA-Z0-9_\-]+).mbox\.gz\z!o) {
                serve_mbox_range($ctx, $1, $2);
        } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/$END_RE\z!o) {
                msg_page($ctx, $1, $2, $3);
@@ -123,11 +124,14 @@ sub call {
                r301($ctx, $1, $2);
        } elsif ($path_info =~ m!$INBOX_RE/_/text(?:/(.*))?\z!o) {
                get_text($ctx, $1, $2);
-       } elsif ($path_info =~ m!$INBOX_RE/([\w\-\.]+)\.css\z!o) {
+       } elsif ($path_info =~ m!$INBOX_RE/([a-zA-Z0-9_\-\.]+)\.css\z!o) {
                get_css($ctx, $1, $2);
+       } elsif ($path_info =~ m!$INBOX_RE/manifest\.js\.gz\z!o) {
+               get_inbox_manifest($ctx, $1, $2);
        } elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s/\z!o) {
                get_vcs_object($ctx, $1, $2);
-       } elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s/([\w\.\-]+)\z!o) {
+       } elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s/
+                               ($PublicInbox::Hval::FN)\z!ox) {
                get_vcs_object($ctx, $1, $2, $3);
        } elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s\z!o) {
                r301($ctx, $1, $2, 's/');
@@ -296,13 +300,6 @@ sub get_vcs_object ($$$;$) {
        PublicInbox::ViewVCS::show($ctx, $oid, $filename);
 }
 
-sub ctx_get {
-       my ($ctx, $key) = @_;
-       my $val = $ctx->{$key};
-       (defined $val && $val ne '') or die "BUG: bad ctx, $key unusable";
-       $val;
-}
-
 sub need {
        my ($ctx, $extra) = @_;
        my $msg = <<EOF;
@@ -433,10 +430,10 @@ sub msg_page {
 }
 
 sub serve_git {
-       my ($ctx, $part, $path) = @_;
+       my ($ctx, $epoch, $path) = @_;
        my $env = $ctx->{env};
        my $ibx = $ctx->{-inbox};
-       my $git = defined $part ? $ibx->git_part($part) : $ibx->git;
+       my $git = defined $epoch ? $ibx->git_epoch($epoch) : $ibx->git;
        $git ? PublicInbox::GitHTTPBackend::serve($env, $git, $path) : r404();
 }
 
@@ -488,6 +485,15 @@ sub www_listing {
        }
 }
 
+# GET $INBOX/manifest.js.gz
+sub get_inbox_manifest ($$$) {
+       my ($ctx, $inbox, $key) = @_;
+       my $r404 = invalid_inbox($ctx, $inbox);
+       return $r404 if $r404;
+       require PublicInbox::WwwListing;
+       PublicInbox::WwwListing::js($ctx->{env}, [$ctx->{-inbox}]);
+}
+
 sub get_attach {
        my ($ctx, $idx, $fn) = @_;
        require PublicInbox::WwwAttach;
@@ -534,11 +540,15 @@ sub stylesheets_prepare ($$) {
                        $inline_ok = 0;
                } else {
                        my $fn = $_;
+                       my ($key) = (m!([^/]+?)(?:\.css)?\z!i);
+                       if ($key !~ /\A[a-zA-Z0-9_\-\.]+\z/) {
+                               warn "ignoring $fn, non-ASCII word character\n";
+                               next;
+                       }
                        open(my $fh, '<', $fn) or do {
                                warn "failed to open $fn: $!\n";
                                next;
                        };
-                       my ($key) = (m!([^/]+?)(?:\.css)?\z!i);
                        my $ctime = 0;
                        my $local = do { local $/; <$fh> };
                        if ($local =~ /\S/) {