#!/usr/bin/perl #日本語変換 require './jcode.pl'; #初期設定 $title = "井戸端会議 BBS"; $body = ''; $messages = <<"EOF";
腎臓病BBSへ | IBD BBSへ | アトピー・アレルギーBBSへ | ダイエットBBSへ |

DM糖尿病BBSへ | ガン BBSへ | 療養・介護BBSへ | 井戸端会議へ |

kaigi

ここは共有の場です。紳士な対応をお願いします。
他人の誹謗中傷や不愉快な投稿は原則として禁止いたします。弊社が不適切と 判断した場合、投稿を削除いたします。


投稿者名はニックネームでも結構です。
e-mailアドレスは非公開です。画面に表示はされませんのでご安心ください。
お名前、メッセージに半角カタカナを使用しないようにしてください。
トラブルを避けるために公開メッセージには電話番号、住所記入などをしないでください
EOF $cgi = "KAIGI.cgi"; $MasterURL = "./KAIGI.cgi"; $adminpasswd = "drmeal8126"; $backword ="Homeへ"; $log = "./log/KAIGI.log"; $titlecolor = "#CCCCAA"; $articletitlecolor = "#335555"; $articletitlebackground = "#3131b1"; $articlebackground = "#FFFFFF"; $MasterColor = "#DDDDAA"; $testcolor = "#e6e6fa"; $fontface = "Verdana, Arial, Helvetica, sans-serif"; $articlemax = "100"; $articlelog = "10"; $mini_fig= "10"; $cnt_color= "red"; $countfile="./KAIGIcount.txt"; #本体 &decode; if ($mode eq "usr_del") { &usr_del; } if ($mode eq "msg_del") { &msg_del; } if ($mode eq "msg") { ®ist; } if ($mode eq "admin") { &admin; } if ($mode eq "admin_del") { &admin_del; } &mainlog; #記事表示 sub mainlog { &gettime; #書き込み部の表示 print "Content-type: text/html\n\n"; &counter; print <<"EOF"; $title $body $messages
         "現在の時刻は$timeです"

EOF print <<"EOM";
[投稿削除] [管理用]


名前
mail
題名
color
キーワード(8文字まで)

\n EOM # ログを取り込み open(IN,"$log") || &error("ファイルがみつかりません"); @lines = ; close(IN); #番号の削除 shift(@lines); # 親スレの配列データ @new = (); foreach $line (@lines) {local($Mnum,$Mn,$Mtim,$Mnam,$Mema,$Msub,$Mcom, $Mhost,$Mpass,$Mcolor) = split(/<>/, $line); # 親スレを集約 if ($Mn eq "") { push(@new,$line); } } # レスはレス順につけるため配列を逆順 @lines = reverse(@lines); if ($Data{'page'} eq '') { $page = 0; } else { $page = $Data{'page'}; } # 記事数を取得 $end_data = @new - 1; $page_end = $page + ($articlelog - 1); if ($page_end >= $end_data) { $page_end = $end_data; } foreach ($page .. $page_end) { ($number,$Mn,$time,$name,$email,$Msub, $comment,$Mhost,$pwd,$Mcolor) = split(/<>/, $new[$_]); # if ($email) { $name = "$name"; } print "\n"; print "\n"; print "
\n"; print "[$number] $Msub
\n"; print "\n"; print "
\n"; print "guest:[ $name "; print "] <date : $time >
\n"; print "\n"; print "
\n"; print "$comment
\n"; ## レスメッセージを表示 foreach $line (@lines) { ($Rnum,$Rn,$Rtim,$Rnam,$Rema,$Rsub, $Rcom,$Rhost,$Rpass,$Rcolor) = split(/<>/,$line); # if ($Rema) { $Rnam = "$Rnam"; } if ($number eq "$Rn") { print "

\n"; print " \n"; print "[$Rnam] "; print "<$Rtim>"; print "
$Rcom
\n"; } } print <<"EOF";
名前
color キー
mail
内容

EOF print "

