#!/usr/bin/perl $|=1; $ver = 'PETIT v4.5'; require './jcode.pl'; require './sub.cgi'; #require '../kickit.cgi'; # メイン処理 &get_time; # 時間を取得 &ipget; # アクセスログを記録 &code; # 投稿コード生成 &decode; #if ($mode eq "howto") { &howto; } if ($mode eq "find") { &find; } if ($mode eq "usr_del") { &usr_del; } if ($mode eq "msg_del") { &msg_del; } if ($mode eq "msg") { ®ist; } if ($mode eq "res_msg") { &res_msg; } if ($mode eq "admin") { &admin; } if ($mode eq "admin_del") { &admin_del; } if ($mode eq "res") { &allres; } &html_log; #--------------# # 記事表示部 # #--------------# sub html_log { &getstart; print <<"EOM";

EOM if ($pict) { print <<"EOM"; EOM } print <<"EOM";
名 前 EOM # カウンタ処理 if ($counter) { &counter; } print <<"EOM";
Eメール
題 名  
内 容  
URL
コード   
削除キー (自分の記事を削除時に使用。英数字で8文字以内)

EOM # print "■トップにもどる\n"; # print "■使い方\n"; print "■ワード検索\n"; if ($pastkey) { print "■過去ログ\n"; } print <<"EOM"; ■記事削除管理用
この掲示板についてJAPANESE TRASH 1Π
EOM if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } # 記事数を取得 $end_data = @new - 1; $page_end = $page + ($pagelog - 1); if ($page_end >= $end_data) { $page_end = $end_data; } print "
\n"; foreach ($page .. $page_end) { ($fdate,$fccc,$num,$k,$date,$name,$email,$sbj, $com,$url,$host,$pwd,$color) = split(/<>/, $new[$_]); if (!$sbj) { $sbj = "Untitled"; } print "[$num]: $sbj \n"; } print "▼ 一番下へ行く \n"; print "
\n"; print "
\n"; foreach ($page .. $page_end) { ($fdate,$fccc,$num,$k,$date,$name,$email,$sbj, $com,$url,$host,$pwd,$color) = split(/<>/, $new[$_]); &kakihyoji; } print "\n"; # 改頁処理 $next_line = $page_end + 1; $back_line = $page - $pagelog; # 前頁処理 if ($back_line >= 0) { print "\n"; } # 次頁処理 if ($page_end ne $end_data) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "

