#!/usr/bin/perl
$ver = ""; # バージョン情報
### ■初期設定 ここから■
require './jcode.pl'; # jcodo.plのあるディレクトリに合わせて下さい。
$title = "会員専用掲示板"; # 掲示板のタイトル名
$ttl_clr = "#000088"; # 掲示板タイトルの表示色
$ttl_size = 6; # 掲示板タイトルのフォントサイズ
$brd_clr = "#FFFFFF"; # 掲示板の背景色を指定
$brd_img = ""; # 掲示板の背景にイメージを使用する場合に指定
$home = "../top.htm"; # 戻るページのURL指定
$k_key = "pass"; # 管理者用パスワード(英数字)
$pass = "0248"; # 認証用パスワード
$name_size = 3; # 投稿者名のフォントサイズ
$sbj_size = 3; # 題名のフォントサイズ
$sbj_clr = "#000000"; # 題名の表示色
$cmt_size = 3; # コメントのフォントサイズ
$cmt_clr = "#000000"; # コメントの表示色
$brd_file = "./board.log"; # 掲示板内容の格納ファイルの指定。
$script = "./1_bbs.cgi"; # スクリプトファイルの指定。
$method = "POST"; # methodの形式設定(POST or GET)
$pagelog = 10; # 1ページ表示記事数
$logmax = 100; # 最大保存ログ数
$name_clr = "#0000ff"; # 記載名の色
$tag = 0; # タグの許可(0=off,1=on)
$lock_key = 1; # ファイルロック(0=off,1=on)
$cook = 1; # クッキー(0=off,1=on)
### ■初期設定 ここまで■
### --- ログファイルチェック ---
if (!-f $brd_file) {
open(DB,">$brd_file") || &error("Can Not Log File");
close(DB);
chmod 0666,$log_file;
}
### ■メイン処理
&form_deco;
if ($FM{'pass'} ne $pass) { &pass_inp; }
if ($mode eq "bbs") { &bbs_wrt; }
if ($mode eq "del") { &bbs_del; }
&bbs_log;
exit;
### ■HTMLのヘッダー
sub header {
print "Content-type: text/html\n\n";
print "\n
\n";
print "\n";
print "$title\n";
if ($brd_img eq "") { print "\n"; }
else { print "\n"; }
print <ホームへ戻る]
$title
HTML
}
### ■フォームからの入力データ処理
sub form_deco {
if ($ENV{'REQUEST_METHOD'} eq "POST") {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。"); }
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else { $buf = $ENV{'QUERY_STRING'}; }
@data = split(/&/,$buf);
foreach (@data) {
($name,$value) = split(/=/,$_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value,'sjis'); # 文字コード変換
# --- タグの処理 ---
if ($tag == 0) {
$value =~ s/\<\;/g;
$value =~ s/>/\>\;/g;
$value =~ s/\"/\"\;/g;
} else {
$value =~ s/<>/\<\;\>\;/g;
}
$FM{$name} = $value;
}
$name = $FM{'name'};
$mail = $FM{'mail'};
$subject = $FM{'subject'};
$comment = $FM{'comment'};
$comment =~ s/\r\n\r/
/g;
$comment =~ s/\r\n/
/g;
$comment =~ s/\r|\n/
/g;
$url = $FM{'url'};
$url =~ s/^http\:\/\///;
$del_key = $FM{'del_key'};
$mode = $FM{'mode'};
$page = $FM{'page'};
$del_no = $FM{'del_no'};
$del_pwd = $FM{'del_pwd'};
$k_pwd = $FM{'k_pwd'};
# --- 日時の取得 ---
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year = 1900 + $year;
$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"; }
$date = "$year年$mon月$mday日 $hour時$min分"; # 日時のフォーマット
}
### ■error処理
sub error {
&header;
print <"$_[0]"
ホームへ戻る
HTML
exit;
}
### ■パスワード認証画面
sub pass_inp {
&header;
print <
この掲示板は会員制です。
下記フォームにてパスワードの認証を行って下さい。
HTML
exit;
}
### ■掲示板表示
sub bbs_log {
if ($cook == 1) { &getcookie; }
&header;
print <
名前・コメント・削除キーは必須項目です。
削除キーを入力する事により、投稿記事の削除が可能\です。 |
HTML
open(LOG,"$brd_file") || &error("パスワードファイルを開けません。");
@bbs = ;
close(LOG);
if ($page eq '') { $page1 = 0; }
else { $page1 = $page; }
# --- ログ数を取得 ---
$log_length = @bbs;
$page2 = $page1 + ($pagelog - 1);
if ($page2 >= $log_length - 1) { $page2 = $log_length - 1; }
print "現在の掲示数: $log_length 件 (最大保存記事数: $logmax 件)\n";
print "
\n";
foreach ($page1 .. $page2) {
($h_num,$h_date,$h_name,$h_mail,$h_subject,$h_comt,$h_url)=split(/<>/,$bbs[$_]);
if ($h_mail ne "") { $h_name = "$h_name"; }
if ($h_url ne "") { $h_url = "http://$h_url\n"; }
# --- 投稿記事がある時のみ記事表示 ---
if ($log_length != 0) {
print <$h_name $h_subject
$h_comt
$h_url
■投稿日 $h_date
HTML
}
}
print "\n";
print "\n";
print "\n";
print "| \n";
# --- 前ページ処理 ---
if ($page1 != 0) {
$page = $page1 - $pagelog;
if ($page < 0) { $page = 0; }
print "\n";
}
print " | \n";
print "\n";
# --- 次ページ処理 ---
if ($page2 ne $log_length - 1) {
$page = $page2 + 1;
print "\n";
}
print " | \n";
print "
\n";
print "
\n";
# --- ユーザー記事削除 ---
print <
以下のフォームから自分の投稿した記事を削除できます。
■削除No
■削除キー
HTML
exit;
}
### ■掲示板ログ書き込み処理
sub bbs_wrt {
# --- 名前とコメントは必須 ---
if ($name eq "") { &error("名前が入力されていません。"); }
if ($comment eq "") { &error("コメントが入力されていません。"); }
if ($del_key eq "") { &error("削除キーが入力されていません。"); }
# --- 掲示板ログを開く ---
open(LOG,"$brd_file") || &error("ログファイルを開けません。");
@bbs = ;
close(LOG);
# 二重投稿の禁止
($k_num,$k_date,$k_name,$k_mail,$k_subj,$k_comt,$k_url,$k_del_key) = split(/<>/,$bbs[0]);
if ($name eq $k_name && $comment eq $k_comt) { &error("二重投稿は禁止です。"); }
if ($url eq "http://") { $url = ""; }
$num = $k_num + 1;
unshift (@bbs,"$num<>$date<>$name<>$mail<>$subject<>$comment<>$url<>$del_key<>\n");
# --- 最大保存ログの処理 ---
@new = ();
$log_cnt = 0;
foreach $bbs (@bbs) {
$log_cnt ++;
if ($log_cnt > $logmax) { last; }
push(@new,$bbs);
}
# --- ログの更新 ---
open(LOG,">$brd_file") || &error("ログファイルに書き込めません。");
if ($lock_key == 1) { flock(LOG,2); } # File Lock
print LOG @new;
if ($lock_key == 1) { flock(LOG,8); } # File UnLock
close(LOG);
if ($cook == 1) { &setcookie; }
}
### ■記事の削除処理
sub bbs_del {
if ($del_no eq "") { &error("削除Noが入力されていません。"); }
if ($del_pwd eq "") { &error("削除キーが入力されていません。"); }
# --- ログの読み込み ---
open(LOG,"$brd_file") || &error("ログファイルが開けません。");
@bbs = ;
close(LOG);
@new = ();
$kenri = 0;
foreach (@bbs) {
$flag = 0;
@bbs_log = split(/<>/,$_);
if ($bbs_log[0] == $del_no && $bbs_log[7] eq $del_pwd) { $flag = 1; $kenri = 1; }
if ($bbs_log[0] == $del_no && $k_key eq $del_pwd) { $flag = 1; $kenri = 1; }
if ($flag ==0) { push(@new,$_); }
}
if ($kenri == 0) { &error("あなたの指定した記事No$del_noは、削除の権利がありません。"); }
# --- ログの更新 ---
open(LOG,">$brd_file") || &error("ログファイルが開けません。");
if ($lock_key == 1) { flock(LOG,2); } # File Lock
print LOG @new;
if ($lock_key == 1) { flock(LOG,8); } # File UnLock
close(LOG);
}
### ■クッキーの発行
sub setcookie {
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg)
= gmtime(time + 30*24*60*60);
if ($yearg < 10) { $yearg = "0$yearg"; }
if ($secg < 10) { $secg = "0$secg"; }
if ($ming < 10) { $ming = "0$ming"; }
if ($hourg < 10) { $hourg = "0$hourg"; }
if ($mdayg < 10) { $mdayg = "0$mdayg"; }
$yearg = 1900 + $yearg;
$mong = ('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\-$mong\-$yearg $hourg:$ming:$secg GMT";
$cookie ="name\:$FM{'name'}\,mail\:$FM{'mail'}\,url\:$url\,del\:$FM{'del_key'}";
print "Set-Cookie: BOARD=$cookie; expires=$date_gmt\n";
}
### ■クッキーの取得
sub getcookie {
@pairs = split(/;/,$ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
local($name, $value) = split(/=/, $pair);
$name =~ s/ //g;
$COOK{$name} = $value;
}
@pairs = split(/,/,$COOK{'BOARD'});
foreach $pair (@pairs) {
local($name, $value) = split(/:/, $pair);
$COOKIE{$name} = $value;
}
$cname = $COOKIE{'name'};
$cmail = $COOKIE{'mail'};
$curl = $COOKIE{'url'};
$cdel = $COOKIE{'del'};
if ($FM{'name'}) { $cname = $FM{'name'}; }
if ($FM{'mail'}) { $cmail = $FM{'mail'}; }
if ($url) { $curl = $url; }
if ($FM{'del_key'}) { $cdel = $FM{'del_key'}; }
}