File Coverage

blib/lib/Gantry.pm
Criterion Covered Total %
statement 52 421 12.3
branch 14 188 7.4
condition 5 80 6.2
subroutine 8 79 10.1
pod 70 70 100.0
total 149 838 17.7


line stmt bran cond sub pod time code
1             package Gantry;
2              
3 5     5   41497 use strict;
  5         10  
  5         167  
4 5     5   2433 use Gantry::Stash;
  5         12  
  5         132  
5 5     5   2644 use Gantry::Init;
  5         13  
  5         119  
6 5     5   8396 use CGI::Simple;
  5         98152  
  5         47  
7 5     5   272 use File::Spec;
  5         12  
  5         148  
8 5     5   6284 use POSIX qw( strftime );
  5         49242  
  5         39  
9              
10             ############################################################
11             # Variables #
12             ############################################################
13             our $VERSION = '3.64';
14             our $DEFAULT_PLUGIN_TEMPLATE = 'Gantry::Template::Default';
15             our $DEFAULT_STATE_MACHINE = 'Gantry::State::Default';
16             our $CONF;
17             our $engine_cycle = 0;
18             my %plugin_callbacks;
19              
20             ############################################################
21             # Functions #
22             ############################################################
23              
24             #-------------------------------------------------
25             # $self->handler( $r );
26             #-------------------------------------------------
27             sub handler : method {
28 0     0 1 0 my $class = shift;
29 0         0 my $r_or_cgi = shift;
30 0         0 my $self = bless( {}, $class );
31              
32 0         0 my $status;
33              
34             # Create the stash object
35 0         0 $self->make_stash();
36 0         0 $self->_increment_engine_cycle();
37              
38             # die if we don't know the engine
39 0 0       0 if ( ! $self->can( 'engine' ) ) {
40 0         0 die( 'No engine specified, engine required' );
41             }
42              
43             # initialize the engine
44 0         0 $self->engine_init( $r_or_cgi );
45              
46             # handle the request
47 0         0 $status = $self->state_run($r_or_cgi, \%plugin_callbacks);
48            
49 0         0 return $status;
50            
51             } # end handler
52              
53             #-------------------------------------------------
54             # $self->gantry_version( )
55             #-------------------------------------------------
56             sub gantry_version {
57 0     0 1 0 return $VERSION;
58             }
59              
60             #-------------------------------------------------
61             # $self->make_stash( )
62             #-------------------------------------------------
63             sub make_stash {
64 0     0 1 0 my $self = shift;
65              
66 0         0 $self->{__STASH__} = stash->new();
67              
68             } # end make_stash
69              
70             #-------------------------------------------------
71             # $self->stash( )
72             #-------------------------------------------------
73             sub stash {
74 0     0 1 0 my $self = shift;
75              
76 0 0       0 $self->{__STASH__} = stash->new() unless defined $self->{__STASH__};
77              
78 0         0 return $self->{__STASH__};
79              
80             } # end stash
81              
82             #-------------------------------------------------
83             # $self->engine_cycle()
84             #-------------------------------------------------
85             sub engine_cycle {
86 0     0 1 0 my ( $self ) = ( shift );
87              
88 0         0 return( $engine_cycle );
89            
90             } # end engine_cycle
91              
92             #-------------------------------------------------
93             # $self->_increment_engine_cycle()
94             #-------------------------------------------------
95             sub _increment_engine_cycle {
96 0     0   0 my ( $self ) = ( shift );
97              
98 0         0 ++$engine_cycle;
99            
100             } # end _increment_engine_cycle
101              
102             #-------------------------------------------------
103             # $self->declined( value )
104             #-------------------------------------------------
105             sub declined {
106 0     0 1 0 my ( $self, $p ) = ( shift, shift );
107              
108 0 0       0 $$self{__DECLINED__} = $p if defined $p;
109 0         0 return( $$self{__DECLINED__} );
110            
111             } # end declined
112              
113             #-------------------------------------------------
114             # $self->gantry_response_page( value )
115             #-------------------------------------------------
116             sub gantry_response_page {
117 0     0 1 0 my ( $self, $p ) = ( shift, shift );
118              
119 0 0       0 $$self{__RESPONSE_PAGE__} = $p if defined $p;
120 0         0 return( $$self{__RESPONSE_PAGE__} );
121            
122             } # end gantry_response_page
123              
124             #-------------------------------------------------
125             # $self->redirect( value )
126             #-------------------------------------------------
127             sub redirect {
128 0     0 1 0 my ( $self, $p ) = ( shift, shift );
129              
130 0 0       0 $$self{__REDIRECT__} = $p if defined $p;
131 0         0 return( $$self{__REDIRECT__} );
132            
133             } # end redirect
134              
135             #-------------------------------------------------
136             # $self->status( value )
137             #-------------------------------------------------
138             sub status {
139 0     0 1 0 my ( $self, $p ) = ( shift, shift );
140              
141 0 0       0 $$self{__STATUS__} = $p if defined $p;
142 0         0 return( $$self{__STATUS__} );
143            
144             } # end status
145              
146             #-----------------------------------------------------------------
147             # $self->smtp_host( value )
148             #-----------------------------------------------------------------
149             sub smtp_host {
150 0     0 1 0 my ( $self, $p ) = @_;
151              
152 0 0       0 $$self{__SMTP_HOST__} = $p if defined $p;
153 0         0 return( $$self{__SMTP_HOST__} );
154              
155             } # end smtp_host
156              
157             #-------------------------------------------------
158             # $self->get_cookies
159             #-------------------------------------------------
160             sub get_cookies {
161 0     0 1 0 my ( $self, $want_cookie ) = ( shift, shift );
162              
163             # return the cookies if previously parsed
164 0 0       0 if ( $self->{__PARSED_COOKIES__} ) {
165            
166 0 0       0 return $self->{__PARSED_COOKIES__}->{$want_cookie}
167             if defined $want_cookie;
168            
169 0         0 return $self->{__PARSED_COOKIES__};
170             }
171            
172 0   0     0 my $client =
173             $self->header_in( 'Cookie' ) || $self->header_in( 'HTTP_COOKIE' );
174            
175 0 0       0 return () if ( ! defined $client );
176            
177 0         0 my %cookies;
178              
179 0         0 for my $crumb ( split ( /; /, $client ) ) {
180 0         0 my ( $key, $value ) = split( /=/, $crumb );
181 0         0 $cookies{$key} = $value;
182             }
183            
184 0         0 $self->{__PARSED_COOKIES__} = \%cookies;
185            
186 0 0       0 if ( defined $want_cookie ) {
187 0         0 return( $cookies{$want_cookie} );
188             }
189             else {
190 0         0 return( \%cookies );
191             }
192            
193             } # end get_cookies
194              
195             #-------------------------------------------------
196             # set_cookie( { @options } )
197             # name => cookie name
198             # value => cookie value
199             # expire => cookie expires
200             # path => cookie path
201             # domain => cookie domain
202             # secure => [0/1] cookie secure
203             #-------------------------------------------------
204             sub set_cookie {
205 0     0 1 0 my ( $self, @opts ) = @_;
206            
207 0 0 0     0 my $options = (@opts == 1) && UNIVERSAL::isa($opts[0], 'HASH')
208             ? shift(@opts) : { @opts };
209            
210 0 0       0 croak( 'Cookie has no name' ) if ( ! defined $$options{name} );
211 0 0       0 croak( 'Cookie has no value' ) if ( ! defined $$options{value} );
212              
213             # Only required fields in the cookie.
214 0         0 my $cookie = sprintf( "%s=%s; ", $$options{name}, $$options{value} );
215              
216              
217              
218 0 0       0 $cookie .= sprintf( "path=%s; ", $$options{path} )
219             if ( defined $$options{path} );
220 0 0       0 $cookie .= sprintf( "domain=%s; ", $$options{domain} )
221             if ( defined $$options{domain} );
222 0 0 0     0 $cookie .= 'secure'
223             if ( defined $$options{secure} && $$options{secure} );
224              
225             # these are all optional. and should be created as such.
226 0 0       0 if ( defined $$options{expire} ) {
227 0 0       0 $$options{expire} = 0 if ( $$options{expire} !~ /^\d+$/ );
228 0         0 $cookie .= strftime( "expires=%a, %d-%b-%Y %H:%M:%S GMT; ",
229             gmtime( time + $$options{expire} ) );
230             }
231              
232 0         0 $cookie =~ s/\;\s*$/ /;
233              
234 0         0 $self->err_header_out( 'Set-Cookie', $cookie ); # mp13 mp20
235 0         0 $self->cookie_stash( $cookie ); # cgi
236              
237 0         0 return();
238            
239             } # end set_cookies
240              
241             sub cookie_stash {
242 0     0 1 0 my ( $self, $p ) = @_;
243              
244 0 0       0 $self->{__COOKIE_STASH__} = []
245             unless defined $self->{__COOKIE_STASH__};
246            
247 0 0       0 if ( defined $p ) {
248 0         0 push( @{ $self->{__COOKIE_STASH__} }, $p );
  0         0  
249             }
250 0         0 return( $self->{__COOKIE_STASH__} );
251            
252             } # end method
253            
254             sub response_headers {
255 0     0 1 0 my ( $self, $key, $value ) = @_;
256              
257 0 0       0 $self->{__RESPONSE_HEADERS__} = {}
258             unless defined $self->{__RESPONSE_HEADERS__};
259            
260 0 0       0 if ( defined $key ) {
261 0         0 $self->{__RESPONSE_HEADERS__}{ $key } = $value;
262             }
263 0         0 return( $self->{__RESPONSE_HEADERS__} );
264            
265             } # end method
266              
267             #-------------------------------------------------
268             # $self->cleanroot( $uri, $root )
269             #-------------------------------------------------
270             sub cleanroot {
271 0     0 1 0 my ( $self, $uri, $root ) = @_;
272              
273 0         0 $uri =~ s!^$root!!g;
274 0         0 $uri =~ s/\/\//\//g;
275 0         0 $uri =~ s/^\///;
276              
277 0         0 return( split( '/', $uri ) );
278            
279             } # end cleanroot
280              
281             #-------------------------------------------------
282             # $self->import( $self, @options )
283             #-------------------------------------------------
284             sub import {
285 8     8   93 my ( $class, @options ) = @_;
286              
287 8         16 my( $engine, $tplugin, $plugin, $splugin, $conf_instance, $conf_file );
288              
289 8         17 my $plugin_namespace = 'Gantry';
290 8         15 my $plugin_dir = 'Gantry::Plugins';
291            
292 8         29 foreach (@options) {
293            
294             # Import the proper engine
295 5 100       61 if ( /^-Engine=(\S+)/ ) {
    50          
    0          
    0          
    0          
296 1 50       14 unless ( $class->can( 'engine' ) ) {
297 1         6 $engine = "Gantry::Engine::$1";
298 1         26 my $engine_file = File::Spec->catfile(
299             'Gantry', 'Engine', "${1}.pm"
300             );
301              
302 1         4 eval {
303 1         731 require $engine_file;
304 1         273 $engine->import();
305             };
306              
307 1 50       10 if ( $@ ) { die qq/Could not load engine "$engine", "$@"/ }
  0         0  
308             }
309             }
310            
311             # Load Template Engine
312             elsif ( /^-TemplateEngine=(\S+)/ ) {
313 4         22 $tplugin = "Gantry::Template::$1";
314 4         109 my $tfile = File::Spec->catfile(
315             'Gantry', 'Template', "${1}.pm"
316             );
317              
318 4         437 eval qq[
319             package $plugin_namespace;
320             require "$tfile";
321             $tplugin->import();
322             ];
323              
324 4 50       34 if ($@) { die qq/Could not load plugin "$tplugin", "$@"/ }
  0         0  
325             }
326              
327             # Load the desired State Machine
328             elsif ( /^-StateMachine=(\S+)/ ) {
329 0         0 $splugin = "Gantry::State::$1";
330 0         0 my $sfile = File::Spec->catfile(
331             'Gantry', 'State', "${1}.pm"
332             );
333              
334 0         0 eval qq[
335             package $plugin_namespace;
336             require "$sfile";
337             $splugin->import();
338             ];
339              
340 0 0       0 if ($@) { die qq/Could not load state machine "$splugin", "$@"/ }
  0         0  
341             }
342              
343             elsif ( /^-PluginNamespace=(\S+)/ ) {
344 0         0 $plugin_namespace = $1;
345             }
346            
347             elsif ( /^-PluginDir=(\S+)/ ) {
348 0         0 $plugin_dir = $1;
349             }
350            
351             else {
352 0         0 my @plugin_path;
353             my $plugin_file;
354 0         0 my $import_list = '';
355            
356             # Check for plugin import list.
357             # Save list and strip it from the plugin.
358 0 0       0 if ( /\=(.*)$/o ) {
359 0         0 $import_list = $1;
360 0         0 $_ =~ s/=.*$//o;
361             }
362            
363 0         0 $plugin = sprintf('%s::%s', $plugin_dir, $_);
364 0         0 @plugin_path = split /::/, $plugin . '.pm';
365              
366 0         0 $plugin_file = File::Spec->catfile(
367             @plugin_path
368             );
369              
370 0         0 eval qq[
371             package $plugin_namespace;
372             require "$plugin_file";
373             $plugin->import( qw( $import_list ) );
374             ];
375              
376 0 0       0 if ($@) { die qq/Could not load plugin "$plugin", "$@"/ }
  0         0  
377            
378 0         0 eval {
379 0 0       0 if ( $plugin_namespace eq 'Gantry' ) {
380 0         0 $plugin_namespace = $class->namespace;
381             }
382              
383 0         0 my @new_callbacks = $plugin->get_callbacks(
384             $plugin_namespace
385             );
386              
387 0         0 foreach my $callback ( @new_callbacks ) {
388             push @{
389             $plugin_callbacks{ $plugin_namespace }
390             { $callback->{ phase } }
391 0         0 }, $callback->{ callback };
  0         0  
392             }
393             };
394            
395             # failure means not having to register callbacks
396             }
397             }
398            
399             # Load Default template plugin if one hasn't been defined
400 8 100 66     95 if ( ! $tplugin && ! $class->can( 'do_action' ) ) {
401 1         15 my( $tengine ) = ( $DEFAULT_PLUGIN_TEMPLATE =~ m!::(\w+)$! );
402 1         25 my $def_tengine_file = File::Spec->catfile(
403             'Gantry', 'Template', "${tengine}.pm"
404             );
405              
406 1         21 eval {
407 1         723 require $def_tengine_file;
408 1         46 import $DEFAULT_PLUGIN_TEMPLATE;
409             };
410 1 50       6 if ($@) { die qq/Could not load Default template engine, "$@"/ }
  0         0  
411            
412             }
413              
414             # Load the default state machine if one hasn't been defined
415 8 100 66     185 if ( ! $splugin && ! $class->can( 'state_run' ) ) {
416              
417 5         40 my( $sengine ) = ( $DEFAULT_STATE_MACHINE =~ m!::(\w+)$! );
418 5         79 my $def_sengine_file = File::Spec->catfile(
419             'Gantry', 'State', "${sengine}.pm"
420             );
421              
422 5         68 eval {
423 5         3435 require $def_sengine_file;
424 5         249 import $DEFAULT_STATE_MACHINE;
425             };
426 5 50       2722 if ($@) { die qq/Could not load Default state machine, "$@"/ }
  0         0  
427            
428             }
429              
430             }
431              
432             #-------------------------------------------------
433             # $class->namespace or $site->namespace
434             #-------------------------------------------------
435             sub namespace {
436 0     0 1 0 return 'Gantry';
437             }
438              
439             #-------------------------------------------------
440             # $site->init( $r )
441             # note: this function should be redefined in the application.
442             # This will act as the default but it's recommended
443             # that only global init rules are defined here
444             #
445             # application note: for "proper" or suggested practice,
446             # the application level init function should immeadiatly
447             # call:
448             #
449             # $site->SUPER::init( $r );
450             #
451             # After the call to SUPER, the application level init
452             # should include its init intructions.
453             #-------------------------------------------------
454             sub init {
455 0     0 1 0 my ( $self, $r_or_cgi ) = @_;
456              
457 0         0 $self->uri( $self->fish_uri() );
458 0         0 $self->location( $self->fish_location() );
459 0         0 $self->path_info( $self->fish_path_info() );
460 0         0 $self->method( $self->fish_method() );
461 0 0       0 $self->protocol( $ENV{HTTPS} ? 'https://' : 'http://' );
462 0         0 $self->status( "" );
463              
464 0 0       0 if (defined $plugin_callbacks{ $self->namespace }{ init }) {
465             # Do the plugin callbacks for the 'init' phase
466 0         0 foreach my $callback (sort
467 0         0 @{ $plugin_callbacks{ $self->namespace }{ init } }
468             ) {
469 0         0 $callback->( $self );
470             }
471             }
472              
473             # set post_max - used for apache request object
474 0   0     0 $self->post_max( $self->fish_config( 'post_max' ) || '20000000' );
475              
476             # set user varible
477 0         0 $self->user( $self->fish_user() );
478            
479             # set default content-type
480 0   0     0 $self->content_type( $self->fish_config( 'content_type' ) || 'text/html' );
481              
482             # set template variables
483 0         0 $self->template( $self->fish_config( 'template' ) );
484 0         0 $self->template_default( $self->fish_config( 'template_default' ) );
485 0         0 $self->template_wrapper( $self->fish_config( 'template_wrapper' ) );
486 0         0 $self->template_disable( $self->fish_config( 'template_disable' ) );
487            
488             # set application directory variables
489 0   0     0 my $app_root = $self->fish_config( 'root' ) || '';
490            
491 0         0 $self->root( $app_root );
492 0         0 $self->doc_root( $self->fish_config( 'doc_root' ) );
493 0         0 $self->css_root( $self->fish_config( 'css_root' ) );
494 0         0 $self->img_root( $self->fish_config( 'img_root' ) );
495 0         0 $self->js_root( $self->fish_config( 'js_root' ) );
496 0         0 $self->tmp_root( $self->fish_config( 'tmp_root' ) );
497            
498             # set application uri variables
499 0         0 $self->doc_rootp( $self->fish_config( 'doc_rootp' ) );
500 0         0 $self->web_rootp( $self->fish_config( 'web_rootp' ) );
501 0         0 $self->app_rootp( $self->fish_config( 'app_rootp' ) );
502 0         0 $self->img_rootp( $self->fish_config( 'img_rootp' ) );
503 0         0 $self->css_rootp( $self->fish_config( 'css_rootp' ) );
504 0         0 $self->js_rootp( $self->fish_config( 'js_rootp' ) );
505 0         0 $self->tmp_rootp( $self->fish_config( 'tmp_rootp' ) );
506 0         0 $self->editor_rootp( $self->fish_config( 'editor_rootp' ) );
507            
508             # set no cache
509 0         0 $self->no_cache( $self->fish_config( 'no_cache' ) );
510            
511             # set page title
512 0   0     0 $self->page_title( $self->fish_config( 'page_title' ) || $self->uri );
513            
514             # set default date format
515 0   0     0 $self->date_fmt( $self->fish_config( 'date_fmt' ) || '%b %d, %Y' );
516            
517            
518             # set request body paramater variables
519 0         0 $self->set_req_params();
520              
521             # database and auth database variables are handled in each engine's
522             # Gantry::Utils::DBConnHelper::* sublcass.
523            
524             } # END $site->init
525              
526             #-------------------------------------------------
527             # $self->r( value )
528             #-------------------------------------------------
529             sub r {
530 0     0 1 0 my ( $self, $p ) = @_;
531              
532 0 0       0 $self->{__R__} = $p if ( defined $p );
533 0         0 return( $self->{__R__} );
534            
535             } # end r
536              
537             #-------------------------------------------------
538             # $self->cgi( value )
539             #-------------------------------------------------
540             sub cgi {
541 0     0 1 0 my( $self, $p ) = @_;
542              
543 0 0       0 $self->{__CGI__} = $p if ( defined $p );
544 0         0 return( $self->{__CGI__} );
545             } # end cgi
546              
547             #-------------------------------------------------
548             # $self->method( value )
549             #-------------------------------------------------
550             sub method {
551 0     0 1 0 my ( $self, $p ) = @_;
552              
553 0 0       0 $self->{__METHOD__} = $p if ( defined $p );
554 0         0 return( $self->{__METHOD__} );
555            
556             } # end method
557              
558             #-------------------------------------------------
559             # $self->no_cache( value )
560             #-------------------------------------------------
561             sub no_cache {
562 0     0 1 0 my ( $self, $p ) = @_;
563              
564 0 0       0 $self->{__NO_CACHE__} = $p if ( defined $p );
565 0         0 return( $self->{__NO_CACHE__} );
566            
567             } # end no_cache
568              
569             #-------------------------------------------------
570             # $self->uri( value )
571             #-------------------------------------------------
572             sub uri {
573 0     0 1 0 my ( $self, $p ) = @_;
574              
575 0 0       0 $self->{__URI__} = $p if ( defined $p );
576 0   0     0 return( $self->{__URI__} || '' );
577            
578             } # end uri
579              
580             #-------------------------------------------------
581             # $self->location( value )
582             #-------------------------------------------------
583             sub location {
584 9     9 1 1713 my ( $self, $p ) = @_;
585              
586 9 100       24 $self->{__LOCATION__} = $p if ( defined $p );
587 9   50     28 return( $self->{__LOCATION__} || '' );
588            
589             } # end location
590              
591             #-------------------------------------------------
592             # $self->action( value )
593             #-------------------------------------------------
594             sub action {
595 0     0 1   my ( $self, $p ) = @_;
596              
597 0 0         $self->{__ACTION__} = $p if ( defined $p );
598 0   0       return( $self->{__ACTION__} || '' );
599            
600             } # end action
601              
602             #-------------------------------------------------
603             # $self->current_url( )
604             #-------------------------------------------------
605             sub current_url {
606 0     0 1   my ( $self ) = @_;
607              
608 0           return $self->protocol . $self->base_server . $self->uri;
609             } # end location
610              
611             #-------------------------------------------------
612             # $self->path_info( value )
613             #-------------------------------------------------
614             sub path_info {
615 0     0 1   my ( $self, $p ) = @_;
616              
617 0 0         $self->{__PATH_INFO__} = $p if ( defined $p );
618 0   0       return( $self->{__PATH_INFO__} || '' );
619            
620             } # end path_info
621              
622             #-------------------------------------------------
623             # $self->content_length( value )
624             #-------------------------------------------------
625             sub content_length {
626 0     0 1   my ( $self, $p ) = @_;
627              
628 0 0         $self->{__CONTENT_LENGTH__} = $p if ( defined $p );
629 0           return( $self->{__CONTENT_LENGTH__} );
630            
631             } # end content_length
632              
633             #-------------------------------------------------
634             # $self->content_type( value )
635             #-------------------------------------------------
636             sub content_type {
637 0     0 1   my ( $self, $p ) = @_;
638              
639 0 0         $self->{__CONTENT_TYPE__} = $p if ( defined $p );
640 0           return( $self->{__CONTENT_TYPE__} );
641            
642             } # end content_type
643              
644             #-------------------------------------------------
645             # $self->template( value )
646             #-------------------------------------------------
647             sub template {
648 0     0 1   my ( $self, $p ) = @_;
649              
650 0 0         $self->{__TEMPLATE__} = $p if ( defined $p );
651 0           return( $self->{__TEMPLATE__} );
652            
653             } # end template
654              
655             #-------------------------------------------------
656             # $self->template_default( value )
657             #-------------------------------------------------
658             sub template_default {
659 0     0 1   my ( $self, $p ) = @_;
660              
661 0 0         $self->{__TEMPLATE_DEFAULT__} = $p if ( defined $p );
662 0           return( $self->{__TEMPLATE_DEFAULT__} );
663            
664             } # end template_default
665              
666             #-------------------------------------------------
667             # $self->template_wrapper( value )
668             #-------------------------------------------------
669             sub template_wrapper {
670 0     0 1   my ( $self, $p ) = @_;
671              
672 0 0         $self->{__TEMPLATE_WRAPPER__} = $p if ( defined $p );
673 0           return( $self->{__TEMPLATE_WRAPPER__} );
674            
675             } # end template_wrapper
676              
677             #-------------------------------------------------
678             # $self->template_disable( value )
679             #-------------------------------------------------
680             sub template_disable {
681 0     0 1   my ( $self, $p ) = @_;
682              
683 0 0         $self->{__TEMPLATE_DISABLE__} = $p if ( defined $p );
684 0           return( $self->{__TEMPLATE_DISABLE__} );
685            
686             } # end template_disable
687              
688             #-------------------------------------------------
689             # $self->root( value )
690             #-------------------------------------------------
691             sub root {
692 0     0 1   my ( $self, $p ) = @_;
693              
694 0 0         $self->{__ROOT__} = $p if ( defined $p );
695 0   0       return( $self->{__ROOT__} || '' );
696            
697             } # end root
698              
699             #-------------------------------------------------
700             # $self->css_root( value )
701             #-------------------------------------------------
702             sub css_root {
703 0     0 1   my ( $self, $p ) = @_;
704              
705 0 0         $self->{__CSS_ROOT__} = $p if ( defined $p );
706 0   0       return( $self->{__CSS_ROOT__} || '' );
707            
708             } # end css_root
709              
710             #-------------------------------------------------
711             # $self->tmp_root( value )
712             #-------------------------------------------------
713             sub tmp_root {
714 0     0 1   my ( $self, $p ) = @_;
715              
716 0 0         $self->{__TMP_ROOT__} = $p if ( defined $p );
717 0   0       return( $self->{__TMP_ROOT__} || '' );
718              
719             } # end tmp_root
720              
721             #-------------------------------------------------
722             # $self->tmp_rootp( value )
723             #-------------------------------------------------
724             sub tmp_rootp {
725 0     0 1   my ( $self, $p ) = @_;
726              
727 0 0         $self->{__TMP_ROOTP__} = $p if ( defined $p );
728 0   0       return( $self->{__TMP_ROOTP__} || '' );
729              
730             } # end tmp_rootp
731              
732             #-------------------------------------------------
733             # $self->editor_rootp( value )
734             #-------------------------------------------------
735             sub editor_rootp {
736 0     0 1   my ( $self, $p ) = @_;
737              
738 0 0         $self->{__EDITOR_ROOTP__} = $p if ( defined $p );
739 0   0       return( $self->{__EDITOR_ROOTP__} || '' );
740              
741             } # end editor_rootp
742              
743             #-------------------------------------------------
744             # $self->img_root( value )
745             #-------------------------------------------------
746             sub img_root {
747 0     0 1   my ( $self, $p ) = @_;
748              
749 0 0         $self->{__IMG_ROOT__} = $p if ( defined $p );
750 0   0       return( $self->{__IMG_ROOT__} || '' );
751            
752             } # end img_root
753              
754             #-------------------------------------------------
755             # $self->js_root( value )
756             #-------------------------------------------------
757             sub js_root {
758 0     0 1   my ( $self, $p ) = @_;
759              
760 0 0         $self->{__JS_ROOT__} = $p if ( defined $p );
761 0   0       return( $self->{__JS_ROOT__} || '' );
762            
763             } # end js_root
764              
765             #-------------------------------------------------
766             # $self->app_rootp( value )
767             #-------------------------------------------------
768             sub app_rootp {
769 0     0 1   my ( $self, $p ) = @_;
770              
771 0 0         if ( defined $p ) {
772             # trim trailing slashes
773 0           $p =~ s{/+$}{}g;
774              
775 0           $self->{__APP_ROOTP__} = $p;
776             }
777 0   0       return( $self->{__APP_ROOTP__} || '' );
778            
779             } # end app_rootp
780              
781             #-------------------------------------------------
782             # $self->web_rootp( value )
783             #-------------------------------------------------
784             sub web_rootp {
785 0     0 1   my ( $self, $p ) = @_;
786              
787 0 0         $self->{__WEB_ROOTP__} = $p if ( defined $p );
788 0   0       return( $self->{__WEB_ROOTP__} || '' );
789            
790             } # end web_rootp
791              
792             #-------------------------------------------------
793             # $self->doc_rootp( value )
794             #-------------------------------------------------
795             sub doc_rootp {
796 0     0 1   my ( $self, $p ) = @_;
797              
798 0 0         $self->{__DOC_ROOTP__} = $p if ( defined $p );
799 0   0       return( $self->{__DOC_ROOTP__} || '' );
800            
801             } # end doc_rootp
802              
803             #-------------------------------------------------
804             # $self->js_rootp( value )
805             #-------------------------------------------------
806             sub js_rootp {
807 0     0 1   my ( $self, $p ) = @_;
808              
809 0 0         $self->{__JS_ROOTP__} = $p if ( defined $p );
810 0   0       return( $self->{__JS_ROOTP__} || '' );
811            
812             } # end js_rootp
813              
814             #-------------------------------------------------
815             # $self->doc_root( value )
816             #-------------------------------------------------
817             sub doc_root {
818 0     0 1   my ( $self, $p ) = @_;
819              
820 0 0         $self->{__DOC_ROOT__} = $p if ( defined $p );
821 0   0       return( $self->{__DOC_ROOT__} || '' );
822            
823             } # end doc_root
824              
825             #-------------------------------------------------
826             # $self->img_rootp( value )
827             #-------------------------------------------------
828             sub img_rootp {
829 0     0 1   my ( $self, $p ) = @_;
830              
831 0 0         if ( defined $p ) {
832             # trim trailing slashes
833 0           $p =~ s{/+$}{}g;
834              
835 0           $self->{__IMG_ROOTP__} = $p;
836             }
837 0   0       return( $self->{__IMG_ROOTP__} || '' );
838            
839             } # end img_rootp
840              
841             #-------------------------------------------------
842             # $self->css_rootp( value )
843             #-------------------------------------------------
844             sub css_rootp {
845 0     0 1   my ( $self, $p ) = @_;
846              
847 0 0         if ( defined $p ) {
848             # trim trailing slashes
849 0           $p =~ s{/+$}{}g;
850              
851 0           $self->{__CSS_ROOTP__} = $p;
852             }
853 0   0       return( $self->{__CSS_ROOTP__} || '' );
854            
855             } # end css_rootp
856              
857             #-------------------------------------------------
858             # $self->page_title( value )
859             #-------------------------------------------------
860             sub page_title {
861 0     0 1   my ( $self, $p ) = @_;
862              
863 0 0         $self->{__PAGE_TITLE__} = $p if ( defined $p );
864 0   0       return( $self->{__PAGE_TITLE__} || '' );
865            
866             } # end uri
867              
868             #-------------------------------------------------
869             # $self->date_fmt( value )
870             #-------------------------------------------------
871             sub date_fmt {
872 0     0 1   my ( $self, $p ) = @_;
873              
874 0 0         $self->{__DATE_FMT__} = $p if ( defined $p );
875 0           return( $self->{__DATE_FMT__} );
876            
877             } # end date_fmt
878              
879             #-------------------------------------------------
880             # $self->user( value )
881             #-------------------------------------------------
882             sub user {
883 0     0 1   my ( $self, $p ) = @_;
884              
885 0 0         $self->{__USER__} = $p if ( defined $p );
886 0           return( $self->{__USER__} );
887            
888             } # end user
889              
890             #-------------------------------------------------
891             # $self->test( value )
892             #-------------------------------------------------
893             sub test {
894 0     0 1   my ( $self, $p ) = @_;
895              
896 0 0         $self->{__TEST__} = $p if ( defined $p );
897 0           return( $self->{__TEST__} );
898            
899             } # end test
900              
901             #-------------------------------------------------
902             # $self->get_auth_model_name( )
903             #-------------------------------------------------
904             sub get_auth_model_name {
905 0     0 1   my ( $self ) = shift;
906              
907 0   0       return $self->{__MODELS__}{__AUTH_USERS__}
908             || 'Gantry::Control::Model::auth_users';
909             }
910              
911             #-------------------------------------------------
912             # $self->set_auth_model_name( )
913             #-------------------------------------------------
914             sub set_auth_model_name {
915 0     0 1   my ( $self, $model ) = @_;
916              
917 0 0         $model = $self->get_auth_model_name() unless $model;
918              
919 0           $self->{__MODELS__}{__AUTH_USERS__} = $model;
920              
921 0           my @pieces = split /::/, $model;
922 0           my $base = pop @pieces;
923              
924 0           my $file_name = File::Spec->catfile( @pieces, "$base.pm" );
925              
926 0           require $file_name;
927             }
928              
929             #-------------------------------------------------
930             # $self->user_row( { model => '', user_name => '' } )
931             #-------------------------------------------------
932             sub user_row {
933 0     0 1   my ( $self, @opts ) = @_;
934              
935 0 0 0       my $options = (@opts == 1) && UNIVERSAL::isa($opts[0], 'HASH')
936             ? shift(@opts) : { @opts };
937              
938 0           $self->set_auth_model_name( $options->{model} );
939              
940 0 0         if ( defined $self->{__MODELS__}{__AUTH_USERS__} ) {
941            
942             # use request user_name if passed to function
943 0 0         my $user_name = defined $options->{user_name} ?
944             $options->{user_name} : $self->user;
945              
946 0           my @rows = $self->{__MODELS__}{__AUTH_USERS__}->search(
947             { user_name => $user_name }, $self, undef
948             );
949              
950 0 0         return( $rows[0] ) if @rows;
951             }
952             else {
953 0           die( "failed to lookup user: unknown auth_users model" );
954             }
955              
956 0           return; # don't know
957            
958             } # end user_row
959              
960             #-------------------------------------------------
961             # $self->user_id( { model => '', user_name => '' } )
962             #-------------------------------------------------
963             sub user_id {
964 0     0 1   my ( $self, @opts ) = @_;
965              
966 0           my $row = $self->user_row( @opts );
967              
968 0 0         ( defined $row ) ? return $row->user_id : return;
969             }
970              
971             #-------------------------------------------------
972             # $self->post_max( value )
973             #-------------------------------------------------
974             sub post_max {
975 0     0 1   my ( $self, $p ) = @_;
976              
977 0 0         $self->{__POST_MAX__} = $p if ( defined $p );
978 0           return( $self->{__POST_MAX__} );
979            
980             } # end POST_MAX
981              
982             #-------------------------------------------------
983             # $self->ap_req( value )
984             #-------------------------------------------------
985             sub ap_req {
986 0     0 1   my ( $self, $p ) = @_;
987              
988 0 0 0       $self->{__AP_REQ__} = $p
989             if ( ( ! defined $self->{__AP_REQ__} ) and defined $p );
990            
991 0           return( $self->{__AP_REQ__} );
992             } # end ap_req
993              
994             #-------------------------------------------------
995             # $self->params( value )
996             #-------------------------------------------------
997             sub params {
998 0     0 1   my ( $self, $p ) = @_;
999              
1000 0 0         $self->{__PARAMS__} = $p if ( defined $p );
1001 0           return( $self->{__PARAMS__} );
1002              
1003             } # end params
1004              
1005             #-------------------------------------------------
1006             # $self->uf_params( value )
1007             #-------------------------------------------------
1008             sub uf_params {
1009 0     0 1   my ( $self, $p ) = @_;
1010              
1011 0 0         $self->{__UF_PARAMS__} = $p if ( defined $p );
1012 0           return( $self->{__UF_PARAMS__} );
1013              
1014             } # end uf_params
1015              
1016             #-------------------------------------------------
1017             # $self->get_param_hash()
1018             #-------------------------------------------------
1019             sub get_param_hash {
1020 0     0 1   my $self = shift;
1021            
1022 0           my %param = ();
1023            
1024 0           eval {
1025 0           %param = %{ $self->params };
  0            
1026             };
1027 0 0         if ( $@ ) {
1028 0           die "$@";
1029             }
1030            
1031 0 0         return wantarray ? %param : \%param;
1032              
1033             } # end get_param_hash
1034              
1035             #-------------------------------------------------
1036             # $self->get_uf_param_hash()
1037             #-------------------------------------------------
1038             sub get_uf_param_hash {
1039 0     0 1   my $self = shift;
1040              
1041 0           my %param = ();
1042              
1043 0           eval {
1044 0           %param = %{ $self->uf_params };
  0            
1045             };
1046 0 0         if ( $@ ) {
1047 0           die "$@";
1048             }
1049              
1050 0 0         return wantarray ? %param : \%param;
1051              
1052             } # end get_uf_param_hash
1053              
1054             #-------------------------------------------------
1055             # $self->protocol( value )
1056             #-------------------------------------------------
1057             sub protocol {
1058 0     0 1   my ( $self, $p ) = @_;
1059              
1060 0 0         $self->{__PROTOCOL__} = $p if ( defined $p );
1061 0           return( $self->{__PROTOCOL__} );
1062            
1063             } # end protocol
1064              
1065             #-------------------------------------------------
1066             # $self->is_post()
1067             #-------------------------------------------------
1068             sub is_post {
1069 0     0 1   my ( $self ) = @_;
1070            
1071 0 0         return( $self->method eq 'POST' ? 1 : 0 );
1072            
1073             } # end is_post
1074              
1075             #-------------------------------------------------
1076             # $self->gantry_secret()
1077             #-------------------------------------------------
1078             sub gantry_secret {
1079 0     0 1   my ( $self ) = @_;
1080            
1081 0   0       return $self->fish_config( 'gantry_secret' ) || 'w3s3cR7';
1082             } # end gantry_secret
1083              
1084             #-------------------------------------------------
1085             # $self->controller_config()
1086             #-------------------------------------------------
1087             sub controller_config {
1088 0     0 1   return {};
1089             } # end controller_config
1090              
1091             ##-------------------------------------------------
1092             ## $self->get_conf( )
1093             ##-------------------------------------------------
1094             #sub get_conf {
1095             # my $class = shift;
1096             # my $instance = shift;
1097             # my $file = shift;
1098             #
1099             # return Gantry::Conf->retrieve(
1100             # $instance,
1101             # $file
1102             # );
1103             #}
1104              
1105             #-------------------------------------------------
1106             # $self->cleanup( $r )
1107             # note: this function should be redefined in the application.
1108             # This will act as the default but it's recommended
1109             # that only global cleanup rules are defined here
1110             #
1111             # application note: for "proper" or suggested practice,
1112             # the application level cleanup function should immeadiatly
1113             # call:
1114             #
1115             # $self->SUPER::cleanup( $r );
1116             #
1117             # After the call to SUPER, the application level cleanup
1118             # should include its cleanup intructions.
1119             #-------------------------------------------------
1120             sub cleanup {
1121 0     0 1   my ( $self ) = @_;
1122              
1123             # Make sure get_schema() is available first.
1124 0 0         if ( $self->can( 'get_schema' ) ) {
1125             # Get main database schema.
1126 0           my $schema = $self->get_schema();
1127              
1128             # Disconnect from database, if the schema exists.
1129 0 0         if ($schema) {
1130 0           $schema->storage()->disconnect();
1131             }
1132             }
1133              
1134             # Create helper to get and set auth schema dbh.
1135 0           my $helper = Gantry::Utils::DBConnHelper->get_subclass();
1136 0           my $auth_schema = $helper->get_auth_dbh();
1137              
1138             # Disconnect from database, if the schema exists.
1139 0 0         if ($auth_schema) {
1140 0           $auth_schema->disconnect();
1141              
1142             # Undefine the dbh so that it will re-connect automatically
1143             # on the next request.
1144 0           $helper->set_auth_dbh( undef );
1145             }
1146              
1147             # db_disconnect( $$self{dbh} );
1148              
1149             } # end cleanup
1150              
1151             #-------------------------------------------------
1152             # $self->custom_error( @errors )
1153             #-------------------------------------------------
1154             sub custom_error {
1155 0     0 1   my( $self, @err ) = @_;
1156            
1157 0           eval "use Data::Dumper";
1158              
1159 0           my $die_msg = join( "\n", @err );
1160            
1161 0           my $param_dump = Dumper( $self->params );
1162 0           $param_dump =~ s/(?:^|\n)(\s+)/&trim( $1 )/ge;
  0            
1163 0           $param_dump =~ s/
1164              
1165 0           my $request_dump = Dumper( $self );
1166 0           my $response_dump = '';
1167 0           $request_dump =~ s/(?:^|\n)(\s+)/&trim( $1 )/ge;
  0            
1168 0           $request_dump =~ s/
1169              
1170 0   0       my $status = $self->status || 'Bad Request';
1171            
1172 0           my $page = $self->_error_page();
1173            
1174 0           $page =~ s/##DIE_MESSAGE##/$die_msg/sg;
1175 0           $page =~ s/##PARAM_DUMP##/$param_dump/sg;
1176 0           $page =~ s/##REQUEST_DUMP##/$request_dump/sg;
1177 0           $page =~ s/##RESPONSE_DUMP##/$response_dump/sg;
1178 0           $page =~ s/##STATUS##/$status/sg;
1179 0           $page =~ s/##PAGE_TITLE##/$self->page_title/sge;
  0            
1180            
1181 0           return( $page );
1182            
1183              
1184             } # end custom_error
1185              
1186             sub trim {
1187 0     0 1   my $spaces = $1;
1188              
1189 0           my $new_sp = " " x int( length($spaces) / 4 );
1190 0           return( "\n$new_sp" );
1191             }
1192              
1193             #-------------------------------------------------
1194             # $self->serialize_params( [ keys to exclude ], )
1195             #-------------------------------------------------
1196             sub serialize_params {
1197 0     0 1   my( $self, $exclude_ref, $separator ) = @_;
1198            
1199 0   0       $exclude_ref ||= [];
1200 0   0       $separator ||= '&';
1201 0           my $exclude_hash = {};
1202            
1203 0           foreach ( @{ $exclude_ref } ) {
  0            
1204 0           ++$exclude_hash->{$_};
1205             }
1206            
1207 0           my @page_params;
1208 0           foreach my $p ( keys %{ $self->params } ) {
  0            
1209 0 0         next if $p =~ /^\./;
1210 0 0         next if exists $exclude_hash->{$p};
1211              
1212 0           push( @page_params, sprintf( "%s=%s", $p, $self->params->{$p} ) );
1213             }
1214              
1215 0           return join( $separator, @page_params );
1216            
1217             }
1218              
1219             #-------------------------------------------------
1220             # $self->escape_html($value)
1221             #-------------------------------------------------
1222             sub escape_html {
1223 0     0 1   my ($self, $value) = @_;
1224            
1225 0           $value =~ s/
1226 0           $value =~ s/>/>/go;
1227 0           $value =~ s/"/"/go;
1228 0           $value =~ s/'/'/go;
1229            
1230 0           return $value;
1231             }
1232              
1233             #-------------------------------------------------
1234             # $self->unescape_html($value)
1235             #-------------------------------------------------
1236             sub unescape_html {
1237 0     0 1   my ($self, $value) = @_;
1238            
1239 0           $value =~ s/</
1240 0           $value =~ s/>/>/go;
1241 0           $value =~ s/"/"/go;
1242 0           $value =~ s/'/'/go;
1243            
1244 0           return $value;
1245             }
1246              
1247             #-------------------------------------------------
1248             # $self->_error_page()
1249             #-------------------------------------------------
1250             sub _error_page {
1251 0     0     my( $self ) = ( shift );
1252            
1253 0           return( qq!
1254            
1255            
1256             ##PAGE_TITLE## ##STATUS##
1257            
1303            
1304            
1305            
1306            
##DIE_MESSAGE##
1307            

1308            
1309            
site.params
1310            
1311            
 
1312             ##PARAM_DUMP##
1313            
1314            
1315            
site

1316            
 
1317             ##REQUEST_DUMP##
1318            
1319            
Response

1320            
 
1321             ##RESPONSE_DUMP##
1322            
1323            
1324            
1325            
1326            
Running on Gantry $Gantry::VERSION
1327            
1328            
1329             ! );
1330            
1331             } # end _error_page
1332              
1333             1;
1334              
1335             __END__