#!/usr/bin/perl

#┌─────────────────────────────────
#│  PETIT BOARD v5.6 (2005/11/20)
#│  Copyright (c) KentWeb
#│  webmaster@kent-web.com
#│  http://www.kent-web.com/
#│ 
#│ 
#│ ――――――――――――――[注意事項]――――――――――――――
#│ 
#│ 本スクリプトについて、KENT WEBサポート掲示板への質問は禁止です。
#│ 利用規定を守らない場合には本改造スクリプトの使用を一切認めません。
#│ 
#│ ――――――――――――――[注意事項]――――――――――――――
#│ 
#│ 
#│ Modified by isso. March, 2007
#│ http://swanbay-web.hp.infoseek.co.jp/index.html
#└─────────────────────────────────
$ver = 'PETIT BOARD v5.6 Rev1.96';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│    いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 改変版CGI設置に関するご質問は設置URLを明記のうえ、下記までお願いします。
#│    http://swanbay-web.hp.infoseek.co.jp/index.html
#│    お問い合わせ前に、「このサイトについて」
#│    http://swanbay-web.hp.infoseek.co.jp/about.html
#│    「よくあるご質問」
#│    http://swanbay-web.hp.infoseek.co.jp/faq.html
#│   「お問い合わせに関する注意事項」
#│    http://swanbay-web.hp.infoseek.co.jp/mail.html
#│    に必ず目を通してください。
#│
#│    最新のNGワードデータファイルは下記よりダウンロードしてください。
#│    http://swanbay-web.hp.infoseek.co.jp/spamdata.html
#│
#│    掲示板へのリンク方法をJavascript表示する方法は下記を参照下さい。
#│    http://swanbay-web.hp.infoseek.co.jp/cgi-bin/javascript.html
#│
#│    自動アクセス制限の利用方法は下記サイトを参照下さい。
#│    http://swanbay-web.hp.infoseek.co.jp/accesstrap/index.html
#│
#│    アクセス制限IPアドレスファイル下記よりダウンロードしてください。
#│    通常、このアクセス拒否IPファイルを利用するは必要ありません。
#│    このファイルを利用したことによるいかなる損害に対しても当方は一切の責任を負いません。
#│    http://swanbay-web.hp.infoseek.co.jp/accessdeny.html
#│＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
#│本改造スクリプトに関してはKENT氏に問い合わせしないようお願いします。
#│￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
#│ 3. 添付の home.gif は L.O.V.E の mayuRin さんによる画像です。
#└─────────────────────────────────
#
# 【ファイル構成例】
#
#  public_html (ホームディレクトリ)
#      |
#      +-- petit / petit.cgi [705]
#            |     petit.log [606]
#            |     count.dat [606]
#            |     jcode.pl  [604]
#            |     pastno.dat[606]
#            |     home.gif
#            |
#            +-- data [707] /  spamdata.cgi [606]...NGワード用
#            |
#            +-- lock [707] /
#            |
#            +-- past [707] / 1.dat [606] ...

#============#
#  設定項目  #
#============#

# 文字コードライブラリ取込
require './jcode.pl';

# タイトル名を指定
$title = "GFCの掲示板";

# タイトルの色
$t_color = "#008080";

# タイトル文字のサイズ
$t_size = '24px';

# タイトル文字のフォントタイプ
$t_face = "ＭＳ Ｐゴシック";

# 本文の文字サイズ
$b_size = '13px';

# 壁紙を指定する場合（http://から指定）
$backgif = "";

# 背景色を指定
$bgcolor = "#E1F0F0";

# 文字色を指定
$text = "#000000";

# リンク色を指定
$link  = "#0000FF";	# 未訪問
$vlink = "#800080";	# 訪問済
$alink = "#FF0000";	# 訪問中

# 戻り先のURL (index.htmlなど)
$homepage = "../index.html";

# 最大記事数
$max = 100;

# 管理者用マスタパスワード (英数字で８文字以内)
$pass = 'haguremetaru';

# 返信がつくと親記事をトップへ移動 (0=no 1=yes)
$topsort = 1;

# 返信フォーム複数行化 (0=no 1=yes)
$res_forms = 0;

# タイトルにGIF画像を使用する時 (http://から記述)
$title_gif = "";
$tg_w = 150;	# GIF画像の幅 (ピクセル)
$tg_h = 50;	#    〃    高さ (ピクセル)

# ファイルロック形式
# → 0=no 1=symlink関数 2=mkdir関数
$lockkey = 0;

# ロックファイル名
$lockfile = './lock/petit.lock';

# ミニカウンタの設置
#  --> 0=no 1=テキスト 2=GIF画像
$counter = 1;

# ミニカウンタの桁数
$mini_fig = 7;

# テキストのとき：ミニカウンタの色
$cnt_color = "#DD0000";

# ＧＩＦのとき：画像までのディレクトリ
# → 最後は必ず / で閉じる
$gif_path = "./img/";
$mini_w = 8;		# 画像の横サイズ
$mini_h = 12;		# 画像の縦サイズ

# カウンタファイル
$cntfile = './count.dat';

# スクリプトのファイルURL
$script  = './bbs.cgi';

# ログファイルを指定
#  --> フルパスで指定する場合は / から記述
$logfile = './gfc.log';

# 記事 [タイトル] 部の長さ (全角文字換算)
$sub_len = 14;

# 記事の [タイトル] 部の色
$sub_color = "#006400";

# 記事表示部の下地の色
$tbl_color = "#FFFFFF";

# 家アイコンの使用 (0=no 1=yes)
$home_icon = 1;
$home_gif = "./home.gif";	# 家アイコンのファイル名
$home_wid = 16;			# 画像の横サイズ
$home_hei = 20;			#   〃  縦サイズ

# 記事の更新は method=POST 限定 (0=no 1=yes)
#  --> セキュリティ対策
$postonly = 1;

# 同一IPアドレスからの連続投稿時間（秒数）
#  --> 連続投稿などの荒らし対策
#  --> 値を 0 にするとこの機能は無効になります
$wait = 60;

# １ページ当たりの記事表示数 (親記事)
$p_log = 10;

# 投稿があるとメール通知する (sendmail必須)
#  0 : 通知しない
#  1 : 通知するが、自分の投稿記事はメールしない。
#  2 : 通知する。自分の投稿記事も通知する。
$mailing = 0;

# メールアドレス(メール通知する時)
$mailto = 'xxx@xxx.xxx';

# sendmailパス（メール通知する時）
$sendmail = '/usr/lib/sendmail';

# 他サイトから投稿排除時に指定 (http://から書く)
$base_url = "";

# 文字色の設定。
@color1 = ('800000','DF0000','008040','0000FF','C100C1','FF80C0','FF8040','000080');
@color2 = ('茶','赤','みどり','青','紫','ピンク','オレンジ','あい色');

# URLの自動リンク (0=no 1=yes)
$autolink = 1;

# タグ広告挿入オプション
#  → <!--上部--> <!--下部--> の代わりに「広告タグ」を挿入する。
#  → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。
$banner1 = '<!-- 上部 -->';	# 掲示板上部に挿入
$banner2 = '<!-- 下部 -->';	# 掲示板下部に挿入

# 投稿後の処理
#  → 掲示板自身のURLを記述しておくと、投稿後リロードします
#  → ブラウザを再読み込みしても二重投稿されない措置。
#  → Locationヘッダの使用可能なサーバのみ
$location = '';

# ホスト取得方法
# 0 : gethostbyaddr関数を使わない
# 1 : gethostbyaddr関数を使う
$gethostbyaddr = 0;

# アクセス制限（半角スペースで区切る、アスタリスク可）
#  → 拒否ホスト名を記述（後方一致）【例】*.anonymizer.com
$deny_host = '';
#  → 拒否IPアドレスを記述（前方一致）【例】210.12.345.*
$deny_addr = '';

# 禁止ワード
# → 投稿時禁止するワードをコンマで区切る
$no_wd = '';

# 日本語チェック（投稿時日本語が含まれていなければ拒否する）
# 0=No  1=Yes
$jp_wd = 1;

# URL個数チェック
# → 投稿コメント中に含まれるURL個数の最大値
$urlnum = 3;

# １回当りの最大投稿サイズ (bytes)
$maxData = 51200;

#---(以下は「過去ログ」機能を使用する場合の設定です)---#
#
# 過去ログ生成 (0=no 1=yes)
$pastkey = 1;

# 過去ログ用NOファイル
$nofile  = './pastno.dat';

# 過去ログのディレクトリ
# → フルパスなら / から記述（http://からではない）
# → 最後は必ず / で閉じる
$pastdir = './past/';

# 過去ログ１ファイルの行数
# → この行数を超えると次ページを自動生成します
$log_line = 600;


#-------------------------------------------------
# ログファイル消失防止
#-------------------------------------------------
# ログファイル消失防止機能の利用
# Write Errorになる場合は掲示板設置ディレクトリの
# パーミッションを(707や777に)変更するか、
# この機能をゼロに設定してください
# 0 : 利用しない
# 1 : 利用する
$logbackup = 1;

# 一時ログファイル
$tempfile = './pt_temp.cgi';

#-------------------------------------------------
# スパム投稿(宣伝投稿)拒否設定
#-------------------------------------------------
# 通常は設定変更の必用はありません(特に秒数設定)。
# そのままで運用して頂き、拒否できない投稿が多いか
# あるいは誤処理が多い場合にのみ設定を変更して下さい。
# [基本設定] のみの設定でほとんど全てのスパムを排除できます。
# 通常は [拡張オプション] を使用しないで(ゼロに設定して)下さい。

# ＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# [基本設定]  (ゼロにはせず、必ず設定して下さい)
# ￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
# フォーム投稿確認用
# 削除すると動作しませんので絶対に削除しないで下さい。(変更は可)
# 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。
# 
# 変更する場合は意味不明な文字列にすることをお薦めします。
# (例) $bbscheckmode = 'L4g_Ks16_4Nd9c';
$bbscheckmode = 'PETIT_BOARD';

# 削除すると動作しませんので絶対に削除しないで下さい。(変更は可)
# 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。
# 特に必用がなければ、変更せずに初期設定のまま運用してください。
# 
# 変更する場合は意味不明な文字列かあるいは
# cancel,clear,delete,reject,reset,erase,annul,effase
# などの語句(を含む文字列)にして下さい。
# ただし、下で設定する$postvalueとは違う文字列にしてください。
# (例) $writevalue = 'k9SL0sv_3rk_wq2';
# (例) $writevalue = 'cancel';
$writevalue = 'cancel';

# 削除すると動作しませんので絶対に削除しないで下さい。(変更は可)
# 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。
# 特に必用がなければ、変更せずに初期設定のまま運用してください。
# 
# 変更する場合は意味不明な文字列かあるいは
# cancel,clear,delete,reject,reset,erase,annul,effase
# などの語句(を含む文字列)にして下さい。
# ただし、上で設定した$writevalueとは違う文字列にしてください。
# (例) $postvalue = 'x2oMw7fepc_7ge3';
# (例) $postvalue = 'clear';
$postvalue = 'clear';

# 削除すると動作しませんので絶対に削除しないで下さい。(変更は可)
# 半角の英数字およびアンダースコアのみ設定可能、空白や記号は設定不可です。
# 特に必用がなければ、変更せずに初期設定のまま運用してください。
$formcheck = 'formcheck';

# 掲示板アクセスからの経過時間(秒)
# 投稿フォームを使わないプログラム投稿対策です。
# 投稿者が掲示板を開いて投稿完了するまでの最小時間間隔です。
# 通常は数秒程度に設定しておきます。
# 初期設定は5秒で、ゼロにするとこのチェックは行いません。
$mintime = 5;

# 投稿者が掲示板を開いて投稿完了するまでの最長時間間隔です。
# 通常は7200秒(2時間)〜90000秒(25時間)程度に設定しておきます。
# 初期設定は18,000秒(5時間)で、ゼロにするとこのチェックは行いません。
$maxtime = 18000;

# 投稿までの間隔がグレーゾーンの場合には
# プレビューを表示してから投稿
# 0 : プレビューを表示しない
# 1 : プレビューを表示する【推奨】
$previewtime = 1;

# プレビュー非表示の最小時間
# アクセスから投稿までの時間間隔が設定秒数以下の場合、
# 投稿内容をプレビュー表示し、クリック後に書き込み処理をします。
# 通常は初期設定のままで問題ありません。
# 拒否されないスパムが多くなるようでしたら長く設定してください。
# 推奨値15〜60(秒)、初期設定は 25(秒)。
$previewmin = 25;

# プレビュー非表示の最大時間
# アクセスから投稿までの時間間隔が設定秒数以上の場合、
# 投稿内容をプレビュー表示し、クリック後に書き込み処理をします。
# 通常は初期設定のままで問題ありません。
# 拒否されないスパムが多くなるようでしたら短く設定してください。
# 推奨値1000〜10000(秒)、初期設定は5000秒(約80分)。
$previewmax = 5000;

# チェックデータの符号化処理
# 0 : 符号化しない
# 1 : 符号化する(解析対策)
$fcencode = 1;

# ハッシュキーの変換設定
# 0 : ハッシュキー変換しない
# 1 : ハッシュキー変換をする(スパム対策)
$keychange = 1;

# 句読点を定義
# 句読点として認める記号を設定しておきます。
# 日本語チェックでは句読点を含まないと日本語文ではないと判断します。
@period = ("、","，","。","．","？","！");

# ＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# [投稿拒否ログ設定]  (スパム投稿として拒否された書き込みに関する設定です)
# ￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
# 掲示板スパムの投稿拒否ログ
# 数ヶ月間はログを記録し、
# 誤処理がなければ「記録しない」にして下さい。
# 
# 0 : 記録しない
# 1 : 全てのスパム投稿を記録する
# 2 : 日本語の投稿のみを記録する
$spamlog = 2;

# 投稿拒否ログファイル
$spamlogfile = './data/spamlog.cgi';

# 投稿拒否ログ1ページあたりの表示数
# 20に設定すると、拒否ログ閲覧の1ページに20件の拒否ログを表示します
$spamlog_page = 20;

# 投稿拒否ログファイル設定
# 投稿拒否ログファイル容量が大きくなり設定容量を超過すると
# 警告を出すか古い拒否ログから順番に削除するかを選択します。
# 0 : 掲示板に警告メッセージをを出す
# 1 : 古い拒否ログから順に自動削除する
$spamlog_max = 1;

# 投稿拒否ログファイルの最大容量
# この許容量を超過すると上記の設定に従って
# 「投稿拒否ログファイルを削除」するよう警告を出すか、
# 古い拒否ログから順番にログを削除します。
# 初期値は 1000000 (1MB)。
$spamlog_maxfile = 1E06;

# 投稿拒否ログに残すURL許容数
# スパム投稿に、この設定値以上のURLが書き込まれていた場合、
# 拒否ログにはメッセージ本文を省略して記録します。
# 推奨値は20〜50、初期値は20。
$maxurl = 20;

# ＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# [オプション設定]  (必用があれば設定変更して下さい)
# ￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
# ホスト情報の取得できないIPアドレスからのアクセス制限
# ホスト情報を取得できないIPアドレスからのアクセスを拒否する場合には 1 にします。
# ニフティ、ぷらら、インフォシーク等を利用している場合や、
# 意味が分からない場合にには 0 のままにしておいてください。
#   0 : アクセスを許可する
#   1 : アクセスを拒否する
$da = 0;

# スパムチェック緩和設定
# クッキーデータがある場合(常連投稿者)には
# スパムチェックを緩和し投稿しやすくします。
# 0 : 通常通りスパムチェックをする
# 1 : スパムチェックを緩和する【推奨】
$cookiecheck = 1;

# URL重複書き込み設定
# URL欄に記入したURLと同一URLがメッセージ内に書かれている場合
# スパム投稿と見なし書き込みを拒否します。
# 日本語のアダルト・出会い系・ワンクリック詐欺スパムに
# この傾向が多く見られます。
# 
# 0 : URLの重複書き込みを許可する
# 1 : 新規投稿の場合のみURLの重複書き込みを拒否する【推奨】
# 2 : 返信でもURLの重複書き込みを拒否する
$urlcheck = 1;

# 名前の最大長設定
# 50に設定すると、名前の長さが50バイト(日本語で25文字)以上の場合に投稿を拒否します。
# ゼロにするとこのチェックは行いません。初期設定は50(推奨値30〜50)。
$namelen = 50;

# 禁止語句(NGワード、URL)登録ファイル
# 書き込み禁止語句を登録するファイルです。
# このファイルに登録された語句、URLを本文やURL欄に書き込むと投稿拒否されます。
# このファイルを削除すると、禁止語句のチェックは行いません。
$spamdata = './data/spamdata.cgi';

# 最新の禁止語句(NGワード、URL)登録ファイルは下記よりダウンロードしてください。
# http://swanbay-web.hp.infoseek.co.jp/spamdata.html

# 禁止語句(NGワード、URL)チェック設定
# 0 : 新規投稿の場合のみ禁止語句(NGワード、URL)チェックをする
# 1 : 返信でも禁止語句(NGワード、URL)チェックをする
$spamdatacheck = 1;

# 0 : メールアドレス欄は禁止語句チェックをしない
# 1 : メールアドレス欄も禁止語句チェックをする
$ngmail  = 1;

# 0 : タイトル欄は禁止語句チェックをしない
# 1 : タイトル欄も禁止語句チェックをする
$ngtitle = 1;

# ここでは、多数のURL書き込みを禁止することができます。
# URLの直接書き込みを許可する場合($comment_url = 0; に設定)は
# URLを書き込める限度数を設定します。
# 10に設定すると、http://〜を10以上書き込んだ投稿を拒否します。
# ゼロにするとこのチェックは行いません。初期設定は5(推奨値5〜10)。
$spamurlnum = 5;

# 掲示板スパム投稿時の処理
# 0 : CGI(サーバー)エラーを返す
# 1 : すぐに下記のエラーメッセージを表示
# それ以外の数値 : 数値秒後にエラー表示
# 3600に設定すると3600秒(60分)後に下記のエラーメッセージを表示
$spamresult = 1;

# スパムと判断された場合の表示メッセージ
# $spammsg = '投稿は正常に受理されました';
# と設定すると通常の書き込みと投稿拒否を区別できなくすることができます。
# スパム業者に投稿拒否を知られづらくなります。(日本語スパムが多い掲示板向け)
# $spammsg = '';
# とメッセージを設定しない場合にはCGI(サーバー)エラーを返して
# 掲示板が削除されたかのように振る舞います。
# 初期設定は
# $spammsg = '迷惑投稿として正常に処理されました';
$spammsg = '迷惑投稿として正常に処理されました';

# 携帯からのURL入力禁止
# 0 : 携帯からの投稿でもURLの記載を許可する
# 1 : 携帯からの投稿ではURLの記載を禁止する
$keitaiurl = 1;

# チェックデータのJavascript表示化
# 1に設定するとJavascript表示に対応していない
# プログラムからの投稿を排除することができます。
# 0 : チェックデータのJavascript表示しない
# 1 : チェックデータのJavascript表示化する(スパム対策)
$javascriptpost = 0;

# タイトル入力チェック
# 0 : タイトル未入力のときは「無題」にする
# 1 : タイトル未入力のときはエラー表示する
# 2 : 半角数字のみのタイトルやhttp://を含むタイトルのときはエラー表示する
$suberror = 0;

# メッセージ内の日本語をチェック
# メッセージ内にひらがな、カタカナおよび句読点が含まれているかをチェックします。
# 0 : メッセージに日本語が含まれていなくても投稿を許可する
# 1 : メッセージに日本語が含まれていない場合は投稿を拒否する
$asciicheck = 0;

# メッセージ文字数のチェック設定
# 20に設定すると、URLの記載がある場合に限り
# URL以外の文字数が半角文字で20文字未満、
# 全角文字で10文字未満の場合に投稿を拒否します。
# ゼロにするとこのチェックは行いません。
$characheck = 0;

# 投稿用の合い言葉設定
# 合い言葉の入力を必須とする場合に設定してください。
# (合い言葉設定例)
# $aikotoba = 'ほげほげ';
# 合い言葉を利用しない場合には何も書かないでください。
$aikotoba = '';

# 合い言葉を設定する場合、合い言葉のヒントを書いてください。
# (例) 合い言葉には○○○をひらがなで書いてください
$hint = "合い言葉欄には$aikotobaと書いてください";

# 掲示板を検索サイトロボットの検索対象から外す
# 掲示板を検索サイトロボットの検索対象から外す場合には 1 にします。
#  0 : 検索を許可する
#  1 : 検索対象から外す
$norobot = 0;

# ＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# [拡張オプション設定] (非常用/特に必要性のある場合のみ設定して下さい。)
# ￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
# この [拡張オプション] は基本的には設定せず、全てゼロのままご利用下さい。
# この項目を設定しなくてもスパム投稿は排除できます。
# 設定してスパムチェックを厳しくするとスパム投稿は全く無くなりますが、
# それと同時に、投稿時の制限が多いと通常の投稿も減ります。
# 
# 
# [拡張オプション] URLの直接書き込みを禁止する
# URL(http://〜)のメッセージ内への直接書き込みを禁止し、
# ttp://〜と書き込んだときだけ、URLの書き込みを許可します。
# 0 : URLの直接書き込みを許可する
# 1 : URLの直接書き込みを禁止する(URLを書き込む場合には ttp://〜と記述)
$comment_url = 0;

# [拡張オプション] 掲示板への直接アクセス投稿制限
# 掲示板へ直接アクセスした場合に投稿を禁止させることができます。
# 掲示板リストを作成して自動投稿をするようなスパムを排除できますが、
# ブックマークから直接掲示板にアクセスした場合も投稿制限を受けます。
# 0 : 投稿を許可する
# 1 : 投稿を禁止する(閲覧は可能)
# 2 : 「404 Not Found」エラーを返す
$referercheck = 0;

# [拡張オプション] URL転送・短縮URLの掲載禁止設定
# URL転送サービスおよび短縮URLサービスの疑いのあるURLを
# 本文かURL欄に掲載した場合、投稿を禁止させることができます。
# (例) http://symy.jp/ http://xrl.us/ http://jpan.jp/
# http://urlsnip.com/ http://tinyurl.com/ http://204.jp/  など
# 
# 0 : 投稿を許可する
# 1 : 投稿を禁止する
$shorturl = 0;

# [拡張オプション] 不正な削除キーの禁止
# 削除キーに半角スペースを含む場合や、
# 「111111」「aaaaa」のような一字の繰り返しを禁止できます
# 0 : 不正な削除キーを禁止しない
# 1 : 不正な削除キーを禁止する
$ng_pass = 0;

# [拡張オプション] メールアドレスの入力を禁止できます
# 0 : メールアドレスの入力を自由にする
# 1 : メールアドレスの入力を禁止する
# 2 : メールアドレスの入力はアットマークを全角入力「 ＠ 」に限定する
$no_email = 0;

# [拡張オプション] 投稿端末
# 0 : 携帯からの投稿はスパムチェックをゆるめる
# 1 : 携帯からの投稿でも最低限のスパムチェックをする
# 2 : 携帯からの投稿でもブラウザと同様にスパムチェックをする
$keitaicheck = 0;

# [拡張オプション] 投稿IPアドレスチェック設定
# アクセスIPアドレスと投稿IPアドレスが一致しない場合、
# 投稿を拒否することができます。
# 0 : IPアドレスが一致しなくても投稿許可する
# 1 : IPアドレスが一致しない場合は投稿拒否する
$ipcheckmode = 0;

# [拡張オプション] 日本語環境チェック
# ブラウザの言語コード設定に日本語(ja)がある場合のみ
# 投稿を許可させることができます。
# 0 : 日本語環境以外からの投稿を許可する
# 1 : 日本語環境以外からの投稿は拒否する
$japanese = 0;

# ＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
# [自動アクセス制限設定] (下記の利用方法をお読み下さい) 
# ￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
# 自動アクセス制限の利用方法は下記サイトを参照下さい。
# http://swanbay-web.hp.infoseek.co.jp/accesstrap/index.html
# 
# [自動アクセス制限設定] 制限ファイル
# 変更しないでください。
$denyfile = './data/denyaddress.cgi';

unless (-e $denyfile) {
	if (-e "./denyaddress.cgi") { $denyfile = "./denyaddress.cgi"; }
}

# アクセス制限IPアドレスファイル(外国からのスパム拒否用)
$deny_addr_file = './data/deny_addr_file.cgi';

# アクセス拒否IP追加
@denyaddr= split(/\s+/, $deny_addr);
if (-e $deny_addr_file) {
	open(IN, "$deny_addr_file");
	$deny_addr2 = <IN>;
	close(IN);
	@deny_addr2 = split(/\s+/, $deny_addr2);
	push(@denyaddr, @deny_addr2);
}


#============#
#  設定完了  #
#============#
if($writevalue eq $postvalue) {
	&error("\$writevalueと\$postvalueの文字は同じにしないでください"); }

# データ用ディレクトリ
unless(-d "./data/") {
	mkdir ("./data/", 0707) || die "ディレクトリを作成できません : $!";
}

# メイン処理
&agent;
&decode;
&axscheck;
&previewcheck;

if ($mode eq "howto") { &howto; }
elsif ($mode eq "find") { &find; }
elsif ($mode eq "usr_del") { &usr_del; }
elsif ($mode eq "$writevalue" && $in{'pview'} ne "on") { &regist; }
elsif ($mode eq "$postvalue" && $in{'pview'} eq "on") { &regist; }
elsif ($mode eq "$writevalue" && $in{'pview'} eq "on") { &error("$spammsg"); }
elsif ($mode eq "previewmode") { &previewmode("$timecheck"); }
elsif ($mode eq "admin") { &admin; }
elsif ($mode eq "image") { &image; }
elsif ($mode eq "past") { &past; }
elsif ($mode eq "check") { &check; }
elsif ($mode eq "spam") { &spam; }
elsif ($mode eq "spammsg") { &spammsg; }
elsif ($mode eq "spamclear") { &spamclear; }
elsif ($mode eq "spamdata") { &spamdata; }
elsif ($mode eq "editspam") { &editspam; }
elsif ($mode eq "admin_repost_form") { &admin_repost_form; }
elsif ($in{'pass'} eq $pass && $mode eq "admin_repost") { &regist; }
elsif ($mode eq 'noscript') { &noscript; }
&html_log;

#---------------------------------------
#  アクセス制限
#---------------------------------------
sub axscheck {
	# IP&ホスト取得
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};

	if ($gethostbyaddr && ($host eq "" || $host eq $addr)) {
		$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
	}

	if ($da) {
		if ($host =~ /\d$/) {
			&error("ホスト名が不明なためアクセスできません。<br>\n".
			"ご利用ネットワークの管理者にDNS登録をお願いしてください。");
		}
	}

	# IPチェック
	local($flg);
	foreach (@denyaddr) {
		s/\./\\\./g;
		s/\*/\.\*/g;

		if ($addr =~ /^$_/i) { $flg = 1; last; }
	}
	if ($flg) {
		&error("アクセスを許可されていません。<br>掲示板管理者までお問い合わせ下さい。");

	# ホストチェック
	} elsif ($host) {

		foreach ( split(/\s+/, $deny_host) ) {
			s/\./\\\./g;
			s/\*/\.\*/g;

			if ($host =~ /$_$/i) { $flg = 1; last; }
		}
		if ($flg) {
			&error("アクセスを許可されていません");
		}
	}
	if ($host eq "") { $host = $addr; }
	if (-e "$denyfile") { &spambot; }
	if ($keitai eq "p") {
		if ($referercheck == 2 && !$ENV{'HTTP_REFERER'}) { &cgi_error; }
	}
}

#-------------------------------------------------
#  携帯機種チェック
#-------------------------------------------------
sub agent {
	# 携帯のUSER_AGENT
	@keitai = ('DoCoMo','KDDI','J-PHONE','Vodafone','DDIPOCKET','ASTEL','PDXGW','L-mode','UP.Browser','MOT-','Mozilla');
	@ktype = ('i','e','j','v','d','a','h','l','e','v','p');

	# 携帯機種設定
	local($agent) = $ENV{'HTTP_USER_AGENT'};
	$method = 'POST'; $keitai = 'p';

	local ($i) = 0;
	foreach (@keitai) {
		if ($agent =~ /\Q$_\E/i) { $keitai = $ktype[$i]; last; }
		$i++;
	}
	if ($keitai eq  'v' || $keitai eq  'j') { $method = 'GET'; }
}

