summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Quantum
diff options
context:
space:
mode:
authorDylan William Hardison <dylan@hardison.net>2018-04-08 01:20:00 +0200
committerDylan William Hardison <dylan@hardison.net>2018-06-28 22:41:55 +0200
commit541e2b41af8cc44ad3eb0638618bc457c666d612 (patch)
tree121866bb37e4b06ffd7320679772d77271158661 /Bugzilla/Quantum
parentcdc26a69674ea7a3413efce2f8d4e3225c6ab76e (diff)
downloadbugzilla-541e2b41af8cc44ad3eb0638618bc457c666d612.tar.gz
bugzilla-541e2b41af8cc44ad3eb0638618bc457c666d612.tar.xz
a bit of a quantum leap
It's now possible to load the CGIs into a mojolicious controller. Compatibility isn't 100% yet, but it should give a migration path for any random CGI to become a proper controller.
Diffstat (limited to 'Bugzilla/Quantum')
-rw-r--r--Bugzilla/Quantum/CGI.pm59
-rw-r--r--Bugzilla/Quantum/Legacy.pm47
-rw-r--r--Bugzilla/Quantum/Plugin/Glue.pm61
-rw-r--r--Bugzilla/Quantum/Template.pm40
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