X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fp5-CGI-Ex;a=blobdiff_plain;f=lib%2FCGI%2FEx%2FApp.pm;h=ec3ff6a976aee7370cebe4645d266abedfefb26d;hp=9ccbab3e31ca43c0559f937d64a25371c82f4780;hb=419d9570723c210429e2be23875160f57dd36156;hpb=aa030874456c91d688e6c9b25e82d2bf9575ea6f diff --git a/lib/CGI/Ex/App.pm b/lib/CGI/Ex/App.pm index 9ccbab3..ec3ff6a 100644 --- a/lib/CGI/Ex/App.pm +++ b/lib/CGI/Ex/App.pm @@ -10,7 +10,7 @@ use strict; use vars qw($VERSION); BEGIN { - $VERSION = '2.14'; + $VERSION = '2.15'; Time::HiRes->import('time') if eval {require Time::HiRes}; eval {require Scalar::Util}; @@ -49,12 +49,6 @@ sub navigate { $self->{'_time'} = time; eval { - ### allow for authentication - my $ref = $self->require_auth; - if ($ref && ! ref $ref) { - return $self if ! $self->get_valid_auth; - } - ### a chance to do things at the very beginning return $self if ! $self->{'_no_pre_navigate'} && $self->pre_navigate; @@ -98,8 +92,6 @@ sub nav_loop { ### allow for an early return return if $self->pre_loop($path); # a true value means to abort the navigate - my $req_auth = ref($self->require_auth) ? $self->require_auth : undef; - ### iterate on each step of the path foreach ($self->{'path_i'} ||= 0; $self->{'path_i'} <= $#$path; @@ -113,17 +105,18 @@ sub nav_loop { $step = $1; # untaint ### allow for per-step authentication - if ($req_auth - && $req_auth->{$step} - && ! $self->get_valid_auth) { - return; + if (! $self->is_authed) { + my $req = $self->run_hook('require_auth', $step, 1); + if (ref($req) ? $req->{$step} : $req) { # in the hash - or true + return if ! $self->get_valid_auth; + } } ### allow for becoming another package (allows for some steps in external files) $self->morph($step); ### allow for mapping path_info pieces to form elements - if (my $info = $ENV{'PATH_INFO'}) { + if (my $info = $self->path_info) { my $maps = $self->run_hook('path_info_map', $step) || []; croak 'Usage: sub path_info_map { [[qr{/path_info/(\w+)}, "keyname"]] }' if ! UNIVERSAL::isa($maps, 'ARRAY') || (@$maps && ! UNIVERSAL::isa($maps->[0], 'ARRAY')); @@ -195,8 +188,8 @@ sub path { if (! $self->{'path'}) { my $path = $self->{'path'} = []; # empty path - ### add initial items to the form hash from path_info - if (my $info = $ENV{'PATH_INFO'}) { + ### add initial items to the form hash from path_info5B + if (my $info = $self->path_info) { my $maps = $self->path_info_map_base || []; croak 'Usage: sub path_info_map_base { [[qr{/path_info/(\w+)}, "keyname"]] }' if ! UNIVERSAL::isa($maps, 'ARRAY') || (@$maps && ! UNIVERSAL::isa($maps->[0], 'ARRAY')); @@ -464,6 +457,8 @@ sub dump_history { $note .= ' - {}'; } elsif (ref($resp) eq 'ARRAY' && ! @$resp) { $note .= ' - []'; + } elsif (! defined $resp) { + $note .= ' - undef'; } elsif (! ref $resp || ! $all) { my $max = $self->{'history_max'} || 30; if (length($resp) > $max) { @@ -601,6 +596,10 @@ sub navigate_authenticated { my ($self, $args) = @_; $self = $self->new($args) if ! ref $self; + if ($self->can('require_auth') != \&CGI::Ex::App::require_auth) { + require Carp; + Carp::croak("The default navigate_authenticated method was called but the default require_auth method has been overwritten - aborting"); + } $self->require_auth(1); return $self->navigate; @@ -608,8 +607,8 @@ sub navigate_authenticated { sub require_auth { my $self = shift; - $self->{'require_auth'} = shift if @_ == 1; - return $self->{'require_auth'}; + $self->{'require_auth'} = shift if @_ == 1 && (! defined($_[0]) || ref($_[0]) || $_[0] =~ /^[01]$/); + return $self->{'require_auth'} || 0; } sub is_authed { shift->auth_data } @@ -624,8 +623,16 @@ sub get_valid_auth { my $self = shift; return 1 if $self->is_authed; - ### augment the args with sensible defaults my $args = $self->auth_args; + + ### allow passed in args + if (my $extra = shift) { + $args = {%$args, %$extra}; + } + + ### augment the args with sensible defaults + $args->{'script_name'} ||= $self->script_name; + $args->{'path_info'} ||= $self->path_info; $args->{'cgix'} ||= $self->cgix; $args->{'form'} ||= $self->form; $args->{'cookies'} ||= $self->cookies; @@ -635,9 +642,15 @@ sub get_valid_auth { $args->{'cleanup_user'} ||= sub { my ($auth, $user) = @_; $self->cleanup_user( $user, $auth) }; $args->{'login_print'} ||= sub { my ($auth, $template, $hash) = @_; - my $out = $self->run_hook('swap_template', '__login', $template, $hash); - $self->run_hook('fill_template', '__login', \$out, $hash); - $self->run_hook('print_out', '__login', $out); + my $step = '__login'; + my $hash_base = $self->run_hook('hash_base', $step) || {}; + my $hash_comm = $self->run_hook('hash_common', $step) || {}; + my $hash_swap = $self->run_hook('hash_swap', $step) || {}; + my $swap = {%$hash_base, %$hash_comm, %$hash_swap, %$hash}; + + my $out = $self->run_hook('swap_template', $step, $template, $swap); + $self->run_hook('fill_template', $step, \$out, $hash); + $self->run_hook('print_out', $step, \$out); }; require CGI::Ex::Auth; @@ -660,6 +673,19 @@ sub verify_user { 1 } ###----------------------------------------------------------------### ### a few standard base accessors +sub script_name { shift->{'script_name'} || $ENV{'SCRIPT_NAME'} || $0 } + +sub path_info { shift->{'path_info'} || $ENV{'PATH_INFO'} || '' } + +sub cgix { + my $self = shift; + $self->{'cgix'} = shift if @_ == 1; + return $self->{'cgix'} ||= do { + require CGI::Ex; + CGI::Ex->new; # return of the do + }; +} + sub form { my $self = shift; $self->{'form'} = shift if @_ == 1; @@ -672,15 +698,6 @@ sub cookies { return $self->{'cookies'} ||= $self->cgix->get_cookies; } -sub cgix { - my $self = shift; - $self->{'cgix'} = shift if @_ == 1; - return $self->{'cgix'} ||= do { - require CGI::Ex; - CGI::Ex->new; # return of the do - }; -} - sub vob { my $self = shift; $self->{'vob'} = shift if @_ == 1; @@ -807,15 +824,14 @@ sub print { my $out = $self->run_hook('swap_template', $step, $file, $swap); $self->run_hook('fill_template', $step, \$out, $fill); - - $self->run_hook('print_out', $step, $out); + $self->run_hook('print_out', $step, \$out); } sub print_out { my ($self, $step, $out) = @_; $self->cgix->print_content_type; - print $out; + print ref($out) ? $$out : $out; } sub swap_template { @@ -884,7 +900,7 @@ sub name_module { return $self->{'name_module'} ||= do { # allow for cgi-bin/foo or cgi-bin/foo.pl to resolve to "foo" - my $script = $ENV{'SCRIPT_NAME'} || $0; + my $script = $self->script_name; $script =~ m/ (\w+) (?:\.\w+)? $/x || die "Couldn't determine module name from \"name_module\" lookup ($step)"; $1; # return of the do }; @@ -1033,8 +1049,8 @@ sub hash_base { my $copy = $self; eval {require Scalar::Util; Scalar::Util::weaken($copy)}; my $hash = { - script_name => $ENV{'SCRIPT_NAME'} || $0, - path_info => $ENV{'PATH_INFO'} || '', + script_name => $copy->script_name, + path_info => $copy->path_info, js_validation => sub { $copy->run_hook('js_validation', $step, shift) }, form_name => sub { $copy->run_hook('form_name', $step) }, $self->step_key => $step, @@ -1117,7 +1133,7 @@ sub ext_val { ### default to using this script as a handler sub js_uri_path { my $self = shift; - my $script = $ENV{'SCRIPT_NAME'} || return ''; + my $script = $self->script_name; my $js_step = $self->js_step; return ($self->can('path') == \&CGI::Ex::App::path) ? $script .'/'. $js_step # try to use a cache friendly URI (if path is our own) @@ -1132,7 +1148,7 @@ sub js_run_step { my $self = shift; ### make sure path info looks like /js/CGI/Ex/foo.js - my $file = $self->form->{'js'} || $ENV{'PATH_INFO'} || ''; + my $file = $self->form->{'js'} || $self->path_info; $file = ($file =~ m!^(?:/js/|/)?(\w+(?:/\w+)*\.js)$!) ? $1 : ''; $self->cgix->print_js($file);