From 889d8ad22855191773dd45e67272650d0c00f502 Mon Sep 17 00:00:00 2001 From: Dylan William Hardison Date: Sun, 20 May 2018 22:00:08 -0400 Subject: cool stuff --- Bugzilla/Quantum/CGI.pm | 153 ++++++++++++------------------------------------ 1 file changed, 36 insertions(+), 117 deletions(-) (limited to 'Bugzilla/Quantum/CGI.pm') diff --git a/Bugzilla/Quantum/CGI.pm b/Bugzilla/Quantum/CGI.pm index 4cbbe0418..4d43158cc 100644 --- a/Bugzilla/Quantum/CGI.pm +++ b/Bugzilla/Quantum/CGI.pm @@ -6,133 +6,52 @@ # defined by the Mozilla Public License, v. 2.0. package Bugzilla::Quantum::CGI; -use 5.10.1; -use Carp qw(confess); -use Moo; +use Mojo::Base 'Mojolicious::Controller'; -has 'controller' => ( - is => 'ro', - handles => [qw[req res]], -); +use CGI::Compile; +use Bugzilla::Constants qw(bz_locations); +use File::Slurper qw(read_text); +use File::Spec::Functions qw(catfile); +use Sub::Quote 2.005000; +use Taint::Util qw(untaint); -has 'csp_object' => ( - is => 'ro', - writer => 'set_csp_object', -); +my %CGIS; +my %SKIP = ( 'xmlrpc.cgi' => 1, 'jsonrpc.cgi' => 1, 'rest.cgi' => 1); -with 'Bugzilla::CGI::Role'; +_load_all(); -sub script_name { - my ($self) = @_; - - return $self->req->env->{SCRIPT_NAME}; -} - -sub referer { - my ($self) = @_; - - return $self->req->headers->referrer; -} - -sub http { - my ($self, $header) = @_; - return $self->req->headers->header($header); -} - -sub header { - my ($self, @args) = @_; - return '' if @args == 0; - - if (@args == 1) { - $self->res->headers->content_type($args[0]); +sub expose_routes { + my ($class, $r) = @_; + foreach my $cgi (keys %CGIS) { + $r->any("/$cgi")->to("CGI#$CGIS{$cgi}"); } - - return ''; } -sub cookie { ## no critic (unpack) - my $self = shift; - my $c = $self->controller; - if (@_ == 1 && !ref $_[0]) { - my ($name) = @_; - return $c->cookie($name); - } - else { - die "cookie(@_) is not understood"; +sub _load_all { + foreach my $script (glob '*.cgi') { + next if $SKIP{$script}; + my $name = _load_cgi($script); + $CGIS{ $script } = $name; } } -sub user_agent { - my $self = shift; - - return $self->req->headers->user_agent; -} - -sub url { ## no critic (unpack) - my $self = shift; - my $c = $self->controller; - if ($_[0] eq '-relative' && $_[1] == 1) { - return $c->url_for; - } - else { - confess "url(@_) is not understood"; - } -} - -sub param { ## no critic (unpack) - my $self = shift; - if (@_ == 1) { - my ($name) = @_; - return $self->req->param($name); - } - else { - die "param(@_) is not understood"; - } -} - -sub delete { ## no critic (builtin) - my ($self, $name) = @_; - $self->req->params->remove($name); -} - -sub redirect { - my ($self, $location) = @_; - - $self->controller->redirect_to($location); -} - -sub Vars { - my ($self) = @_; - - return $self->req->query_params->to_hash; -} - -sub query_string { - my ($self) = @_; - - return $self->req->query_params->to_string; -} - -sub send_cookie { - my ($self, %params) = @_; - my $name = delete $params{'-name'}; - my $value = delete $params{'-value'} or ThrowCodeError('cookies_need_value'); - state $uri = URI->new( Bugzilla->localconfig->{urlbase} ); - my %attrs = ( - path => $uri->path, - secure => lc( $uri->scheme ) eq 'https', - samesite => 'Lax', +sub _load_cgi { + my ($file) = @_; + my $name = $file; + $name =~ s/\.cgi$//s; + $name =~ s/\W+/_/gs; + my $subname = "handle_$name"; + my $content = read_text(catfile(bz_locations->{cgi_path}, $file)); + untaint($content); + $content = 'my ($self) = @_; ' . $content; + my %options = ( + package => __PACKAGE__ . "::$name", + file => $file, + line => 1, + no_defer => 1, ); - my $expires = delete $params{'-expires'}; - $attrs{expires} = $expires if $expires; - $attrs{httponly} = 1 if delete $params{'-httponly'}; - - if (keys %params) { - die "Unknown keys: " . join(", ", keys %params); - } - - $self->controller->cookie($name, $value, \%params); + quote_sub $subname, $content, {}, \%options; + return $subname; } -1; - +1; \ No newline at end of file -- cgit v1.2.3-24-g4f1b