\n"; &footer; exit; } #--------------------# # ログ書き込み処理 # #--------------------# sub regist { unless ($name eq $manager_name && $pwd eq $pass) { # 他サイトからのアクセスを排除 if ($base_url) { $ref_url = $ENV{'HTTP_REFERER'}; $ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($browse_check) { foreach (@browser) { if ( $hua =~/$_/i) { $base_url = ''; last; } } } if ($ref_url !~ /$base_url/i) { &error("外部投稿は出来ません。"); } } if ($reg_prx_kick) { &check_proxy("$reg_prx_kick",'2'); } # 投稿コードチェック local($codeflag) = 0; foreach $codecheck(@codeline){ $codecheck =~ s/\n//; ($codeline,$codekey) = split(/\,/,$codecheck); if ($ccc eq $codeline){ $codeflag = 1; $last_ctime = $codekey; last; } } unless($codeflag){ &error("不正投稿の可能\性があります。リロードして再投稿して下さい。");} if ($allow_submit && !$letout_ip) { if (($cc_time - $last_ctime) < $noprx_stime) { &error("アクセスしてから投稿するまでは$noprx_stime秒以上開けて下さい。");} } elsif (($cc_time - $last_ctime) < $submit_time) { &error("アクセスしてから投稿するまでは$submit_time秒以上開けて下さい。");} if ($pict) { if ($FORM{'checka'} eq '') {&error("投稿コードが入力されてません");} $dukecheck = $FORM{'checka'} . $FORM{'checkb'}; if ( !open(DB,"$himicode_log") ) {&error("ファイルをオープン出来ません");} @liness = ; close(DB); $himikocheck=0; foreach $line (@liness) { chop($line); if ($dukecheck eq $line) {$himikocheck=1;} } if ($himikocheck != 1) {&error("投稿コードエラー");} } # 名前とコメントは必須 if ($name eq "") { $name = "名無しさん"; } if ($comment eq "") { &error("コメントが入力されていません"); } if ($FORM{'resno'} eq "" && $subj eq "") { &error("題名が入力されていません"); } if($email){ if ($email =~ /,/) {&error("Eメールの入力内容が正しくありません。");} unless ($email =~ /(.*)\@(.*)\.(.*)/) {&error("Eメールの入力内容が正しくありません。");} unless ($email =~ /to$|hr$|mx$|ru$|au$|jp$|us$|uk$|cz$|ch$|sg$|ec$|nl$|au$|fi$|ca$|de$|kr$|tw$|it$|pl$|edu$|com$|org$|net$/i){&error("Eメールの入力内容が正しくありません。");} } } #管理者特権ここまで # ファイルロック if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # ログを開く open(IN,"$logfile") || &error("Can't open $logfile"); @lines = ; close(IN); # 親記事NO処理 $oya = $lines[0]; if ($oya =~ /<>/) { &error("ログが正しくありません。"); } $oya =~ s/\n//; shift(@lines); unless ($name eq $manager_name && $pwd eq $pass) { # 二重投稿の禁止 local($flag) = 0; local($flag2) = 0; local($flag3) = 0; local($flag4) = 0; foreach $line (@lines) { ($kwdate,$kccc,$knum,$kk,$kd,$kname,$kem,$ksub,$kcom,$kurl,$khost) = split(/<>/,$line); if ($name eq "$kname" && $comment eq "$kcom") { $flag = 1; last; } if ($allow_submit && !$letout_ip) { if (( $wdate - $kwdate ) < $diff_nprtime && $host ne $khost) { $flag2 = 1; last; } if (( $wdate - $kwdate ) < $same_nprtime && $host eq $khost) { $flag3 = 1; last; } } else { if (( $wdate - $kwdate ) < $diff_rtime && $host ne $khost) { $flag2 = 1; last; } if (( $wdate - $kwdate ) < $same_rtime && $host eq $khost) { $flag3 = 1; last; } } if ($kccc eq $ccc) { $flag4 = 1; last; } } if ($flag) { &error("二重投稿は禁止です"); } if ($flag2) { &error("連続投稿制限"); } if ($flag3) { &error("連続投稿制限"); } if ($flag4) { &error("チェックコードエラー"); } } #管理者特権ここまで # 親記事の場合、記事Noをカウントアップし、クッキーを発行 if ($FORM{'resno'} eq "") { $oya++; } &set_cookie; $number = $oya; # 削除キーを暗号化 if ($pwd) { &passwd_encode($name,$pwd); } # ログをフォーマット $new_msg = "$wdate<>$ccc<>$number<>$FORM{'resno'}<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host $hua<>$ango<>$color<>\n"; ## 自動ソート時は、レス記事投稿時は親記事はトップへ移動 if ($res_sort && $FORM{'resno'} ne "") { @res_data = (); @new = (); foreach $line (@lines) { $flag = 0; ($fdate,$fccc,$num,$k,$d,$na,$em,$sub,$com,$u,$ho,$p,$c,$ico) = split(/<>/,$line); # 親記事を抜き出す if ($k eq "" && $FORM{'resno'} eq "$num") { $new_line = "$line"; $flag = 1; } # 関連のレス記事を抜き出す elsif ($k eq "$FORM{'resno'}") { push(@res_data,$line); $flag = 1; } if ($flag == 0) { push(@new,$line); } } # 関連レス記事をトップへ unshift(@new,@res_data); # 新規メッセージをトップへ unshift(@new,$new_msg); # 親記事をトップへ unshift(@new,$new_line); ## 親記事の場合、最大記事数を超える記事をカット } elsif ($FORM{'resno'} eq "") { $i = 0; $stop = 0; foreach $line (@lines) { ($fdate,$fccc,$num,$k,$d,$na,$em,$sub,$com,$u,$ho,$p,$c,$ico)=split(/<>/,$line); if ($k eq "") { $i++; } if ($i > $max-1) { $stop = 1; if ($pastkey == 0) { last; } else { if ($k eq "") { $kflag=1; push(@past_data,$line); } else { push(@past_res,$line); } } } if ($stop == 0) { push(@new,$line); } } ## 過去記事生成 if ($kflag) { @past_res = reverse(@past_res); push(@past_data,@past_res); &pastlog; } unshift(@new,$new_msg); ## レス記事は記事数の調整はしない } else { @res_data = (); @new = (); foreach $line (@lines) { $flag = 0; ($fdate,$fccc,$num,$k,$d,$na,$em,$sub,$com,$u,$ho,$p,$c,$ico) = split(/<>/,$line); # 親記事を抜き出す if ($k eq "" && $FORM{'resno'} eq "$num") { $new_line = "$line"; $flag = 2; } if ($flag == 0) { push(@new,$line); } elsif ($flag == 2) { push(@new,$new_line); push(@new,$new_msg); } } } # 親記事NOを付加 unshift (@new,"$oya\n"); # ログを更新 open(OUT,">$logfile") || &error("Can't write $logfile"); print OUT @new; close(OUT); # ロック解除 if (-e $lockfile) { unlink($lockfile); } # メール処理 if ($mailing && $mail_me) { &mail_to; } elsif ($mailing && $mail_me == 0 && $email ne "$mailto") { &mail_to; } } #---------------# # デコード処理 # #---------------# sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コード変換 &jcode'convert(*value,'sjis'); # タグ処理 if ($tagkey == 0) { $value =~ s//>\;/g; } else { $value =~ s///g; $value =~ s/<>/<\;>\;/g; } # 一括削除用 if ($name eq 'del') { push(@delete,$value); } if($name ne 'comment'){ $value =~ s/\r|\n|\"//g;} $FORM{$name} = $value; } $name = $FORM{'name'}; $comment = $FORM{'comment'}; $comment =~ s/\r\n/\n/g; $comment =~ s/\r/\n/g; $comment =~ s/\ \n/\n/g; $comment =~ s/\ \n/\n/g; $comment=~ s/\n{3,}/\n\n/g; unless ($name eq $manager_name && $pwd eq $pass) { if ($max_line) { $value_size = ($comment =~ tr/\n/\n/) + 1; if ($value_size > $max_line){ &error("本文の行数が多すぎます"); } } if ($max_width){ @max_widthcheck = split(/\n/,$comment); for(@max_widthcheck){ if (length($_) > $max_width){&error('1行の文字数が多すぎます'); } } } if(length($comment) > $max_comment) { $errorword = length($comment);&error("投稿量が大きすぎます"); } } #管理者特権 ここまで $comment =~ s/\n/
/g; $email = $FORM{'email'}; $url = $FORM{'url'}; $url =~ s/^http\:\/\///; $mode = $FORM{'mode'}; $subj = $FORM{'subj'}; $pwd = $FORM{'pwd'}; $color = $toukou_color; $ccc = $FORM{'cc'}; unless ($name eq $manager_name && $pwd eq $pass) { if(length($subj) > $max_subj) { $errorword = length($subj);&error("題名の文字数が多すぎます。
現在$errorword文字ですが、$max_subj 文字以内で書いて下さい。"); } if(length($name) > $max_name) { $errorword = length($name);&error("名前の文字数が多すぎます。
現在$errorword文字ですが、$max_name文字以内で書いて下さい。"); } if(length($email) > $max_email) { $errorword = length($email);&error("Mailの文字数が多すぎます。
現在$errorword文字ですが、$max_email文字以内で書いて下さい。"); } if(length($url) > $max_url) { $errorword = length($url);&error("URLの文字数が多すぎます。
現在$errorword文字ですが、$max_url文字以内で書いて下さい。"); } } #管理者特権 ここまで } #--------------------------# # ワード検索サブルーチン # #--------------------------# sub find { &header; print <<"HTML"; [掲示板にもどる]
ワード検索

  • 検索したいキーワードを入力し、検索領域を選択して「検索ボタン」 を押してください。
  • キーワードを「半角スペース」で区切って複数指定することができます。