#--------------#
#  記事表示部  #
#--------------#
sub html_log {
	# クッキーを取得
	local($cnam,$ceml,$curl,$cpwd,$ccol,$caikotoba) = &get_cookie;
	if ($curl && $curl !~ /^http\:\/\//) { $curl = "http://$curl"; }

	# ヘッダを出力
	&header;

	# カウンタ処理
	if ($counter) { &counter; }

	# タイトル部
	print "<center>\n";
	if ($banner1 ne "<!-- 上部 -->") { print "$banner1<P>\n"; }
	if ($title_gif eq '') {
		print "<font color=\"$t_color\" size=\"6\" face=\"$t_face\"><b style=\"font-size: $t_size\">$title</b></font>\n";
	} else {
		print "<img src=\"$title_gif\" width=\"$tg_w\" height=\"$tg_h\">\n";
	}

	local($access) = &encode_bbsmode();
	local($enaddress) = &encode_addr();
	if ($keychange) { $url_key  = 'email'; $mail_key = 'url'; $name_key = 'comment'; $comment_key = 'name';
	} else { $url_key  = 'url'; $mail_key = 'email'; $name_key = 'name'; $comment_key = 'comment'; }
	if ( (-s $spamlogfile) > $spamlog_maxfile ) {
		print "<br>\n<br>\n<b style='color:#FF0000'>投稿拒否ログ(スパムログ)のファイルサイズが大きくなりました。<br>",
		"至急、管理モードから投稿拒否ログを削除して下さい。</b><br>\n<br>\n";
	}

	print "<hr width='90%'>\n";
	print "[<a href=\"$homepage\" target='_top'>トップに戻る</a>]\n";
	print "[<a href=\"$script?mode=howto\">留意事項</a>]\n";
	print "[<a href=\"$script?mode=find\">ワード検索</a>]\n";

	# 過去ログのリンク部を表示
	if ($pastkey) {	print "[<a href=\"$script?mode=past\">過去ログ</a>]\n"; }

	print <<"EOM";
[<a href="$script?mode=admin">管理用</a>]
<hr width='90%'>
</center>
<blockquote>
<form method="$method" action="$script">
EOM
	if ($keitai eq 'p') {
		if ($javascriptpost) {
			print <<EOM;
<script type="text/javascript">
<!-- //
fcheck("me='$bbscheckmode' val","<input t","ype='hidden' na","ue='$access'>");
// -->
</script>
EOM
		} else { print "<input type=\"hidden\" name=\"$bbscheckmode\" value=\"$access\">\n"; }
	} else { print "<input type=\"hidden\" name=\"$bbscheckmode\" value=\"$access\">\n"; }
	print <<EOM;
<!-- //
<input type="hidden" name="mode" value="write">
// -->
<table border="0" cellspacing="0">
<tr>
  <td nowrap><b>おなまえ</b></td>
  <td><input type="text" name="$name_key" size="30" value="$cnam"></td>
</tr>
EOM
	if ($aikotoba) {
		print "<tr>\n  <td nowrap><b>合い言葉</b></td>\n  <td>",
		"<input type=\"text\" name=\"aikotoba\" size=\"10\" value=\"$caikotoba\">",
		"<font color=\"#FF0000\">※必須</font></td>\n</tr>";
		if ($caikotoba ne $aikotoba) { print "<tr>\n  <td nowrap colspan=\"2\"><b>$hint</b></td>\n</tr>\n"; }
	}
	print <<EOM;
<tr>
  <td nowrap><b>Ｅメール</b></td><td>
    <input type="hidden" name="mail" size="28" value="$enaddress">
    <input type="text" name="$mail_key" size="30" value="$ceml">
EOM
	if ($no_email eq '1') { print "<b style='color:#FF0000'>メールアドレスは入力禁止</b>\n"; }
	elsif ($no_email eq '2') { print "<b style='color:#FF0000'>入力する場合には必ず＠を全角で書いて下さい</b>\n"; }
	print <<EOM;
</td>
</tr>
<tr>
  <td nowrap><b>タイトル</b></td>
  <td nowrap>
<!-- //
    <input type="text" name="subject" size="36" value="">
// -->
    <input type="hidden" name="title" size="36" value="">
    <input type="hidden" name="theme" size="36" value="">
    <input type="text" name="sub" size="38">
EOM
	if ($keitai eq 'p') {
		if (!$referercheck || $ENV{'HTTP_REFERER'}) {
			print "    <input type=\"hidden\" name=\"mode\" value=\"$writevalue\">\n";
			if ($javascriptpost) {
				print <<EOM;
<script type="text/javascript">
<!-- //
fcheck("value='投稿する'><input t","<input t","ype='submit' ","ype='reset' value='リセット'>");
// -->
</script>
<noscript><br><b>Javascriptを有効にしてください。</b><br><br></noscript>
EOM
			} else { print "<input type=\"submit\" value=\"投稿する\"><input type=\"reset\" value=\"リセット\">"; }
		} else { print "<BR>\n<B>掲示板へ直接アクセスした場合には投稿できません。",
			"<A HREF=\"$home\">トップページ</A>から入り直してください。</B>\n"; }
	} else {
		print "<input type=\"hidden\" name=\"mode\" value=\"$writevalue\">\n";
		print "<input type=\"submit\" value=\"投稿する\"><input type=\"reset\" value=\"リセット\">";
	}

	print <<EOM;
  </td>
</tr>
<tr>
  <td colspan="2">
    <b>コメント
EOM
	if ($comment_url) { print "【コメント内のＵＲＬは先頭のｈを抜いて書き込んで下さい。】"; }
	print <<EOM;
</b><br>
    <textarea cols="58" rows="7" name="$comment_key" wrap="soft"></textarea>
  </td>
</tr>
<!--//
<tr>
  <td><b>URL</b></td>
  <td><input type="text" name="url2" size="50" value=""></td>
</tr>
//-->
EOM
	$f_c_d = int(rand(5E07)) + 11E08;
	if ($urlcheck) { print "<tr>\n<td colspan=\"2\">\n",
	"<b>コメント内にはURL欄と同じURLを書き込まないで下さい</b>\n",
	"</td>\n</tr>\n"; }
	print <<EOM;
<tr>
  <td><input type="hidden" name="$formcheck" value="$f_c_d"></td>
</tr>
<tr>
  <td nowrap><b>ＵＲＬ</b></td>
  <td><input type="text" size="55" name="$url_key" value="$curl"></td>
</tr>
EOM

	print "<tr><td nowrap><b>削除キー</b></td>\n";
	print "<td><input type=\"password\" name=\"pwd\" size=\"8\" maxlength=\"8\" value=\"$cpwd\">\n";
	print "(記事削除時に使用。英数字で8文字以内)</td></tr>\n";
	print "<tr><td nowrap><b>文字色</b></td><td>\n";

	# クッキーの色情報がない場合
	if ($ccol eq "") { $ccol = $color1[0]; }
	foreach (0 .. $#color1) {
		if ($ccol eq $color1[$_]) {
			print "<input type=\"radio\" name=\"color\" value=\"$color1[$_]\" checked>";
			print "<font color=\"$color1[$_]\">■</font>\n";
		} else {
			print "<input type=\"radio\" name=\"color\" value=\"$color1[$_]\">";
			print "<font color=\"$color1[$_]\">■</font>\n";
		}
	}

	print "</td></tr></table></form>\n";
	print "</blockquote><center><br>\n";

	# 記事を展開
	$i = 0;
	$flag = 0;
	$rf_flag = 0;
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$top = <IN>;
	while (<IN>) {
		$rf_flag = 1;
		($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color) = split(/<>/);
		if ($reno eq "") { $i++; }
		if ($i < $page + 1) { next; }
		if ($i > $page + $p_log) { last; }

#		if ($mail) { $name = "<a href=\"mailto:$mail\">$name</a>"; }
			if ($keitai eq "p" && $mail) { ($em0,$em1) = split(/\@/,$mail);
				$em1 =~ s/\./&\#46\;/g;
				$name = "<script type=\"text/javascript\">\n<!-- //\n".
				"address(\"$em0\",\"$name\",\"$em1\");\n// -->\n</script>\n".
				"<noscript><a href=\"$script?mode=noscript&page=$page\">$name</a></noscript>\n";
			}
		if ($home_icon && $url) {
			if ($url !~ /^http\:\/\//) { $url = "http://$url"; }
			$url = "<a href=\"$url\" target=\"_blank\"><img src=\"$home_gif\" border=\"0\" align=\"top\" alt=\"HomePage\" width=\"$home_wid\" height=\"$home_hei\"></a>"; }
		elsif (!$home_icon && $url) {
			if ($url !~ /^http\:\/\//) { $url = "http://$url"; }
			$url = "&lt;<a href=\"$url\" target='_blank'>HOME</a>&gt;"; }

		if (!$reno && $flag) {
			print "</TD></TR></TABLE>\n";
			# 返信フォーム
			&res_form("$res_num");
			$flag = 1;
		}
		if (!$reno) {
			print "<TABLE BORDER=\"1\" WIDTH=\"90%\" BGCOLOR=\"$tbl_color\" CELLSPACING=\"1\" CELLPADDING=\"5\"><TR><TD>\n";
			$flag = 1;
		}

		if ($reno && !$res_flag) {
			print "<hr size=\"1\" width='95%'>\n";
			$res_flag = 1;

		} elsif (!$reno && $res_flag) {
			$res_flag = 0;
		}
		if (!$reno) {
			$res_num = $no;
			print "<font color=\"$sub_color\"><b>$sub</b></font> ";
			print "投稿者：<b>$name</b> 投稿日：$date ";
			print "<font color=\"$sub_color\">No\.$no</font>";
			print "&nbsp; $url <br>\n";
			print "<blockquote><font color=\"$color\">$comment</font></blockquote>\n";
		} else {
			print "<font color=\"$color\"><b>$name</b> ＞ $comment ($date)</font> <font color=\"$sub_color\">No\.$no</font><br>\n";
		}
	}
	close(IN);
	if ($rf_flag) {
		print "</TD></TR></TABLE>\n";
		&res_form("$res_num");
	}

	$next = $page + $p_log;
	$back = $page - $p_log;

	print "<blockquote><table align=\"left\" cellpadding=\"0\" cellspacing=\"0\"><tr>\n";
	if ($back >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$back\">\n";
		print "<input type=\"submit\" value=\"前の$p_log件\"></td></form>\n";
	}
	if ($next < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$next\">\n";
		print "<input type=\"submit\" value=\"次の$p_log件\"></td></form>\n";
	}
	print "</tr></table>\n";
	print "<table align=\"right\"><tr>\n";
	print "<td nowrap align=\"center\"><form action=\"$script\" method=\"$method\">\n";
	print "<input type=\"hidden\" name=\"mode\" value=\"usr_del\">\n";
	print "記事No<input type=\"text\" name=\"no\" size=\"3\">\n";
	print "削除キー<input type=\"password\" name=\"pwd\" size=\"4\" maxlength=\"8\">\n";
	print "<input type=\"submit\" value=\"削除\">\n";
	print "</td></form></tr></table></blockquote><br clear=\"all\">\n";

	# 著作権表示部 (削除改変を禁止)
	print "$banner2<P><!-- $ver --><span style='font-size:10px;font-family:Verdana,Helvetica,Arial'>\n";
	print "- <a href=\"&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#119;&#119;&#119;&#46;&#107;&#101;&#110;&#116;&#45;&#119;&#101;&#98;&#46;&#99;&#111;&#109;&#47;\" target=\"_top\">&#x50;&#x65;&#x74;&#x69;&#x74;&#x42;&#x6f;&#x61;&#x72;&#x64;</a> -\n";
	print "<br>- <a href=\"&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#115;&#119;&#97;&#110;&#98;&#97;&#121;&#45;&#119;&#101;&#98;&#46;&#104;&#112;&#46;&#105;&#110;&#102;&#111;&#115;&#101;&#101;&#107;&#46;&#99;&#111;&#46;&#106;&#112;&#47;&#105;&#110;&#100;&#101;&#120;&#46;&#104;&#116;&#109;&#108;\" target=\"_top\">&#x41;&#x6e;&#x74;&#x69;&#x73;&#x70;&#x61;&#x6d;&#x20;&#x56;&#x65;&#x72;&#x73;&#x69;&#x6f;&#x6e;</a> -\n";
	print "</span></center>\n</body>\n</html>\n";
	exit;
}

#----------------#
#  ログ書込処理  #
#----------------#
sub regist {
	local($f,$no2,$reno2,$date2,$name2,$mail2,$sub2,$com2);
	local($cnam,$ceml,$curl,$cpwd,$ccol,$caikotoba) = &get_cookie;

	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	# 他サイトからのアクセスを排除
	if ($base_url) {
		$baseUrl =~ s/(\W)/\\$1/g;

		$ref = $ENV{'HTTP_REFERER'};
		$ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
		if ($ref && $ref !~ /$base_url/i) { &error("不正なアクセスです"); }
	}

	# 拡張オプションチェック
	if ($mode ne "admin_repost") {
		&option_check($in{'pwd'},$in{'email'},$in{'comment'},$in{'url'});
	}
	if ($in{'email'} && $in{'email'} =~ /＠/) { $in{'email'} =~ s/＠/\@/; }

	# 合い言葉をチェック
	if ($aikotoba && $mode ne "admin_repost") {
		if ($in{'aikotoba'} ne $aikotoba) { &error("合い言葉が不正です"); }
	}

	# URL
	if ($in{'url'} && $in{'url'} !~ /^https?\:\/\//i) { &error("URLの入力が不正です"); }
	if ($in{'url'} eq "http://") { $in{'url'} = ""; }

	# タイトルチェック
	if (!$in{'reno'}) {
		if (!$in{'sub'}) {
			if ($suberror) { &error("タイトルが入力されていません"); } else { $in{'sub'} = "無題"; } 
		} elsif ($suberror == 2) {
			if ($in{'sub'} !~ /[^0-9]/ || $in{'sub'} =~ /http\:\/\//i) { &error("タイトルが不正です"); }
		}
	}

	# 名前とコメントは必須
	if ($in{'name'} eq "") { &error("名前が入力されていません"); }
	if ($in{'comment'} eq "") { &error("コメントが入力されていません"); }
	if ($in{'email'}) {
		if ($in{'email'} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
			&error("Ｅメールの入力内容が正しくありません");
		}
	}
	# 題名の長さ制限
	if (length($in{'sub'}) > $sub_len * 2)
		{ &error("題名の長さは全角$sub_len文字までにして下さい"); }

	# チェック
	if ($no_wd) { &no_wd; }
	if ($jp_wd) { &jp_wd; }
	if ($urlnum > 0) { &urlnum; }

	# 時間を取得
	&get_time;

	# クッキーを発行
	if ($mode ne "admin_repost") {
		if ($no_email == 2) { $in{'email'} =~ s/\@/＠/; }
		&set_cookie;
		if ($no_email == 2) { $in{'email'} =~ s/＠/\@/; }
	}

	# ファイルロック
	if ($lockkey) { &lock; }

	# ログを開く
	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	# 記事NO処理
	$top = shift(@lines);
	($no,$ip,$time2) = split(/<>/, $top);
	$no++;

	# 連続投稿チェック
	if ($addr eq $ip && $wait > $times - $time2)
		{ &error("連続投稿はもうしばらく時間をおいて下さい"); }

	# 重複チェック
	$flag = 0;
	foreach (@lines) {
		($no2,$reno2,$date2,$name2,$mail2,$sub2,$com2) = split(/<>/);

		if ($in{'name'} eq $name2 && $in{'comment'} eq $com2) {
			$flag = 1; last;
		}
	}
	if ($flag) { &error("重複投稿のため処理を中断しました"); }

	# 削除キーを暗号化
	if ($mode ne "admin_repost") {
		if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); }
	}

	# 改行・ダブルクオート復元
	if ($in{'pview'} eq "on") {
		$in{'comment'} =~ s/&lt;br&gt;/<br>/g;
		$in{'comment'} =~ s/&quot;/"/g;
	}

	# スパム投稿チェック
	($spam,$reason) = &spam_check($in{'name'},$in{'url2'},$in{"$bbscheckmode"},$in{'comment'},
	$in{'reno'},$in{'url'},$in{'email'},$in{'sub'},$in{'mail'},$in{"$formcheck"},$cnam,
	$in{'subject'},$in{'title'},$in{'theme'},$ENV{'HTTP_ACCEPT_LANGUAGE'},$ENV{'HTTP_USER_AGENT'});

	# プレビュー＆スパムログの削除
	if ($in{'pview'} eq "on" || $mode eq "admin_repost") {
		if ($spamlog) { &del_spamlog("$in{\"$bbscheckmode\"}"); }
	}

	# スパム投稿処理
	if ($spam && $mode ne "admin_repost") {
		# 投稿拒否ログの記録
		if ($spamlog) { &write_spamlog; }
		if ($spamresult) {
			# エラー表示
			if ($spammsg) {
				if ($spamresult == 1)  { &error("$spammsg"); }
				else { sleep($spamresult); &error("$spammsg"); }
			} else { &cgi_error; }
		} else { &cgi_error; }
	}

	# 復活処理
	if ($mode eq "admin_repost") {
		$date= $in{'date'};
		$host= $in{'host'};
		$pwd = $in{'pwd'};
	}

	# URL自動リンク
		if ($autolink) { &auto_link($in{'comment'}); }

	# 親記事の場合
	if ($in{'reno'} eq "") {

		$i = 0;
		$stop = 0;
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);
			$i++;
			if ($i > $max-1 && $reno2 eq "") { $stop = 1; }
			if (!$stop) { push(@new,$_); }
			elsif ($stop && $pastkey) { push(@data,$_); }
		}
		unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n");
		unshift(@new,"$no<>$addr<>$times<>\n");

		# 過去ログ更新
		if ($data[0]) { &pastlog; }

		# 更新
#		open(OUT,">$logfile") || &error("Write Error : $logfile");
#		print OUT @new;
#		close(OUT);
		# 一時ファイルを作成
		if (!$logbackup) { $tempfile = $logfile; }
		open(OUT,">$tempfile") || &error("Write Error : ログファイルに書き込みができません。<BR>掲示板設置ディレクトリのパーミッション設定を変更してください。");
		chmod (0606,$tempfile);
		print OUT @new;
		close(OUT);
		# 一時ファイル正常更新時にログファイルにリネーム
		if ( $logbackup && (-s $tempfile) > 100 ) { rename ($tempfile,$logfile) || &error("Rename Error"); }

	# レス記事の場合：トップソートあり
	} elsif ($in{'reno'} && $topsort) {

		$f = 0;
		$match = 0;
		@new = ();
		@tmp = ();
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);

			if ($in{'reno'} eq $no2) {
				if ($reno2) { $f++; last; }
				$match = 1;
				push(@new,$_);

			} elsif ($in{'reno'} eq $reno2) {
				push(@new,$_);

			} elsif ($match == 1 && $in{'reno'} ne $reno2) {
				$match = 2;
				push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n");
				push(@tmp,$_);

			} else { push(@tmp,$_); }
		}
		if ($f) { &error("不正な返信要求です"); }

		if ($match == 1) {
			push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n");
		}
		push(@new,@tmp);

		# 更新
		unshift(@new,"$no<>$addr<>$times<>\n");
#		open(OUT,">$logfile") || &error("Write Error : $logfile");
#		print OUT @new;
#		close(OUT);
		# 一時ファイルを作成
		if (!$logbackup) { $tempfile = $logfile; }
		open(OUT,">$tempfile") || &error("Write Error : ログファイルに書き込みができません。<BR>掲示板設置ディレクトリのパーミッション設定を変更してください。");
		chmod (0606,$tempfile);
		print OUT @new;
		close(OUT);
		# 一時ファイル正常更新時にログファイルにリネーム
		if ( $logbackup && (-s $tempfile) > 100 ) { rename ($tempfile,$logfile) || &error("Rename Error"); }

	# レス記事の場合：トップソートなし
	} else {
		$f = 0;
		$match = 0;
		@new = ();
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);

			if ($match == 0 && $in{'reno'} eq $no2) {
				if ($reno2) { $f++; last; }
				$match = 1;

			} elsif ($match == 1 && $in{'reno'} ne $reno2) {
				$match = 2;
				push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n");
			}
			push(@new,$_);
		}
		if ($f) { &error("不正な返信要求です"); }

		if ($match == 1) {
			push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>\n");
		}

		# 更新
		unshift(@new,"$no<>$addr<>$times<>\n");
