diff options
Diffstat (limited to 'Bugzilla/Quantum')
-rw-r--r-- | Bugzilla/Quantum/CGI.pm | 59 | ||||
-rw-r--r-- | Bugzilla/Quantum/Legacy.pm | 47 | ||||
-rw-r--r-- | Bugzilla/Quantum/Plugin/Glue.pm | 61 | ||||
-rw-r--r-- | Bugzilla/Quantum/Template.pm | 40 |
4 files changed, 207 insertions, 0 deletions
diff --git a/Bugzilla/Quantum/CGI.pm b/Bugzilla/Quantum/CGI.pm new file mode 100644 index 000000000..5afa19b18 --- /dev/null +++ b/Bugzilla/Quantum/CGI.pm @@ -0,0 +1,59 @@ +# 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::CGI; +use 5.10.1; +use Moo; + +has 'controller' => ( + is => 'ro', + handles => [qw(param cookie)], +); + +has 'csp_object' => ( + is => 'ro', + writer => 'set_csp_object', +); + +with 'Bugzilla::CGI::ContentSecurityPolicyAttr'; + +sub script_name { + my ($self) = @_; + + return $self->controller->req->env->{SCRIPT_NAME}; +} + +sub http { + my ($self, $header) = @_; + return $self->controller->req->headers->header($header); +} + +sub header { + my ($self, @args) = @_; + my $c = $self->controller; + return '' if @args == 0; + + if (@args == 1) { + $c->res->headers->content_type($args[0]); + } + + return ''; +} + +sub redirect { + my ($self, $location) = @_; + + $self->controller->redirect_to($location); +} + +sub Vars { + my ($self) = @_; + + return $self->controller->req->query_params->to_hash; +} + +1; diff --git a/Bugzilla/Quantum/Legacy.pm b/Bugzilla/Quantum/Legacy.pm new file mode 100644 index 000000000..73e877af3 --- /dev/null +++ b/Bugzilla/Quantum/Legacy.pm @@ -0,0 +1,47 @@ +# 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::Legacy; +use Mojo::Base 'Mojolicious::Controller'; +use File::Spec::Functions qw(catfile); +use Bugzilla::Constants qw(bz_locations); +use Taint::Util qw(untaint); +use Sub::Name qw(subname); +use autodie; + +_load_cgi(index_cgi => 'index.cgi'); +_load_cgi(show_bug => 'show_bug.cgi'); + +sub _load_cgi { + my ($name, $file) = @_; + my $content; + { + local $/ = undef; + open my $fh, '<', catfile(bz_locations->{cgi_path}, $file); + $content = <$fh>; + untaint($content); + close $fh; + } + my $pkg = __PACKAGE__ . '::' . $name; + my @lines = ( + qq{package $pkg;}, + qq{#line 1 "$file"}, + "sub { my (\$self) = \@_; $content };" + ); + my $code = join "\n", @lines; + my $sub = _eval($code); + { + no strict 'refs'; ## no critic (strict) + *{ $name } = subname($name, $sub); + } +} + +sub _eval { ## no critic (unpack) + return eval $_[0]; ## no critic (eval) +} + +1;
\ No newline at end of file diff --git a/Bugzilla/Quantum/Plugin/Glue.pm b/Bugzilla/Quantum/Plugin/Glue.pm new file mode 100644 index 000000000..d689f598a --- /dev/null +++ b/Bugzilla/Quantum/Plugin/Glue.pm @@ -0,0 +1,61 @@ +# 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::Glue; +use Mojo::Base 'Mojolicious::Plugin'; + +use Try::Tiny; +use Bugzilla::Constants; +use Bugzilla::Quantum::CGI; +use Bugzilla::Quantum::Template; + +sub register { + my ( $self, $app, $conf ) = @_; + + my $template = Bugzilla::Template->create; + $template->{_is_main} = 1; + + $app->renderer->add_handler( + 'bugzilla' => sub { + my ( $renderer, $c, $output, $options ) = @_; + my %params; + + # Helpers + foreach my $method ( grep {m/^\w+\z/} keys %{ $renderer->helpers } ) { + my $sub = $renderer->helpers->{$method}; + $params{$method} = sub { $c->$sub(@_) }; + } + + # Stash values + $params{$_} = $c->stash->{$_} for grep {m/^\w+\z/} keys %{ $c->stash }; + $params{self} = $params{c} = $c; + my $name = $options->{template}; + unless ($name =~ /\./) { + $name = sprintf '%s.%s.tmpl', $options->{template}, $options->{format}; + } + $template->process( $name, \%params, $output ) + or die $template->error; + } + ); + + $app->hook( + around_dispatch => sub { + my ($next, $c) = @_; + try { + local %{ Bugzilla->request_cache } = (); + Bugzilla->usage_mode(USAGE_MODE_QUANTUM); + Bugzilla->cgi( Bugzilla::Quantum::CGI->new(controller => $c) ); + Bugzilla->template( Bugzilla::Quantum::Template->new( controller => $c, template => $template ) ); + $next->(); + } catch { + die $_ unless /\bModPerl::Util::exit\b/; + }; + } + ); +} + +1;
\ No newline at end of file diff --git a/Bugzilla/Quantum/Template.pm b/Bugzilla/Quantum/Template.pm new file mode 100644 index 000000000..ebae0cf9f --- /dev/null +++ b/Bugzilla/Quantum/Template.pm @@ -0,0 +1,40 @@ +# 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::Template; +use 5.10.1; +use Moo; + +has 'controller' => ( + is => 'ro', + required => 1, +); + +has 'template' => ( + is => 'ro', + required => 1, + handles => ['error', 'get_format'], +); + +sub process { + my ($self, $file, $vars, $output) = @_; + + if (@_ < 4) { + my $stash = $self->controller->stash; + $stash->{$_} = $vars->{$_} for keys %$vars; + $self->controller->render(template => $file, handler => 'bugzilla'); + return 1; + } + elsif (@_ == 4) { + return $self->template->process($file, $vars, $output); + } + else { + die __PACKAGE__ . '->process() called with too many arguments'; + } +} + +1;
\ No newline at end of file |