#!/usr/bin/perl
# ----------------------------------------------------------------------------------
$master_name = '多重債務相談'; # 管理者の名前
$master_email = 'mail@kaikeijinkai.com'; # 管理人のメールアドレス
$master_pass = 'shigeji'; # 管理人のパスワード
$master_url = 'http://www.kaikeijinkai.com/hasan/'; # 管理者のURL(トップページ)
# -------------------------------------------------------
# ファイル関連設定 ※必須
# -------------------------------------------------------
$jcode = './jcode.pl'; # jcode.plの位置
$cgifile = './bbs1.cgi'; # このCGIの位置
$datafile = './bbs1.dat'; # データー記録ファイル
$home_gif = './home.gif'; # HP用画像の位置
$home_w = '44'; # HP用画像の横幅
$home_h = '14'; # HP用画像の縦幅
$mail_gif = './mail.gif'; # Mail用画像の位置
$mail_w = '31'; # Mail用画像の横幅
$mail_h = '16'; # Mail用画像の縦幅
$cookie_name = 'bbsusr'; # クッキーの名前(必要以外、変更不要)
# -------------------------------------------------------
# その他必要に応じて設定する項目
# -------------------------------------------------------
$title = '多重債務ご意見板'; # このCGIのタイトル
$max_page = '10'; # 1ページの表示記事数
$max_report = '30'; # 最大記事登録数(極端に大きくするとファイルが巨大化します)
$sheet = '1'; # スタイルシートを使用する(1=する 0=しない)
$stylesheetfile = './style.css'; # スタイルシートファイルのパス
$back_img = ''; # 背景画像のパス(背景画像を使用しない場合は空白にする)
$title_img = 'bbsty1.gif'; # タイトル画像のパス(背景画像を使用しない場合は空白にする)
$table_size = '480'; # 記事テーブルの横サイズ(ピクセル数か%で指定)
$lockfile = './bbs1.lock'; # ロックファイル名(必要以外変更しなくても結構です)
$lock_mode = '2'; # ロックモード(symlink関数=1 open関数=2) "1"でエラーの場合は"2"にする
# ---------- 各色設定部 --------------
$title_size = ''; # このCGIのタイトル文字サイズ
$title_color = ''; # このCGIのタイトルの文字色
$title_bgcolor = '#000000'; # 記事テーブル、項目の背景色
$title_color = '#ffffff'; # 記事タイトル文字色
# ---------- body色設定部 ------------
$bgcolor = '#000000'; # 背景色
$text_color = '#808080'; # 通常文字色
$link_color = '#6633ff'; # LINKの文字色
$alink_color = '#ff00ff'; # ALINKの文字色
$vlink_color = '#cc0099'; # VLINKの文字色
# **********************************************************************************
# オプション設定終わり ↑ここまで
# ----------------------------------------------------------------------------------
# これ以降書き換えをする場合は、個人の責任で行って下さい。
# **********************************************************************************
# [メイン処理]
if (!(-r $jcode)) { &error("jcode.plが見つかりません。"); }
require $jcode;
@DATA = &read_file($datafile);
&read_form;
if ($FORM{'ac'} eq 'new') { &html_new; }
elsif ($FORM{'ac'} eq 'control') { &password; }
elsif ($FORM{'ac'} eq 'password') { &delete1; }
elsif ($FORM{'ac'} eq 'delete') { &delete2; }
elsif ($FORM{'ac'} eq 'regist') { &check_registry; }
&html_view;
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ヘッダー部分]
sub html_header {
print "Content-type: text/html\n\n";
print "\n";
print "
\n";
print "\n";
if($sheet) {
print "\n";
}
print "$title\n";
print "\n";
if($back_img) {
print "\n";
} else {
print "\n";
}
print "\n";
print "\n";
if($title_img) {
print "
\n";
} else {
print "$title
\n";
}
print "
トップページへ\n";
print "\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [フッター部分]
sub html_footer {
print "
\n";
print "管理者へメール ログ管理\n";
print "\n\n";
print "\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [トップ表示]
sub html_view {
&html_header;
# 投稿部表示
&html_toukou;
# 登録記事数を求める。
$max_data = @DATA;
# 改ページ処理
if ($FORM{'page'} eq '') { $end_page = 0; }
else { $end_page = $FORM{'page'}; }
$end_list = ($end_page + $max_page);
if ($end_page < 0) { $end_page = 0; }
if ($end_list >= $max_data) { $end_list = $max_data; }
# 記事の表示
print "
\n";
for ($i = $end_page;$i<$end_list;$i++) {
@log = split(/★/,$DATA[$i]);
local($number,$date,$name,$title,$mail,$hpurl,$com) = split(/☆/,$log[$_]);
$name =~ s/\0/☆/g;
$title =~ s/\0/☆/g;
$com =~ s/\0/☆/g;
print "\n\n";
print "\n";
print "\n";
print "[$number] $title
\n";
print "投稿者:$name \n";
if ($mail ne '') { print " \n"; }
if ($hpurl ne '') { print " \n"; }
print "投稿日:$date
\n";
print "\n";
print "$com\n";
print " \n";
print " |
\n";
}
print "
\n\n";
# 次ページ用
$next_page = $end_list;
# まだデータが残っている場合は、次ページボタンを付け、
# 1ページに表示した人数を $next_page で返す。
if ($end_list ne $max_data) {
print "\n";
print "\n";
print "
\n";
}
&html_footer;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [投稿部]
sub html_toukou {
&read_cookie;
# ブラウザによってサイズを変更する。
local($ad_width,$name_width,$com_width) = &bura_check;
# 投稿部分
print "\n";
print "
\n\n";
print "返信希望の方はEメールを、リンク希望の方はHPを入力して下さい。
\n";
print "タグの使用は、FONT COLOR=#******〜/FONT または A HREF=***〜/A
\n";
print "程度で活用して下さい。負担のかかるタグの使用は、ご遠慮願います。
\n";
print "管理者が不適切と判断した投稿記事は削除させていただきます。
\n";
print "ネチケット(ネットマナー)を守り投稿してくださいね。^_^;
\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [投稿チェック]
sub check_registry {
if ($FORM{'name'} eq "") { &error("名前を入力してください。"); }
if ($FORM{'title'} eq '') { $FORM{'title'} = "無題"; }
if ($FORM{'com'} eq "") { &error("内容を入力してください。"); }
else { ®istry; }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルに記録]
sub registry {
# クッキー記録
&set_cookie;
# 登録番号取得
$number = $DATA[0] + 1;
# 現在時間の取得
$date = &time;
$FORM{'name'} =~ s/☆/\0/g;
$FORM{'name'} =~ s/★/\0/g;
$FORM{'title'} =~ s/☆/\0/g;
$FORM{'title'} =~ s/★/\0/g;
$FORM{'com'} =~ s/\n//g;
$FORM{'com'} =~ s/\r/
/g;
$FORM{'com'} =~ s/☆/\0/g;
$FORM{'com'} =~ s/★/\0/g;
# 最大記録数より大きければ古い記事を削除
$i = 0;
foreach $log (@DATA) {
$i++;
if ($i == $max_report) { last; }
push(@NEW,$log);
}
# データを $value に代入。
$value = "$number☆$date☆$FORM{'name'}☆$FORM{'title'}☆$FORM{'mail'}☆$FORM{'hpurl'}☆$FORM{'com'}★\n";
# データをファイルの最初に記録するようにフォーマット
unshift(@NEW,$value);
# ロック開始
if($lock_mode == 1) { &lock1; }
elsif ($lock_mode == 2) { &lock2; }
# ファイルを更新
if (!open(OUT, ">$datafile")) { &error("ファイルに記録できませんでした。"); }
print OUT @NEW;
close (OUT);
# ロック解除
&fileunlock;
print "Location: $cgifile" . '?' . "\n\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [記録ファイルの読み込み]
sub read_file {
local($data_file) = $_[0];
if (!open(IN,$data_file)) { &error("ファイルを読み込みできませんでした。"); }
local(@data_files) = ;
close(IN);
return @data_files;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [パスワード入力画面]
sub password {
&html_header;
print "
\n";
print "管理者用のパスワードを入力して下さい。
\n";
print "\n";
print "
\n";
&html_footer;
exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [認証]
sub pass {
$flag = 0;
if($FORM{'pwd'} eq $master_pass) { $flag = 1; }
if(!$flag) { &error("パスワードが違います。"); }
return;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [削除処理 1]
sub delete1 {
# パスワード認証
&pass;
&html_header;
print "\n";
print "\n\n";
&html_footer;
exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [削除処理 2]
sub delete2 {
# パスワード認証
&pass;
foreach $lines (@DATA) {
local($number,$date,$name,$title,$mail,$hpurl,$com) = split(/☆|★/,$lines);
$del = 'up';
foreach $get (@DEL) {
if ($get eq $number) { $del = 'del';}
}
if ($del eq 'up') { push(@NEW,$lines); }
}
# ロック開始
if($lock_mode == 1) { &lock1; }
elsif ($lock_mode == 2) { &lock2; }
if (!open(OUT, ">$datafile")) { &error("ファイルに記録できませんでした。"); }
print OUT @NEW;
close (OUT);
# ロック解除
&fileunlock;
print "Location: $cgifile" . '?' . "\n\n";
exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルロック(symlink)]
sub lock1 {
local($retry) = 5;
while (!symlink(".", $lockfile)) {
if(--$retry <= 0) { &error("ただ今混雑中です。しばらくしてアクセスしてください。"); }
sleep(1);
}
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルロック(open)]
sub lock2 {
foreach (1 .. 5) {
if (-e $lockfile) { sleep(1); }
else {
open(LOCK,">$lockfile");
close(LOCK);
return;
}
}
&error("ただ今混雑中です。しばらくしてアクセスしてください。");
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルロック解除]
sub fileunlock {
if (-e $lockfile) { unlink($lockfile); }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [クッキー関連処理]
# クッキー取得
sub read_cookie {
local($cookies) = $ENV{'HTTP_COOKIE'};
local($pair,%DUMMY);
local(@pairs) = split(/;/,$cookies);
foreach $pair (@pairs) {
local($name,$value) = split(/=/,$pair);
$name =~ s/ //g;
$DUMMY{$name} = $value;
}
@pairs = split(/,/,$DUMMY{$cookie_name});
foreach $pair (@pairs) {
local($name,$value) = split(/#/,$pair);
$COOKIE{$name} = $value;
}
}
# クッキー記録
sub set_cookie {
# クッキーの有効期限を30日にする
local($csec,$cmin,$chour,$cmday,$cmon,$cyear,$cwday) = gmtime(time + 30*24*60*60);
$cyear = $cyear + 1900;
$cmday = sprintf("%.2d",$cmday);
$chour = sprintf("%.2d",$chour);
$cmin = sprintf("%.2d",$cmin);
$csec = sprintf("%.2d",$csec);
$cmon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$cmon];
$cwday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$cwday];
$date_gmt = "$cwday, $cmday\-$cmon\-$cyear $chour:$cmin:$csec GMT";
local($cook) = "name\#$FORM{'name'}\,mail\#$FORM{'mail'}\,hpurl\#$FORM{'hpurl'}";
print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [フォームデータを取得し、文字コード統一]
sub read_form {
local($pair,$form_data);
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'}); }
else { $form_data = $ENV{'QUERY_STRING'}; }
local(@pairs) = split(/&/,$form_data);
foreach $pair (@pairs) {
local($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 ($name eq 'get') { push(@DEL,$value); }
else { $FORM{$name} = $value; }
}
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ブラウザチェック]
sub bura_check{
$ad_width = 50; $name_width = 20; $com_width = 50;
$agent = $ENV{'HTTP_USER_AGENT'};
if ($agent =~ /MSIE 3/i || $agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
$ad_width = $ad_width * 1.2;
$name_width = $name_width * 1.5;
$com_width = $com_width * 1.1;
}
return ($ad_width,$name_width,$com_width);
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [現在時刻を取得]
sub time{
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime();
$year = $year + 1900;
$mon = sprintf("%.2d",$mon +1);
$mday = sprintf("%.2d",$mday);
$hour = sprintf("%.2d",$hour);
$min = sprintf("%.2d",$min);
$sec = sprintf("%.2d",$sec);
# 曜日を日本語化
@week = ('日','月','火','水','木','金','土');
$wday = $week[$wday];
local($date) = "$year年$mon月$mday日($wday) $hour:$min.$sec";
return ($date);
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [エラー関連]
sub error {
&html_header;
print "
\n";
print "$_[0]\n";
print "
\n";
&html_footer;
# ロック解除
&fileunlock;
exit;
}