#		open(OUT,">$logfile") || &error("Write Error : $logfile");
#		print OUT @new;
#		close(OUT);
		# 一時ファイルを作成
		if (!$logbackup) { $tempfile = $logfile; }
		open(OUT,">$tempfile") || &error("Write Error : ログファイルに書き込みができません。<BR>掲示板設置ディレクトリのパーミッション設定を変更してください。");
		chmod (0606,$tempfile);
		print OUT @new;
		close(OUT);
		# 一時ファイル正常更新時にログファイルにリネーム
		if ( $logbackup && (-s $tempfile) > 100 ) { rename ($tempfile,$logfile) || &error("Rename Error"); }
	}

	# ロック解除
	if ($lockkey) { &unlock; }

	# メール処理
	if ($mailing == 1 && $in{'email'} ne $mailto) { &mail_to; }
	elsif ($mailing == 2) { &mail_to; }

	# リロード
	if ($location) {
		if ($ENV{'PERLXS'} eq "PerlIS") {
			print "HTTP/1.0 302 Temporary Redirection\r\n";
			print "Content-type: text/html\n";
		}
		print "Location: $location?\n\n";
	} else {
		&message("投稿は正常に処理されました");
	}
	exit;
}

#-------------------------------------------------
# メッセージ
#-------------------------------------------------
sub message {
	local($msg) = @_;
	&header if (!$headflag);
	print "<div align=\"center\"><hr width=\"400\">\n";
	print "<h3>$msg</h3>\n";
	print "<form action=\"$script\">\n";
	print "<input type=\"submit\" value=\"掲示板へ戻る\"></form>\n";
	print "<hr width=\"400\"></div>\n</body></html>\n";
	exit;
}

#----------------#
#  返信フォーム  #
#----------------#
sub res_form {
	$res_num = $_[0];
	local($access) = &encode_bbsmode();
	local($enaddress) = &encode_addr();
	if ($keychange) { $url_key  = 'email'; $mail_key = 'url'; $name_key = 'comment'; $comment_key = 'name';
	} else { $url_key  = 'url'; $mail_key = 'email'; $name_key = 'name'; $comment_key = 'comment'; }

	if ($keitai eq 'p') {
		if (!$referercheck || $ENV{'HTTP_REFERER'}) {
			print "<form action=\"$script\" method=\"$method\">\n";
			if ($javascriptpost) {
				print <<EOM;
<script type="text/javascript">
<!-- //
fcheck("me='$bbscheckmode' val","<input t","ype='hidden' na","ue='$access'>");
// -->
</script>
EOM
			} else { print "<input type=\"hidden\" name=\"$bbscheckmode\" value=$access>\n"; }
		} else { print "<BR>\n<B>掲示板へ直接アクセスした場合には投稿できません。",
		"<A HREF=\"$home\">トップページ</A>から入り直してください。</B>\n"; }
	} else {
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"$bbscheckmode\" value=\"$access\">\n";
	}
	print "<!-- //\n<input type=\"hidden\" name=\"mode\" value=\"write\">\n// -->\n";
	print "<input type=\"hidden\" name=\"reno\" value=\"$res_num\">\n";
	print "<input type=\"hidden\" name=\"page\" value=\"$in{'page'}\">\n";
	print "<input type=\"hidden\" name=\"mail\" size=\"28\" value=\"$enaddress\">\n";
	print "<input type=\"hidden\" name=\"$mail_key\" value=\"$ceml\">\n";
	print "<input type=\"hidden\" name=\"$url_key\" value=\"$curl\">\n";
	print "<input type=\"hidden\" name=\"mode\" value=\"$writevalue\">\n";
	print "<input type=\"hidden\" name=\"subject\" value=\"\">\n";
	print "<input type=\"hidden\" name=\"title\" value=\"\">\n";
	print "<input type=\"hidden\" name=\"theme\" value=\"\">\n";
	print "名前 <input type=\"text\" name=\"$name_key\" size=\"10\" value=\"$cnam\">\n";
	if ($aikotoba) {
		print "合い言葉 <input type=\"text\" name=\"aikotoba\" size=\"10\" value=\"$caikotoba\">\n";
	}
	$f_c_d = int(rand(5E07)) + 11E08;
	print "<input type=\"hidden\" name=\"$formcheck\" value=\"$f_c_d\">\n";

	if ($res_forms) {
		print "返信 <textarea name=\"$comment_key\" cols=\"30\" rows=\"2\" wrap=\"soft\"></textarea>\n";
	} else {
		print "返信 <input type=\"text\" name=\"$comment_key\" size=\"35\">\n";
	}

	print "文字色 <select name=\"color\">\n";
	foreach (0 .. $#color1) {
		if ($ccol eq $color1[$_]) {
			print "<option value=\"$color1[$_]\" selected>$color2[$_]\n";
		} else {
			print "<option value=\"$color1[$_]\">$color2[$_]\n";
		}
	}
	print "</select>\n";
	print "削除キー <input type=\"password\" name=\"pwd\" size=\"4\" value=\"$cpwd\">\n";
	print "<input type=\"submit\" value='返信'></form><br>\n";
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	local($buf, $key, $val);

	$post_flag = 0;
	if ($ENV{'REQUEST_METHOD'} eq "$method") {
		$post_flag = 1;
		if ($ENV{'CONTENT_LENGTH'} > $maxData) {
			&error("投稿量が大きすぎます");
		}
		read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
	} else {
		$buf = $ENV{'QUERY_STRING'};
	}
	undef(%in);
	foreach ( split(/&/, $buf) ) {
		($key, $val) = split(/=/);

		$val =~ tr/+/ /;
		$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

		# 文字コードをシフトJIS変換
		&jcode'convert(*val, "sjis", "", "z");

		# エスケープ
		$val =~ s/&/&amp;/g;
		$val =~ s/"/&quot;/g;
		$val =~ s/</&lt;/g;
		$val =~ s/>/&gt;/g;
		$val =~ s/\r\n/<br>/g;
		$val =~ s/\r/<br>/g;
		$val =~ s/\n/<br>/g;

		# 一括削除用
		if ($key eq "del") { push(@DEL,$val); }

		$in{$key} = $val;
	}
	$mode = $in{'mode'};
	$page = $in{'page'};
}

#----------------------------#
#  掲示板の使い方メッセージ  #
#----------------------------#
sub howto {
	&header;
	print <<"HTML";
[<a href="$script?">掲示板にもどる</a>]
<table width="100%">
<tr><th bgcolor="#0000A0">
  <font color="#FFFFFF">掲示板の利用上の注意</font>
</th></tr>
</table>
<P><center>
<table width="90%" border="1" cellpadding="10">
<tr><td bgcolor="$tbl_color">
<OL>
<li>この掲示板は<b>クッキー対応</b>です。１度記事を投稿いただくと、おなまえ、Ｅメール、ＵＲＬ、削除キーの情報は２回目以降は自動入力されます。（ただし利用者のブラウザがクッキー対応の場合）<P>
<li>投稿内容には、<b>タグは一切使用できません。</b><P>
<li>記事を投稿する上での必須入力項目は<b>「おなまえ」</b>と<b>「メッセージ」</b>です。Ｅメール、ＵＲＬ、題名、削除キーは任意です。<P>
<li>記事には、<b>半角カナは一切使用しないで下さい。</b>文字化けの原因となります。<P>
<li>記事の投稿時に<b>「削除キー」</b>にパスワード（英数字で8文字以内）を入れておくと、その記事は次回<b>削除キー</b>によって削除することができます。<P>
<li>記事の保持件数は<b>最大 $max件</b>です。それを超えると古い順に自動削除されます。<P>
<li>既存の記事に<b>「返信」</b>をすることができます。各記事の上部にある<b>「返信」</b>ボタンを押すと返信用フォームが現れます。<P>
<li>過去の投稿記事から<b>「キーワード」によって簡易検索ができます。</b>トップメニューの<a href="$script?mode=find">「ワード検索」</a>のリンクをクリックすると検索モードとなります。<P>
<li>管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。
</OL>
</td></tr></table>
</center>
</body>
</html>
HTML
	exit;
}

#------------------#
#  ワード検索処理  #
#------------------#
sub find {
	&header;
	print <<"EOM";
[<a href="$script?">掲示板にもどる</a>]
<table width="100%">
<tr><th bgcolor="#0000A0">
  <font color="#FFFFFF">ワード検索</font>
</th></tr></table>
<P>
<ul>
  <li>検索したい<b>キーワード</b>を入力し、「条件」「表\示」を選択して「検索」ボタンを押して下さい。
  <li>キーワードは「半角スペース」で区切って複数指定することができます。
<P><form action="$script" method="$method">
<input type="hidden" name="mode" value="find">
キーワード：<input type="text" name="word" size="30" value="$in{'word'}">
条件：<select name="cond">
EOM
	if (!$in{'cond'}) { $in{'cond'} = "AND"; }
	foreach ("AND", "OR") {
		if ($in{'cond'} eq $_) {
			print "<option value=\"$_\" selected>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}
	print "</select>\n";
	print "表\示：<select name=view>\n";
	if ($in{'view'} eq "") { $in{'view'} = $p_log; }
	foreach (5,10,15,20) {
		if ($in{'view'} == $_) {
			print "<option value=\"$_\" selected>$_件\n";
		} else {
			print "<option value=\"$_\">$_件\n";
		}
	}
	print "</select>\n<input type=\"submit\" value='検索'></form>\n</ul>\n";

	# ワード検索の実行と結果表示
	if ($in{'word'} ne ""){

		# 入力内容を整理
		$in{'word'} =~ s/　/ /g;
		@pairs = split(/\s+/, $in{'word'});

		# ファイルを読み込み
		@new=();
		open(IN,"$logfile") || &error("Open Error : $logfile");
		$top = <IN>;
		while (<IN>) {
			$flag = 0;
			foreach $pair (@pairs) {
				if (index($_,$pair) >= 0) {
					$flag = 1;
					if ($in{'cond'} eq 'OR') { last; }
				} else {
					if ($in{'cond'} eq 'AND') { $flag = 0; last; }
				}
			}
			if ($flag) { push(@new,$_); }
		}
		close(IN);

		# 検索終了
		$count = @new;
		print "検索結果：<b>$count</b>件\n";
		if ($page eq '') { $page = 0; }
		$end_data = @new - 1;
		$page_end = $page + $in{'view'} - 1;
		if ($page_end >= $end_data) { $page_end = $end_data; }

		$next_line = $page_end + 1;
		$back_line = $page - $in{'view'};

		$eword = &url_enc($in{'word'});
		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=find&page=$back_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}\">前の$in{'view'}件</a>]\n";
		}
		if ($page_end ne "$end_data") {
			print "[<a href=\"$script?mode=find&page=$next_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}\">次の$in{'view'}件</a>]\n";
		}
		print "[<a href=\"$script?mode=find\">検索やり直し</a>]\n";

		foreach ($page .. $page_end) {
			($no,$reno,$date,$name,$email,$sub,$com,$url)
							= split(/<>/, $new[$_]);

			if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
			if ($url) {
				if ($url !~ /^http\:\/\//) { $url = "http://$url"; }
				$url = "&lt;<a href=\"$url\" target='_top'>HOME</a>&gt;"; }

			if ($reno) { $no = "$renoへのレス"; }

			# 結果を表示
			print "<hr>[<b>$no</b>] <font color=\"$sub_color\"><b>$sub</b></font>";
			print " 投稿者：<b>$name</b> 投稿日：$date $url<br>\n";
			print "<blockquote>$com</blockquote>\n";
		}
		print "<hr>\n";
	}
	print "</body></html>\n";
	exit;
}

#------------------#
#  クッキーの発行  #
#------------------#
sub set_cookie {
	local($gmt, $cook, @t, @m, @w);
	@t = gmtime(time + 60*24*60*60);
	@m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	@w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');

	$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]);

	$cook = "$in{'name'}<>$in{'email'}<>$in{'url'}<>$in{'pwd'}<>$in{'color'}<>$in{'aikotoba'}";
	print "Set-Cookie: PETIT_BBS=$cook; expires=$gmt\n";
}

