broken refactor but need to leave now...

This commit is contained in:
Oliver Gorwits
2019-03-22 09:10:19 +00:00
parent 3e0af5888c
commit bd9ba3bcb8
6 changed files with 18 additions and 34 deletions

View File

@@ -8,7 +8,6 @@ use Time::Seconds;
use base 'Exporter'; use base 'Exporter';
our @EXPORT = (); our @EXPORT = ();
our @EXPORT_OK = qw/ our @EXPORT_OK = qw/
request_is_api
sort_port sort_modules sort_port sort_modules
interval_to_daterange interval_to_daterange
sql_match sql_match
@@ -28,18 +27,6 @@ subroutines.
=head1 EXPORT_OK =head1 EXPORT_OK
=head2 request_is_api
Whether the request should be interpreted as an API call.
=cut
sub request_is_api {
return (setting('api_token_lifetime')
and request->accept =~ m/(?:json|javascript)/
and index(var('orig_path'), uri_for('/api')->path) == 0);
}
=head2 sql_match( $value, $exact? ) =head2 sql_match( $value, $exact? )
Convert wildcard characters "C<*>" and "C<?>" to "C<%>" and "C<_>" Convert wildcard characters "C<*>" and "C<?>" to "C<%>" and "C<_>"

View File

@@ -12,8 +12,7 @@ use HTML::Entities (); # to ensure dependency is met
use URI::QueryParam (); # part of URI, to add helper methods use URI::QueryParam (); # part of URI, to add helper methods
use Path::Class 'dir'; use Path::Class 'dir';
use Module::Load (); use Module::Load ();
use App::Netdisco::Util::Web use App::Netdisco::Util::Web 'interval_to_daterange';
qw/request_is_api interval_to_daterange/;
use App::Netdisco::Web::AuthN; use App::Netdisco::Web::AuthN;
use App::Netdisco::Web::OpenAPI; use App::Netdisco::Web::OpenAPI;
@@ -202,7 +201,7 @@ hook 'after' => sub {
}; };
any qr{.*} => sub { any qr{.*} => sub {
if (request_is_api()) { if (request->is_api) {
status(404); status(404);
return to_json { error => 'not found' }; return to_json { error => 'not found' };
} }
@@ -222,6 +221,16 @@ any qr{.*} => sub {
$response->status($status || 302); $response->status($status || 302);
$response->headers('Location' => $destination); $response->headers('Location' => $destination);
}; };
# helper for handlers of more than one method type
*Dancer::Request::is_api = sub {
my $self = shift;
vars->{'orig_path'} = request->path unless request->is_forward;
my $path = ($self->is_forward ? vars->{'orig_path'} : $self->path);
return (setting('api_token_lifetime')
and $self->accept =~ m/(?:json|javascript)/
and index($path, uri_for('/api')->path) == 0);
};
} }
true; true;

View File