キーワード
検索条件 AND OR
HTML # ワード検索の実行と結果表示 if ($FORM{'word'} ne "") { # 入力内容を整理 $cond = $FORM{'cond'}; $word = $FORM{'word'}; $word =~ s/ / /g; $word =~ s/\t/ /g; @pairs = split(/ /,$word); # ファイルを読み込み open(DB,"$logfile") || &error("Can't open $logfile"); @lines = ; close(DB); # 検索処理 foreach (1 .. $#lines) { $flag = 0; foreach $pair (@pairs){ if (index($lines[$_],$pair) >= 0){ $flag = 1; if ($cond eq 'or') { last; } } else { if ($cond eq 'and'){ $flag = 0; last; } } } if ($flag == 1) { push(@new,$lines[$_]); } } # 検索終了 $count = @new; print "
検索結果:$count件

\n"; print "

    \n"; foreach $line (@new) { ($fdate,$fccc,$num,$k,$date,$name,$email,$sub,$com,$url) = split(/<>/, $line); if (!$sub) { $sub = "Untitled"; } if ($email) { $name = "$name"; } if ($url) { $url = "[HOME]"; } if ($k) { $num = "$kへのレス"; } # 結果を表示 print "
  1. [$num] $sub\n"; print "投稿者:$name $url 投稿日:$date

    \n"; print "

    $com

    \n"; } print "

\n"; } &footer; exit; } #--------------# # 日時の取得 # #--------------# sub get_time { $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$dmy,$dmy) = localtime(time); $year += 1900; $mon++; if ($mon < 10) { $mon = "0$mon"; } if ($mday < 10) { $mday = "0$mday"; } if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } # 日時のフォーマット if ($date_type && $FORM{'resno'} eq "") { $youbi = ('日','月','火','水','木','金','土') [$wday]; $date = "$year年$mon月$mday日 ($youbi) $hour時$min分$sec秒"; } else { $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $date = "$year/$mon/$mday($youbi) $hour\:$min\:$sec"; } } #------------------------------------# # ブラウザを判断しフォーム幅を調整 # #------------------------------------# sub get_bros { # ブラウザ名を取得 $agent = $hua; if ($agent =~ /MSIE 3/i) { $nam_wid = 30; $subj_wid = 40; $com_wid = 65; $url_wid = 48; $nam_wid2 = 15; } elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { $nam_wid = 30; $subj_wid = 40; $com_wid = 65; $url_wid = 78; $nam_wid2 = 15; } else { $nam_wid = 20; $subj_wid = 25; $com_wid = 56; $url_wid = 50; $nam_wid2 = 10; } } #------------# # 削除画面 # #------------# sub msg_del { if ($FORM{'action'} eq 'admin' && $FORM{'pass'} ne "$pass") { &error("パスワードが違います"); } open(DB,$logfile) || &error("Can't open $logfile"); @lines = ; close(DB); shift(@lines); # 親記事のみの配列データを作成 @new = (); foreach $line (@lines) { local($fdate,$fccc,$num,$k,$date,$name, $email,$sub,$com,$url,$host,$pw) = split(/<>/,$line); # RES記事を外す if ($k eq "") { push(@new,$line); } } @lines = reverse(@lines); &header; print "[掲示板へ戻る]\n"; print "
\n"; print "コメント削除画面
\n"; print "

