From dd5c0861db83e58ae7f507b4ecfc564d96792cb8 Mon Sep 17 00:00:00 2001 From: Dylan William Hardison Date: Mon, 1 Oct 2018 12:03:41 -0400 Subject: Bug 1495071 - Mojolicious Cleanup There are some things that should've been in the first patch but were missed: 1. Calling $c->finish in the finally block should not happen if an exception has been raised. 2. Bugzilla->cleanup() should be called at the same time the mojolicious stash is cleared. 3. Code referencing the shutdownhtml should be removed 4. The conditionals that ran code in Bugzilla.pm when it was not run under mod_perl should instead check where the Bugzilla.pm module was loaded from. 5. Revert the default template from #770 6. Also removed some stuff that manipulates the PATH and signals, which we shouldn't do --- Bugzilla/Quantum/CGI.pm | 13 ++++++-- Bugzilla/Quantum/Plugin/BasicAuth.pm | 40 ---------------------- Bugzilla/Quantum/Plugin/Glue.pm | 3 +- Bugzilla/Quantum/Plugin/Helpers.pm | 64 ++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 43 deletions(-) delete mode 100644 Bugzilla/Quantum/Plugin/BasicAuth.pm create mode 100644 Bugzilla/Quantum/Plugin/Helpers.pm (limited to 'Bugzilla/Quantum') diff --git a/Bugzilla/Quantum/CGI.pm b/Bugzilla/Quantum/CGI.pm index 0a74f1ee5..945a87d5b 100644 --- a/Bugzilla/Quantum/CGI.pm +++ b/Bugzilla/Quantum/CGI.pm @@ -58,16 +58,20 @@ sub load_one { local *STDIN; ## no critic (local) open STDIN, '<', $stdin->path or die "STDIN @{[$stdin->path]}: $!" if -s $stdin->path; tie *STDOUT, 'Bugzilla::Quantum::Stdout', controller => $c; ## no critic (tie) + + # the finally block calls cleanup. + $c->stash->{cleanup_guard}->dismiss; try { Bugzilla->init_page(); $inner->(); } catch { - die $_ unless ref $_ eq 'ARRAY' && $_->[0] eq "EXIT\n"; + die $_ unless _is_exit($_); } finally { + my $error = shift; untie *STDOUT; - $c->finish; + $c->finish if !$error || _is_exit($error); Bugzilla->cleanup; CGI::initialize_globals(); }; @@ -157,4 +161,9 @@ sub _file_to_method { return $name; } +sub _is_exit { + my ($error) = @_; + return ref $error eq 'ARRAY' && $error->[0] eq "EXIT\n"; +} + 1; diff --git a/Bugzilla/Quantum/Plugin/BasicAuth.pm b/Bugzilla/Quantum/Plugin/BasicAuth.pm deleted file mode 100644 index e17273404..000000000 --- a/Bugzilla/Quantum/Plugin/BasicAuth.pm +++ /dev/null @@ -1,40 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. -package Bugzilla::Quantum::Plugin::BasicAuth; -use 5.10.1; -use Mojo::Base qw(Mojolicious::Plugin); - -use Bugzilla::Logging; -use Carp; - -sub register { - my ( $self, $app, $conf ) = @_; - - $app->renderer->add_helper( - basic_auth => sub { - my ( $c, $realm, $auth_user, $auth_pass ) = @_; - my $req = $c->req; - my ( $user, $password ) = $req->url->to_abs->userinfo =~ /^([^:]+):(.*)/; - - unless ( $realm && $auth_user && $auth_pass ) { - croak 'basic_auth() called with missing parameters.'; - } - - unless ( $user eq $auth_user && $password eq $auth_pass ) { - WARN('username and password do not match'); - $c->res->headers->www_authenticate("Basic realm=\"$realm\""); - $c->res->code(401); - $c->rendered; - return 0; - } - - return 1; - } - ); -} - -1; \ No newline at end of file diff --git a/Bugzilla/Quantum/Plugin/Glue.pm b/Bugzilla/Quantum/Plugin/Glue.pm index a38a12657..e9d0056d0 100644 --- a/Bugzilla/Quantum/Plugin/Glue.pm +++ b/Bugzilla/Quantum/Plugin/Glue.pm @@ -14,6 +14,7 @@ use Bugzilla::Constants; use Bugzilla::Logging; use Bugzilla::RNG (); use JSON::MaybeXS qw(decode_json); +use Scope::Guard; sub register { my ( $self, $app, $conf ) = @_; @@ -42,6 +43,7 @@ sub register { } } Log::Log4perl::MDC->put( request_id => $c->req->request_id ); + $c->stash->{cleanup_guard} = Scope::Guard->new( \&Bugzilla::cleanup ); } ); @@ -72,7 +74,6 @@ sub register { or die $template->error; } ); - $app->renderer->default_handler('bugzilla'); $app->log( MojoX::Log::Log4perl::Tiny->new( logger => Log::Log4perl->get_logger( ref $app ) ) ); } diff --git a/Bugzilla/Quantum/Plugin/Helpers.pm b/Bugzilla/Quantum/Plugin/Helpers.pm new file mode 100644 index 000000000..0aedca338 --- /dev/null +++ b/Bugzilla/Quantum/Plugin/Helpers.pm @@ -0,0 +1,64 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +package Bugzilla::Quantum::Plugin::Helpers; +use 5.10.1; +use Mojo::Base qw(Mojolicious::Plugin); + +use Bugzilla::Logging; +use Carp; + +sub register { + my ( $self, $app, $conf ) = @_; + + $app->helper( + basic_auth => sub { + my ( $c, $realm, $auth_user, $auth_pass ) = @_; + my $req = $c->req; + my ( $user, $password ) = $req->url->to_abs->userinfo =~ /^([^:]+):(.*)/; + + unless ( $realm && $auth_user && $auth_pass ) { + croak 'basic_auth() called with missing parameters.'; + } + + unless ( $user eq $auth_user && $password eq $auth_pass ) { + WARN('username and password do not match'); + $c->res->headers->www_authenticate("Basic realm=\"$realm\""); + $c->res->code(401); + $c->rendered; + return 0; + } + + return 1; + } + ); + $app->routes->add_shortcut( + static_file => sub { + my ($r, $path, $option) = @_; + my $file = $option->{file}; + my $content_type = $option->{content_type} // 'text/plain'; + unless ($file) { + $file = $path; + $file =~ s!^/!!; + } + + return $r->get($path => sub { + my ($c) = @_; + $c->res->headers->content_type($content_type); + $c->reply->file( $c->app->home->child($file) ); + }) + } + ); + $app->routes->add_shortcut( + page => sub { + my ($r, $path, $id) = @_; + + return $r->any($path)->to('CGI#page_cgi' => { id => $id }); + } + ); +} + +1; -- cgit v1.2.3-24-g4f1b