#!/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); use MIME::QuotedPrint qw(encode_qp decode_qp); $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 = <HTML>; close(HTML); }else{ $time_w = time(); $QUERY{'pkai'}++; $hidden = "<input type=\"hidden\" name=\"pkai\" value=\"$QUERY{'pkai'}\">"; $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 = <BLT>; 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/<br>/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 = <LOG>; 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 = <HTML>; close(HTML); }else{ open(HTML,"$location_file") || die "ファイルオープンに失敗しました - design"; @htmls = <HTML>; close(HTML); } } $html = ""; foreach (@htmls) { $html .= $_; } $html =~ s/<!--cgi-->/$cgi_file/g; $html =~ s/<!--hidden-->/$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/<!--$wk-->/$COOKIE{$wk}/g; $i++; } &set_cookie($cookie_name2,$cook_yuko,$cook); $html =~ s/<!--html_encoding-->/Shift_JIS/g; $html =~ s/<!--clap_su-->/$clap_su/g; $html =~ s/<!--clap_kankaku-->/$clap_kankaku/g; $html =~ s/<!--moji_hmax-->/$com_jisu/g; $moji_zmax = int($com_jisu / 2); $html =~ s/<!--moji_zmax-->/$moji_zmax/g; $msg =~ s/\n/<br>/g; $msg = decode("euc-jp", $msg); $msg = encode("cp932", $msg); $html =~ s/<!--view_msg-->/$msg/g; $html =~ s/<!--system-->/$systeminfo/g; print "Content-Type: text/html\n\n"; print $html; exit; #================================メール転送処理================================= sub mail{ $mail_encoding = "UTF-8"; $mail_subject = decode("euc-jp", $subject); $mail_subject = encode($mail_encoding, $mail_subject); $mail_subject = "=?$mail_encoding?Q?".encode_qp($mail_subject, "")."?="; $msg = decode("euc-jp", $msg); $msg = decode_entities($msg); $msg = encode($mail_encoding, $msg); $mail_msg = encode_qp($msg); $msg = decode($mail_encoding, $msg); $msg = encode("euc-jp", $msg); my $n = "\r\n"; 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 "MIME-Version: 1.0$n"; print MAIL "Content-Transfer-Encoding: quoted-printable$n"; print MAIL "Content-Type: text/plain\; charset=$mail_encoding$n"; print MAIL "$n"; print MAIL "$mail_msg$n"; 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"; }