#------------------#
#  クッキーを取得  #
#------------------#
sub get_cookie {
	local($key, $val, *ck);

	$ck = $ENV{'HTTP_COOKIE'};
	foreach (split(/;/, $ck)) {
		($key, $val) = split(/=/);
		$key =~ s/\s//g;
		$ck{$key} = $val;
	}
	@ck = split(/<>/, $ck{'PETIT_BBS'});
	return (@ck);
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	if ($lockflag) { &unlock; }

	&header if (!$head_flag);
	print "<center><h3>ERROR !</h3>\n";
	print "<font color=\"red\">$_[0]</font></center>\n";
	print "</body>\n</html>\n";
	exit;
}

#--------------#
#  管理モード  #
#--------------#
sub admin {
	if ($in{'pass'} ne "" && $in{'pass'} ne $pass) {
		&error("パスワードが違います");
	}

	&header;

	if ($in{'pass'} eq "") {
		print "[<a href=\"$script?\">掲示板に戻る</a>]\n";
		print "<table width='100%'><tr><th bgcolor=\"#800080\">\n";
		print "<font color=\"#FFFFFF\">管理モード</font>\n";
		print "</th></tr></table>\n";
		print "<P><center><h4>パスワードを入力して下さい</h4>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
		print "<input type=\"hidden\" name=\"action\" value=\"del\">\n";
		print "<input type=\"password\" name=\"pass\" size=\"8\">";
		print "<input type=\"submit\" value=\" 認証 \"></form>\n";

	} else {
		# 削除処理
		if ($DEL[0]) {

			# ロック処理
			if ($lockkey) { &lock; }

			# 削除情報をマッチングし更新
			@new=();
			open(IN,"$logfile") || &error("Open Error : $logfile");
			$top = <IN>;
			while (<IN>) {
				$flag = 0;
				($no,$reno,$date) = split(/<>/);
				foreach $del (@DEL) {
					if ($no eq $del || $reno eq $del) {
						$flag = 1; last;
					}
				}
				if ($flag == 0) { push(@new,$_); }
			}
			close(IN);

			# 更新
			unshift(@new,$top);
			open(OUT,">$logfile") || &error("Write Error : $logfile");
			print OUT @new;
			close(OUT);

			# ロック解除
			if ($lockkey) { &unlock; }
		}

		print "<table width='100%'><tr><th bgcolor=\"#800080\">\n";
		print "<font color=\"#FFFFFF\">管理モード</font>\n";
		print "</th></tr></table>\n";

		print <<EOM;
<table border="0"><tr>
<td>
<form action="$script">
<input type="submit" value="掲示板に戻る">
</td>
</form>
EOM

		if (-e $spamdata) {
		print <<EOM;
<td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="spamdata">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value='NGワードの一括編集'><br>
</form>
</td>
EOM
		}

		if(-s $spamlogfile) {
		print <<EOM;
<td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="spam">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value="迷惑投稿を閲覧">
</form>
</td>
EOM
		}
		print "</tr></table>\n<hr>\n";

		# 管理を表示
		if ($page eq "") { $page = 0; }
		print "<P><center><table><tr><td>\n";
		print "<ul><li>削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n";
		print "<li>親記事を削除するとレス記事も一括して削除されます。</ul>\n";
		print "</td></tr></table>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$page\">\n";
		print "<input type=\"hidden\" name=\"pass\" value=\"$in{'pass'}\">\n";
		print "<input type=\"hidden\" name=\"action\" value=\"$in{'action'}\">\n";
		print "<input type=\"submit\" value=\"削除する\">";
		print "<input type=\"reset\" value=\"リセット\">\n";
		print "<P><table border=\"0\" cellspacing=\"1\">\n";
		print "<tr><th>削除</th><th>記事NO</th><th>投稿日</th><th>タイトル</th>";
		print "<th>投稿者</th><th>URL</th><th>コメント</th><th>ホスト名</th></tr>\n";

		# ページ区切り処理
		$start = $page + 1;
		$end   = $page + $p_log;

		open(IN,"$logfile") || &error("Open Error : $logfile");
		$top = <IN>;
		$i = 0;
		while (<IN>) {
			($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/);
			if ($reno eq "") { $i++; }
			if ($i < $start) { next; }
			if ($i > $end) { last; }

			if ($mail) { $name="<a href=\"mailto:$mail\">$name</a>"; }
			($date) = split(/\(/, $date);

			if ($url) {
				if ($url !~ /^http\:\/\//) { $url = "http://$url"; }
				$url = "&lt;<a href=\"$url\" target='_top'>Home</a>&gt;"; }
			else { $url = '-'; }

			$com =~ s/<br>//ig;
			$com =~ s/</&lt;/g;
			$com =~ s/>/&gt;/g;
			if (length($com) > 40) {
				$com = substr($com,0,38);
				$com .= "...";
			}

			if ($reno eq "") { print "<tr><th colspan=\"8\"><hr></th></tr>\n"; }

			# 削除チェックボックス
			print "<tr><th><input type=\"checkbox\" name=\"del\" value=\"$no\"></th>";
			print "<td align=\"center\">$no</td>";
			print "<td><small>$date</small></td><th>$sub</th><th>$name</th>";
			print "<td align=\"center\">$url</td><td><small>$com</small></td>";
			print "<td><small>$host</small></td></tr>\n";

		}
		close(IN);

		print "<tr><th colspan=\"8\"><hr></th></tr>\n";
		print "</table></form>\n";
	}

	$next = $page + $p_log;
	$back = $page - $p_log;

	print "<P><table cellspacing=\"0\" cellpadding=\"0\"><tr>\n";
	if ($back >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$back\">\n";
		print "<input type=\"hidden\" name=\"pass\" value=\"$in{'pass'}\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
		print "<input type=\"hidden\" name=\"action\" value=\"$in{'action'}\">\n";
		print "<input type=\"submit\" value=\"前の$p_log組\"></td></form>\n";
	}
	if ($next < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$next\">\n";
		print "<input type=\"hidden\" name=\"pass\" value=\"$in{'pass'}\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
		print "<input type=\"hidden\" name=\"action\" value=\"$in{'action'}\">\n";
		print "<input type=\"submit\" value=\"次の$p_log組\"></td></form>\n";
	}
	print "</tr></table></center>\n";
	print "</body></html>\n";
	exit;
}

#------------------#
#  ユーザ記事削除  #
#------------------#
sub usr_del {
	local($no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw);

	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'no'} eq '' || $in{'pwd'} eq '')
		{ &error("記事Noまたは削除キーが入力モレです"); }

	# ロック処理
	if ($lockkey) { &lock; }

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);
	$top = shift(@lines);

	$flag = 0;
	foreach (@lines) {
		($no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/);

		if ($flag == 0 && $in{'no'} eq $no) {
			$PW = $pw;
			if ($reno eq "") { $flag = 2; }
			else { $flag = 1; }
		}
		elsif ($flag == 2 && $in{'no'} eq "$reno") { next; }
		else { push(@new,$_); }
	}

	if ($flag == 0) { &error("該当記事が見当たりません"); }
	if ($PW eq '') { &error("該当記事には削除キーが設定されていません"); }

	# 削除キーを照合
	$match = &decrypt($in{'pwd'}, $PW);
	if ($match ne 'yes') { &error("削除キーが違います"); }

	# 更新
	unshift(@new,$top);
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }
}

#--------------#
#  時間を取得  #
#--------------#
sub get_time {
	$times = shift;
	if (!$times) { $ENV{'TZ'} = "JST-9"; $times = time; }
	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times);
	@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');

	# 日時のフォーマット
	if ($in{'reno'}) {
		$date = sprintf("%s/%s-%02d:%02d",$mon+1,$mday,$hour,$min);
	} else {
		$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
				$year+1900,$mon+1,$mday,$week[$wday],$hour,$min);
	}
}

#----------------#
#  カウンタ処理  #
#----------------#
sub counter {
	# 閲覧時のみカウントアップ
	if ($mode eq '') { $cntup = 1; } else { $cntup = 0; }

	# カウントファイルを読みこみ
	open(IN,"$cntfile") || &error("Open Error : $cntfile");
	eval "flock(IN, 1);";
	$data = <IN>;
	close(IN);

	# IPチェックとログ破損チェック
	($cnt, $ip) = split(/:/, $data);
	if ($addr eq "$ip" || $cnt eq "") { $cntup = 0; }

	# カウントアップ
	if ($cntup) {
		$cnt++;
		open(OUT,"+< $cntfile") || &error("Write Error : $cntfile");
		eval "flock(OUT, 2);";
		truncate(OUT, 0);
		seek(OUT, 0, 0);
		print OUT "$cnt\:$addr";
		close(OUT);
	}

	# 桁数調整
	while(length($cnt) < $mini_fig) { $cnt = '0' . $cnt; }
	@cnts = split(//, $cnt);

	# GIFカウンタ表示
	if ($counter == 2) {
		foreach (0 .. $#cnts) {
			print "<img src=\"$gif_path$cnts[$_]\.gif\" alt=\"$cnts[$_]\" width=\"$mini_w\" height=\"$mini_h\">";
		}
	}
	# テキストカウンタ表示
	else {
		print "<font color=\"$cnt_color\" face=\"verdana,Times New Roman,Arial\">$cnt</font><br>\n";
	}
}

#--------------#
#  ロック処理  #
#--------------#
sub lock {
	# 1分以上古いロックは削除する
	if (-e $lockfile) {
		local($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) { &unlock; }
	}
	local($retry) = 5;
	# symlink関数式ロック
	if ($lockkey == 1) {
		while (!symlink(".", $lockfile)) {
			if (--$retry <= 0) { &error('Lock is busy'); }
			sleep(1);
		}
	# mkdir関数式ロック
	} elsif ($lockkey == 2) {
		while (!mkdir($lockfile, 0755)) {
			if (--$retry <= 0) { &error('Lock is busy'); }
			sleep(1);
		}
	}
	$lockflag = 1;
}

#--------------#
#  ロック解除  #
#--------------#
sub unlock {
	if ($lockkey == 1) { unlink($lockfile); }
	elsif ($lockkey == 2) { rmdir($lockfile); }
	$lockflag = 0;
}

#--------------#
#  メール送信  #
#--------------#
sub mail_to {
	local($com, $mail_sub, $mail_body);

	# メールタイトルを定義
	$mail_sub = "[$title : $no] $in{'sub'}";

	# 記事の改行を復元
	$com  = $in{'comment'};
	$com =~ s/<br>/\n/g;

	# メール本文を定義
	$mail_body = <<"EOM";
--------------------------------------------------------
投稿日時：$date
ホスト名：$host
ブラウザ：$ENV{'HTTP_USER_AGENT'}

投稿者名：$in{'name'}
Ｅメール：$in{'email'}
ＵＲＬ  ：$in{'url'}
タイトル：$in{'sub'}
投稿記事：

$com
--------------------------------------------------------
EOM
	# JISコード変換
    	&jcode'convert(*mail_sub,'jis');
    	&jcode'convert(*mail_body,'jis');

	# sendmail起動
	if ($in{'email'} eq "") { $email = $mailto; }
	else { $email = $in{'email'}; }

	open(MAIL,"| $sendmail -t");
	print MAIL "To: $mailto\n";
	print MAIL "From: $email\n";
	print MAIL "Subject: $mail_sub\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "X-Mailer: $ver\n\n";
	print MAIL $mail_body;
	close(MAIL);
}

#----------------------#
#  パスワード暗号処理  #
#----------------------#
sub encrypt {
	local($inpw) = $_[0];
	local(@SALT, $salt, $encrypt);

	@SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
	srand;
	$salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))];
	$encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt);
	return $encrypt;
}

#----------------------#
#  パスワード照合処理  #
#----------------------#
sub decrypt {
	local($inpw, $logpw) = @_;
	local($salt, $key, $check);

	$salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2);
	$check = "no";
	if (crypt($inpw, $salt) eq $logpw || crypt($inpw, '$1$' . $salt) eq $logpw)
		{ $check = "yes"; }
	return $check;
}

#------------------#
#  HTMLのヘッダー  #
#------------------#
sub header {
	$head_flag = 1;
	if ($keitai eq 'p') {
		print "Content-type: text/html\n\n";
		print <<EOM;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<META HTTP-EQUIV="Content-Script-Type" content="text/javascript">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="Mon, 1 Jan 1990 01:01:01 GMT">
<META HTTP-EQUIV="Expires" CONTENT="0">
EOM
	if ($norobot) {
		print "<META NAME=\"ROBOTS\" CONTENT=\"NOARCHIVE\">\n",
		"<META NAME=\"ROBOTS\" CONTENT=\"NOINDEX,NOFOLLOW\">\n";
	}
	print <<EOM;
<STYLE type="text/css">
<!--
body,td,th { font-size: $b_size }
a:hover { color: $alink }
-->
</STYLE>
<script type="text/javascript">
<!-- //
function address(){
mail=address.arguments[1];
document.write(mail.link("mailto:" + address.arguments[0] + "&#64;" + address.arguments[2]));
}
function fcheck(){
document.write(fcheck.arguments[1] + fcheck.arguments[2] + fcheck.arguments[0] + fcheck.arguments[3]);
}
// -->
</script>
<title>$title</title></head>
EOM
		if ($backgif) {
			print "<body background=\"$backgif\" bgcolor=\"$bgcolor\" text=\"$text\" link=\"$link\" vlink=\"$vlink\" alink=\"$alink\">\n";
		} else {
			print "<body bgcolor=\"$bgcolor\" text=\"$text\" link=\"$link\" vlink=\"$vlink\" alink=\"$alink\">\n";
		}
	} else {
		# 携帯用ヘッダ
		print "Content-type: text/html\n\n";
		print "<html>\n<head>\n";
		print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
		print "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
		print "<title>$title</title>\n</head>\n<body>\n";
	}
}