\n"; print "\n"; print "
\n"; if ($FORM{'action'} eq '') { print "■投稿時に記入した「削除キー」により、記事を削除します。
\n"; } print "■削除したい記事のチェックボックスにチェックを入れ、下記フォームに「削除キー」を入力してください。
\n"; print "■親記事を削除する場合、そのレスメッセージも同時に消滅してしまうことになりますので、ご注意ください。
\n"; print "

\n"; print "

\n"; if ($FORM{'action'} eq '') { print "\n"; print "削除キー \n"; } else { print "\n"; print "\n"; print "\n"; } print "\n"; print "

\n"; print ""; print "\n"; if ($FORM{'action'} eq 'admin') { print "\n"; } print "\n"; if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } # 記事数を取得 $end_data = @new - 1; $page_end = $page + ($pagelog - 1); if ($page_end >= $end_data) { $page_end = $end_data; } foreach ($page .. $page_end) { ($fdate,$fccc,$num,$k,$date,$name,$email,$sub, $com,$url,$host,$pw,$color) = split(/<>/,$new[$_]); if ($email) { $name="$name"; } if (!$sub) { $sub = "Untitled"; } $com =~ s/
/ /g; if ($tagkey) { $com =~ s//>/g; } if (length($com) > 60) { $com=substr($com,0,58); $com=$com . '..'; } if ($FORM{'action'} eq 'admin') { print "\n"; } else { print "\n"; } print "\n"; print "\n"; if ($FORM{'action'} eq 'admin') { print "\n"; } print "\n"; ## レスメッセージを表示 foreach (@lines) { ($fdate,$fccc,$rnum,$rk,$rd,$rname,$rem,$rsub, $rcom,$rurl,$rho,$rp,$rc) = split(/<>/, $_); $rcom =~ s/
/ /g; if ($tagkey) { $rcom =~ s//>/g; } if (length($rcom) > 60) { $rcom=substr($rcom,0,58); $rcom=$rcom . '..'; } if ($num eq "$rk"){ if ($FORM{'action'} eq 'admin') { print "\n"; } else { print "\n"; } print "\n"; print "\n"; if ($FORM{'action'} eq 'admin') { print "\n"; } print "\n"; } } } print "
削除記事No題名投稿者投稿日コメントホスト名
$num$sub$name$date$com$host
$numへのレス$rname$rd$rcom$rho

\n"; print "\n"; # 改頁処理 $next_line = $page_end + 1; $back_line = $page - $pagelog; # 前頁処理 if ($back_line >= 0) { print "\n"; } # 次頁処理 if ($page_end ne $end_data) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; if ($FORM{'action'} eq 'admin') { print "\n"; print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; if ($FORM{'action'} eq 'admin') { print "\n"; print "\n"; } print "


\n"; &footer; exit; } ## --- ユーザ記事削除処理 sub usr_del { if ($FORM{'del_key'} eq "") { &error("削除キーが入力モレです。"); } if ($FORM{'del'} eq "") { &error("ラジオボタンの選択がありません。"); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # ログを読み込む open(DB,"$logfile") || &error("Can't open $logfile"); @lines = ; close(DB); # 親記事NO $oya = $lines[0]; if ($oya =~ /<>/) { &error("ログが正しくありません。"); } shift(@lines); ## 削除キーによる記事削除 ## @new=(); foreach $line (@lines) { $dflag = 0; ($fdate,$fccc,$num,$k,$dt,$name,$email,$sub,$com,$url,$host,$pw,$color) = split(/<>/,$line); if ($FORM{'del'} eq "$dt") { $dflag = 1; $encode_pwd = $pw; $del_num = $num; if ($k eq '') { $oyaflag=1; } } elsif ($oyaflag && $del_num eq "$k") { $dflag = 1; } if ($dflag == 0) { push(@new,$line); } elsif ($dflag == 1) { push(@new,"$fdate<>$fccc<>$num<>$k<>$dt<>$name<>$email<>$sub<>ユーザー削除<>$url<>$host<>削除<>$color<>$com\n"); } } if ($del_num eq '') { &error("削除対象記事が見つかりません"); } else { if ($encode_pwd eq '') { &error("削除キーが設定されていません"); } $check = &passwd_decode("$FORM{'del_key'}","$encode_pwd"); if ($check ne 'yes') { &error("パスワードが違います"); } } # 親記事NOを付加 unshift(@new,$oya); ## ログを更新 ## open(DB,">$logfile") || &error("Can't write $logfile"); print DB @new; close(DB); # ロック解除 if (-e $lockfile) { unlink($lockfile); } # 削除画面にもどる &msg_del; } #----------------------# # 管理者一括記事削除 # #----------------------# sub admin_del { if ($FORM{'pass'} ne "$pass") { &error("パスワードが違います"); } if ($FORM{'del'} eq "") { &error("チェックボックスの選択がありません"); } # ロック開始 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # ログを読み込む open(DB,"$logfile") || &error("Can't open $logfile"); @lines = ; close(DB); # 親記事NO $oya = $lines[0]; if ($oya =~ /<>/) { &error("ログが正しくありません。

\(v2.5以前のログの場合は変換の必要があります\)<\/small>"); } shift(@lines); ## 削除処理 foreach $line (@lines) { $dflag=0; ($fdate,$fccc,$num,$k,$dt,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/,$line); foreach $del (@delete) { if ($del eq "$dt") { $dflag = 1; $del_num = $num; if ($k eq '') { $oyaflag=1; } } elsif ($oyaflag && $del_num eq "$k") { $dflag = 1; } } if ($dflag == 0) { push(@new,$line); } elsif ($dflag == 1) { push(@new,"$fdate<>$fccc<>$num<>$k<>$dt<>$name<>$email<>$sub<>削除<>$url<>$host<>削除<>$color<>$com\n"); } } # 親記事NOを付加 unshift(@new,$oya); ## ログを更新 ## open(DB,">$logfile") || &error("Can't write $logfile"); print DB @new; close(DB); # ロック解除 if (-e $lockfile) { unlink($lockfile); } # 削除画面にもどる &msg_del; } ## --- 管理者入室画面 sub admin { &header; print "

パスワードを入力してください

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; exit; } ## --- カウンタ処理 sub counter { # 閲覧時のみカウントアップ $match=0; if ($FORM{'mode'} eq '') { # カウンタロック if ($lockkey) { &lock3; } $match=1; } # カウントファイルを読みこみ open(NO,"$cntfile") || &error("Can't open $cntfile",'0'); $cntlog = ; close(NO); ($today_c,$yesterday_c,$total_c,$w_day) = split(/\,/,$cntlog); # カウントアップ if ($match) { if ($w_day ne $mday){ $w_day = $mday; $yesterday_c = $today_c; $today_c = '0'; } $today_c ++; $total_c ++; } # 更新 open(OUT,">$cntfile") || &error("Write Error : $cntfile"); print OUT "$today_c,$yesterday_c,$total_c,$w_day"; close(OUT); # カウンタロック解除 if (-e $cntlock) { unlink($cntlock); } # 桁数調整 while(length($total_c) < $mini_fig) { $total_c = '0' . "$total_c"; } @cnts = split(//,$total_c); # print "
\n"; # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } # テキストカウンタ表示 } else { print "$total_c"; } print " (today - $today_c yesterday - $yesterday_c)"; # print "
\n"; } ## --- ロックファイル(symlink関数) sub lock1 { local($retry) = 5; while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } } ## --- ロックファイル(open関数) sub lock2 { local($flag) = 0; foreach (1 .. 5) { if (-e $lockfile) { sleep(1); } else { open(LOCK,">$lockfile"); close(LOCK); $flag = 1; last; } } if ($flag == 0) { &error("LOCK is BUSY"); } } ## --- カウンタロック sub lock3 { $cnt_flag = 0; foreach (1 .. 7) { if (-e $cntlock) { sleep(1); } else { open(LOCK,">$cntlock"); close(LOCK); $cnt_flag = 1; last; } } if (!$cnt_flag) { unlink($cntlock); } } ## --- メール送信 sub mail_to { $mail_subj = "$title に投稿がありました。"; &jcode'convert(*mail_subj,'jis'); &jcode'convert(*name,'jis'); &jcode'convert(*subj,'jis'); &jcode'convert(*comment,'jis'); if ($date_type && $FORM{'resno'} eq "") { &jcode'convert(*date,'jis'); } $comment =~ s/
/\n/g; $comment =~ s/\<\;//g; open(MAIL,"| $sendmail $mailto") || &error("Can't post sendmail"); print MAIL "To: $mailto\n"; # メールアドレスがない場合はダミーメールに置き換え if ($FORM{'email'} eq "") { $email = 'nomail@xxx.xxx'; } print MAIL "From: $email\n"; print MAIL "Subject: $mail_subj\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "$mail_subj\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "TIME : $date\n"; print MAIL "NAME : $name\n"; print MAIL "EMAIL: $FORM{'email'}\n"; if ($url ne "") { print MAIL "URL : http://$url\n"; } if ($FORM{'resno'} ne "") { $subj = "(Res Message to $FORM{'resno'})"; } elsif ($FORM{'resno'} eq "" && $subj eq "") { $subj = "no title"; $mail_num = $number; } else { $mail_num = $number; } print MAIL "TITLE: $mail_num $subj\n\n"; print MAIL "$comment\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "pass - $pwd host - $host $hua\n"; close(MAIL); } #----------------------# # パスワード暗号処理 # #----------------------# ## --- パスワード暗号処理(Crypt関数) sub passwd_encode { local ($asc,@in_name,@saltset,$saltnum,$nsalt); if ($_[0] eq $manager_name && $_[1] eq $pass){ $ango = 'hide'; $host = '255.255.255.255'; $hua = '';} else{ @saltset = ('0' .. '9','a' .. 'z','A' .. 'Z','.','/'); $saltnum = @saltset; @in_name = split ('',(join('',@_))); foreach (@in_name){ $asc += ord($_); } $nsalt = $saltset[($asc * $saltnum) % $saltnum] . $saltset[$asc % $saltnum]; $ango = crypt($_[1], $nsalt) || crypt ($_[1], '$1$' . $nsalt); } } #----------------------# # パスワード照合処理 # #----------------------# sub passwd_decode { ($inpw, $logpw) = @_; if ($logpw =~ /^\$1\$/) { $key = 3; } else { $key = 0; } local($check) = "no"; if (crypt($inpw, substr($logpw,$key,2)) eq "$logpw") { $check = "yes"; } } #--------------# # 自動リンク # #--------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g; } #------------------# # HTMLのヘッダー # #------------------# sub header { print "Content-type: text/html\n\n"; print <<"EOM"; $title EOM } ## --- HTMLのフッター sub footer { ## 著作権表示(削除不可) print "$banner2\n"; print "
about tEaM hEd
\n"; print "
\n"; print "
Petit Board
\n"; print "Modified by"; print " 脱走犬エルモ
\n"; print "\n"; print "arranged by 羅豪 \& hide\n"; print "
\n"; print "\n"; } ## --- クッキーの発行 sub set_cookie { # クッキーは60日間有効 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime(time + 365*24*60*60); $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"; $cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd"; print "Set-Cookie: TRASH2=$cook; expires=$date_gmt\n"; } ## --- クッキーを取得 sub get_cookie { @pairs = split(/\;/, $ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/\,/, $DUMMY{'TRASH2'}); foreach $pair (@pairs) { local($name, $value) = split(/\:/, $pair); $COOKIE{$name} = $value; } $c_name = $COOKIE{'name'}; $c_email = $COOKIE{'email'}; $c_url = $COOKIE{'url'}; $c_pwd = $COOKIE{'pwd'}; if ($FORM{'name'}) { $c_name = $FORM{'name'}; } if ($FORM{'email'}) { $c_email = $FORM{'email'}; } if ($FORM{'url'}) { $c_url = $url; } if ($FORM{'pwd'}) { $c_pwd = $FORM{'pwd'}; } } ## --- エラー処理 sub error { if (-e $lockfile) { unlink($lockfile); } if ($_[1] ne '0') { &header; } print "

ヽ(´ー`)ノ

\n"; print "

$_[0]\n"; print "


\n"; print "$banner2\n"; print "
about tEaM hEd
\n"; print "
\n"; print "\n"; exit; } ## --- 過去ログ生成 sub pastlog { $new_flag = 0; # 過去NOを開く open(NO,"$nofile") || &error("Can't open $nofile"); $count = ; close(NO); # 過去ログのファイル名を定義 $pastfile = "$past_dir/$count\.html"; # 過去ログがない場合、新規に自動生成する unless(-e $pastfile) { &new_log; } # 過去ログを開く if ($new_flag == 0) { open (IN,"$pastfile") || &error("Can't open $pastfile"); @past = ; close(IN); } # 規定の行数をオーバーすると、次ファイルを自動生成する if ($#past > $log_line) { &next_log; } foreach $pst_line (@past_data) { ($pdate,$pccc,$pnum,$pk,$pdt,$pname,$pemail,$psub,$pcom, $purl,$phost,$ppw) = split(/<>/, $pst_line); if ($idview && $ppw) { $ppw ='(ID: '.substr($ppw,-7,7).')'; } else { $ppw = ''; } if ($pk eq "" && $psub eq "") { $psub = "no title"; } if ($pemail) { $pname = "$pname"; } if ($purl) { $purl="http://$purl"; } if ($pk) { $pnum = "$pkへのレス"; } &jisyohenkan3; # 自動リンク if ($autolink) { &auto_link($pcom); } # 保存記事をフォーマット $html = <<"HTML"; [$pnum] $psub 投稿者:$pname $ppw 投稿日:$pdt

$pcom

$purl


HTML push(@htmls,"$html"); } @news = (); foreach $line (@past) { if ($line =~ //i) { last; } push (@news,$line); if ($line =~ //i) { push (@news,@htmls); } } push (@news,"\n
$banner2\n"); # 過去ログを更新 open(OUT,">$pastfile") || &error("Can't write $pastfile"); print OUT @news; close(OUT); } ## --- 過去ログ次ファイル生成ルーチン sub next_log { # 次ファイルのためのカウントアップ $count++; # カウントファイル更新 open(NO,">$nofile") || &error("Can't write $nofile"); print NO "$count"; close(NO); $pastfile = "$past_dir/$count\.html"; &new_log; } ## --- 新規過去ログファイル生成ルーチン sub new_log { $new_flag = 1; if ($backgif) { $bgkey = "background=\"$backgif\""; } else { $bgkey = "bgcolor=$bgcolor"; } $past[0] = "過去ログ\n"; $past[1] = "\n"; $past[2] = "
\n"; $past[3] = "<\!--HAJIME-->\n"; $past[4] = "<\!--OWARI-->\n"; $past[5] = "
$banner2\n"; # 新規過去ログファイルを生成更新 open(OUT,">$pastfile") || &error("Can't write $pastfile"); print OUT @past; close(OUT); # パーミッションを604へ。 chmod(0604,"$pastfile"); } ##-------------------------------------------------------------- ## --- アクセスログ記録ルーチン sub ipget{ local (@accline,$acclogline2,$cache_c,$cache_i,$cli_ip,$foward,$host_head,$ht_con,$ht_from,$ht_xon, $logdata,$maxlog,$pro_con,$sp_host,$via,$xfoward,$xro_con); $addr = $ENV{'REMOTE_ADDR'}; $host = $ENV{'REMOTE_HOST'}; unless ($host) { $host = $addr; } if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } $hua = $ENV{'HTTP_USER_AGENT'}; $hua =~ s/(<|>|\,)//g; if(length($hua) > 150){$hua = "";} $href = $ENV{'HTTP_REFERER'}; $href =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $base_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($href =~ /$base_url/) { $href=""; } $cache_c = $ENV{'HTTP_CACHE_CONTROL'}; $cache_i = $ENV{'HTTP_CACHE_INFO'}; $cli_ip = $ENV{'HTTP_CLIENT_IP'}; $ht_con = $ENV{'HTTP_CONNECTION'}; $foward = $ENV{'HTTP_FORWARDED'}; $ht_from = $ENV{'HTTP_FROM'}; $pro_con = $ENV{'HTTP_PROXY_CONNECTION'}; $sp_host = $ENV{'HTTP_SP_HOST'}; $via = $ENV{'HTTP_VIA'}; $xfoward = $ENV{'HTTP_X_FORWARDED_FOR'}; $ht_xon = $ENV{'HTTP_XONNECTION'}; $xro_con = $ENV{'HTTP_XROXY_CONNECTION'}; if ($cli_ip =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) { $letout_ip = $cli_ip; } if ($foward =~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) { $letout_ip = $foward; } if ($ht_from =~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) { $letout_ip = $ht_from; } if ($sp_host =~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) { $letout_ip = $sp_host; } if ($via =~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) { $letout_ip = $via; } if ($xfoward =~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ) { $letout_ip = $xfoward; } if ($letout_ip eq '' && $cache_c) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $cache_i) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $pro_con) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $foward) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $ht_xon) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $hua =~/cache|delegate|proxy|squid|via/i) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $via) { $letout_ip = "(proxy)"; } if ($letout_ip eq '' && $xro_con) { $letout_ip = "(proxy)"; } $host_head = (split(/\./,$host))[0]; if ($letout_ip eq '' && $host =~ /cache|^cgi|delegate|^dns|^firewall|^ftp|^fw|keeper|^mail|^ns\d{0,2}\.|^news|proxy|squid|^web|^www/i) { $letout_ip = "(proxy)"; } elsif ($letout_ip eq '' && $host_head !~ /\d{2,}/) { $letout_ip = "(maybe proxy)"; } if ($letout_ip eq '' && $ht_con !~ /Keep-Alive/i) { $letout_ip = "(maybe proxy)"; } if ($letout_ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $letout_ip = gethostbyaddr(pack('C4',split(/\./,$letout_ip)),2) || $letout_ip; if ($letout_ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $letout_ip .= "(perhaps proxy)"; } else { $host_head = (split(/\./,$letout_ip))[0]; if ($letout_ip =~ /cache|^cgi|delegate|^dns|^firewall|^ftp|^fw|keeper|^mail|^ns\d{0,2}\.|^news|proxy|squid|^web|^www/i) { $letout_ip .= "(proxy)"; } elsif ($host_head !~ /\d{2,}/) { $letout_ip .= "(perhaps proxy)"; } } } foreach (@kickhost) { if($host =~ /$_/i || $addr =~ /$_/i){ $kickflag = 'kick'; } } foreach (@denyagent) { if($hua =~ /$_/i){ $kickflag = 'kick'; } } if (!open(LOG,"$lognum")) { &error('ファイルをオープン出来ません'); } $num = ; close(LOG); local($logdatfile) = "$logname"."$num"."\.txt"; if (-e $logdatfile){ if (!open(LOG,"$logdatfile")) { &error('ファイルをオープン出来ません'); } @logfilelines=; close(LOG); } else { $cmd_flag = 1; } $linecount = @logfilelines; if ($linecount >= ($logmax- 1)) { if (!open(LOG,">$lognum")) { &error('ファイルをオープン出来ません'); } $num ++; print LOG $num; close(LOG); } $log_data = "$date,$href,$host,$addr,$via,$letout_ip,$hua,$ENV{'HTTP_COOKIE'},$kickflag\n"; if (!open(LOG,">$logdatfile")){ &error('ファイルをオープン出来ません'); } print LOG $log_data; foreach (@logfilelines) { print LOG $_; } close(LOG); if ($cmd_flag) { if(!chmod (0604,"$logdatfile")){ &error('ファイルをオープン出来ません'); }} if ($proxy_kick){ &check_proxy("$proxy_kick",'1'); } if($kickflag eq 'kick'){ #&htaccess; &error("Unknown Error!!"); } } ## --- プロクシーチェックルーチン sub check_proxy { local ($p_flag) = 0; local ($p_kick,$check_f) = @_; if ($check_f == 1) { @allowhost = @allowproxy; $e_word = 'アクセス'; } elsif ($check_f == 2) { @allowhost = @reg_allowprx; $e_word = '投稿'; } if ($p_kick == 1 && $letout_ip =~ /\(proxy\)/) { $p_flag = 1; } elsif ($p_kick == 2 && ($letout_ip =~ /\(proxy\)/ || $letout_ip eq "\(maybe proxy\)")) { $p_flag = 1; } elsif ($p_kick == 3 && $letout_ip =~ /proxy/) { $p_flag = 1; } elsif ($p_kick == 4){ if ($host =~ /\.jp/i || $host =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $p_flag = 0; } if ($letout_ip =~ /proxy/) { $p_flag = 1; } } elsif ($p_kick == 5){ if ($host =~ /\.jp/i || $host =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $p_flag = 0; } if ($letout_ip) { $p_flag = 1; } } foreach(@allowhost) { if($host =~ /$_/i || $addr =~ /$_/i){ $p_flag = 0; } } if ($p_flag) { &error("あなたがお使いのホスト( $host )からの$e_wordは許可されていません。
掲示板管理者に該当ホストの許可を申\し出て下さい。"); } } ## --- 投稿コード生成ルーチン sub code{ srand(); local (@data,@henka,@henkan,$henkan,$rand,$maxlog,$codelogline2); @data = (0 .. 9); @henka = (a .. z,A .. Z); $henkan = @henka; for(0 .. 9){ push (@henkan,$henka[int(rand($henkan))]); } $cc = $cc_time = $wdate = time; $rand = (int(rand(100))+1) ** 4; $cc .= $rand; for(0 .. 9){ $cc =~ s/$data[$_]/$henkan[$_]/g; } open(LOG,"$code_log") || &error("ログファイルが開けられません"); @codeline = ; close(LOG); $maxlog = @codeline; $codelogline2 = ($codelogline - 2); open(LOG,">$code_log") || &error("ログファイルが開けられません"); print LOG "$cc,$cc_time\n"; if ($maxlog >= $codelogline) { foreach (0 .. $codelogline2) { print LOG $codeline[$_]; } }else { foreach (@codeline) { print LOG $_; } } close(LOG); } #---------------------------------------------------------------------------------------------- sub getstart{ # クッキーを取得 &get_cookie; # フォーム長を調整 &get_bros; # ログを読み込み open(IN,"$logfile") || &error("Can't open $logfile"); @lines = ; close(IN); # 記事番号をカット shift(@lines); # 親記事のみの配列データを作成 @new = (); foreach $line (@lines) { local($fdate,$fccc,$num,$k,$date,$name,$email, $subj,$com,$url,$host,$pw,$color) = split(/<>/,$line); # 親記事を集約 if ($k eq "") { push(@new,$line); } } # レス記事はレス順につけるため配列を逆順にする @lines = reverse(@lines); # ヘッダを出力 &header; print "
$banner1

\n"; # タイトル部 if ($title_gif eq '') { print ""; print "$title"; print "
\n"; } else { print "
\n"; } if ($pict) { $rport = $ENV{'REMOTE_PORT'}; $himicode .= "?$ENV{'REMOTE_PORT'}"; } } sub kakihyoji { if ($email) { $name = "$name"; } if (!$sbj) { $sbj = "Untitled"; } # URL表示 if ($url && $home_icon) { $url = ""; } elsif ($url && $home_icon == 0) { $url = "[HOME]"; } &jisyohenkan; &rescolor; # 自動リンク if ($autolink) { &auto_link($com); } print "

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
[$num] $sbj
1 投稿者:$name "; if ($idview && $pwd) { $pwd ='ID: '.substr($pwd,-7,7); print "($pwd)"; } if ($host_view) { if ($host_view == 1) { print " "; } elsif ($host_view == 2) { print " < $host > "; } } print "投稿日:$date$url
\n"; print "
$com
\n
\n"; ## レスメッセージを表示 @resnew = ();$resflag = 0; foreach $line (@lines) { ($dammy,$dammy,$dammy,$rk) = split(/<>/,$line); if ($num eq "$rk") {push(@resnew,$line);} } if (@resnew){ $resline = @resnew - 1; $resstart = ($resline - $reshyoji + 1); if ($resstart <= 0 || $resnum){$resstart = 0;$resend = $resline;} else{$resend = $resline;$resflag = 1;} print "


\n"; foreach ($resstart .. $resend) { ($rdate,$rccc,$rnum,$rk,$rd,$rname,$rem,$rsub,$rcom,$rurl,$rho,$rp,$rc) = split(/<>/,$resnew[$_]); $renumber = $_ +2 ; &jisyohenkan2; &rescolor2; # 自動リンク if ($autolink) { &auto_link($rcom); } if ($idview && $rp) { $rp ='(ID: '.substr($rp,-7,7).')'; } else { $rp = ''; } print "
$renumber 投稿者:$rname $rp\n"; print "投稿日:$rd
$rcom "; if ($host_view) { if ($host_view == 1) { print " "; } elsif ($host_view == 2) { print " < $rho > "; } } print "
\n"; } } print "
\n"; if($resflag){ print "\n"; } print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "名前 \n"; print "削除キー \n"; if ($pict) { print "コード\n"; print "\n"; } print "  
\n"; print "レス
\n"; print "
\n"; print "
\n"; print "

\n"; } sub allres { &getstart; $resnum = $FORM{'resnum'}; foreach (@new) { ($fdate,$fccc,$num,$k,$date,$name,$email,$sbj, $com,$url,$host,$pwd,$color) = split(/<>/,$_); if ($num eq $resnum){last;} } &kakihyoji; &footer; exit; }