@@ -5,7 +5,6 @@ use Dancer::Plugin::DBIC;
use Dancer::Plugin::Auth::Extensible; use Dancer::Plugin::Auth::Extensible;
use Dancer::Plugin::Swagger; use Dancer::Plugin::Swagger;
use App::Netdisco::Util::Web 'request_is_api';
use MIME::Base64; use MIME::Base64;
hook 'before' => sub { hook 'before' => sub {
@@ -49,7 +48,7 @@ hook 'before' => sub {
session(logged_in_user => 'guest'); session(logged_in_user => 'guest');
session(logged_in_user_realm => 'users'); session(logged_in_user_realm => 'users');
} }
elsif (request_is_api() elsif (request->is_api
and request->header('Authorization')) { and request->header('Authorization')) {
my $token = request->header('Authorization'); my $token = request->header('Authorization');
@@ -68,7 +67,7 @@ hook 'before' => sub {
# user redirected here (POST -> GET) when login fails # user redirected here (POST -> GET) when login fails
get qr{^/(?:login(?:/denied)?)?} => sub { get qr{^/(?:login(?:/denied)?)?} => sub {
if (request_is_api()) { if (request->is_api) {
status('unauthorized'); status('unauthorized');
return to_json { return to_json {
error => 'not authorized', error => 'not authorized',
@@ -96,7 +95,7 @@ swagger_path {
}, },
}, },
post qr{^/(?:api/)?login$} => sub { post qr{^/(?:api/)?login$} => sub {
my $mode = (request_is_api() ? 'API' : 'WebUI'); my $mode = (request->is_api ? 'API' : 'WebUI');
my $x = params; use DDP; p $x; my $x = params; use DDP; p $x;
@@ -173,7 +172,7 @@ swagger_path {
responses => { default => { examples => { 'application/json' => {} } } }, responses => { default => { examples => { 'application/json' => {} } } },
}, },
get qr{^/(?:api/)?logout$} => sub { get qr{^/(?:api/)?logout$} => sub {
my $mode = (request_is_api() ? 'API' : 'WebUI'); my $mode = (request->is_api ? 'API' : 'WebUI');
# clear out API token # clear out API token
my $user = schema('netdisco')->resultset('User') my $user = schema('netdisco')->resultset('User')

View File

@@ -5,9 +5,6 @@ use Dancer::Plugin::Ajax;
use Dancer::Plugin::Swagger; use Dancer::Plugin::Swagger;
use App::Netdisco::Util::Web
qw/request_is_api interval_to_daterange/;
# setup for swagger API # setup for swagger API
my $swagger = Dancer::Plugin::Swagger->instance->doc; my $swagger = Dancer::Plugin::Swagger->instance->doc;
$swagger->{schemes} = ['http','https']; $swagger->{schemes} = ['http','https'];
@@ -30,11 +27,6 @@ $swagger->{securityDefinitions} = {
}; };
$swagger->{security} = [ { APIKeyHeader => [] } ]; $swagger->{security} = [ { APIKeyHeader => [] } ];
# support for checking if this is an api request even after forward
hook 'before' => sub {
vars->{'orig_path'} = request->path unless request->is_forward;
};
# workaround for Swagger plugin weird response body # workaround for Swagger plugin weird response body
hook 'after' => sub { hook 'after' => sub {
my $r = shift; # a Dancer::Response my $r = shift; # a Dancer::Response
@@ -50,7 +42,6 @@ any '/api/:type/:identifier/:method' => require_login sub {
pass unless setting('api_enabled') pass unless setting('api_enabled')
->{ params->{'type'} }->{ params->{'method'} }; ->{ params->{'type'} }->{ params->{'method'} };
vars->{'is_api'} = 1;
my $target = my $target =
sprintf '/ajax/content/%s/%s', params->{'type'}, params->{'method'}; sprintf '/ajax/content/%s/%s', params->{'type'}, params->{'method'};
forward $target, { tab => params->{'method'}, q => params->{'identifier'} }; forward $target, { tab => params->{'method'}, q => params->{'identifier'} };

View File

@@ -3,7 +3,6 @@ package App::Netdisco::Web::Plugin;
use Dancer ':syntax'; use Dancer ':syntax';
use Dancer::Plugin; use Dancer::Plugin;
use App::Netdisco::Util::Web 'request_is_api';
use Path::Class 'dir'; use Path::Class 'dir';
set( set(
@@ -25,7 +24,7 @@ set(
config->{engines}->{netdisco_template_toolkit}->{INCLUDE_PATH} ||= [ setting('views') ]; config->{engines}->{netdisco_template_toolkit}->{INCLUDE_PATH} ||= [ setting('views') ];
register 'bang' => sub { register 'bang' => sub {
if (request_is_api()) { if (request->is_api) {
content_type('application/json'); content_type('application/json');
set serializer => 'JSON'; set serializer => 'JSON';
status $_[1]; status $_[1];

View File

@@ -22,7 +22,6 @@ swagger_path {
} } }, } } },
}, },
get '/api/device/:identifier' => require_login sub { get '/api/device/:identifier' => require_login sub {
vars->{'is_api'} = 1;
forward '/ajax/content/device/details', forward '/ajax/content/device/details',
{ tab => 'details', q => params->{'identifier'} }; { tab => 'details', q => params->{'identifier'} };
}; };
@@ -45,7 +44,7 @@ get '/ajax/content/device/details' => require_login sub {
delete $results[0]->{'snmp_comm'}; delete $results[0]->{'snmp_comm'};
$results[0]->{'power'} = \@power; $results[0]->{'power'} = \@power;
if (vars->{'is_api'}) { if (request->is_api) {
content_type('application/json'); content_type('application/json');
to_json { device => $results[0] }; to_json { device => $results[0] };
} }