#!/usr/bin/env -S perl
#=======================================================================================
# PatiPati System Script by HAL
# Last Update 2007.08.15
#=======================================================================================
# このファイルの文字コードは EUC-JP/CR-LF
require './preset.cgi';
require './sub.pl';
use Encode qw(encode decode);
use MIME::Base64 qw(encode_base64 decode_base64);
use HTML::Entities qw(encode_entities decode_entities);
$cookie_name1 = 'pati2';
$cookie_name2 = 'patiinput';
$cook_yuko = $cook_yuko * 24;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'});
} else { $formdata = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/,$formdata);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ s/\+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
#改行マークを\nに統一
$value =~ s/\r\n/\n/g;
$value =~ s/\r/\n/g;
$value = &moji_henkan($value);
$value = decode("cp932", $value);
$value = encode("euc-jp", $value);
$QUERY{$name} = $value;
}
#================================メイン処理=================================
&get_cookie($cookie_name2);
&get_cookie($cookie_name1);
if($COOKIE{'f'} == 1){
open(HTML,"$last_file") || die "ファイルオープンに失敗しました - design";
@htmls = ;
close(HTML);
}else{
$time_w = time();
$QUERY{'pkai'}++;
$hidden = "";
$gn = &get_date($time_w);
# 過去データ消去
&del_logs;
$gn = &get_date($time_w);
$user_ipg = $ENV{'REMOTE_ADDR'};
# crypt
$ic = length($user_ipg) / 8;
if(length($user_ipg) % 8 != 0){ $ic++; }
$i = 0; $crypt_ip = "";
while($i <= $ic){
$keta = $i*8;
$crypt_ip .= crypt(substr($user_ipg,$keta,8),$salt);
$i++;
}
# ブラックリスト処理
$bk_ck = 0;
if($ip_ck == 1){
open(BLT,"$ip_ck_file") || &error('FILE OPEN ERROR - Black List');
@blists = ;
close(BLT);
}
foreach $bk(@blists){
($n_ip,$c_ip) = split(/<>/,$bk);
if($c_ip eq $crypt_ip){ $bk_ck = 1; last; }
}
if($ip_ck == 1 && $bk_ck == 1 && $ip_ck_msg ne ""){ &error("$ip_ck_msg"); }
if($bk_ck == 0){
$i = 1; $comp = "";
while($i <= $sub_su){
$wk = 'sub' .$i;
if($QUERY{$wk} ne ""){
$QUERY{$wk} =~ s/\r\n//g;
$QUERY{$wk} =~ s/\r//g;
$QUERY{$wk} =~ s/\n//g;
$comp .= "( $QUERY{$wk} )";
}
$i++;
}
if($comp ne ""){ $QUERY{'com'} .= "\n$comp"; }
$QUERY{'com'} =~ s/\r\n/\n/g;
$QUERY{'com'} =~ s/\r/\n/g;
$msg = $QUERY{'com'};
$msgw = $msg;
$msgw =~ tr/A-Z/a-z/;
if($com_jisu != 0 && $com_jisu < length($msg)){ &error("送信できるメッセージは半角$com_jisu文字(全角の場合その半分)までです。"); }
$ng_ck = 0;
if($msg ne ""){
foreach $ngw (@ngs){
# &jcode'convert(*ngw,'euc');
# $ngw = decode("cp932", $ngw);
# $ngw = encode("euc-jp", $ngw);
$ngw =~ tr/A-Z/a-z/;
if($ngw ne "" && index($msgw,$ngw) >= 0){ $ng_ck = 1; }
}
}
if($ng_ck == 1 && $ng_ck_msg ne ""){ &error($ng_ck_msg); }
elsif($ng_ck == 0){
$QUERY{'com'} =~ s/\n/
/g;
$log_file = $log_dir .$gw .'.' .$kakucho; # ログファイル
# ロック開始
if ($lockkey == 1) { &lock1; }
elsif ($lockkey == 2) { &lock2; }
if(!(-e $log_file)){ # ログファイルがない場合は生成
open(OUT,">$log_file") || &error('FILE OPEN ERROR - log');
print OUT "";
close(OUT);
chmod (0666,$log_file);
}
open(LOG,"$log_file") || &error('FILE OPEN ERROR - log');
@logs = ;
close(LOG);
@news = ();
$kaisu = 1;
foreach (@logs) {
($jikanw,$user_ipw,$kaisuw,$comw) = split("<>",$_);
# crypt
$ic = length($user_ipw) / 8;
if(length($user_ipw) % 8 != 0){ $ic++; }
$i = 0; $user_ipc = "";
while($i <= $ic){
$keta = $i*8;
$user_ipc .= crypt(substr($user_ipw,$keta,8),$salt);
$i++;
}
if($user_ipg eq $user_ipw && $jikanw eq $jikan){
$kaisu = $kaisuw + 1;
if($QUERY{'com'} ne ""){ $QUERY{'com'} = $comw ."<#>$QUERY{'com'}"; }
else{ $QUERY{'com'} = $comw; }
}else{ push(@news,$_); }
}
if($clap_su == 0 || $kaisu <= $clap_su){
push(@news,"$jikan<>$user_ipg<>$kaisu<>$QUERY{'com'}<>\n");
@sorted = sort { $a <=> $b } @news;
open(OUT,">$log_file") || &error('FILE OPEN ERROR - log');
print OUT @sorted;
close(OUT);
}
&unlock; # ロック解除
if($msg ne "" && $mail_ck == 1){ $msg .="\n"; &mail; }
}
}
$ifile = @location_files;
if($locate_rand == 1){
srand;
$r = int(rand($ifile));
$location_file = @location_files[$r];
}elsif($locate_rand == 2){
$i = $kaisu;
$location_file = @location_files[$i-1];
if($i >= $ifile){ $location_file = @location_files[$ifile-1]; }
}else{
$i = $QUERY{'pkai'};
while($i > $ifile){ $i -= $ifile; }
$location_file = @location_files[$i-1];
}
if($clap_su != 0 && $kaisu >= $clap_su){
$cook="f<>1";
&set_cookie($cookie_name1,$clap_kankaku,$cook);
open(HTML,"$last_file") || die "ファイルオープンに失敗しました - design";
@htmls = ;
close(HTML);
}else{
open(HTML,"$location_file") || die "ファイルオープンに失敗しました - design";
@htmls = ;
close(HTML);
}
}
$html = "";
foreach (@htmls) { $html .= $_; }
$html =~ s//$cgi_file/g;
$html =~ s//$hidden/g;
$i = 1; $cook = "";
while($i <= $sub_su){
$wk = 'sub' .$i;
if($QUERY{$wk} ne ""){
my $wk2 = $QUERY{$wk};
$wk2 =~ s/\r\n/\n/g;
$wk2 =~ s/\r/\n/g;
$wk2 = decode("euc-jp", $wk2);
$wk2 = encode("cp932", $wk2);
$cook .= "$wk<>$wk2,";
}else{ $cook .= "$wk<>$COOKIE{$wk},"; }
$html =~ s//$COOKIE{$wk}/g;
$i++;
}
&set_cookie($cookie_name2,$cook_yuko,$cook);
$html =~ s//Shift_JIS/g;
$html =~ s//$clap_su/g;
$html =~ s//$clap_kankaku/g;
$html =~ s//$com_jisu/g;
$moji_zmax = int($com_jisu / 2);
$html =~ s//$moji_zmax/g;
$msg =~ s/\n/
/g;
$msg = decode("euc-jp", $msg);
$msg = encode("cp932", $msg);
$html =~ s//$msg/g;
$html =~ s//$systeminfo/g;
print "Content-Type: text/html\n\n";
print $html;
exit;
#================================メール転送処理=================================
sub mail{
$mail_subject = decode("euc-jp", $subject);
$mail_subject = encode("ISO-2022-JP", $mail_subject);
$mail_subject = "=?ISO-2022-JP?B?".encode_base64($mail_subject, "")."?=";
$msg = decode("euc-jp", $msg);
$msg = decode_entities($msg);
$msg = encode("utf-8", $msg);
$mail_msg = encode_base64($msg);
$msg = decode("utf-8", $msg);
$msg = encode("euc-jp", $msg);
foreach $mlw (@mailtos){
$mailtow = $mlw;
if (!open(MAIL,"| $sendmail $mailtow")) { &error('何らかの原因で送信できませんでした。'); }
print MAIL "X-Mailer: GNBSys\n";
print MAIL "To: $mailtow\n";
print MAIL "From: $mailtow\n";
print MAIL "Subject: $mail_subject\n";
print MAIL "Content-Transfer-Encoding: base64\n";
print MAIL "Content-Type: text/plain\; charset=\"UTF-8\"\n\n";
print MAIL "$mail_msg";
close(MAIL);
}
}
#===============================クッキーの取得===========================
sub get_cookie{
my $cookie_name = $_[0];
@pairs = split(/\;/, $ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
local($name, $value) = split(/\=/, $pair);
$name =~ s/ //g;
$DUMMY{$name} = $value;
}
@pairs = split(/\,/, $DUMMY{$cookie_name});
foreach $pair (@pairs) {
local($name, $value) = split(/<>/, $pair);
$COOKIE{$name} = $value;
}
}
#===============================クッキーの発行===========================
sub set_cookie{
my $cookie_name = $_[0];
my $cookie_time = $_[1];
my $cook = $_[2];
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$dmy,$dmy)
= gmtime(time + 60*60*$cookie_time);
$yearg += 1900;
if ($secg < 10) { $secg = "0$secg"; }
if ($ming < 10) { $ming = "0$ming"; }
if ($hourg < 10) { $hourg = "0$hourg"; }
if ($mdayg < 10) { $mdayg = "0$mdayg"; }
$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong];
$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg];
$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
print "Set-Cookie: $cookie_name=$cook; expires=\"$date_gmt\"\n";
}