#!/usr/bin/perl
#日本語変換
require './jcode.pl';
#初期設定
$title = "井戸端会議 BBS";
$body = '
';
$messages = <<"EOF";
;
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 "[$number]
$Msub
|
\n";
print "\n";
print "\n";
print "guest:[
$name ";
print "] <date : $time > | \n";
print " \n";
print " \n";
print "\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";
|
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";
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";
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";
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";
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;
}