;
close(IN);
# 親記事NO処理
$oya = $lines[0];
if ($oya =~ /<>/) {
&error("ログが正しくありません。
(v2.5以前のログの場合は変換の必要があります)");
}
$oya =~ s/\n//;
shift(@lines);
# 二重投稿の禁止
local($flag) = 0;
foreach $line (@lines) {
($knum,$kk,$kd,$kname,$kem,$ksub,$kcom) = split(/<>/,$line);
if ($name eq "$kname" && $comment eq "$kcom") {
$flag=1; last;
}
}
if ($flag) { &error("二重投稿は禁止です"); }
# 親記事の場合、記事Noをカウントアップし、クッキーを発行
if ($FORM{'resno'} eq "") { $oya++; }
&set_cookie;
$number = $oya;
# 削除キーを暗号化
if ($pwd) { $ango = &passwd_encode($pwd); }
# 時間を取得
&get_time;
# ログをフォーマット
$new_msg = "$number<>$FORM{'resno'}<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host<>$ango<>$color<>\n";
## 自動ソート時は、レス記事投稿時は親記事はトップへ移動
if ($res_sort && $FORM{'resno'} ne "") {
@res_data = ();
@new = ();
foreach $line (@lines) {
$flag = 0;
($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) {
($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;
($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") {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); }
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;
$value =~ s/>/>\;/g;
} else {
$value =~ s///g;
$value =~ s/<>/<\;>\;/g;
}
# 一括削除用
if ($name eq 'del') { push(@delete,$value); }
$FORM{$name} = $value;
}
$name = $FORM{'name'};
$comment = $FORM{'comment'};
$comment =~ s/\r\n/
/g;
$comment =~ s/\r|\n/
/g;
$email = $FORM{'email'};
$url = $FORM{'url'};
$url =~ s/^http\:\/\///;
$mode = $FORM{'mode'};
$subj = $FORM{'subj'};
$pwd = $FORM{'pwd'};
$color = $FORM{'color'};
}
#----------------------------#
# 掲示板の使い方メッセージ #
#----------------------------#
sub howto {
if ($tagkey == 0) { $tag_msg = "投稿内容には、タグは一切使用できません。\n"; }
else { $tag_msg = "コメント欄には、タグ使用をすることができます。\n"; }
&header;
print <<"HTML";
[掲示板にもどる]
- この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)
- $tag_msg
- 記事を投稿する上での必須入力項目は「おなまえ」と「メッセージ」です。Eメール、URL、題名、削除キーは任意です。
- 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。
- 記事の投稿時に「削除キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回削除キーによって削除することができます。
- 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。
- 既存の記事に「複数行レス」を付けることができます。記事表\示欄下部にある返信用フォームから記事を投稿することができます。
- 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。
- 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は\予\告\なく削除することがあります。
|
HTML
&footer;
exit;
}
#--------------------------#
# ワード検索サブルーチン #
#--------------------------#
sub find {
&header;
print <<"HTML";
[掲示板にもどる]
- 検索したいキーワードを入力し、検索領域を選択して「検索ボタン」
を押してください。
- キーワードを「半角スペース」で区切って複数指定することができます。
|
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) {
($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 "- [$num] $sub\n";
print "投稿者:$name $url 投稿日:$date
\n";
print "
$com
\n";
}
print "
\n";
}
&footer;
exit;
}
#--------------#
# 日時の取得 #
#--------------#
sub get_time {
$ENV{'TZ'} = "PDT+8";
($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分";
#$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";
#$date = "$year/$mon/$mday($youbi) $hour\:$min\:$sec";
}
}
#------------------------------------#
# ブラウザを判断しフォーム幅を調整 #
#------------------------------------#
sub get_bros {
# ブラウザ名を取得
$agent = $ENV{'HTTP_USER_AGENT'};
if ($agent =~ /MSIE 3/i) {
$nam_wid = 20;
$subj_wid = 35;
$com_wid = 65;
$url_wid = 40;
$nam_wid2 = 10;
} elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
$nam_wid = 20;
$subj_wid = 35;
$com_wid = 65;
$url_wid = 40;
$nam_wid2 = 10;
} else {
$nam_wid = 20;
$subj_wid = 35;
$com_wid = 65;
$url_wid = 40;
$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($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";
if ($FORM{'action'} eq '') {
print "■投稿時に記入した「削除キー」により、記事を削除します。 \n";
}
print "■削除したい記事のチェックボックスにチェックを入れ、下記フォームに「削除キー」を入力してください。 \n";
print "■親記事を削除する場合、そのレスメッセージも同時に消滅してしまうことになりますので、ご注意ください。 \n";
print " |
\n";
print "
\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";
&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("ログが正しくありません。\(v2.5以前のログの場合は変換の必要があります\)<\/small>");
}
shift(@lines);
## 削除キーによる記事削除 ##
@new=();
foreach $line (@lines) {
$dflag = 0;
($num,$k,$dt,$name,$email,$sub,$com,$url,$host,$pw) = 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); }
}
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;
($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); }
}
# 親記事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 "