\n"; } print "\n"; # 改頁処理 $next_line = $page_end + 1; $back_line = $page - $articlelog; # 前頁処理 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"; exit; } #書き込み作業 sub regist { # 他サイトからのアクセスを排除 #if ($MasterURL) { # $Rurl = $ENV{'HTTP_REFERER'}; # $Rurl =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # if ($Rurl !~ /$MasterURL/) {&error("不正なアクセスです");} #} # 名前とコメントとキーワードは必須 if ($name eq "") { &error("名前が入力されていません"); } if ($comment eq "") { &error("コメントが入力されていません"); } if ($pwd eq "") { &error("削除キーが入力されていません"); } if ($email && $email !~ /(.*)\@(.*)\.(.*)/) {&error("Eメールの入力内容が正しくありません");} # Eメールは必須 if ($email eq "") { &error("Eメールが入力されていません"); } &gethost; &gettime; # ログを開く open(IN,"$log") || &error("ファイルがみつかりません"); @lines = ; close(IN); # 記事NO処理 $Master = $lines[0]; $Master =~ s/\n//; shift(@lines); # 二重投稿の禁止 local($flag) = 0; foreach $line (@lines) { ($Dnum,$Dn,$Dtim,$Dnam,$Dema,$Dsub,$Dcom) = split(/<>/,$line); if ($name eq "$Dnam" && $comment eq "$Dcom") {$flag=1; last;} } if ($flag) { &error("二重投稿は禁止です"); } # 親スレ、記事Noをカウントアップ if ($Data{'resno'} eq "") { $Master++; $number=$Master; } else { $number = $Master; } # 削除キーを暗号化 #if ($Data{'pwd'} ne "") { &passwd_encode($Data{'pwd'}); } # ログのフォーマット $new_msg = "$number<>$Data{'resno'}<>$time<>$name<>$email<>$sub<>$comment<>$host<>$pwd<>$color<>\n"; if ($Data{'resno'} eq "") { $i = 0; $stop = 0; foreach $line (@lines) { ($num,$n,$t,$na,$em,$sb,$com,$ho,$p,$c)=split(/<>/,$line); if ($n eq "") { $i++; } if ($i > $articlemax-1) {$stop = 1;$pastkey =0; } 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; ($num,$n,$t,$na,$em,$sb,$com,$ho,$p,$c) = split(/<>/,$line); # 親記事を抜き出す if ($n eq "" && $Data{'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,"$Master\n"); # ログを更新 open(OUT,">$log") || &error("ファイルがみつかりません"); print OUT @new; close(OUT); } sub error { print "Content-type: text/html\n\n"; print "

入力エラー

\n"; print "

$_[0]\n"; print "

\n"; exit; } ## --- フォームからのデータ処理 sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @messages = split(/&/, $buffer); foreach $messages (@messages) { ($section, $value) = split(/=/, $messages); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コードをeuc変換 &jcode'convert(*value,'euc'); # 改行等処理 if ($section eq "comment") { $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; } else { $value =~ s/\r//g; $value =~ s/\n//g; } # 一括削除用 if ($section eq 'del') { push(@delete,$value); } $Data{$section} = $value; } $name = $Data{'name'}; $comment = $Data{'comment'}; $email = $Data{'email'}; $mode = $Data{'mode'}; $sub = $Data{'sub'}; if ($sub eq "") { $sub = "無題"; } $pwd = $Data{'pwd'}; $pwd =~ s/\r//g; $pwd =~ s/\n//g; $color = $Data{'color'}; } # 時間設定 sub gettime {($sec,$min,$hour,$day,$mon,$year,$days) = localtime; @week = ('日','月','火','水','木','金','土'); $time = sprintf("%04d年%02d月%02d日 (%s) %02d時%02d分%02d秒", $year+1900, $mon+1, $day, $week[$days], $hour, $min, $sec); } ## --- 削除画面 sub msg_del { if ($Data{'action'} eq 'admin' && $Data{'pass'} ne "$adminpasswd") { &error("パスワードが違います"); } open(DB,$log) || &error("ファイルがみつかりません"); @lines = ; close(DB); shift(@lines); # 親記事のみの配列データを作成 @NEW = (); foreach (@lines) { ($number,$n,$time,$name,$email,$sub, $comment,$host,$pwd,$color) = split(/<>/, $_); if ($n eq '') { push(@NEW,$_); } } @lines = reverse(@lines); print "Content-type: text/html\n\n"; print "[掲示板へ戻る]\n"; print "\n"; print "
\n"; print "コメント削除画面

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

\n"; print "

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