#-----------------#
#  自動URLリンク  #
#-----------------#
sub auto_link {
	if ($comment_url) {
		$_[0] =~ s/http/ttp/g;
		$_[0] =~ s/([^=^\"]|^)(ttps?\:[\w\.\~\-\/\?\&\=\+\@\;\#\:\%\,]+)/$1<a href=\"h$2\" target=\"_blank\">h$2<\/a>/g;
	} else {
		$_[0] =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\+\@\;\#\:\%\,]+)/$1<a href=\"$2\" target=\"_blank\">$2<\/a>/g;
	}
}

#----------------#
#  過去ログ生成  #
#----------------#
sub pastlog {
	local($past_flag) = 0;

	# 過去NOを開く
	open(NO,"$nofile") || &error("Open Error : $nofile");
	$count = <NO>;
	close(NO);

	# 過去ログのファイル名を定義
	$pastfile  = "$pastdir$count\.dat";

	# 過去ログを開く
	open(IN,"$pastfile") || &error("Open Error : $pastfile");
	@past = <IN>;
	close(IN);

	# 規定の行数をオーバーすると次ファイルを自動生成
	if ($#past > $log_line) {
		$past_flag = 1;

		# カウントファイル更新
		$count++;
		open(NO,">$nofile") || &error("Write Error : $nofile");
		print NO $count;
		close(NO);

		$pastfile = "$pastdir$count\.dat";
		@past=();
	}

	@temp=();
	foreach (@data) {
		($pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho)
								 = split(/<>/);
		if ($pmail) { $pname = "<a href=\"mailto:$pmail\">$pname</a>"; }
		if ($purl) {
			if ($purl !~ /^http\:\/\//) { $purl = "http://$purl"; }
			$purl = "&lt;<a href=\"$purl\" target='_top'>HOME</a>&gt;"; }
		if ($preno) { $pno = "$prenoへのレス"; }

		# 保存記事をフォーマット
		push(@temp,"<hr>[$pno] <font color=\"$sub_color\"><b>$psub</b></font> 投稿者：<b>$pname</b> 投稿日：$pdate $purl<br><blockquote>$pcom</blockquote><!-- $pho -->\n");
	}

	# 過去ログを更新
	unshift(@past,@temp);
	open(OUT,">$pastfile") || &error("Write Error : $pastfile");
	print OUT @past;
	close(OUT);

	if ($past_flag) { chmod(0666,$pastfile); }
}

#------------#
#  過去ログ  #
#------------#
sub past {
	open(IN,"$nofile") || &error("Open Error : $nofile");
	$pastno = <IN>;
	close(IN);

	if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; }

	&header;
	print <<"EOM";
[<a href="$script?">掲示板に戻る</a>]
<table width="100%"><tr><th bgcolor="#000080">
  <font color="#FFFFFF">過去ログ[$in{'pastlog'}]</font>
</th></tr></table>
<P><table><tr><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="past">
過去ログ：<select name="pastlog">
EOM

	$pastkey = $pastno;
	while ($pastkey > 0) {
		if ($in{'pastlog'} == $pastkey) {
			print "<option value=\"$pastkey\" selected>$pastkey Page\n";
		} else {
			print "<option value=\"$pastkey\">$pastkey Page\n";
		}
		$pastkey--;
	}
	print "</select>\n<input type=\"submit\" value='移動'><td></form>\n";
	print "<td width=\"30\"></td><td>\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<input type=\"hidden\" name=\"mode\" value=\"past\">\n";
	print "<input type=\"hidden\" name=\"pastlog\" value=\"$in{'pastlog'}\">\n";
	print "ワード検索：<input type=\"text\" name=\"word\" size=\"30\" value=\"$in{'word'}\">\n";
	print "条件：<select name=\"cond\">\n";

	foreach ('AND', 'OR') {
		if ($in{'cond'} eq "$_") {
			print "<option value=\"$_\" selected>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}
	print "</select>\n";
	print "表\示：<select name=\"view\">\n";
	if ($in{'view'} eq "") { $in{'view'} = $p_log; }
	foreach (5,10,15,20,25,30) {
		if ($in{'view'} eq "$_") {
			print "<option value=\"$_\" selected>$_件\n";
		} else {
			print "<option value=\"$_\">$_件\n";
		}
	}
	print "</select>\n<input type=\"submit\" value='検索'></td></form>\n";
	print "<td></tr></table>\n";

	# 表示ログを定義
	$in{'pastlog'} =~ s/\D//g;
	$file = "$pastdir$in{'pastlog'}\.dat";

	# ワード検索処理
	if ($in{'word'} ne "") {
		$in{'word'} =~ s/　/ /g;
		@pairs = split(/\s+/, $in{'word'});

		@new=();
		open(IN,"$file") || &error("Open Error : $file");
		while (<IN>) {
			$flag = 0;
			foreach $pair (@pairs) {
				if (index($_,$pair) >= 0) {
					$flag = 1;
					if ($in{'cond'} eq 'OR') { last; }
				} else {
					if ($in{'cond'} eq 'AND') { $flag = 0; last; }
				}
			}
			if ($flag) { push(@new,$_); }
		}
		close(IN);

		$count = @new;
		print "検索結果：<b>$count</b>件\n";
		if ($page eq '') { $page = 0; }
		$end_data = @new - 1;
		$page_end = $page + $in{'view'} - 1;
		if ($page_end >= $end_data) { $page_end = $end_data; }

		$next_line = $page_end + 1;
		$back_line = $page - $in{'view'};

		$eword = &url_enc($in{'word'});
		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=past&page=$back_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">前の$in{'view'}件</a>]\n";
		}
		if ($page_end ne "$end_data") {
			print "[<a href=\"$script?mode=past&page=$next_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">次の$in{'view'}件</a>]\n";
		}
		print "[<a href=\"$script?mode=past&pastlog=$in{'pastlog'}\">検索やり直し</a>]\n";

		# 表示開始
		foreach ($page .. $page_end) {
			print $new[$_];
		}
		print "<hr>\n";
		print "</body></html>\n";
		exit;
	}

	# ページ区切り処理
	$start = $page + 1;
	$end   = $page + $p_log;

	$i = 0;
	open(IN,"$file") || &error("Open Error : $file");
	while (<IN>) {
		$flag = 0;
		if ($_ =~ /^\<hr\>\[\d+\]/) { $flag = 1; $i++; }
		if ($i < $start) { next; }
		if ($i > $end) { last; }

		if ($flag) { print $_; }
		else {
			$_ =~ s/<hr>//ig;
			print "<blockquote>$_</blockquote>\n";
		}
	}
	close(IN);
	print "<hr>\n";

	$next = $page + $p_log;
	$back = $page - $p_log;

	print "<table>\n";
	if ($back >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"past\">\n";
		print "<input type=\"hidden\" name=\"pastlog\" value=\"$in{'pastlog'}\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$back\">\n";
		print "<input type=\"submit\" value=\"前の$p_log件\"></td></form>\n";
	}
	if ($next < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"past\">\n";
		print "<input type=\"hidden\" name=\"pastlog\" value=\"$in{'pastlog'}\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$next\">\n";
		print "<input type=\"submit\" value=\"次の$p_log件\"></td></form>\n";
	}
	print "</table>\n";
	print "</body></html>\n";
	exit;
}

#------------------#
#  チェックモード  #
#------------------#
sub check {
	&header;
	print "<h2>Check Mode</h2>\n";
	print "<ul>\n";

	# ログパス
	if (-e $logfile) {
		print "<li>ログファイルのパス：OK\n";
		# パーミッション
		if (-r $logfile && -w $logfile) {
			print "<li>ログファイルのパーミッション：OK\n";
		} else { print "<li>ログファイルのパーミッション：NG\n"; }
	} else { print "<li>ログファイルのパス：NG → $logfile\n"; }

	# カウンタログ
	print "<li>カウンタ：";
	if ($counter) {
		print "設定あり\n";
		if (-e $cntfile) { print "<li>カウンタログファイルのパス：OK\n"; }
		else { print "<li>カウンタログファイルのパス：NG → $cntfile\n"; }
	} else { print "設定なし\n"; }

	# ロックディレクトリ
	print "<li>ロック形式：";
	if ($lockkey == 0) { print "ロック設定なし\n"; }
	else {
		if ($lockkey == 1) { print "symlink\n"; }
		else { print "mkdir\n"; }

		($lockdir) = $lockfile =~ /(.*)[\\\/].*$/;
		print "<li>ロックディレクトリ：$lockdir\n";

		if (-d $lockdir) {
			print "<li>ロックディレクトリのパス：OK\n";
			if (-r $lockdir && -w $lockdir && -x $lockdir) {
				print "<li>ロックディレクトリのパーミッション：OK\n";
			} else {
				print "<li>ロックディレクトリのパーミッション：NG\n";
			}
		} else { print "<li>ロックディレクトリのパス：NG → $lockdir\n"; }
	}

	# 過去ログ
	print "<li>過去ログ：";
	if ($pastkey == 0) { print "設定なし\n"; }
	else {
		print "設定あり\n";

		# NOファイル
		if (-e $nofile) {
			print "<li>NOファイルパス：OK\n";
			if (-r $nofile && -w $nofile) {
				print "<li>NOファイルパーミッション：OK\n";
			} else { print "<li>NOファイルパーミッション：NG → $nofile\n"; }
		} else { print "<li>NOファイルのパス：NG → $nofile\n"; }

		# ディレクトリ
		if (-d $pastdir) {
			print "<li>過去ログディレクトリパス：OK\n";
			if (-r $pastdir && -w $pastdir && -x $pastdir) {
				print "<li>過去ログディレクトリパーミッション：OK\n";
			} else {
				print "<li>過去ログディレクトリパーミッション：NG → $pastdir\n";
			}
		} else { print "<li>過去ログディレクトリパス：NG → $pastdir\n"; }
	}
	print "</ul>\n</body></html>\n";
	exit;
}

#-----------------#
#  URLエンコード  #
#-----------------#
sub url_enc {
	local($_) = @_;

	s/(\W)/'%' . unpack('H2', $1)/eg;
	s/\s/+/g;
	$_;
}

#-------------------------------------------------
#  禁止ワードチェック
#-------------------------------------------------
sub no_wd {
	local($flg);
	foreach ( split(/,/, $no_wd) ) {
		if (index("$in{'name'} $in{'sub'} $in{'comment'}",$_) >= 0) {
			$flg = 1; last;
		}
	}
	if ($flg) { &error("禁止ワードが含まれています"); }
}

#-------------------------------------------------
#  日本語チェック
#-------------------------------------------------
sub jp_wd {
	local($sub, $com, $mat1, $mat2, $code1, $code2);
	$sub = $in{'sub'};
	$com = $in{'comment'};
	if ($sub) {
		($mat1, $code1) = &jcode'getcode(*sub);
	}
	($mat2, $code2) = &jcode'getcode(*com);
	if ($code1 ne 'sjis' && $code2 ne 'sjis') {
		&error("題名又はコメントに日本語が含まれていません");
	}
}

#-------------------------------------------------
#  URL個数チェック
#-------------------------------------------------
sub urlnum {
	local($com) = $in{'comment'};
	local($num) = ($com =~ s|(https?://)|$1|ig);
	if ($num > $urlnum) {
		&error("コメント中のURLアドレスは最大$urlnum個までです");
	}
}

#-------------------------------------------------
#  スパム拡張オプションチェック
#-------------------------------------------------
sub option_check {
	local ($pw,$em,$cm,$ur) = @_;

	# 削除キーをチェック
	local($pwdflag) = 0;
	if ($ng_pass && $pw) {
		if ($pw =~ /\s/) { $pwdflag = 1; }
		if ($pw eq reverse($pw)) { $pwdflag = 1; }
	}
	if ($pwdflag) { &error("削除キーが不正です。"); }

	# メールアドレスをチェック
	if ($no_email == 1 && $em) { &error("メールアドレスは入力禁止です。"); }
	if ($no_email == 2 && $em && $em!~ /^[\w\.\-]+＠[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
		&error("アットマーク ＠ は全角で入力して下さい。"); }

	# URLの直接書き込みをチェック
	if ($comment_url) { 
		$urlnum = ($cm =~ s/http/http/ig);
		if ($urlnum) { &error("ＵＲＬは先頭のｈを抜いて書き込んで下さい。"); }
	}

	# URL転送・短縮URLをチェック
	$shorturlcheck = 0;
	if ($shorturl) { 
		if ($cm =~ /https?\:\/\/[\w\-]{1,10}?\.[\w\-]{2,5}?\//i || 
			$ur =~ /https?\:\/\/[\w\-]{1,10}?\.[\w\-]{2,5}?\//i) {
			local($html) = $';
			if ($html =~ /^[\w\?]+?/)  {
				if ($html !~ /^index\.htm/i) { $shorturlcheck = 1; }
			}
		}
		if (!$shorturlcheck) {
			if ($cm =~ /https?\:\/\/([\w\-]{1,5}\.)?(\d+)\.[a-z]{2,4}\/?/i || 
				$ur =~ /https?\:\/\/([\w\-]{1,5}\.)?(\d+)\.[a-z]{2,4}\/?/i)
				{ $shorturlcheck = 2; }
		}
		if ($shorturlcheck) { &error("URLの記載は禁止されています。"); }
	}
}

#-------------------------------------------------
#  スパムチェック
#-------------------------------------------------
sub spam_check{
	local ($na,$u2,$bt,$cm,$re,$ur,$em,$sb,$ad,$fc,$cn,$sb2,$sb3,$sb4,$lng,$ua) = @_;
	$spam = 0;
	my $posttime2 = time;
	my $timecheck2 = abs($posttime2 - $bt);

	if ($u2 || $sb2 || $sb3 || $sb4) {
		$spam = 1; $reason = "プログラム投稿(非ブラウザ)"; }

	if (!$spam) {
		if (!$bt || !$fc || !$ad) {
			$spam = 1; $reason = "プログラム投稿(非フォーム投稿)"; }
	}

	if (!$spam) {
		if (!$cn || !$cookiecheck) {
			if ($maxtime && $timecheck2 > $maxtime) {
				$spam = 1; $reason = "プログラム投稿(投稿まで$timecheck2秒)"; }
		}
	}

	if (!$spam) {
		if($ipcheckmode) {
			local($enadr) = &encode_addr($addr);
			if ($ad ne $enadr) { $spam = 1; $reason = "プログラム投稿(IP不一致)"; }
		} else {
			if ($ad =~ /\@/) { $spam = 1; $reason = "プログラム投稿(IPデータ不正)"; }
		}
	}

	# 日本語環境チェック
	if (!$spam) {
		if ($japanese) {
			if ($lng !~ /ja/i && $ua !~ /ja/i) {
				$spam = 1; $reason = "不正ブラウザ(非日本語環境)"; }
		}
	}

	# 携帯除外
	if ($keitaicheck == 1 && $keitai ne 'p') { $spam = 0; }

	if ($u2 || $sb2 || $sb3 || $sb4) {
		$spam = 1; $reason = "プログラム投稿(非ブラウザ)"; }

	if (!$spam) {
		if (!$bt || !$fc || !$ad) {
			$spam = 1; $reason = "プログラム投稿(非フォーム投稿)"; }
	}

	if (!$spam) {
		if ($mintime && $timecheck2 < $mintime) {
			$spam = 1; $reason = "プログラム投稿(投稿まで$timecheck2秒)"; }
	}

	# 携帯除外II
	if (!$keitaicheck && $keitai ne 'p') { $spam = 0; }

	# 携帯からのURL記入チェック
	if (!$spam) {
		if($keitaiurl && $keitai ne 'p') {
			if ($cm =~ /http/i || $ur) { &error("URLは書き込まないでください。"); }
		}
	}

	if (!$spam) {
		if ($em && $em =~ /https?\:\/\//) {
			$spam = 1; $reason = "プログラム投稿(email/URL不正)"; }
	}

	if (!$spam) {
		if ($ur && $ur =~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
			$spam = 1; $reason = "プログラム投稿(email/URL不正)"; }
	}

	if (!$spam) {
		if (length($cm)*2 < length($na)) {
			&error("コメント・メッセージが短すぎます。"); }
		if ($namelen && length($na) >= $namelen) {
			&error("おなまえが不適切です。"); }
		if ($cm eq $na) {
			&error("コメント・メッセージ内容が不適切です。"); }
	}

	if (!$spam) {
		if ($na =~ /https?\:\/\//i) {
			$spam = 1; $reason = "プログラム投稿(name/comment不正)"; }
	}

	# スパム投稿チェック(多数URL記述対応)
	if (!$spam) {
		$urlnum = ($cm =~ s/http/http/ig);
		if ($spamurlnum && ($urlnum >= $spamurlnum)) { $spam = 1; $reason = "URLの書き込みが$urlnum個"; }
	}

	# URL以外の文字数をチェック
	if (!$spam) {
		if ($characheck) {
			if ($cm =~ /(https?\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+\@\,]+)/ || $ur) {
				local($charamsg) = $cm;
				$charamsg =~ s/(https?\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+\@\,]+)//g;
				$charamsg =~ s/[\s\n\r\t]//g;
				$charamsg =~ s/<br>//ig;
				$msgnum = length($charamsg);
				if ($msgnum < $characheck) {
					 $spam = 1; $reason = "コメントの文字数が$msgnumバイトと少ない";
				}
			}
		}
	}

	# 日本語文チェック
	if (!$spam) {
		if ($asciicheck) {
			if ($cm !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {
				$spam = 1; $reason = "コメントに日本語(ひらがな/カタカナ)がない";
			} else {
				my $flag = 0;
				foreach (@period ) { if ($cm =~ /$_/) {$flag = 1; last;} }
				if (!$flag) { $spam = 1; $reason = "コメントに句読点がない"; }
			}
		}
	}

	if (!$spam) {
		if (-e $spamdata) {
			if ($spamdatacheck || !$re) {
				# 禁止URLデータをロード
				open(SPAM,"$spamdata") || &error("Open Error : $spamdata");
				$SPM = <SPAM>;
				close(SPAM);
				# 禁止URLの書き込みをチェック
				foreach (split(/\,/, $SPM)) {
					if(length($_) > 1) {
						if ($cm =~ /\Q$_\E/i) {
							$spam = 1; $reason = "名前/コメント内に禁止語句$_を含む投稿"; last; }
						if (!$spam && $na =~ /\Q$_\E/i) {
							$spam = 1; $reason = "名前/コメント内に禁止語句$_を含む投稿"; last; }
						if (!$spam && $ur =~ /\Q$_\E/i) {
							$spam = 1; $reason = "URLに禁止語句$_を含む投稿"; last; }
						if (!$spam && $ngmail && $em =~ /\Q$_\E/i) {
							$spam = 1; $reason = "メールアドレスに禁止語句$_を含む投稿"; last; }
						if (!$spam && $ngtitle && $sb =~ /\Q$_\E/i) {
							$spam = 1; $reason = "タイトルに禁止語句$_を含む投稿"; last; }
					}
				}
			}
		}
	}

	if (!$spam) {
		if ($urlcheck) {
			if ($urlcheck eq 2 || !$re) {
				# URLのコメントへの重複書き込みをチェック
				if($ur) {
					$ur =~ s/\/$//;
					if ($cm =~ /\Q$ur\E/i) {
						if ($' !~ /(^\/?[\w\?]+?)/)  {
							$spam = 1; $reason = "コメント内にURL欄と同じURLを含む投稿";
						}
					}
				}
			}
		}
	}

	return ($spam,$reason);
}

#-------------------------------------------------
#  スパムログ記録
#-------------------------------------------------
sub write_spamlog {
	local($log_times,$num);
	local($log_comment) = $in{'comment'};
	local($log_name)    = $in{'name'};
	local($log_email)   = $in{'email'};
	local($log_url)     = $in{'url'};
	if (length($log_comment) < length($log_name)) {
		($log_comment,$log_name) = ($log_name,$log_comment);
	}
	if($spamlog == 2) {
		# ひらがなを含まないスパムは記録しない
		if ($log_comment !~ /(\x82[\x9F-\xF2])/) {
			if ($spammsg) { &message("$spammsg"); } else { &cgi_error; }
		}
	}

	if ($log_url =~ /\@/ || $log_email && $log_email !~ /\@/) {
		($log_email,$log_url)=($log_url,$log_email);
	}

	$num = ($log_comment =~ s/http/http/ig);
	if($num >= $maxurl) { $log_comment ="メッセージ内のURL数が$num個と多いため、メッセージ本文削除"; }
	$log_comment =~ s/"/&quot;/g;

	$times = time;
	if (!$in{"$bbscheckmode"}) { $log_times = $times; } else { $log_times = $in{"$bbscheckmode"}; }
	push (@spamlog,"$no<><>$date<>$log_name<>$log_email<>$in{'sub'}<>$log_comment<>$log_url<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$reason<>$log_times<>$ENV{'HTTP_REFERER'}<>$ENV{'HTTP_USER_AGENT'}<>$times<>\n");
	if (-e $spamlogfile) {
		open(OUT,">>$spamlogfile") || &error("Write Error");
		print OUT @spamlog;
		close(OUT);
	} else {
		open(OUT,">$spamlogfile");
		chmod (0606,"$spamlogfile");
		print OUT @spamlog;
		close(OUT);
	}

	# 古いスパムログを削除
	if ($spamlog_max) {
		while ((-s $spamlogfile) > $spamlog_maxfile ) {
			open(IN,"$spamlogfile") || &error("Open Error : >$spamlogfile");
			@spamlog = <IN>;
			close(IN);

			shift(@spamlog);

			open(OUT,">$spamlogfile") || &error("Write Error : $spamlogfile");
			print OUT @spamlog;
			close(OUT);
		}
	}

	# ロック解除
	&unlock if ($lockkey);
}

#-------------------------------------------------
#  スパムログ削除
#-------------------------------------------------
sub del_spamlog {
	local($checktime) = shift;
	my @newspm = ();
	open(IN,"$spamlogfile") || &error("Open Error: $spamlogfile");
	while (<IN>) {
		chomp;
		local ($no,$reno,$date,$name,$email,$sub,$msg,$url,$host,$pwd,$color,$icon,
		$reason,$fcheck,$referer,$useragent) = split(/<>/);
		if ($fcheck eq $checktime) {
			$_ = "";
		} else {
			$_ = "$no<>$reno<>$date<>$name<>$email<>$sub<>$msg<>$url<>$host<>$pwd<>$color<>$icon<>$reason<>$fcheck<>$referer<>$useragent<>\n";
		}
		push(@newspm,"$_");
	}
	close(IN);

	open(OUT,">$spamlogfile") || &error("Write Error : $spamlogfile");
	print OUT @newspm;
	close(OUT);
}

#-------------------------------------------------
#  プレビューチェック
#-------------------------------------------------
sub previewcheck {
	$in{"$bbscheckmode"} = &decode_bbsmode($in{"$bbscheckmode"});
	if ($mode eq "$writevalue") {
		if ($keychange) { ($in{'email'},$in{'url'})=($in{'url'},$in{'email'});
			($in{'comment'},$in{'name'}) = ($in{'name'},$in{'comment'}); }
		if ($previewtime) {
			if ($in{'pview'} ne "on") {
				local($posttime) = time;
				$timecheck = $posttime - $in{"$bbscheckmode"};
				if ($timecheck < 0) { $timecheck2 = 0 - $timecheck; }
				if ($timecheck <= $maxtime) {
					if ($timecheck > $previewmax) { $mode = "previewmode"; }
				}
				if ($timecheck >= $mintime) {
					if ($timecheck < $previewmin) { $mode = "previewmode"; }
				}
			}
		}
	}
}

#-------------------------------------------------
#  プレビュー画面
#-------------------------------------------------
sub previewmode {
	local($timecheck) = shift;
	$time     = time;
	$date     = &get_time($time);
	if ($in{'pwd'} ne "") { $pwd = &encrypt($in{'pwd'}); }
	$reason   = "プレビューモードトラップ($timecheck秒)";

	# プレビューログの記録
	if ($spamlog) { &write_spamlog; }
	$in{"$bbscheckmode"} = &encode_bbsmode($in{"$bbscheckmode"});

	&header;
	print <<EOM;
<form action="$script" method="$method">
<input type="hidden" name="$bbscheckmode" value="$in{$bbscheckmode}">
<!--//
<input type="hidden" name="mode" value="write">
//-->
<input type="hidden" name="pwd" value="$in{'pwd'}">
<input type="hidden" name="name" value="$in{'name'}">
<input type="hidden" name="mail" value="$in{'mail'}">
<input type="hidden" name="email" value="$in{'email'}">
<input type="hidden" name="url" value="$in{'url'}">
<input type="hidden" name="sub" value="$in{'sub'}">
<input type="hidden" name="reno" value="$in{'reno'}">
<input type="hidden" name="color" value="$in{'color'}">
<input type="hidden" name="icon"  value="$in{'icon'}">
<input type="hidden" name="comment" value="$in{'comment'}">
<input type="hidden" name="pview" value="on">
<input type="hidden" name="$formcheck" value="$in{$formcheck}">
<input type="hidden" name="aikotoba" value="$in{'aikotoba'}">
EOM
	$in{'name'} =~ s/"/&quot;/g;
	$in{'sub'}  =~ s/"/&quot;/g;
	$in{'comment'} =~ s/"/&quot;/g;

	# URL
	if ($in{'url'} eq "http://") { $in{'url'} = ""; }

	# ラジオボタン選択
	my ($cnam,$ceml,$curl,$cpwd,$ccol,$caikotoba) = &get_cookie;
	my $cm = $in{'comment'};
	my $ur = $in{'url'};
	my $em = $in{'email'};
	my $pflg = 0;

	# 日本語チェック
	$checked0 = ""; $checked1 = "checked"; $checked2 = "";
	if ($cm =~ /(\x82[\x9F-\xF2])/) {
		$checked0 = "checked"; $checked1 = ""; $checked2 = "";

		# 句読点チェック
		foreach (@period ) { if ($cm =~ /$_/) {$pflg = 1; last;} }
		if (!$pflg) { $checked0 = ""; $checked1 = ""; $checked2 = ""; }

		# URL重複チェック
		$ur =~ s/\/$//;
		$em =~ s/\/$//;
		if (($ur && $cm =~ /\Q$ur\E/i) ||
			($em && $cm =~ /\Q$em\E/i)) {
			if ($' !~ /(^\/?[\w\?]+?)/)  {
				$checked0 = ""; $checked1 = ""; $checked2 = "checked";
			}
		}

		# URL欄入力チェック
		if ($ur)  {
			if (!$curl)  {
				$checked0 = ""; $checked1 = ""; $checked2 = "checked";
			}
		}

		# コメント欄URLチェック
		$urlcnt = ($cm =~ s/http/http/ig);
		if ($urlcnt)  {
			if (!$cnam)  {
				$checked0 = ""; $checked1 = ""; $checked2 = "checked";
			}
		}
	}

	if ($keitai eq 'p') {
		print <<EOM;
<div align="center">
<h2 style="color:#FF0000">投稿はまだ完了しておりません。</h2>
<br>
▼ 内容を確認し、<B STYLE="COLOR:#FF0000">投稿する</B>をチェックして投稿して下さい。<br>
<br>
<table border="1" width='90%' cellspacing="0" cellpadding="10">
<tr><td bgcolor="$tblCol">
<table>
<tr>
  <td><b>お名前</b></td>
  <td>$in{'name'}</td>
</tr>
<tr>
  <td><b>Ｅメール</b></td>
  <td>$in{'email'}</td>
</tr>
<tr>
  <td><b>タイトル</b></td>
  <td>$in{'sub'}</td>
</tr>
<tr>
  <td><b>ＵＲＬ</b></td>
  <td>$in{'url'}</td>
</tr>
<tr>
  <td><b>メッセージ</b></td>
  <td></td>
</tr>
</table>
<blockquote>
<table cellspacing="10">
<tr>
<td valign="top">$in{'comment'}</td>
</tr></blockquote>
</table>
</table>
<p>
<table cellpadding="5">
<tr>
  <td colspan="2">
  <script type="text/javascript">
  <!-- //
  fcheck("io name=mo","<inpu","t type=rad","de value=$postvalue $checked0>");
  // -->
  </script>
  <noscript><input type="radio" name="mode" value="$postvalue"></noscript>
  <B STYLE="COLOR:#FF0000">投稿する</B>
  &nbsp;&nbsp;&nbsp;
  <input type="radio" name="mode" value="regist" $checked1><small>投稿キャンセル</small>
  &nbsp;&nbsp;&nbsp;
  <input type="radio" name="mode" value="write" $checked2><small>投稿中止</small>
  </td>
</tr>
<tr>
  <td><div align="right">
   <input type="submit" value=" 実行 ">
   </form></div></td>
   <td><form><div align="left">
     <input type="button" value="前画面に戻る" onclick="history.back()">
     </div></form>
  </td>
</tr>
</table>
</form>
</div>
</body>
</html>
EOM
	  } else {
		print <<EOM;
▼ 内容を確認し、投稿を実行して下さい。
<hr>
おなまえ: 
<b style="color:#0000FF">$in{'name'}</b><br>
題名: 
<b style="color:#0000FF">$in{'sub'}</b><br>
Ｅメール: 
<b style="color:#0000FF">$in{'email'}</b><br>
コメント<br>
<b style="color:#0000FF">$in{'comment'}</b><br>
<hr>
<input type="radio" name="mode" value="$postvalue" $checked0>投稿する
<br>
<input type="radio" name="mode" value="regist" $checked1><small>投稿をやめる</small>
<br>
<input type="submit" value=" 実行 ">
</form>
<form>
<input type="button" value="前画面に戻る" onclick="history.back()">
EOM
	}
	exit;
}

#-------------------------------------------------
#  フォームチェックデータ符号化
#-------------------------------------------------
sub encode_bbsmode {
	local($fck) = shift;
	if(!$fck) { $fck = time; }
	if($fcencode) {
		srand;
		local($en) = rand(4); $en++; $en = int($en);
		if ($en%2) { $fck = sprintf("%X", $fck);
		} else { $fck = sprintf("%x", $fck); }
		if ($en == 1)    { $fck =~ tr/[0-9]/[g-p]/; }
		elsif ($en == 2) { $fck =~ tr/[0-9]/[q-z]/; }
		elsif ($en == 3) { $fck =~ tr/[0-9]/[G-P]/; }
		elsif ($en == 4) { $fck =~ tr/[0-9]/[Q-Z]/; }
		$fck = reverse($fck);
	}
	return $fck;
}

#-------------------------------------------------
#  フォームチェックデータ復号
#-------------------------------------------------
sub decode_bbsmode {
	local($fck) = shift;
	$fck2 = $fck;
	if ($fck =~ /[a-z]/i) {
		$fck = reverse($fck);
		$fck =~ tr/[g-p]/[0-9]/;
		$fck =~ tr/[q-z]/[0-9]/;
		$fck =~ tr/[G-P]/[0-9]/;
		$fck =~ tr/[Q-Z]/[0-9]/;
		$fck = sprintf("%d", hex($fck));
	}
	if($fck < 0) { $fck = $fck2; }
	return $fck;
}

#-------------------------------------------------
#  アドレス暗号化
#-------------------------------------------------
sub encode_addr {
	local ($adr,$i);
	$adr = shift;
	if (!$adr) { $adr = $addr; }
	$i = 0;
	foreach (split(/\./, $adr)) {
		$addr[$i] = sprintf("%02x", $_);
		$i++;
	}
	$enadr = substr(crypt(join('',@addr), $addr[0]), 2);
	return $enadr;
}

#-------------------------------------------------
#  スパムログ
#-------------------------------------------------
sub spam {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	&header;
	print <<EOM;
<UL>
<table border="0">
<tr><td><form action="$script">
<input type="submit" value="掲示板に戻る">
</form>
</td><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</UL>
<UL><li>投稿拒否ログ<br>
「再投稿処理」をクリックすると誤ってスパム投稿として拒否された投稿を復活させることができます。<br>
必用な投稿を復活させたあとは、「投稿拒否ログを削除」しておいて下さい。
<form action="$script" method="$method">
<input type="hidden" name="mode" value="spamclear">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 投稿拒否ログを削除する ">
</form>
EOM
	open(IN,"$spamlogfile") || &error("Open Error : $spamlogfile");
	$i = 0;
	while (<IN>) {
		local ($no,$reno,$date,$name,$email,$sub,$msg,$url,$host,$pwd,$color,$icon,
		$reason,$fcheck,$referer,$useragent) = split(/<>/);
		$reno{$i}      = $reno;
		$date{$i}      = $date;
		$name{$i}      = $name;
		$email{$i}     = $email;
		$sub{$i}       = $sub;
		$msg{$i}       = $msg;
		$url{$i}       = $url;
		$host{$i}      = $host;
		$pwd{$i}       = $pwd;
		$color{$i}     = $color;
		$icon{$i}      = $icon;
		$reason{$i}    = $reason;
		$useragent{$i} = &escape($useragent);
		$timecheck{$i} = &encode_bbsmode($fcheck);
		if ($fcheck) { $fcheck{$i} = &get_time($fcheck); }
		else { $fcheck{$i} = "アクセス記録なし"; }
		if ($keychange) {
			if ($url{$i} && $url{$i} =~ /\@/) { ($email{$i},$url{$i})=($url{$i},$email{$i}); }
			elsif ($email{$i} && $email{$i} !~ /\@/) { ($email{$i},$url{$i})=($url{$i},$email{$i}); }
		}
		$i++;
	}
	close(IN);

	# ソート処理
	$j = 0;
	$x = 0;
	$page = $in{'page'};
	foreach (sort { ($date{$b} cmp $date{$a}) } keys(%date)) {
		$j++;
		if ($j < $page + 1) { next; }
		if ($j > $page + $spamlog_page) { next; }

		$useragent = "<small>$useragents</small>";
		print "<P><table border=\"1\">\n<tr>";
		print "<tr><td>投稿日時</td><td>$date{$_}</td><td>タイトル</td><td>$sub{$_}</td></tr>",
		"<tr><td>アクセス日時</td><td>$fcheck{$_}</td><td>投稿拒否理由</td><td>$reason{$_}</td></tr>",
		"<tr><td>投稿者名</td><td>$name{$_}</td><td>URL</td><td>$url{$_}</td></tr>",
		"<tr><td>ホストアドレス</td><td>$host{$_}</td><td>ブラウザ</td><td>$useragent{$_}</td></tr>",
		"<tr><td>メールアドレス</td><td>$email{$_}</td><td>投稿内容</td><td> ";
	print <<EOM;
<form action="$script" method="$method">
<input type="hidden" name="mode" value="spammsg">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="hidden" name="msg" value="$msg{$_}">
<input type="submit" value="投稿内容を閲覧">
</form></td></tr></table>
<table border="0"><tr><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="admin_repost_form">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="hidden" name="date"  value="$date{$_}">
<input type="hidden" name="reno"  value="$reno{$_}">
<input type="hidden" name="name"  value="$name{$_}">
<input type="hidden" name="email" value="$email{$_}">
<input type="hidden" name="sub"   value="$sub{$_}">
<input type="hidden" name="msg"   value="$msg{$_}">
<input type="hidden" name="url"   value="$url{$_}">
<input type="hidden" name="host"  value="$host{$_}">
<input type="hidden" name="pwd"   value="$pwd{$_}">
<input type="hidden" name="color" value="$color{$_}">
<input type="hidden" name="icon"  value="$icon{$_}">
<input type="hidden" name="$bbscheckmode" value="$timecheck{$_}">
<input type="hidden" name="reason" value="$reason{$_}">
<input type="submit" value="再投稿処理">
</form></td>
<td>(上記の投稿を復活させることができます)</td></tr></table>
EOM
	}

	print "</table><br>\n";
	$next = $page + $spamlog_page;
	$back = $page - $spamlog_page;

	print "<table><tr>\n";
	if ($back >= 0) {
		print "<td><form action=\"$script\" method=\"POST\">\n";
		print "<input type=\"hidden\" name=\"pass\" value=\"$in{'pass'}\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"$in{'mode'}\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$back\">\n";
		print "<input type=\"submit\" value=\"前画面\"></form></td>\n";
	}
	if ($next < $i) {
		print "<td><form action=\"$script\" method=\"POST\">\n";
		print "<input type=\"hidden\" name=\"pass\" value=\"$in{'pass'}\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"$in{'mode'}\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$next\">\n";
		print "<input type=\"submit\" value=\"次画面\"></form></td>\n";
	}
	print "</tr></table>\n";
	print <<EOM;
<form action="$script" method="$method">
<input type="hidden" name="mode" value="spamclear">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 投稿拒否ログを削除する ">
</form>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  エスケープ
#-------------------------------------------------
sub escape {
	my $str = $_[0];
	$str =~ s/[\x00-\x1F\x7F]//g;
	$str =~ s/&/&amp;/g;
	$str =~ s/</&lt;/g;
	$str =~ s/>/&gt;/g;
	$str =~ s/"/&quot;/g;
	$str =~ s/'/&#x27;/g;
	return $str;
}

#-------------------------------------------------
#  投稿拒否ログ初期化
#-------------------------------------------------
sub spamclear {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	# 投稿拒否ログの初期化
	open(OUT,">$spamlogfile");
	chmod (0606,"$spamlogfile");
	print OUT "";
	close(OUT);

	&header();
	print <<EOM;
<div align="center">
<h4>投稿拒否ログを削除しました</h4>
<table border="0">
<tr><td><form action="$script">
<input type="submit" value="掲示板に戻る">
</form>
</td><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  投稿拒否コメント
#-------------------------------------------------
sub spammsg {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	# エスケープ
	$in{'msg'} =~ s/"/&quot;/g;
	$in{'msg'} =~ s/</&lt;/g;
	$in{'msg'} =~ s/>/&gt;/g;
	# 改行処理
	$in{'msg'} =~ s/&lt;br&gt;/<br>/ig;

	&header();
	print <<EOM;
<div align="center">
<h4>コメント</h4>
<P><table border="1">
<tr><td>$in{'msg'}</td></tr>
</table><BR>
<table border="0">
<tr><td><form action="$script" method="$method">
<input type="hidden" name="mode" value="spam">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 投稿拒否ログ閲覧に戻る ">
</form>
</td><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  NGワード編集
#-------------------------------------------------
sub spamdata {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	&header;
	print <<EOM;
<div align="left">
<table border="0">
<tr><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
<BR>
<li>NGワードを一括登録できます(半角のカンマで区切る)。<br>
<br>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="editspam">
<input type="hidden" name="pass" value="$in{'pass'}">
EOM
	if (-e $spamdata) {
		open(IN,"$spamdata");
		$SPMLST = <IN>;
		close(IN);
	}

	print <<EOM;
<textarea name="SPMLST" rows="30" cols="80" wrap="soft">$SPMLST</textarea><br>
<br>
<input type="submit" value="更新する">
</form>
</ul>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  NGワード更新
#-------------------------------------------------
sub editspam {

	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	$SPMLST = $in{"SPMLST"};

	# 空データ・改行・空白を削除
	$SPMLST =~ s/，/\,/g;
	$SPMLST =~ s/<br>//ig;
	$SPMLST =~ s/\n//g;
	$SPMLST =~ s/\r//g;
	$SPMLST =~ s/　//g;
	$SPMLST =~ s/\,{2,}/\,/g;
	$SPMLST =~ s/^\,{1,}//;

	open(OUT,">$spamdata") || &error("Write Error");
	print OUT $SPMLST;
	close(OUT);

	&header;

	print <<EOM;
<div align="center">
<h4>NGワードを更新しました</h4>
<BR>
<table border="0">
<tr><td>
<form action="$script" method="$method">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  管理者再投稿画面
#-------------------------------------------------
sub admin_repost_form {

	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	$in{'msg'} =~ s/<br>/\n/g;
	$in{'msg'} =~ s/&lt;br&gt;/\n/g;
	$in{"$bbscheckmode"} = &encode_bbsmode($in{"$bbscheckmode"});
	$f_c_d = int(rand(5E07)) + 11E08;

	&header;
	print <<EOM;
<h3>スパム投稿として処理された下記の投稿を復活させます。</h3>
<hr>
<table border="0" cellspacing="1">
<form action="$script" method="$method">
<input type="hidden" name="$bbscheckmode" value="$in{$bbscheckmode}">
<input type="hidden" name="mode" value="admin_repost">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="hidden" name="date" value="$in{'date'}">
<input type="hidden" name="reno" value="$in{'reno'}">
<input type="hidden" name="host" value="$in{'host'}">
<input type="hidden" name="pwd" value="$in{'pwd'}">
<input type="hidden" name="color" value="$in{'color'}">
<input type="hidden" name="icon"  value="$in{'icon'}">
<tr>
  <td><b>投稿拒否理由&nbsp;:&nbsp;$in{'reason'}</b><br><br></td>
</tr>
<tr>
  <td><b>お名前</b>&nbsp;:&nbsp;
    <input type="text" name="name" value="$in{'name'}" class="f"></td>
</tr>
<tr>
  <td><b>Ｅメール</b>&nbsp;:&nbsp;
    <input type="text" name="email" size="28" value="$in{'email'}"></td>
</tr>
<tr>
  <td><b>タイトル</b>&nbsp;:&nbsp;
    <input type="text" name="sub" value="$in{'sub'}" class="f">
  </td>
</tr>
<tr>
  <td>
    <b>メッセージ</b><br>
    <textarea cols="56" rows="7" name="comment" wrap="soft" class="f">$in{'msg'}</textarea>
  </td>
</tr>
<tr>
  <td><input type="hidden" name="$formcheck" value="$f_c_d">
  </td>
</tr>
<tr>
  <td><b>ＵＲＬ</b>&nbsp;:&nbsp;
  <input type="text" name="url" size="50" value="$in{'url'}" class="f"></td>
</tr>
</table>
<table><tr><td>
<input type="submit" value="投稿復活処理する">
</form>
</td>
<td><form action="$script" method="$method">
<input type="hidden" name="mode" value="spam">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" value=" 投稿拒否ログ閲覧に戻る ">
</form>
</td></tr></table>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  アクセス制限チェック
#-------------------------------------------------
sub spambot {
	open(IN, "$denyfile");
	local($deny) = <IN>;
	close (IN);
	local($flag) = 0;
	local(@denyip) = split(/\,/, $deny);
	foreach $denyip (@denyip) {
		if(length($denyip) > 7) {
			$denyip =~ s/\./\\\./g;
			$denyip =~ s/\*/\.\*/g;
			if ($addr =~ /^$denyip/) { $flag = 1; last; }
		}
	}
	if($flag) { &cgi_error; }
}


#------------------#
#  JavaScript無効  #
#------------------#
sub noscript {
&header;
print <<"EOM";
<table width="100%"><tr><th bgcolor="#008080">
  <font color="#FFFFFF">JavaScriptを利用したメールアドレス表\示について</font>
</th></tr></table>
<P><div align="center">
スパム(一方的迷惑メール)およびウイルス対策のため、JavaScriptを利用したメールアドレス表\示を採用しています。<br>
お手数をおかけしますが、投稿者のメールアドレスを表\示させるためには、JavaScriptを有効にしてください。<br>
<br>
<form action="$script" target="_top">
<input type="hidden" name="page" value="$page">
<input type="submit" value="掲示板へ戻る">
</form>
</div>
<br><hr>
</body>
</html>
EOM
exit;
}

__END__

