package DECODE;
##
use strict; #
use CGI; #
use Jcode; #
##
$CGI::POST_MAX = 1024 * 1024; # 1MB
#===================
#
#===================
sub new {
##
my $class = shift;
##
my($enc) = @_;
##
if(!($enc eq 'euc' || $enc eq 'sjis' || $enc eq 'utf8')) {
return undef;
}
##
my $cgi = new CGI;
my(%htext);
##
my $self = {
'CGI' => $cgi,
'HTEXT' => \%htext,
'ENC' => $enc
};
##
if(!&setDecode($self, $enc)) {
return undef;
}
return bless $self, $class;
}
sub setDecode($$) {
my $self = shift;
my($enc) = @_;
my $r_htext = $self->{'HTEXT'};
my $cgi = $self->{'CGI'};
my($key,$val);
foreach $key($cgi->param){
foreach $val($cgi->param($key)){
if(ref($val) eq 'Fh') {
#$r_htext->{$key} .= "\0" if (defined($r_htext->{$key}));
$r_htext->{$key} = 'Fh';
next;
}
if($enc eq 'euc') {
$val = Jcode->new($val, 'euc')->h2z->euc;
}
elsif($enc eq 'sjis') {
$val = Jcode->new($val, 'sjis')->h2z->sjis; #
}
elsif($enc eq 'utf8') {
$val = Jcode->new($val, 'utf8')->h2z->utf8; #
}
$val =~ s/
/\r\n/g; #
$key =~ s/&/&/g;
$key =~ s/"/"/g;
$key =~ s/</g;
$key =~ s/>/>/g;
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/</g; #
$val =~ s/>/>/g;
$val =~ s/\r\n/
/g;
$val =~ s/\r/
/g;
$val =~ s/\n/
/g;
$val =~ s/\t//g;
$val =~ s/[\x00-\x20]+/ /g;
$val =~ tr/+/ /;
#if (!defined($r_htext->{$key})) {
#}
if($val ne '') {
$r_htext->{$key} = $val;
}
#$r_htext->{$key} .= "\0";
}
}
#if ($cgi->request_method() ne "POST") {return 0;}
return 1;
}
sub getHtext($) {
my $self = shift;
return $self->{'HTEXT'};
}
sub viewTemplate($$$) {
my $self = shift;
my($file, $rHash) = @_;
if(!open(IN,$file)) {
return 0;
}
if($self->{'ENC'} eq 'euc') {
print "Content-type: text/html; charset=\"euc-jp\"\n\n";
}
if($self->{'ENC'} eq 'sjis') {
print "Content-type: text/html; charset=\"Shift-JIS\"\n\n";
}
if($self->{'ENC'} eq 'utf8') {
print "Content-type: text/html; charset=\"utf-8\"\n\n";
}
while () {
my @ary = ($_ =~ m/\[\[--([\w]+)--\]\]/g);
foreach my $str (@ary) {
if(defined($rHash->{$str})) {
$_ =~ s/\[\[--$str--\]\]/$rHash->{$str}/;
}
}
$_ =~ s/\[\[--[\w]+--\]\]//g;
print $_;
}
close(IN);
return 1;
}
sub getTemplate($$$) {
my $self = shift;
my($file, $rHash) = @_;
if(!open(IN,$file)) {
return undef;
}
my $body = ''; #
while () {
my @ary = ($_ =~ m/\[\[--([\w]+)--\]\]/g);
foreach my $str (@ary) {
if(defined($rHash->{$str})) {
$_ =~ s/\[\[--$str--\]\]/$rHash->{$str}/;
}
}
$_ =~ s/\[\[--[\w]+--\]\]//g;
$body .= $_;
}
close(IN);
return $body;
}
sub makeTemplate($$$$) {
my $self = shift;
my($inFile, $outFile, $rHash) = @_;
if(!open(IN,$inFile)) {
return 0;
}
if(!open(OUT,">$outFile")) {
close(IN);
return 0;
}
while () {
my @ary = ($_ =~ m/\[\[--([\w]+)--\]\]/g);
foreach my $str (@ary) {
if(defined($rHash->{$str})) {
$_ =~ s/\[\[--$str--\]\]/$rHash->{$str}/;
}
}
$_ =~ s/\[\[--[\w]+--\]\]//g;
print OUT $_;
}
close(OUT);
close(IN);
return 1;
}
sub upFile($$$$) {
my $self = shift;
my $cgi = $self->{'CGI'};
my($frm, $dir, $maxsize) = @_;
my(%ret);
if ($dir !~ /\/$/) { $dir .= "/"; }
if(!defined($cgi)) {
$ret{'err'} = "no cgi object.";
return \%ret;
}
my %hash_mime = (
#'text/html' => 'html', #
'image/gif' => 'gif', #
'image/jpeg' => 'jpg', #
'image/pjpeg' => 'jpg', #
'image/png' => 'png' #
);
my $fH = $cgi->upload($frm);
if ($cgi->cgi_error) {
$ret{'err'} = $cgi->cgi_error;
return \%ret;
}
unless (defined($fH)) {
$ret{'err'} = "File transfer error.";
return \%ret;
};
$ret{'mime'} = $cgi->uploadInfo($fH)->{'Content-Type'};
my($ext);
if($hash_mime{$ret{'mime'}}) {
$ext = $hash_mime{$ret{'mime'}};
}
else {
$ret{'err'} = "Can't permit this file." . $ret{'mime'};
return \%ret;
}
$ret{'name'} = $frm . "_" . time . "_" . $$ . "." . $ext;
$ret{'size'} = (stat($fH))[7];
if($maxsize !~ m/^[0-9]+$/) {
$ret{'err'} = "The filesize is nonsense.";
return \%ret;
}
if ($ret{'size'} > $maxsize * 1024) {
$ret{'err'} = "The filesize is too large. Max $maxsize KB";
return \%ret;
};
my ($buffer);
if(!open (OUT, ">$dir$ret{'name'}")) {
$ret{'err'} = "Can't open $ret{'name'}";
return \%ret;
}
binmode (OUT);
while(read($fH, $buffer, 1024)){
print OUT $buffer;
}
close (OUT);
close ($fH) if ($CGI::OS ne 'UNIX'); #
# chmod (0666, "$dir$ret{'name'}");
return \%ret;
}
sub setCookie($$$$$$@) {
my $self = shift;
my($name, $expires, $domain, $path, $secure, @cook) = @_;
if($expires !~ m/^[0-9]+$/) {
return 0;
}
if($secure !~ m/^[01]$/) {
return 0;
}
my $gmt = '';
if($expires != 0) {
my @t = gmtime(time + $expires);
my @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
my @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
$w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]);
}
my $cook = '';
for(my $i = 0;$i < $#cook + 1;$i++) {
$cook[$i] =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
# $_ =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
$cook .= $cook[$i];
if(($i + 1) < ($#cook + 1)) {
$cook .= '<>';
}
}
print "Set-Cookie: $name=$cook";
if($expires != 0) {
print "; expires=$gmt";
}
if($domain ne '') {
print "; domain=$domain";
}
if($path ne '') {
print "; path=$path";
}
if($secure == 1) {
print "; secure";
}
print "\n";
return 1;
}
sub getCookie($$) {
# my(*cook); #
my $self = shift;
my($name) = @_;
my $cook = $ENV{'HTTP_COOKIE'};
my(%cook, @idparam);
if(defined($cook)) {
@idparam = split(/;/, $cook);
}
foreach (@idparam) {
my($key, $val) = split(/=/);
$key =~ s/\s//g;
$cook{$key} = $val;
}
my(@cook, @param);
if(defined($cook{$name})) {
@param = split(/<>/, $cook{$name});
}
foreach (@param) {
$_ =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
# $_ =~ tr/+/ /;
# $_ =~ s/%([\da-fA-F]{2})/chr hex($1)/ge;
push(@cook,$_);
}
return (@cook);
}
return 1;
__END__