File Coverage

blib/lib/OurCal/Handler/CGI.pm
Criterion Covered Total %
statement 9 65 13.8
branch 0 28 0.0
condition 0 23 0.0
subroutine 3 14 21.4
pod 9 9 100.0
total 21 139 15.1


line stmt bran cond sub pod time code
1             package OurCal::Handler::CGI;
2              
3 1     1   1831 use strict;
  1         2  
  1         43  
4 1     1   7749 use CGI;
  1         15953  
  1         8  
5 1     1   1163 use CGI::Carp qw(fatalsToBrowser);
  1         4714  
  1         9  
6              
7             my $user_cookie_name = 'ourcal_user_cookie';
8              
9             =head1 NAME
10              
11             OurCal::Handler::CGI - the default, cgi based handler for OurCal
12              
13             =head1 SYNOPSIS
14              
15             my $config = OurCal::Config->new( file => 'ourcal.conf' );
16             my $handler = OurCal::Handler::CGI->new( config => $config );
17              
18             =head1 METHODS
19              
20             =cut
21              
22             =head2 new
23              
24             Requires a C object passed in as the config param.
25              
26             =cut
27              
28             sub new {
29 0     0 1   my ($class, %opts) = @_;
30 0           $opts{_cgi} = CGI->new;
31 0           return bless \%opts, $class;
32             }
33              
34             sub _get_default_date {
35 0     0     my ($mon, $year) = (localtime)[4,5];
36 0           my $default = ($year+1900)."-";
37 0 0         $default .= '0' if ($mon<9);
38 0           $default .= ($mon+1);
39 0           return $default;
40             }
41              
42             =head2 view
43              
44             Get the name of the view we should be using
45              
46             =cut
47              
48             sub view {
49 0     0 1   return $_[0]->_get_with_default('view', 'html');
50             }
51              
52             =head2 date
53              
54             Returns the date
55              
56             =cut
57              
58              
59             sub date {
60 0     0 1   return $_[0]->_get_with_default('date', _get_default_date);
61             }
62              
63             =head2 user
64              
65             Returns the user as defined by HTTP Basic Auth, cookie or user CGI
66             param.
67              
68             =cut
69              
70             sub user {
71 0     0 1   my $self = shift;
72 0 0         return undef if 'del_cookie' eq $self->mode;
73 0 0 0       return $self->{user} if defined $self->{user} && length($self->{user});
74              
75 0           $self->{_user_needed} = 0;
76              
77 0           my $user;
78 0           my $tmp_user = $user = $self->param('user');
79              
80             # first try auth
81 0           $user = $self->{_cgi}->remote_user;
82 0 0 0       goto SKIP_USER if defined $user && length($user);
83             #print STDERR "Didn't find remote user\n";
84            
85             # now cookie
86 0           $user = $self->{_cgi}->cookie($user_cookie_name);
87 0 0 0       goto SKIP_USER if defined $user && length($user);
88             #print STDERR "Didn't find remote cookie\n";
89            
90              
91             # lastly, set that user is needed
92 0 0 0       SKIP_USER:
93             $user = undef unless defined $user && length($user);
94 0   0       $self->{_user_needed} = (defined $tmp_user && (!defined $user || $user ne $tmp_user));
95             # and get it from CGI params
96 0 0 0       $user = $tmp_user if defined $tmp_user && length($tmp_user);
97              
98             #print STDERR "Didn't find cgi user\n" unless defined $user;
99            
100 0           $self->{user} = $user;
101 0           return $user;
102             }
103              
104             =head2 mode
105              
106             Get what mode we should be using
107              
108             =cut
109              
110             sub mode {
111 0     0 1   return $_[0]->_get_with_default('mode', 'display');
112             }
113              
114             sub _get_with_default {
115 0     0     my ($self, $name, $default) = @_;
116 0 0         if (not defined $self->{$name}) {
117 0   0       $self->{$name} = $self->param($name) || $default || undef;
118             }
119 0           return $self->{$name};
120             }
121              
122              
123             =head2 header
124              
125             Return what header we need to print out.
126              
127             =cut
128              
129             sub header {
130 0     0 1   my $self = shift;
131 0           my $type = shift;
132 0           my $cgi = $self->{_cgi};
133 0           my %vars;
134 0 0         $vars{"-type"} = $type if defined $type;
135              
136 0 0         if ('del_cookie' eq $self->mode) {
    0          
137 0           my $cookie = $cgi->cookie(-name => $user_cookie_name, -value => '' );
138 0           $vars{"-cookie"} = $cookie;
139             } elsif (defined $self->user) {
140 0           my $cookie = $cgi->cookie(-name => $user_cookie_name, -value => $self->user );
141 0           $vars{"-cookie"} = $cookie;
142             }
143 0           return $cgi->header(%vars);
144            
145             }
146              
147              
148              
149             =head2 link
150              
151             Make a link out a C object
152              
153             =cut
154              
155             sub link {
156 0     0 1   my $self = shift;
157 0           my $span = shift;
158 0           my $date = $span->date;
159 0           my $user = $self->user;
160 0           my $url = "?";
161            
162 0 0 0       $url .= "date=${date}" unless $span->is_this_span && $span->isa("OurCal::Month");
163 0 0         $url .= "&user=${user}" if $self->need_user;
164 0 0         $url = "." if $url eq "?";
165              
166 0           return $url;
167             }
168              
169             =head2 param
170              
171             Get a CGI parma with the given name
172              
173             =cut
174              
175             sub param {
176 0     0 1   my $self = shift;
177 0           my $name = shift;
178 0           my $cgi = $self->{_cgi};
179 0           return $cgi->param($name);
180             }
181              
182             =head2 need_user
183              
184             Whether a link need to include a user param or not
185              
186             =cut
187              
188              
189             sub need_user {
190 0     0 1   my $self = shift;
191 0           return $self->{_user_needed};
192             #return defined $self->user;
193             }
194              
195             1;