diff options
author | Dylan William Hardison <dylan@hardison.net> | 2018-05-21 04:00:08 +0200 |
---|---|---|
committer | Dylan William Hardison <dylan@hardison.net> | 2018-06-28 22:41:56 +0200 |
commit | 889d8ad22855191773dd45e67272650d0c00f502 (patch) | |
tree | d1c9beb3b9a6aed4997e0596fc5cf178a56284b4 /Bugzilla/Quantum/CGI.pm | |
parent | f5a81daeeb16c6f64475f3a48b8ea5eb0ec84c9b (diff) | |
download | bugzilla-889d8ad22855191773dd45e67272650d0c00f502.tar.gz bugzilla-889d8ad22855191773dd45e67272650d0c00f502.tar.xz |
cool stuff
Diffstat (limited to 'Bugzilla/Quantum/CGI.pm')
-rw-r--r-- | Bugzilla/Quantum/CGI.pm | 153 |
1 files changed, 36 insertions, 117 deletions
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 |