| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#============================================================================== |
|
2
|
|
|
|
|
|
|
# LibWeb::CGI -- Extra cgi supports for libweb applications. |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
package LibWeb::CGI; |
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
# Copyright (C) 2000 Colin Kong |
|
7
|
|
|
|
|
|
|
# |
|
8
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or |
|
9
|
|
|
|
|
|
|
# modify it under the terms of the GNU General Public License |
|
10
|
|
|
|
|
|
|
# as published by the Free Software Foundation; either version 2 |
|
11
|
|
|
|
|
|
|
# of the License, or (at your option) any later version. |
|
12
|
|
|
|
|
|
|
# |
|
13
|
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful, |
|
14
|
|
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15
|
|
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16
|
|
|
|
|
|
|
# GNU General Public License for more details. |
|
17
|
|
|
|
|
|
|
# |
|
18
|
|
|
|
|
|
|
# You should have received a copy of the GNU General Public License |
|
19
|
|
|
|
|
|
|
# along with this program; if not, write to the Free Software |
|
20
|
|
|
|
|
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
21
|
|
|
|
|
|
|
#============================================================================= |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
# $Id: CGI.pm,v 1.4 2000/07/18 06:33:30 ckyc Exp $ |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
#-############################# |
|
26
|
|
|
|
|
|
|
# Use standard library. |
|
27
|
1
|
|
|
1
|
|
1439
|
use strict; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
48
|
|
|
28
|
1
|
|
|
1
|
|
6
|
use vars qw(@ISA $VERSION $AutoloadClass); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
7888
|
|
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
#-############################# |
|
31
|
|
|
|
|
|
|
# Use custom library. |
|
32
|
|
|
|
|
|
|
require LibWeb::Class; |
|
33
|
|
|
|
|
|
|
require LibWeb::Core; |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
$VERSION = '0.02'; |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
#-############################# |
|
38
|
|
|
|
|
|
|
# Inheritance. |
|
39
|
|
|
|
|
|
|
# Require CGI.pm version > 2.66. |
|
40
|
|
|
|
|
|
|
require CGI; |
|
41
|
|
|
|
|
|
|
@ISA = qw( LibWeb::Class CGI ); |
|
42
|
|
|
|
|
|
|
# This variable tells CGI what type of default object to create when |
|
43
|
|
|
|
|
|
|
# called in the function-oriented manner. |
|
44
|
|
|
|
|
|
|
$CGI::DefaultClass = __PACKAGE__; |
|
45
|
|
|
|
|
|
|
# This tells the CGI autoloader where to look for functions that are |
|
46
|
|
|
|
|
|
|
# not defined. If you wish to override CGI's autoloader, set this to |
|
47
|
|
|
|
|
|
|
# the name of your own package. |
|
48
|
|
|
|
|
|
|
$AutoloadClass = 'CGI'; |
|
49
|
|
|
|
|
|
|
# Avoid denial of service attacks. |
|
50
|
|
|
|
|
|
|
$CGI::POST_MAX = 1024 * 100; # Default: Max 100K posts. |
|
51
|
|
|
|
|
|
|
$CGI::DISABLE_UPLOADS = 1; # Default: No uploads. |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
#-############################# |
|
54
|
|
|
|
|
|
|
# Methods. |
|
55
|
|
|
|
|
|
|
sub new { |
|
56
|
|
|
|
|
|
|
# |
|
57
|
|
|
|
|
|
|
# Params: [ -post_max=>, -disable_uploads=>, -auto_escape=> ] |
|
58
|
|
|
|
|
|
|
# |
|
59
|
|
|
|
|
|
|
# Pre: |
|
60
|
|
|
|
|
|
|
# - -post_max is the ceiling on the size of POSTings, in bytes. |
|
61
|
|
|
|
|
|
|
# The default for LibWeb::CGI is 100 Kilobytes. |
|
62
|
|
|
|
|
|
|
# - -disable_uploads, if non-zero, will disable file uploads completely |
|
63
|
|
|
|
|
|
|
# which is the default for LibWeb::CGI. |
|
64
|
|
|
|
|
|
|
# - -auto_escape determines whether the text and labels that you provide |
|
65
|
|
|
|
|
|
|
# for form elements are escaped according to HTML rules. Non-zero value |
|
66
|
|
|
|
|
|
|
# will enable auto escape, and undef will disable auto escape (default |
|
67
|
|
|
|
|
|
|
# for LibWeb::CGI). |
|
68
|
|
|
|
|
|
|
# |
|
69
|
1
|
|
|
1
|
1
|
773
|
my ($class, $Class, $self, $rc, $post_max, $disable_uploads, $auto_escape); |
|
70
|
1
|
|
|
|
|
3
|
$class = shift; |
|
71
|
1
|
|
33
|
|
|
11
|
$Class = ref($class) || $class; |
|
72
|
|
|
|
|
|
|
|
|
73
|
1
|
|
|
|
|
13
|
($rc, $post_max, $disable_uploads, $auto_escape) = |
|
74
|
|
|
|
|
|
|
$Class->rearrange( ['RC', 'POST_MAX', 'DISABLE_UPLOADS', 'AUTO_ESCAPE'], @_ ); |
|
75
|
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
# Set up base class: CGI accordingly. |
|
77
|
1
|
50
|
|
|
|
8
|
$CGI::POST_MAX = $post_max if defined($post_max); |
|
78
|
1
|
50
|
|
|
|
3
|
$CGI::DISABLE_UPLOADS = $disable_uploads if defined($disable_uploads); |
|
79
|
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
# Inherit instance variables from the base class. |
|
81
|
1
|
|
|
|
|
7
|
$self = $Class->CGI::new(); |
|
82
|
1
|
|
|
|
|
5119
|
bless($self, $Class); |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
# This doesn't work. Some HTMLs still printed |
|
85
|
|
|
|
|
|
|
# out as escaped. I don't know why. |
|
86
|
1
|
50
|
|
|
|
18
|
($auto_escape) ? $self->autoEscape( $auto_escape ) : |
|
87
|
|
|
|
|
|
|
$self->autoEscape( undef ); |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
# Any necessary initialization. |
|
90
|
|
|
|
|
|
|
#$self->_init($rc); |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
# Returns a reference to this object. |
|
93
|
1
|
|
|
|
|
200
|
return $self; |
|
94
|
|
|
|
|
|
|
} |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
#sub _init { |
|
97
|
|
|
|
|
|
|
# # |
|
98
|
|
|
|
|
|
|
# # Params: $rc |
|
99
|
|
|
|
|
|
|
# # |
|
100
|
|
|
|
|
|
|
# # Pre: |
|
101
|
|
|
|
|
|
|
# # - $rc is absolute path to the rc file for LibWeb. |
|
102
|
|
|
|
|
|
|
# # |
|
103
|
|
|
|
|
|
|
# # Initialization whenever an object of this class is created. |
|
104
|
|
|
|
|
|
|
# # Put site customizations here to override several CGI.pm's variables. |
|
105
|
|
|
|
|
|
|
# # |
|
106
|
|
|
|
|
|
|
# my ($self, $key, $value); |
|
107
|
|
|
|
|
|
|
# $self = shift; |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
# # Instance variables for this class. |
|
110
|
|
|
|
|
|
|
# $self->{__PACKAGE__.'.core'} = new LibWeb::Core(shift); |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
# # A work-around to inherit LibWeb.pm instance variables without doing MI. |
|
113
|
|
|
|
|
|
|
# while ( ($key,$value) = each (%LibWeb::Core::RC) ) { |
|
114
|
|
|
|
|
|
|
# $self->{__PACKAGE__.$key} = $value |
|
115
|
|
|
|
|
|
|
# unless exists $self->{__PACKAGE__.$key}; |
|
116
|
|
|
|
|
|
|
# } |
|
117
|
|
|
|
|
|
|
#} |
|
118
|
|
|
|
|
|
|
|
|
119
|
0
|
|
|
0
|
|
|
sub DESTROY {} |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
sub header { |
|
122
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
|
123
|
|
|
|
|
|
|
#$self->delete_all(); |
|
124
|
|
|
|
|
|
|
#$self->autoEscape(undef); |
|
125
|
0
|
0
|
|
|
|
|
if (@_) { return $self->SUPER::header(@_); } |
|
|
0
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
else { |
|
127
|
0
|
|
0
|
|
|
|
my $crlf = $LibWeb::Core::RC{CRLF} || "\n\n"; |
|
128
|
0
|
|
|
|
|
|
return "Content-Type: text/html$crlf$crlf"; |
|
129
|
|
|
|
|
|
|
} |
|
130
|
|
|
|
|
|
|
} |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
sub is_param_not_null { |
|
133
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
134
|
0
|
|
0
|
|
|
|
return ( defined($_[0]) && ($_[0] ne "") && ($_[0] ne " ") ); |
|
135
|
|
|
|
|
|
|
} |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
sub parameter { |
|
138
|
|
|
|
|
|
|
# |
|
139
|
|
|
|
|
|
|
# Sample usage: $this->parameter(cgi_parameter). |
|
140
|
|
|
|
|
|
|
# |
|
141
|
|
|
|
|
|
|
# Pre: |
|
142
|
|
|
|
|
|
|
# 1. cgi_parameter is the parameter passed by either `GET' or `POST'. |
|
143
|
|
|
|
|
|
|
# |
|
144
|
|
|
|
|
|
|
# Post: |
|
145
|
|
|
|
|
|
|
# 1. If cgi_parameter is a mandatory form value (the ones without `.' as prefix |
|
146
|
|
|
|
|
|
|
# in the parameter's name) and it is null, print an error message and abort |
|
147
|
|
|
|
|
|
|
# the program. |
|
148
|
|
|
|
|
|
|
# 2. Return the value of the parameter. |
|
149
|
|
|
|
|
|
|
# |
|
150
|
0
|
|
|
0
|
1
|
|
my ( $self, $key, $value, $param_is_not_null ); |
|
151
|
0
|
|
|
|
|
|
$self = shift; |
|
152
|
0
|
|
|
|
|
|
$key = shift; |
|
153
|
0
|
|
|
|
|
|
$value = $self->CGI::param($key); |
|
154
|
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
# Check for denial of service attacks. |
|
156
|
|
|
|
|
|
|
# CGI::cgi_error() is available since CGI 2.47. |
|
157
|
|
|
|
|
|
|
# Where is CGI::cgi_error()?? It's supported pre CGI3, but seems to be |
|
158
|
|
|
|
|
|
|
# disappeared in new release of CGI.pm 3.01 alpha (24/04/2000). |
|
159
|
|
|
|
|
|
|
# Need to apply patch here if CGI version is < 2.47 or >= 3.01 alpha. |
|
160
|
0
|
|
|
|
|
|
eval { |
|
161
|
0
|
0
|
0
|
|
|
|
$self->fatal( -msg => 'Invalid post. Post too large.', |
|
162
|
|
|
|
|
|
|
-alertMsg => "413 POST too large for CGI param: $key", |
|
163
|
|
|
|
|
|
|
-helpMsg => $self->{HHTML}->post_too_large() ) |
|
164
|
|
|
|
|
|
|
if ( !$value && $self->cgi_error() ); |
|
165
|
|
|
|
|
|
|
}; |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
# Check to see if mandatory cgi form values are non-null. |
|
169
|
0
|
|
|
|
|
|
$param_is_not_null = $self->is_param_not_null($value); |
|
170
|
0
|
0
|
|
|
|
|
unless ($key =~ m:^[.].*$:) { |
|
171
|
0
|
0
|
|
|
|
|
unless ( $param_is_not_null ) { |
|
172
|
0
|
|
|
|
|
|
$key =~ s:[_]+: :g; |
|
173
|
0
|
|
|
|
|
|
$self->fatal(-msg => ucfirst($key)." not entered.", |
|
174
|
|
|
|
|
|
|
-alertMsg => "$key not entered.", |
|
175
|
|
|
|
|
|
|
-helpMsg => $LibWeb::Core::RC{HHTML}->hit_back_and_edit() |
|
176
|
|
|
|
|
|
|
); |
|
177
|
|
|
|
|
|
|
} |
|
178
|
|
|
|
|
|
|
} |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
# Return undef for non-mandatory cgi parameter's value if |
|
181
|
|
|
|
|
|
|
# it's not entered by user. |
|
182
|
0
|
0
|
|
|
|
|
return undef unless($param_is_not_null); |
|
183
|
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
# Sanitize all html tags. |
|
185
|
|
|
|
|
|
|
#$value = $self->sanitize(-html => $value) if defined($value); |
|
186
|
0
|
|
|
|
|
|
return $value; |
|
187
|
|
|
|
|
|
|
} |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
sub redirect { |
|
190
|
|
|
|
|
|
|
# |
|
191
|
|
|
|
|
|
|
# Params: -url=> [, -cookie=> ]. |
|
192
|
|
|
|
|
|
|
# e.g. 'http://www.your_site.org/help.html' or '/help.html'. |
|
193
|
|
|
|
|
|
|
# |
|
194
|
|
|
|
|
|
|
# Post: |
|
195
|
|
|
|
|
|
|
# 1. Redirect the client Web browser to the specified page. |
|
196
|
|
|
|
|
|
|
# |
|
197
|
0
|
|
|
0
|
0
|
|
my ($self, $url, $cookie); |
|
198
|
0
|
|
|
|
|
|
$self = shift; |
|
199
|
0
|
|
|
|
|
|
($url, $cookie) = $self->rearrange( ['URL', 'COOKIE'], @_ ); |
|
200
|
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
# Append 'http://' to the url to make sure redirect work. |
|
202
|
0
|
0
|
|
|
|
|
unless ($url =~ m"^http://") { |
|
203
|
|
|
|
|
|
|
# remove front slash of url. |
|
204
|
|
|
|
|
|
|
#$url =~ s:^[/]::; |
|
205
|
0
|
|
|
|
|
|
chop $self->{URL_ROOT}; |
|
206
|
0
|
|
|
|
|
|
$url = $self->{URL_ROOT} . $url; |
|
207
|
|
|
|
|
|
|
} |
|
208
|
|
|
|
|
|
|
|
|
209
|
0
|
|
|
|
|
|
print $self->SUPER::redirect( -url => $url, -cookie => $cookie ); |
|
210
|
|
|
|
|
|
|
# $self->send_cookie($cookie) if defined($cookie); |
|
211
|
|
|
|
|
|
|
# print "Status: 302 Moved\nLocation: $url\n\n" if defined($url); |
|
212
|
|
|
|
|
|
|
# #print "Content-Type: text/html\n\n"; |
|
213
|
0
|
|
|
|
|
|
exit(0); |
|
214
|
|
|
|
|
|
|
} |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
sub send_cookie { |
|
217
|
0
|
|
|
0
|
0
|
|
shift; |
|
218
|
0
|
|
|
|
|
|
LibWeb::Core->new()->send_cookie(@_); |
|
219
|
|
|
|
|
|
|
} |
|
220
|
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
sub fatal { |
|
222
|
0
|
|
|
0
|
0
|
|
shift; |
|
223
|
0
|
|
|
|
|
|
LibWeb::Core->new()->fatal(@_); |
|
224
|
|
|
|
|
|
|
} |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
sub sanitize { |
|
227
|
0
|
|
|
0
|
0
|
|
shift; |
|
228
|
0
|
|
|
|
|
|
LibWeb::Core->new()->sanitize(@_); |
|
229
|
|
|
|
|
|
|
} |
|
230
|
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
1; |
|
232
|
|
|
|
|
|
|
__DATA__ |