\n"; print "\n"; if ($Data{'action'} eq 'admin') { print "\n"; } print "\n"; if ($Data{'page'} eq '') { $page = 0; } else { $page = $Data{'page'}; } # 記事数を取得 $end_data = @NEW - 1; $page_end = $page + ($articlelog - 1); if ($page_end >= $end_data) { $page_end = $end_data; } foreach ($page .. $page_end) { ($num,$n,$time,$name,$email,$sub, $com,$host,$pw,$color) = split(/<>/,$NEW[$_]); #if ($email) { $name="$name"; } $com =~ s/
/ /g; if (length($com) > 60) { $com = substr($com,0,58); $com = $com . '..'; } if ($Data{'action'} eq 'admin') { print "\n"; } else { print "\n"; } print "\n"; print "\n"; if ($Data{'action'} eq 'admin') { print "\n"; } print "\n"; ## レスメッセージを表示 foreach (0 .. $#lines) { ($rnum,$rn,$rt,$rname,$rem,$rsub, $rcom,$rho,$rp,$rc) = split(/<>/, $lines[$_]); $rcom =~ s/
/ /g; if (length($rcom) > 60) { $rcom=substr($rcom,0,58); $rcom=$rcom . '..'; } if ($num eq "$rn") { if ($Data{'action'} eq 'admin') { print "\n"; } else { print "\n"; } print "\n"; print "\n"; if ($Data{'action'} eq 'admin') { print "\n"; } print "\n"; } } } print "
削除記事No題名投稿者投稿日コメントホスト名
$num$sub$name$time$com$host
Res to $num$rname$rt$rcom$rho

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


\n"; exit; } ## --- 記事削除処理 sub usr_del { if ($Data{'del_key'} eq "") { &error("削除キーが入力モレです"); } if ($Data{'del'} eq "") { &error("ラジオボタンの選択がありません"); } # ログを読み込む open(DB,"$log") || &error("ファイルがみつかりません"); @lines = ; close(DB); # 親記事NO $Master = $lines[0]; if ($Master =~ /<>/) { &error("ログが正しくありません");} shift(@lines); ## 削除キーによる記事削除 ## @new=(); foreach $line (@lines) { $dflag = 0; ($num,$n,$dt,$name,$email,$sub,$com,$host,$pw,$col) = split(/<>/,$line); if ($Data{'del'} eq "$dt") { $dflag = 1; $encode_pwd = $pw; $del_num = $num; if ($n eq '') { $Masterflag=1; } } elsif ($Masterflag && $del_num eq "$n") { $dflag = 1; } if ($dflag == 0) { push(@new,$line); } } if ($del_num eq '') { &error("$Data{'del'}削除対象記事が見つかりません"); } else { if ($encode_pwd eq '') { &error("削除キーが設定されていません"); } $plain_text = $Data{'del_key'}; #&passwd_decode($encode_pwd); if ($plain_text eq $encode_pwd){$check = "yes";} else {$check = "no";} if ($check eq 'no') { &error("パスワードが違います"); } } # 親記事NOを付加 unshift(@new,$Master); ## ログを更新 ## open(DB,">$log") || &error("ファイルがみつかりません"); print DB @new; close(DB); # 削除画面にもどる &msg_del; } sub gethost { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($get_remotehost) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($host eq "") { $host = $addr; } } ## --- カウンタ処理 sub counter { # 閲覧時のみカウントアップ $match=0; if ($Data{'mode'} eq '') { $match=1; } # カウントファイルを読みこみ open(NO,"$countfile") || &error("ファイルがみつかりません"); $cnt = ; close(NO); # カウントアップ if ($match) { $cnt++; # 更新 open(OUT,">$countfile") || &error("ファイルにかきこめません"); print OUT $cnt; close(OUT); } # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . "$cnt"; } @cnts = split(//,$cnt); print "
\n"; # テキストカウンタ表示 print "$cnt"; print "
\n"; } ## --- 管理者入室画面 sub admin { print "Content-type: text/html\n\n"; print "

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

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "


\n"; exit; } sub admin_del { if ($Data{'pass'} ne "$adminpasswd") { &error("パスワードが違います"); } if ($Data{'del'} eq "") { &error("チェックボックスの選択がありません"); } # ログを読み込む open(DB,"$log") || &error("ファイルがみつかりません"); @lines = ; close(DB); # 親記事NO $Master = $lines[0]; if ($Master =~ /<>/) {&error("ログが正しくありません。");} shift(@lines); ## 削除処理 foreach $line (@lines) { $dflag=0; ($num,$n,$dt,$name,$email,$sub,$com,$pw,$col) = split(/<>/,$line); foreach $del (@delete) { if ($del eq "$dt") {$dflag = 1; $del_num = $num; if ($n eq '') { $Masterflag=1; } } elsif ($Masterflag && $del_num eq "$n") { $dflag = 1; } } if ($dflag == 0) { push(@new,$line); } } # 親記事NOを付加 unshift(@new,$Master); ## ログを更新 ## open(DB,">$log") || &error("ファイルがみつかりません"); print DB @new; close(DB); # 削除画面にもどる &msg_del; }