#!/usr/bin/perl -I../share
# RCS Infomation.
# 削除変更禁止 ----------------------------------------------------------------------------------------- #
$CGI{'RCS_ID'} = '$Id: main.pl 3.12 2003/02/03 11:49:29 Administrator Exp Administrator $';
$CGI{'RCS_SOURCE'} = '$Source: D:/Users/Administrator/projects/works/salut/C-008_tkimageupbbs1-S/visit\\RCS/main.pl $';
# ------------------------------------------------------------------------------------------------------ #
# 以下,情報の変更・削除を禁じます --------------------------------------------------------------------- #
# TKImageUpBBS1:画像アップロード&返信機能付き掲示板:VISIT
# Copyright(C) NTTPC Communications, Inc. 2001,2002,2003
# Programmed by Tomonori Kamitaki
#
# [注意事項]
# スクリプト中の削除変更禁止やそれに関するコメントがあるコードは,
# 著作権保護の為に一切の変更を認めません。
#
# [利用規程および規約]
# スクリプト配布元であるSalut!(サリュ)のホームページをご覧下さい。
# Salut!(サリュ)ホームページ => http://www.salut.ne.jp/
#
# --------------------------------------------------------------------------------------------- ここまで #
# 以下,情報の変更・削除を禁じます --------------------------------------------------------------------- #
$CGI{'TITLE'} = 'TKImageUpBBS1';
$CGI{'COPYRIGHT'} = 'Copyright(C) NTTPC Communications, Inc. 2001,2002';
$CGI{'COPYRIGHT_URL'} = 'http://www.nttpc.co.jp/';
$CGI{'VERSION'} = '2.0';
$CGI{'REVISION'} = '$Revision: 3.12 $';
$CGI{'REVISION'} =~ s/^\D*(\d+\.\d+)\D*$/$1/;
$CGI{'PROG_BY'} = 'Tomonori Kamitaki';
$CGI{'PROG_MAIL'} = '';
$CGI{'INFOMATION'} = $CGI{'TITLE'}." by Salut! Web Master's Heaven";
$CGI{'INFOMATION_URL'} = 'http://www.salut.ne.jp/';
$CGI{'SUPPORT_MAIL'} = '';
$CGI{'COOKIE_AUTHOR'} = $CGI{'TITLE'};
# --------------------------------------------------------------------------------------------- ここまで #
# 変数の設定 1(環境に応じて設定します)---------------------------------------------------------------- #
# 管理用パスワード
# $g_admin_pass = '0123';
# 文字エンコード指定:( jis | sjis | euc )から選択。(通常は,変更不要)
# 文字コード変換へは,jcode.plを使用します。
$g_char_encoding = 'sjis'; # ※省略時は,変換を省きます。
# ----------------------------------------------------------------------------------------- 変数の設定 1 #
# 変数の設定 2(通常は変更不要:変更した場合の動作保証はありません)------------------------------------ #
# MIME Type Table
%g_mime_type = (
'image/jpeg', 'jpg',
'image/pjpeg', 'jpg',
'image/png', 'png',
'image/x-png', 'png',
'image/gif', 'gif',
);
# htmlタグ:
# 0 = No Check Mode, Dangerous & Experimental
# 1 =
Only
$g_html_tag_flag = 1;
#
# ロックファイル保存用パス
$g_lock_file = '../tmp/'.$CGI{'TITLE'}.'.lok';
#
# ロックのタイプ( lock_type : lockWithOpen = 0, lockWithSym = 1 )
$g_lock_type = 1;
#
# ロックに高速リトライサイクルモードを使用する( ON = 1, OFF = 0 )
$g_lock_fast_cycle = 1;
# ログヘッダファイル名
$g_log_head = '../share/log_header.cfg';
#
# ログファイル名(実際には log.0.dat の様に数字が入ります。必ず[.*.]の様にして下さい。)
$g_log_file = '../log/log.*.dat';
#
# テンポラリログファイル名
$g_log_tmp = '../tmp/log.dat';
#
# テンポラリイメージファイル prefix
$g_img_tmp = '../tmp/img';
#
# アップロードイメージのフォーム名
$g_img_obj_name = 'IMG_FILE';
# 設定ファイル
%g_cfg_file = (
'LOCAL', './main.cfg',
'GLOBAL', '../share/global.cfg'
);
%g_cmd = (
'DELT_DELT', 'ADDP_FORM',
'ADDP_FORM', 'ADDP_FORM',
'ADDR_FORM', 'ADDR_FORM',
'ADDX_RESU', 'ADDX_RESU',
'EDIT_FORM', 'EDIT_FORM',
'EDIT_RESU', 'EDIT_RESU',
'DELE_FORM', 'DELE_FORM',
'DELE_RESU', 'DELE_RESU',
'SEAR_FORM', 'SEAR_FORM',
'SEAR_RESU', 'SEAR_RESU',
'VIEW_MANU', 'VIEW_MANU',
'ADMI_LOGS', 'ADMI_LOGS',
'VISI_LOGS', 'VISI_LOGS',
'XXXX_ERRO', 'XXXX_ERRO',
);
# HTMLタグテンプレートファイル:
%g_html_cgi = (
$g_cmd{'ADDP_FORM'}, '../share/tpl_visit/addp_form_tpl.html', #
$g_cmd{'ADDR_FORM'}, '../share/tpl_visit/addr_form_tpl.html', #
$g_cmd{'ADDX_RESU'}, '../share/tpl_visit/addx_resu_tpl.html', #
$g_cmd{'EDIT_FORM'}, '../share/tpl_visit/edit_form_tpl.html', #
$g_cmd{'EDIT_RESU'}, '../share/tpl_visit/edit_resu_tpl.html', #
$g_cmd{'DELE_FORM'}, '../share/tpl_visit/dele_form_tpl.html', #
$g_cmd{'DELE_RESU'}, '../share/tpl_visit/dele_resu_tpl.html', #
$g_cmd{'SEAR_FORM'}, '../share/tpl_visit/sear_form_tpl.html', #
$g_cmd{'SEAR_RESU'}, '../share/tpl_visit/sear_resu_tpl.html', #
$g_cmd{'VIEW_MANU'}, '../share/tpl_visit/view_manu_tpl.html', #
$g_cmd{'XXXX_ERRO'}, '../share/tpl_visit/xxxx_erro_tpl.html', #
);
%g_html_out = (
$g_cmd{'ADMI_LOGS'}, '../share/tpl_admin/view_logs_tpl.html', #
$g_cmd{'VISI_LOGS'}, '../share/tpl_visit/view_logs_tpl.html', #
);
# セパレータ文字列
$g_sep = '<>';
# アラーム時間
$g_alarm_time = 5;
# 管理CGIフラグ
$g_admin = 1;
# 空パス:1 = 有効,0 = 無効
$g_free_pass = 0;
# デッバグ設定(0 = 無効,1 = 有効)
$g_debug = 0;
# ----------------------------------------------------------------------------------------- 変数の設定 2 #
if($g_debug) {
unless(open(DEBUG, ">../debug_$CGI{'TITLE'}.txt")) {
die 'DEBUG FILE ERROR!!';
}
}
# グローバル変数
(
$g_cgi_exec_mode,
%g_in,
$g_br_tag,
$g_alarm_flag
) = undef;
# 前処理
{
# サポートライブラリをロード
require 'tk_util6.pl';
# サポートライブラリ初期化
&tk_util6::initialize(\%CGI, \%g_in, \%g_cfg_file, \&check_usr_config, \%g_html_cgi, $g_lock_file, 1);
# エラー処理コールバック関数をセット
$g_error_proc_ref = \&tk_util6::error;
$g_br_tag = $tk_util6::br_tag;
}
#
# メイン処理
&main();
# メイン処理関数
sub main
{
my($error, $proc_ref);
my(%usr_cfg, %proc_mode);
my(%command_referer);
# 設定ファイルの読込
my(@cfg_file) = ($g_cfg_file{'LOCAL'}, $g_cfg_file{'GLOBAL'});
if($error = &tk_util6::readConfigFile(\@cfg_file, \%usr_cfg)) {
&$g_error_proc_ref($error, 1, 1);
}
# 設定内容のチェック
&check_usr_config(\%usr_cfg);
# 入力内容を解析・取得
if($error = &tk_util6::parseInput(\%g_in, $g_char_encoding, $g_html_tag_flag, $usr_cfg{$usr_cfg{'id-0'}.'-FORM_BUF_SIZE'})) {
&$g_error_proc_ref($error, 0, 1);
## $g_in{'COMMAND'} = $g_cmd{'XXXX_ERRO'};
## $g_in{'ERROR'} = $error;
}
# CGI内部情報を設定
&tk_util6::set_cgi_info(\%g_in, \%usr_cfg);
# アラーム時間設定
&tk_util6::set_alarm_time($g_alarm_time);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('main_alarm');
# ファイルロックの開始
if($error = &tk_util6::cgi_lock_start($g_lock_type, $g_lock_fast_cycle)) {
&$g_error_proc_ref($error, 0, 1);
}
# Command Refererテーブル作成
%command_referer = (
$g_cmd{'ADDP_FORM'}, '', # 特定不能
$g_cmd{'ADDR_FORM'}, '', # 特定不能
$g_cmd{'ADDX_RESU'}, '', # 特定不能
$g_cmd{'EDIT_FORM'}, '', # 特定不能
$g_cmd{'EDIT_RESU'}, $g_cmd{'EDIT_FORM'}, #
$g_cmd{'DELE_FORM'}, '', # 特定不能
$g_cmd{'DELE_RESU'}, $g_cmd{'DELE_FORM'}, #
$g_cmd{'SEAR_FORM'}, '', # 特定不能
$g_cmd{'SEAR_RESU'}, '', # 特定不能
$g_cmd{'VIEW_MANU'}, '', # 特定不能
$g_cmd{'XXXX_ERRO'}, '', # 特定不能
);
# コマンド指定はあるか?
unless($g_in{'COMMAND'}) {
# なし:コマンド指定無時のデフォルト設定
$g_in{'COMMAND'} = $g_cmd{'DELT_DELT'};
}
# 処理関数のリファレンス・テーブル作成
%proc_mode = (
$g_cmd{'ADDP_FORM'}, \&proc_addp_form, #
$g_cmd{'ADDR_FORM'}, \&proc_addr_form, #
$g_cmd{'ADDX_RESU'}, \&proc_addx_resu, #
$g_cmd{'EDIT_FORM'}, \&proc_edit_form, #
$g_cmd{'EDIT_RESU'}, \&proc_edit_resu, #
$g_cmd{'DELE_FORM'}, \&proc_dele_form, #
$g_cmd{'DELE_RESU'}, \&proc_dele_resu, #
$g_cmd{'SEAR_FORM'}, \&proc_sear_form, #
$g_cmd{'SEAR_RESU'}, \&proc_sear_resu, #
$g_cmd{'VIEW_MANU'}, \&proc_view_manu, #
$g_cmd{'XXXX_ERRO'}, \&proc_xxxx_erro, #
);
# 指定された処理関数は,存在するかな?
if(exists $proc_mode{$g_in{'COMMAND'}}) {
# あり
# 処理関数へのリファレンスを取り出し
$proc_ref = $proc_mode{$g_in{'COMMAND'}};
# リファレンスをセット
unless($g_in{'COMMAND_REFERER'}) {
$g_in{'COMMAND_REFERER'} = $command_referer{$g_in{'COMMAND'}};
}
# 処理関数を実行
&$proc_ref(\%usr_cfg);
} else {
# 未定義処理:エラー表示を行う
&$g_error_proc_ref('プログラムは,未定義な処理コマンド内容をリクエストされました。'.$g_br_tag.'処理は続行不能です。 URLや入力フォーム等が間違っていないか確かめてから再度アクセスしてみて下さい。'.$g_in{'COMMAND'});
}
# ロックファイル終了
&tk_util6::cgi_lock_end();
# アラーム時間設定
&tk_util6::set_alarm_time(0);
# アラーム処理登録
&tk_util6::sig_alarm_regist($save_sig);
&tk_util6::testHashOut("main", \%g_in);
}
sub main_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 使用方法表示
sub proc_view_manu
{
my($usr_cfg_ref) = @_;
my($error);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_view_manu_alarm');
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'VIEW_MANU'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_view_resu_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# エラー表示
sub proc_xxxx_erro
{
my($usr_cfg_ref) = @_;
my($error, %tpl_html);
my($tpl_html_file) = $g_html_cgi{$g_cmd{'XXXX_ERRO'}};
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_xxxx_erro_alarm');
unless($g_in{'ERROR'}) {
$g_in{'ERROR'} = 'エラー・テスト';
}
&$g_error_proc_ref($g_in{'ERROR'});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_xxxx_erro_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 検索フォーム表示
sub proc_sear_form
{
my($usr_cfg_ref) = @_;
my($error);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_sear_form_alarm');
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'SEAR_FORM'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_sear_form_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 検索+結果表示
sub proc_sear_resu
{
my($usr_cfg_ref) = @_;
my($error);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_sear_resu_alarm');
my($error_proc_name) = 'proc_sear_resu(); ';
# 全角スペースを半角スペースへ
$g_in{'KEYWORD'} =~ s/ / /g;
# 連続する空白文字をスペース
$g_in{'KEYWORD'} =~ s/\s+/ /g;
# 検索キーワードはあるか?
unless(length($g_in{'KEYWORD'})) {
# ない:
&proc_sear_form($usr_cfg_ref);
} else {
# ある:
my($i);
my($current_log_num, $last_log_num, @log_name_index, %log_id_index, %damy);
my(@item_name, %usr_log, @search_item_list, @s_key_list);
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
# ログファイルリスト取得
($current_log_num, $last_log_num) = &create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
if($current_log_num < 0) {
# ログ無:
&$g_error_proc_ref('検索すべきログがありません。');
}
undef %log_id_index;
unless(defined $g_in{'SLOG_NUM'}) {
$g_in{'SLOG_NUM'} = $current_log_num;
}
## &debug_msg("$error_proc_name SLOG_NUM = $g_in{'SLOG_NUM'}, SCOMMENT_NUM = $g_in{'SCOMMENT_NUM'}");
&sort_file_index_list_by_revNums(\@log_name_index, \@log_name_index, \%log_id_index);
# テンプレートHTMLの読込
if($error = &tk_util6::readDataFile($g_html_cgi{$g_cmd{'SEAR_RESU'}}, $tk_util6::tpl_html, \%tpl_html)) { &error($err_info.$error."\n$!"); }
# tpl_htmlをセットアップ
&tk_util6::setup_tpl_html(\%g_in, \%tpl_html, $usr_cfg_ref, \%damy);
# HTMLヘッダを出力
&tk_util6::out_html_header();
# メイン・ヘッダを出力
print $tpl_html{'MAIN_HEAD'};
# 検索対象アイテムリストを取得
for(split(/,/, $usr_cfg_ref->{'main-SEARCH_ITEM_LIST'})) {
push(@search_item_list, split(/$g_sep/, $_));
}
# キーワードのインデックスを作成
@s_key_list = split(/ /, $g_in{'KEYWORD'});
# 検索開始
my($hit_max) = $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-CMT_PER_LOG'};
## &debug_msg("$error_proc_name hit_max = $hit_max");
my($jump_flag) = 1;
SEARCH:
for(@log_name_index[$log_id_index{$g_in{'SLOG_NUM'}} .. $#log_name_index]) {
$_ =~ m/^(.+?)([\d]+)(.+?)$/;
$current_log_num = $2;
# ログを開く
open(ASV_IN, $_) || &$g_error_proc_ref("読込:[ $_ ]ログファイルのオープンに失敗しました。$error_proc_name\n$!");
# ヘッダ読込
if(&tk_util6::asv_read_head(\*ASV_IN, \@item_name, $g_sep)) { &$g_error_proc_ref("ログファイルヘッダの読込に失敗しました。$error_proc_name\n$!"); }
# ログ読込
while(!(&tk_util6::asv_read_data(\*ASV_IN, \%usr_log, \@item_name, $g_sep))) {
my($hit_nums) = 0;
my($hit_flag) = 0;
if($jump_flag == 1) {
if(($usr_log{$$comment_num_item_name_ref} == $g_in{'SCOMMENT_NUM'}) || !($g_in{'SCOMMENT_NUM'})) {
## &debug_msg("$error_proc_name match or zero.");
$jump_flag = 0;
} else {
undef %usr_log;
next;
}
}
# キーワードを取得(キーワード数分繰り返す)
for(@s_key_list) {
# キーワードをセット
my($s_key) = quotemeta($_);
# 検索対象アイテムを取得(対象アイテム数分繰り返す)
for(@search_item_list) {
# 検索対象アイテムの中にキーワードは含まれているか?
if($usr_log{$_} =~ m/$s_key/) {
# 含む:フラグを加算
$hit_flag++;
last;
}
}
# キーワードはヒットしたか?
if($hit_flag) {
# ヒット数を加算
$hit_nums++;
# フラグをリセット
$hit_flag = 0;
}
}
# ヒットしたか?
if($hit_nums) {
# AND || OR ok?
if( (($g_in{'METHOD'} eq "AND") && ($hit_nums > $#s_key_list)) || ($g_in{'METHOD'} ne "AND") ) {
$usr_log{'LOG_NUM'} = $current_log_num;
if($hit_max == 0) {
$usr_log{'NEXT_RESULT'} = 1;
## &debug_msg("$error_proc_name A log = $usr_log{'LOG_NUM'}, cmt_num = $usr_log{$$comment_num_item_name_ref}");
## &debug_msg("$error_proc_name enable next page.");
close(ASV_IN);
last SEARCH;
}
# 記事部分の置換処理&出力
print &tk_util6::save_data_replace($tpl_html{'COMMENT_MAIN_HEAD'}, \%tpl_html, \%usr_log, \%damy);
$hit_max--;
}
}
if($g_alarm_flag) {
$g_alarm_flag = 0;
$usr_log{'TIME_OUT'} = 1;
close(ASV_IN);
last SEARCH;
} else {
undef %usr_log;
}
}
# 既存ログを閉じる
close(ASV_IN);
}
## &debug_msg("$error_proc_name B log = $usr_log{'LOG_NUM'}, cmt_num = $usr_log{$$comment_num_item_name_ref}");
if($hit_max == $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-CMT_PER_LOG'}) {
$usr_log{'NOTHING'} = 1;
}
# メイン・フッタを出力
print &tk_util6::save_data_replace($tpl_html{'MAIN_FOOT'}, \%tpl_html, \%usr_log, \%damy);
}
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_sear_resu_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
$g_alarm_flag = 1;
return undef;
}
# 記事追加フォーム表示
sub proc_addp_form
{
my($usr_cfg_ref) = @_;
my($error);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_addp_form_alarm');
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'ADDP_FORM'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_addp_form_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 返信追加フォーム表示
sub proc_addr_form
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'proc_addr_form(); ';
my($error, $tmp);
my(@log_name_index, %log_id_index, $current_log_name, $current_log_num, $current_cm_num);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_addr_form_alarm');
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($res_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-RES_NUM_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
# ログファイルリスト取得
&create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
# 返信をつける親記事のログファイルは存在するか?
$current_log_num = $g_in{$$log_num_item_name_ref};
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'返信を追加する親記事を含んだログファイルがありません。'.$g_br_tag);
}
# ログファイルの最大記事数チェック
my($chk) = $g_in{$$res_num_item_name_ref};
unless($current_cm_num = &check_log($current_log_name, $usr_cfg_ref, $g_sep, \$chk)) {
# 最大記事数を越えている:新規投稿扱いにするか?のユーザーに質問する
&$g_error_proc_ref('返信を追加する親記事を含んだログファイルが最大記事数を越えているので返信は出来ませんでした。 返信をしたい場合は新規に記事を投稿してください。'.$g_br_tag.$error_proc_name);
} else {
## &debug_msg("$error_proc_name 返信を追加する事が出来る。");
}
# ログファイル中に親記事は存在するか?
unless($chk) {
&$g_error_proc_ref('返信を追加する親記事を含んだログファイルがありません。'.$g_br_tag.$error_proc_name);
} else {
## &debug_msg("$error_proc_name 返信を追加する親記事を含んだログファイルがある");
}
# テンプレートHTMLの読込
my(%tpl_html, %cookie, %usr_log, @item_name);
if($error = &tk_util6::readDataFile($g_html_cgi{$g_cmd{'ADDR_FORM'}}, $tk_util6::tpl_html, \%tpl_html)) {
&$g_error_proc_ref($error_proc_name.$error.''.$g_br_tag.$!);
}
# クッキーの取得
&tk_util6::get_cookie($CGI{'COOKIE_AUTHOR'}, \%cookie);
# tpl_htmlをセットアップ
&tk_util6::setup_tpl(\%g_in, \%tpl_html, $usr_cfg_ref, \%cookie);
# クッキーを保存
&tk_util6::set_cookie($CGI{'COOKIE_AUTHOR'}, \%cookie);
# HTMLヘッダを出力
&tk_util6::out_html_header();
# メイン・ヘッダを出力
print $tpl_html{'MAIN_HEAD'};
# ログファイルを開く
unless(open(LOG_IN, $current_log_name)) {
&$g_error_proc_ref($error_proc_name.'読込:ログファイルのオープンに失敗しました。'.$g_br_tag.$!);
}
# ログヘッダ読み込み
if(&tk_util6::asv_read_head(\*LOG_IN, \@item_name, $g_sep)) {
&$g_error_proc_ref($error_proc_name.'ログファイルヘッダの読込に失敗しました。'.$g_br_tag.$!);
}
# ログ読込
while(!(&tk_util6::asv_read_data(\*LOG_IN, \%usr_log, \@item_name, $g_sep))) {
# 該当する親記事か?
if($g_in{$$res_num_item_name_ref} == $usr_log{$$comment_num_item_name_ref}) {
# Yes:
# 親記事上側部分の置換処理&出力
print &tk_util6::save_data_replace($tpl_html{'COMMENT_MAIN_HEAD'}, \%tpl_html, \%usr_log, \%cookie);
# 親記事上側部分の置換処理&テンポラリへセット
$tmp = &tk_util6::save_data_replace($tpl_html{'COMMENT_MAIN_FOOT'}, \%tpl_html, \%usr_log, \%cookie);
}
# 該当する返信記事か?
if($g_in{$$res_num_item_name_ref} == $usr_log{$$res_num_item_name_ref}) {
# Yes:
# 返信記事部分の置換処理&出力
print &tk_util6::save_data_replace($tpl_html{'COMMENT_SUB'}, \%tpl_html, \%usr_log, \%cookie);
}
}
# 親記事下側部分をテンポラリから出力
print $tmp;
# ログファイルを閉じる
close(LOG_IN);
# メイン・フッタを出力
print $tpl_html{'MAIN_FOOT'};
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_addr_form_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 記事/返信追加処理+結果表示
sub proc_addx_resu
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'proc_addx_resu(); ';
my($error, $update_flag);
my(@log_name_index, %log_id_index, $current_log_name, $current_log_num, $current_cm_num, $last_log_num);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_addx_resu_alarm');
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($res_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-RES_NUM_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
my($pass_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-PASS_ITEM_NAME'};
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
# 入力フォームチェック
&check_input_form($usr_cfg_ref);
# ログファイルリスト取得
($current_log_num, $last_log_num) = &create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
## &debug_msg("$error_proc_name cur_log_num = $current_log_num");
if($current_log_num < 0) {
# ログファイル無:新規作成
## &debug_msg("$error_proc_name 新規作成");
# ファイル名作成
$current_log_name = &create_file_name(\$g_log_file, 0);
&tk_util6::copy_file($g_log_head, $current_log_name);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'新規ログ作成に失敗しました。'.$g_br_tag.$!);
} else {
# ログファイルリスト再取得
## &debug_msg("$error_proc_name 再取得");
($current_log_num, $last_log_num) = &create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
$current_cm_num = 1;
}
} else {
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
}
## &debug_msg("$error_proc_name start stage 2, current_log_num = $current_log_num");
# 入力の種類?
unless($g_in{$$res_num_item_name_ref}) {
# 新規入力:
## &debug_msg("$error_proc_name 新規入力");
# ログファイルの最大記事数チェック
unless($current_cm_num = &check_log($current_log_name, $usr_cfg_ref, $g_sep)) {
# 最大記事数を越えている:ファイル名作成
$current_log_name = &create_file_name(\$g_log_file, $current_log_num + 1);
&tk_util6::copy_file($g_log_head, $current_log_name);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'新規ログ作成に失敗しました。'.$g_br_tag);
} else {
# 最大ログ数チェック
unless(($#log_name_index + 1) < $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_PAGE_MAX'}) {
# 範囲外:古いログを削除
&delete_log($last_log_num, ($usr_cfg_ref->{'global-BASE_PATH'}.$usr_cfg_ref->{'global-IMG_PATH'}));
# } else {
# # 範囲内
}
# ログファイルリスト取得を再作成
($current_log_num, $last_log_num) = &create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
## &debug_msg("$error_proc_name current = $current_log_num, last = $last_log_num, log-nums = $#log_name_index, LOG_PAGE_MAX = $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_PAGE_MAX'}");
$current_cm_num = 1;
}
}
$update_flag = 1;
} else {
# 返信入力:
# 返信をつける親記事のログファイルは存在するか?
$current_log_num = $g_in{$$log_num_item_name_ref};
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'返信を追加する親記事を含んだログファイルがありません。'.$g_br_tag);
}
# ログファイルの最大記事数チェック
my($chk) = $g_in{$$res_num_item_name_ref};
unless($current_cm_num = &check_log($current_log_name, $usr_cfg_ref, $g_sep, \$chk)) {
# 最大記事数を越えている:新規投稿扱いにするか?のユーザーに質問する
&$g_error_proc_ref('返信を追加する親記事を含んだログファイルが最大記事数を越えているので返信は取り消されました。 返信をしたい場合は新規に記事を投稿してください。'.$g_br_tag.$error_proc_name);
}
# ログファイル中に親記事は存在するか?
unless($chk) {
&$g_error_proc_ref('返信を追加する親記事を含んだログファイルがありません。'.$g_br_tag.$error_proc_name);
}
$update_flag = 2;
}
## &debug_msg("$error_proc_name $current_log_num , $current_cm_num");
# 入力されたパスワードを退避(後処理で必要)
$g_in{'src-'.$$pass_item_name_ref} = $g_in{$$pass_item_name_ref};
# 入力されたパスワードを暗号化
&tk_util6::encrypt_data(\$g_in{$$pass_item_name_ref});
# クッキーの取得
my(%cookie);
&tk_util6::get_cookie($CGI{'COOKIE_AUTHOR'}, \%cookie);
# 多重投稿チェック
if($error = &check_multiplex_contribution(\%g_in, $usr_cfg_ref, \%cookie, $g_sep)) {
&$g_error_proc_ref($error_proc_name.'多重投稿です。$g_br_tagError Type = '.$error);
}
# ログ番号をクッキーに保存
$cookie{$$log_num_item_name_ref} = $current_log_num;
# 記事番号をクッキーに保存
$cookie{$$comment_num_item_name_ref} = $current_cm_num;
# 現記事番号をセット
$g_in{$$comment_num_item_name_ref} = $current_cm_num;
## &debug_msg("$error_proc_name $current_cm_num $current_log_name, $g_log_tmp, $usr_cfg_ref, %g_in, $update_flag, $g_sep");
# 画像ファイル名生成
my($img_name) = $usr_cfg_ref->{'global-IMG_PATH'}.$current_log_num.'-'.$current_cm_num;
&auto_link();
# 記事と画像を保存
$current_cm_num = &update_log_file(\$current_log_name, \$g_log_tmp, $usr_cfg_ref, \%g_in, $update_flag, $g_sep, \$img_name);
# 変更の必要があるログを更新
update_html_file(\$g_log_file, $usr_cfg_ref, $current_log_num);
# HTMLを表示
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'ADDX_RESU'}}, \%cookie);
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_addx_resu_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 記事修正フォーム表示
sub proc_edit_form
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'proc_edit_form(); ';
my($error);
my(@log_name_index, %log_id_index, $current_log_name, $current_log_num);
my($chk, $pass, %usr_log, @item_name);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_edit_form_alarm');
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
# ログファイルリスト取得
&create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
# 修正対象記事のログファイルは存在するか?
$current_log_num = $g_in{$$log_num_item_name_ref};
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'修正対象の記事を含んだログファイルがありません。'.$g_br_tag);
}
# ログファイル中に修正対象は存在するか?
$chk = $g_in{$$comment_num_item_name_ref};
&check_log($current_log_name, $usr_cfg_ref, $g_sep, \$chk, \$pass, \%usr_log, \@item_name);
unless($chk) {
&$g_error_proc_ref($error_proc_name.'修正すべき記事がログファイルに存在しません。'.$g_br_tag);
}
for(@item_name) {
$g_in{$_} = $usr_log{$_};
$g_in{$_} =~ s/($g_br_tag|)/\n/gi;
## &debug_msg("$error_proc_name $_ = $usr_log{$_}");
## &debug_msg("$error_proc_name $_ = $g_in{$_}");
}
undef %usr_log;
&del_auto_link();
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'EDIT_FORM'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_edit_form_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 記事修正処理+結果表示
sub proc_edit_resu
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'proc_edit_form(); ';
my($error);
my(@log_name_index, %log_id_index, $current_log_name, $current_log_num, $current_cm_num);
my($chk, $pass, %usr_log, @item_name);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_edit_resu_alarm');
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
# 入力フォームチェック
&check_input_form($usr_cfg_ref);
# ログファイルリスト取得
&create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
# 修正対象記事のログファイルは存在するか?
$current_log_num = $g_in{$$log_num_item_name_ref};
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'修正対象の記事を含んだログファイルがありません。'.$g_br_tag);
}
# ログファイル中に修正対象は存在するか?
$chk = $g_in{$$comment_num_item_name_ref};
&check_log($current_log_name, $usr_cfg_ref, $g_sep, \$chk, \$pass, \%usr_log, \@item_name);
unless($chk) {
&$g_error_proc_ref($error_proc_name.'修正すべき記事がログファイルに存在しません。'.$g_br_tag);
}
&check_passwd($usr_cfg_ref, $pass);
if($g_in{'IMG_FILE_FLAG'} && $usr_log{$g_img_obj_name.'_PATH'}) {
unlink($usr_log{$g_img_obj_name.'_PATH'});
$g_in{$g_img_obj_name.'_PATH'} = undef;
}
## &debug_msg("$error_proc_name $current_cm_num $current_log_name, $g_log_tmp, $usr_cfg_ref, %g_in, 3, $g_sep");
&auto_link();
# 記事を保存
$current_cm_num = &tk_util6::update_log_file(\$current_log_name, \$g_log_tmp, $usr_cfg_ref, \%g_in, 3, $g_sep);
# 変更の必要があるログを更新
update_html_file(\$g_log_file, $usr_cfg_ref, $current_log_num);
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'EDIT_RESU'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_edit_resu_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 記事/返信削除フォーム表示
sub proc_dele_form
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'proc_dele_form(); ';
my($error);
my(@log_name_index, %log_id_index, $current_log_name, $current_log_num);
my($chk, $pass);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_dele_form_alarm');
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
# ログファイルリスト取得
&create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
# 返信対象記事のログファイルは存在するか?
$current_log_num = $g_in{$$log_num_item_name_ref};
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'削除対象の記事を含んだログファイルがありません。'.$g_br_tag);
}
# ログファイル中に削除対象は存在するか?
$chk = $g_in{$$comment_num_item_name_ref};
&check_log($current_log_name, $usr_cfg_ref, $g_sep, \$chk, \$pass);
unless($chk) {
&$g_error_proc_ref($error_proc_name.'削除すべき記事がログファイルに存在しません。'.$g_br_tag);
}
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'DELE_FORM'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_dele_form_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# 記事/返信削除+結果表示
sub proc_dele_resu
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'proc_dele_resu(); ';
my($error, $update_flag);
my(@log_name_index, %log_id_index, $current_log_name, $current_log_num, $current_cm_num);
my($chk, $pass, %usr_log, @item_name);
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('proc_dele_resu_alarm');
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
# ディスク空き容量チェック
&check_disk_availability($usr_cfg_ref);
# ログファイルリスト取得
&create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
# 修正対象記事のログファイルは存在するか?
$current_log_num = $g_in{$$log_num_item_name_ref};
$current_log_name = &create_file_name(\$g_log_file, $current_log_num);
unless(-e $current_log_name) {
&$g_error_proc_ref($error_proc_name.'削除対象の記事を含んだログファイルがありません。'.$g_br_tag);
}
# ログファイル中に削除対象は存在するか?
$chk = $g_in{$$comment_num_item_name_ref};
&check_log($current_log_name, $usr_cfg_ref, $g_sep, \$chk, \$pass, \%usr_log, \@item_name);
unless($chk) {
&$g_error_proc_ref($error_proc_name.'削除すべき記事がログファイルに存在しません。'.$g_br_tag);
}
&check_passwd($usr_cfg_ref, $pass);
## &debug_msg("$error_proc_name $usr_log{$g_img_obj_name.'_PATH'}");
if($usr_log{$g_img_obj_name.'_PATH'}) {
unlink($usr_log{$g_img_obj_name.'_PATH'});
}
## &debug_msg("$error_proc_name $current_cm_num $current_log_name, $g_log_tmp, $usr_cfg_ref, %g_in, 0, $g_sep");
# 記事を保存
$current_cm_num = &update_log_file(\$current_log_name, \$g_log_tmp, $usr_cfg_ref, \%g_in, 0, $g_sep);
## &debug_msg("$error_proc_name $current_cm_num, $current_log_name");
# 更新したログ記事数チェック
unless($current_cm_num) {
# 記事なし:ログを削除
## &debug_msg("$error_proc_name unlink $current_log_name");
unlink($current_log_name);
# 変更の必要があるログを更新
update_html_file(\$g_log_file, $usr_cfg_ref);
} else {
# 変更の必要があるログを更新
update_html_file(\$g_log_file, $usr_cfg_ref, $current_log_num);
}
&show_html($usr_cfg_ref, \$g_html_cgi{$g_cmd{'DELE_RESU'}});
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub proc_dele_resu_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('プログラムはタイムアウト(処理時間切れ)した為,処理を完了出来ませんでした。 しばらくしてからもう一度アクセスし直してみて下さい。'.$g_br_tag.$SIG{'ALRM'});
# return undef;
}
# ログ更新関数
# $update_flag の意味
# 0 = 削除
# 1 = 新規追加
# 2 = 返信追加
# メモ:この関数はtk_util6.plの同名関数より追加のみ実装し,画像アップロードサポートの為の実装を施したもの
sub update_log_file
{
my($log_src_ref, $log_tmp_ref, $usr_cfg_ref, $in_ref, $update_flag, $sep, $img_name_ref) = @_;
my($error_proc_name) = 'update_log_file(); ';
my($i, $p_flag, %usr_log, @item_name);
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($res_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-RES_NUM_ITEM_NAME'};
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('update_log_file_alarm');
## &debug_msg("$error_proc_name $$log_src_ref, $$log_tmp_ref, $usr_cfg_ref, $in_ref, $update_flag, $sep, $in_ref->{$g_img_obj_name}");
# 画像ファイル保存処理
my($img_tmp_file) = undef;
if($in_ref->{$g_img_obj_name}) {
my($img_ext);
($img_tmp_file, $img_ext) = &tk_util6::save_upload_file($g_img_obj_name, \%g_mime_type, \$g_img_tmp);
unless(-e $img_tmp_file) {
&$g_error_proc_ref('アップロード画像の保存に失敗しました。'.$g_br_tag.$error_proc_name.$!);
}
$in_ref->{$g_img_obj_name.'_PATH'} = $usr_cfg_ref->{'global-BASE_PATH'}.$$img_name_ref.'.'.$img_ext;
}
# 既存ログを開く
unless(open(LOG_SRC, $$log_src_ref)) {
&$g_error_proc_ref('読込:ログファイルのオープンに失敗しました。'.$g_br_tag.$error_proc_name.$!);
}
# テンポラリログを開く
unless(open(LOG_TMP, ">$$log_tmp_ref")) {
&$g_error_proc_ref('書込:ログファイルのオープンに失敗しました。'.$g_br_tag.$error_proc_name.$!);
}
# ヘッダ読込
if(&tk_util6::asv_read_head(\*LOG_SRC, \@item_name, $sep)) {
&$g_error_proc_ref('ログファイルヘッダの読込に失敗しました。'.$g_br_tag.$error_proc_name.$!);
}
# ヘッダ書込
if(&tk_util6::asv_write_head(\*LOG_TMP, \@item_name, $sep)) {
&$g_error_proc_ref('ログファイルヘッダの書込に失敗しました。'.$g_br_tag.$error_proc_name.$!);
}
# 新規追加?
if($update_flag == 1) {
# 記事を出力
if(&tk_util6::asv_write_data(\*LOG_TMP, $in_ref, \@item_name, $sep)) {
# エラー:
close(LOG_TMP);
unlink($$log_tmp_ref);
&$g_error_proc_ref('ログファイル出力中にエラーが発生しました。(新規追加)'.$g_br_tag.$error_proc_name.$!);
}
$i++;
}
# 既存ログ読込
while(!(&tk_util6::asv_read_data(\*LOG_SRC, \%usr_log, \@item_name, $sep))) {
# 返信追加?
if($update_flag == 2) {
# 追加対象親記事?
if($in_ref->{$$res_num_item_name_ref} == $usr_log{$$comment_num_item_name_ref}) {
# 返信追加フラグセット
$p_flag = 1;
} else {
# 返信記事追加先か?
if(($p_flag == 1) && ($in_ref->{$$res_num_item_name_ref} != $usr_log{$$res_num_item_name_ref})) {
# 返信記事を追加
if(&tk_util6::asv_write_data(\*LOG_TMP, $in_ref, \@item_name, $sep)) {
# エラー:
close(LOG_TMP);
unlink($$log_tmp_ref);
&$g_error_proc_ref('ログファイル出力中にエラーが発生しました。(返信追加)'.$g_br_tag.$error_proc_name.$!);
} else {
# 返信追加フラグをリセット
$p_flag = undef;
$i++;
}
}
}
# 削除?
} elsif($update_flag == 0) {
# 削除対象記事?
if(($in_ref->{$$comment_num_item_name_ref} == $usr_log{$$comment_num_item_name_ref})
|| ($in_ref->{$$comment_num_item_name_ref} == $usr_log{$$res_num_item_name_ref})) {
# 次を読込
if($usr_log{$g_img_obj_name.'_PATH'}) {
unlink($usr_log{$g_img_obj_name.'_PATH'});
}
undef %usr_log;
next;
}
}
# 既存ログをテンポラリログへ出力
if(&tk_util6::asv_write_data(\*LOG_TMP, \%usr_log, \@item_name, $sep)){
close(LOG_TMP);
unlink($$log_tmp_ref);
&$g_error_proc_ref('ログファイル出力中にエラーが発生しました。(既存ログ保存)'.$g_br_tag.$error_proc_name.$!);
}
undef %usr_log;
$i++;
}
# 返信追加?
if($update_flag == 2 && $p_flag == 1) {
# 返信記事を追加
if(&tk_util6::asv_write_data(\*LOG_TMP, $in_ref, \@item_name, $sep)) {
# エラー:
close(LOG_TMP);
unlink($$log_tmp_ref);
&$g_error_proc_ref('ログファイル出力中にエラーが発生しました。(返信追加)'.$g_br_tag.$error_proc_name.$!);
} else {
# 返信追加フラグをリセット
$p_flag = undef;
$i++;
}
}
# 既存ログを閉じる
close(LOG_SRC);
# テンポラリログを閉じる
close(LOG_TMP);
my($remain) = &tk_util6::set_alarm_time(0);
# テンポラリイメージを移動
if($in_ref->{$g_img_obj_name}) {
unless(rename($img_tmp_file, $in_ref->{$g_img_obj_name.'_PATH'})) {
&$g_error_proc_ref('テンポラリイメージの移動に失敗しました。'.$g_br_tag.$error_proc_name.$!);
}
}
# テンポラリログを移動して更新
unless(rename($$log_tmp_ref, $$log_src_ref)) {
&$g_error_proc_ref('ログの更新に失敗しました。(テンポラリログ移動失敗)'.$g_br_tag.$error_proc_name.$!);
}
&tk_util6::set_alarm_time($remain);
&tk_util6::sig_alarm_regist($save_sig);
# 出力した記事数を返値
return $i;
}
sub update_log_file_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('処理時間切れにより,ログは更新されませんでした。$g_br_tagこのエラーが頻繁に発生する場合は,1ログあたりの記事登録数(CMT_PER_LOG)を減らすと改善する事があります。$g_br_tagupdate_log_file_alarm();');
# return undef;
}
# ログファイル削除関数
sub delete_log
{
my($log_num, $img_dir) = @_;
my($error_proc_name) = 'delete_log(); ';
opendir(DIR, $img_dir) || &$g_error_proc_ref(''.$g_br_tag.$error_proc_name.' log num = '.$log_num.' dir = '.$img_dir.$g_br_tag.$!);
while($entry = readdir(DIR)) {
if(-d $entry) {
next;
} else {
if($entry =~ m/^$log_num-\d+\.(.*)/) {
unlink($img_dir.$entry);
}
}
}
closedir(DIR);
unlink(&create_file_name(\$g_log_file, $log_num));
}
# ファイルリストを最新順にソートする関数
sub sort_file_index_list_by_revNums
{
my($src_index_ref, $dst_index_ref, $id_index_ref) = @_;
my($error_proc_name) = 'sort_file_index_list_by_revNums(); ';
my(@tmp);
my($i);
$src_index_ref->[0] =~ m/^(.+?)([\d]+)(.+?)$/;
my($prefix) = $1;
my($postfix) = $3;
$i = 0;
for(@$src_index_ref) {
$_ =~ m/^(.+?)([\d]+)(.+?)$/;
$tmp[$i] = $2;
$i++;
}
$i = 0;
for(sort {$b <=> $a} @tmp) {
$dst_index_ref->[$i] = $prefix.$_.$postfix;
$id_index_ref->{$_} = $i;
## &debug_msg("$error_proc_name name = $dst_index_ref->[$i], id = $id_index_ref->{$_}");
$i++;
}
}
# HTML表示
sub show_html
{
my($usr_cfg_ref, $tpl_html_file_ref, $cookie_ref) = @_;
my($error, %tpl_html, %cookie);
unless($cookie_ref) {
my($pass_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-PASS_ITEM_NAME'};
&tk_util6::get_cookie($CGI{'COOKIE_AUTHOR'}, \%cookie);
$cookie_ref = \%cookie;
# 入力されたパスワードを退避(後処理で必要)
$g_in{'src-'.$$pass_item_name_ref} = $cookie_ref->{'PASS'};
# } else {
# undef %cookie;
}
# テンプレートHTMLの読込
if($error = &tk_util6::readDataFile($$tpl_html_file_ref, $tk_util6::tpl_html, \%tpl_html)) {
&$g_error_proc_ref($error.''.$g_br_tag.$!);
} else {
# HTMLを表示
&tk_util6::show_view(\%g_in, \%tpl_html, $usr_cfg_ref, $cookie_ref);
}
return undef;
}
# HTMLファイル更新関数
sub update_html_file
{
my($log_base_name_ref, $usr_cfg_ref, $update_log_num) = @_;
my($error_proc_name) = 'update_html_file(); ';
# アラーム処理登録
my($save_sig) = &tk_util6::sig_alarm_regist('update_html_file_alarm');
if($g_admin) {
## &debug_msg("$error_proc_name Normal Mode.");
&update_html_file_2($log_base_name_ref, $usr_cfg_ref, $usr_cfg_ref->{'global-ADMIN_HTML_PATH'}, $g_html_out{$g_cmd{'ADMI_LOGS'}}, $update_log_num);
&update_html_file_2($log_base_name_ref, $usr_cfg_ref, $usr_cfg_ref->{'global-VISIT_HTML_PATH'}, $g_html_out{$g_cmd{'VISI_LOGS'}}, $update_log_num);
} else {
## &debug_msg("$error_proc_name User Mode Only.");
&update_html_file_2($log_base_name_ref, $usr_cfg_ref, $usr_cfg_ref->{'global-VISIT_HTML_PATH'}, $g_html_out{$g_cmd{'VISI_LOGS'}}, $update_log_num);
}
&tk_util6::sig_alarm_regist($save_sig);
return undef;
}
sub update_html_file_alarm
{
## &debug_msg("$SIG{'ALRM'} start...");
# 処理時間切れ
&$g_error_proc_ref('ログは更新されましたが処理時間切れにより,一部のHTMLファイルの更新に失敗した可能性があります。$g_br_tagこのエラーが頻繁に発生する場合は,最大ログ保持数(LOG_PAGE_MAX)を減らすと改善する事があります。$g_br_tagupdate_html_file_alarm();');
# return undef;
}
# HTMLファイル更新関数(サブ)
sub update_html_file_2
{
my($log_base_name_ref, $usr_cfg_ref, $html_path, $html_tpl, $update_log_num) = @_;
my($error_proc_name) = 'update_html_file_2(); ';
my($error, $n, $flag, $key);
my(%next_page, %prev_page);
my($out_html_name);
my(%update_log_num_index);
my(@log_name_index, %log_id_index, $current_log_num, $last_log_num);
my(@html_file_index, %html_id_index);
my($html_base_name) = $usr_cfg_ref->{'global-BASE_PATH'}.$html_path.$usr_cfg_ref->{'global-HTML_LOG_2ND_FILE_NAME'};
## &debug_msg("$error_proc_name 始め $$log_base_name_ref, $update_log_num");
# 更新ログ番号を更新対象リストへ登録
if(defined $update_log_num) {
$update_log_num_index{$update_log_num} = 1;
}
# ログファイルリスト取得
($current_log_num, $last_log_num) = &create_file_index($log_base_name_ref, \@log_name_index, \%log_id_index);
# HTMLファイルリスト取得
&create_file_index(\$html_base_name, \@html_file_index, \%html_id_index);
# 更新対象HTMLリスト作成&ファイル削除
&create_update_list_and_delete_file($usr_cfg_ref, \@html_file_index, \%html_id_index, $log_base_name_ref, \%update_log_num_index);
$flag = undef;
# 更新対象HTMLリストに前後ページを追加,前後ページインデックスを作成
for(sort {$a <=> $b} sort keys %log_id_index) {
$prev_page{$n} = $_;
if($flag) {
$update_log_num_index{$_} = 1;
$flag = undef;
}
unless(-e $html_file_index[$html_id_index{$_}]) {
# ファイル無
$update_log_num_index{$n} = 1;
$flag = 1;
}
$next_page{$_} = $n;
$n = $_;
}
$flag = undef;
## &debug_msg("$error_proc_name 書出始め");
my(%written_log_num_index);
# 更新対象HTMLをログに基づいて書出
&write_html_file(
$usr_cfg_ref,
$html_tpl,
\$html_base_name,
\@log_name_index,
\%log_id_index,
\%update_log_num_index,
\%next_page,
\%prev_page,
\%written_log_num_index
);
# 更新対象HTMLをログに基づいて書出(次ページ:リンク修正の為)
&write_html_file(
$usr_cfg_ref,
$html_tpl,
\$html_base_name,
\@log_name_index,
\%log_id_index,
\%update_log_num_index,
\%next_page,
\%prev_page,
\%written_log_num_index,
\%next_page
);
# 更新対象HTMLをログに基づいて書出(前ページ:リンク修正の為)
&write_html_file(
$usr_cfg_ref,
$html_tpl,
\$html_base_name,
\@log_name_index,
\%log_id_index,
\%update_log_num_index,
\%next_page,
\%prev_page,
\%written_log_num_index,
\%prev_page
);
my($html_1st_name);
$html_1st_name = $usr_cfg_ref->{'global-BASE_PATH'}.$html_path.$usr_cfg_ref->{'global-HTML_LOG_1ST_FILE_NAME'};
$out_html_name = &create_file_name(\$html_base_name, $n);
if(&update_html_1st_page($out_html_name, $html_1st_name)) {
&$g_error_proc_ref($error_proc_name.'最新ページ(1ページ目)の更新に失敗しました。$out_html_name, $html_1st_name'.$g_br_tag);
}
return undef;
}
sub write_html_file
{
my( $usr_cfg_ref,
$tpl_html_name,
$dst_html_base_name_ref,
$log_name_index_ref,
$log_id_index_ref,
$update_log_num_index_ref,
$next_page_ref,
$prev_page_ref,
$written_log_num_index_ref,
$opt_key_index_ref
) = @_;
my($error_proc_name) = 'write_html_file(); ';
my($key, $dst_html_file);
my($prev_page_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-PREV_PAGE_ITEM_NAME'};
my($next_page_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-NEXT_PAGE_ITEM_NAME'};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'};
for(sort {$b <=> $a} sort keys %$update_log_num_index_ref) {
if($opt_key_index_ref) {
unless(length($_)) {
next;
}
$key = $opt_key_index_ref->{$_};
} else {
$key = $_;
}
unless(length($key)) {
next;
}
if(length($next_page_ref->{$key})) {
$g_in{$$next_page_item_name_ref} = &create_file_name(\$usr_cfg_ref->{'global-HTML_LOG_2ND_FILE_NAME'}, $next_page_ref->{$key});
$g_in{$$log_num_item_name_ref} = $next_page_ref->{$key};
}
if(length($prev_page_ref->{$key})) {
$g_in{$$prev_page_item_name_ref} = &create_file_name(\$usr_cfg_ref->{'global-HTML_LOG_2ND_FILE_NAME'}, $prev_page_ref->{$key});
$g_in{$$log_num_item_name_ref} = $prev_page_ref->{$key};
}
$g_in{$$log_num_item_name_ref} = $key;
$dst_html_file = &create_file_name($dst_html_base_name_ref, $key);
## &debug_msg("%g_in, $usr_cfg_ref, $tpl_html_name, $log_name_index_ref->[$log_id_index_ref->{$key}], $dst_html_file, $g_sep, 1, $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-FLAG_ITEM_NAME'}");
$written_log_num_index_ref->{$key} = &tk_util6::convert_log2file_with_tpl(\%g_in, $usr_cfg_ref, $tpl_html_name, $log_name_index_ref->[$log_id_index_ref->{$key}], $dst_html_file, $g_sep, 1, \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-FLAG_ITEM_NAME'});
# ページ変数をリセット
delete $g_in{$$next_page_item_name_ref};
delete $g_in{$$prev_page_item_name_ref};
## &debug_msg("$error_proc_name $log_name_index_ref->[$log_id_index_ref->{$key}] = $dst_html_file ( $key ) ... update.");
}
}
# 最新ページの更新
sub update_html_1st_page
{
my($src_file, $dst_file) = @_;
my($error_proc_name) = 'update_html_1st_page(); ';
if(-e $src_file) {
## &debug_msg("$error_proc_name YES.");
&tk_util6::copy_file($src_file, $dst_file);
unless(-e $dst_file) {
return 1;
}
} else {
## &debug_msg("$error_proc_name NO. unlink $dst_file");
unlink($dst_file);
}
return undef;
}
# 更新ファイルリスト作成&ファイル削除
sub create_update_list_and_delete_file
{
my($usr_cfg_ref, $file_name_index_ref, $file_id_index_ref, $base_name_ref, $update_log_num_index_ref) = @_;
my($error_proc_name) = 'create_update_list_and_delete_file(); ';
my($p, $pp, $flag, $file_name, %unlink_id_list);
for(sort {$b <=> $a} sort keys %$file_id_index_ref) {
if($flag) {
$update_log_num_index_ref->{$_} = 1;
$flag = undef;
}
$file_name = &create_file_name($base_name_ref, $_);
## &debug_msg("$error_proc_name $file_name checking...");
unless(-e $file_name) {
# ファイル2無:ファイル1削除
## &debug_msg("$error_proc_name $file_name_index_ref->[$file_id_index_ref->{$_}] delete.");
unlink($file_name_index_ref->[$file_id_index_ref->{$_}]);
delete $file_id_index_ref->{$_};
$update_log_num_index_ref->{$p} = 1;
$unlink_id_list{$_} = 1;
$flag = 1;
}
$p = $_;
}
for(sort {$b <=> $a} sort keys %unlink_id_list) {
if($update_log_num_index_ref->{$_} == 1) {
delete $update_log_num_index_ref->{$_};
}
}
return undef;
}
# 保存用ファイル名作成
sub create_file_name
{
my($base_name_ref, $num) = @_;
my($prefix, $postfix);
my($error_proc_name) = 'create_file_name(); ';
$$base_name_ref =~ m/^(.+?)\.\*\.(.+?)$/;
$prefix = $1;
$postfix = $2;
## &debug_msg($error_proc_name.$prefix.'.'.$num.'.'.$postfix."");
return ($prefix.'.'.$num.'.'.$postfix);
}
# ファイルインデックス作成
# 番号からログファイルパスを取得するには,
# $name_index[$id_index{番号}];
# とする。
sub create_file_index
{
my($filename_ref, $name_index_ref, $id_index_ref) = @_;
my($error_proc_name) = 'create_file_index(); ';
my($i) = 0;
my($dir_path, $prefix, $postfix, $entry, $current, $last);
$$filename_ref =~ m/^((.+?)([^\/]+?))\.\*\.(.+?)$/;
$dir_path = $2;
$prefix = $3;
$postfix = $4;
opendir(DIR, $dir_path) || &$g_error_proc_ref($error_proc_name.'ディレクトリが開けませんでした。'.$g_br_tag.$!);
while($entry = readdir(DIR)) {
if(-d $entry) {
next;
} else {
unless($entry =~ m/^$prefix\.(\d+)\.$postfix$/) {
next;
} else {
unless($i) {
$current = $1;
$last = $1;
} else {
if($current < $1) {
$current = $1;
}
if($last > $1) {
$last = $1;
}
}
# ログ番号をキーにしてIDをセット
$id_index_ref->{$1} = $i;
# IDをキーにしてファイル名をセット
$name_index_ref->[$i] = $dir_path.$entry;
## &debug_msg("$error_proc_name entry = $entry, current = $current, last = $last, id = $id_index_ref->{$1}, name = $name_index_ref->[$i]");
# IDを加算
$i++;
}
}
}
closedir(DIR);
unless($i) {
return (-1, -1);
} else {
# 現在の最新と最後のログ番号を返値
return ($current, $last);
}
}
# ログファイル最大記事数チェック
sub check_log
{
my($log_file, $usr_cfg_ref, $sep, $chk_ref, $pass_ref, $usr_log_ref, $item_name_ref) = @_;
my($error_proc_name) = 'check_log(); ';
my($i, $max, %usr_log, @item_name, $chk_flag);
my($current_num);
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-COMMENT_NUM_ITEM_NAME'};
my($res_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-RES_NUM_ITEM_NAME'};
my($pass_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-PASS_ITEM_NAME'};
## &debug_msg("$log_file, $usr_cfg_ref, $sep, $chk_ref, $pass_ref, $usr_log_ref, $item_name_ref");
unless(open(LOG_IN, $log_file)) {
&$g_error_proc_ref($error_proc_name.'ファイルが開けませんでした。'.$log_file.$g_br_tag.$!);
}
if(&tk_util6::asv_read_head(\*LOG_IN, \@item_name, $sep)) {
&$g_error_proc_ref($error_proc_name.'ヘッダの読込に失敗しました。'.$g_br_tag.$!);
}
while(!(&tk_util6::asv_read_data(\*LOG_IN, \%usr_log, \@item_name, $sep))) {
if($$chk_ref == $usr_log{$$comment_num_item_name_ref}) {
$chk_flag = 1;
$$pass_ref = $usr_log{$$pass_item_name_ref};
if($usr_log_ref && $item_name_ref) {
%$usr_log_ref = %usr_log;
@$item_name_ref = @item_name;
}
}
if($current_num < $usr_log{$$comment_num_item_name_ref}) {
$current_num = $usr_log{$$comment_num_item_name_ref};
}
undef %usr_log;
$i++;
}
close(LOG_IN);
# チェック対象記事番号はあり?
if($chk_flag) {
# あり:
$$chk_ref = 1;
} else {
# なし:
$$chk_ref = undef;
}
# 現ログ番号を計算
$current_num++;
# 返信?
if($g_in{$$res_num_item_name_ref}) {
$max = $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-CMT_PER_LOG_MAX'};
} else {
$max = $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-CMT_PER_LOG'};
}
## &debug_msg("$error_proc_name $g_in{$$res_num_item_name_ref}, $current_num, $i, $max");
# 最大数を超えているか?
if($i < $max) {
# 範囲外
return $current_num;
} else {
# 範囲内:
return undef;
}
}
# パスワードチェック関数
sub check_passwd
{
my($usr_cfg_ref, $pass) = @_;
my($pass_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-PASS_ITEM_NAME'};
# ユーザーモード?
if($g_cgi_exec_mode) {
# 管理者削除?
# if($g_in{'MODE'} eq 'ADM') {
# unless($g_in{$$pass_item_name_ref} eq $g_admin_pass) {
# ## &debug_msg("$error_proc_name admin pass check fail.");
# &$g_error_proc_ref($error_proc_name.'管理用パスワードが違います。'.$g_br_tag);
# }
# } else {
{
if($g_free_pass) {
# 既存リリースと同じ動作
# 通常モード:パスワードチェック
if(&tk_util6::decrypt_data($g_in{$$pass_item_name_ref}, $pass)) {
# 入力されたパスワードを退避(後処理で必要)
$g_in{'src-'.$$pass_item_name_ref} = $g_in{$$pass_item_name_ref};
# 入力されたパスワードを暗号化
&tk_util6::encrypt_data(\$g_in{$$pass_item_name_ref});
} else {
# パスワード不正:エラー表示処理
&$g_error_proc_ref($error_proc_name.'記事入力時のパスワードと一致しないか,パスワードが入力されていません。 正しいパスワードを入力して下さい。'.$g_br_tag);
}
} else {
# 空パスワード拒否
# パスワード入力があるのか?
if(length($g_in{$$pass_item_name_ref})) {
# 通常モード:パスワードチェック
if(&tk_util6::decrypt_data($g_in{$$pass_item_name_ref}, $pass)) {
# 入力されたパスワードを退避(後処理で必要)
$g_in{'src-'.$$pass_item_name_ref} = $g_in{$$pass_item_name_ref};
# 入力されたパスワードを暗号化
&tk_util6::encrypt_data(\$g_in{$$pass_item_name_ref});
} else {
# パスワード不正:エラー表示処理
&$g_error_proc_ref($error_proc_name.'記事入力時のパスワードと一致しないか,パスワードが入力されていません。 正しいパスワードを入力して下さい。'.$g_br_tag);
}
} else {
# パスワード入力無:エラー表示処理
&$g_error_proc_ref($error_proc_name.'記事入力時のパスワードと一致しないか,パスワードが入力されていません。 正しいパスワードを入力して下さい。'.$g_br_tag);
}
}
}
} else {
$g_in{$$pass_item_name_ref} = $pass;
}
}
# 多重投稿チェック関数
sub check_multiplex_contribution
{
my($in_ref, $usr_cfg_ref, $cookie_ref, $sep) = @_;
my($chk, $pass, %usr_log, @item_name);
my($log_num, $cmt_num, $err_type);
my($current_log_num, $last_log_num, @log_name_index, %log_id_index);
# アイテム名を取得
my($comment_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-COMMENT_NUM_ITEM_NAME"};
my($log_num_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-LOG_NUM_ITEM_NAME"};
# ログファイルリストと現ログ番号取得 (^^;
($log_num, $last_log_num) = &create_file_index(\$g_log_file, \@log_name_index, \%log_id_index);
# クッキーを取得できているか?
if((exists $cookie_ref->{$$log_num_item_name_ref}) && (exists $cookie_ref->{$$comment_num_item_name_ref})) {
# クッキー有り
$log_num = $cookie_ref->{$$log_num_item_name_ref};
$cmt_num = $cookie_ref->{$$comment_num_item_name_ref};
$err_type = 1;
} else {
# クッキー無し:前記事取得
$cmt_num = &check_log($log_name_index[$log_id_index{$log_num}], $usr_cfg_ref, $sep);
if($cmt_num < 2) {
while($log_num >= 0) {
$log_num--;
if(exists $log_id_index{$log_num}) {
break;
}
}
if($log_num < 0) {
return undef;
}
$cmt_num = &check_log($log_name_index[$log_id_index{$log_num}], $usr_cfg_ref, $sep);
}
$cmt_num--;
$err_type = 2;
}
if($cmt_num < 1) {
return undef;
} else {
$chk = $cmt_num;
&check_log($log_name_index[$log_id_index{$log_num}], $usr_cfg_ref, $sep, \$chk, \$pass, \%usr_log, \@item_name);
unless($chk) {
return undef;
} else {
my($item, $name, $same_num, $check_item_num, $item);
# チェックアイテム取得してリストにあるアイテムをチェックする
for(split(/,/, $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-MULTIPLEX_CONTRIBUTION_CHECK_ITEM_LIST'})) {
($item, $name) = split(/$sep/, $_);
# アイテム・データは同一であるか?
if($in_ref->{$item} eq $usr_log{$item}) {
# 同一:
$same_num++;
}
# チェックアイテム数をインクリメント
$check_item_num++;
}
# 一致エラー数がデータ比較対照数と同じであったか?
if($same_num == $check_item_num) {
# 同じです:エラーを表示
return $err_type;
}
}
}
}
# 入力フォームチェック
sub check_input_form
{
my($usr_cfg_ref) = @_;
my($error_proc_name) = 'check_input_form(); ';
my($error);
my($error_tmp);
my($ret);
# リモートホストのチェック
if($usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-REFUSAL_HOST"}) {
# 拒否ホスト名を分解しながらリモートホストをチェック
foreach (split(/,/, $usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-REFUSAL_HOST"})) {
$_ =~ s/\*/\.\*/g;
# ホスト名は,拒否対象に該当するか?
if(($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-HOST_ITEM_NAME"}} =~ m/$_/)
|| ($ENV{'REMOTE_ADDR'} =~ m/$_/)) {
# 該当する:エラー表示文字を設定
$error = 'リモートホスト拒否:'.$g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-HOST_ITEM_NAME"}};
# ループを抜ける
last;
}
}
if($error) {
&$g_error_proc_ref($error_proc_name.$error);
}
}
# 入力フォームチェック項目:通常
$ret = &tk_util6::check_input_form(\%g_in, \($usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-CHECK_INPUT_FORM_ITEM_LIST'}), \$error_tmp, 0);
if($error_tmp) {
# エラー
$error = $error_tmp;
}
# 入力フォームチェック項目:数字
$ret += &tk_util6::check_input_form(\%g_in, \($usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-CHECK_INPUT_FORM_ITEM_LIST_WITH_NUM'}), \$error_tmp, 1);
if($error_tmp) {
# エラー
$error .= ''.$g_br_tag.$error_tmp;
}
# エラーはあったか?
if($error) {
# あり:エラー表示
&$g_error_proc_ref($error_proc_name.$error);
}
# メールアド返信のチェック(書式的に)
if(length($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-EMAIL_ITEM_NAME"}})) {
if($error = &tk_util6::check_email_address(\($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-EMAIL_ITEM_NAME"}}))) {
# エラー:エラー表示
&$g_error_proc_ref($error_proc_name.$error);
}
}
# メールアド返信のチェック(書式的に)
if(length($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-URL_ITEM_NAME"}})) {
if($error = &tk_util6::check_url_address(\($g_in{$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}."-URL_ITEM_NAME"}}))) {
# エラー:エラー表示
&$g_error_proc_ref($error_proc_name.$error);
}
}
#
if($g_cgi_exec_mode) {
} else {
# my($pass_item_name_ref) = \$usr_cfg_ref->{$usr_cfg_ref->{'id-0'}.'-PASS_ITEM_NAME'};
# $g_in{$$pass_item_name_ref} = $g_admin_pass;
}
return undef;
}
# 設定内容のチェック
sub check_usr_config
{
my($config_ref) = @_;
my($error_proc_name) = 'check_usr_config(); ';
# ---------------------------------------------------------------------------- #
# ログ番号のデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'})) {
# デフォルト設定:LOG_NUM
$config_ref->{$config_ref->{'id-0'}.'-LOG_NUM_ITEM_NAME'} = 'LOG_NUM';
}
# パスワードのデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-PASS_ITEM_NAME'})) {
# デフォルト設定:PASS
$config_ref->{$config_ref->{'id-0'}.'-PASS_ITEM_NAME'} = 'PASS';
}
# メールアド返信のデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-EMAIL_ITEM_NAME'})) {
# デフォルト設定:EMAIL
$config_ref->{$config_ref->{'id-0'}.'-EMAIL_ITEM_NAME'} = 'EMAIL';
}
# URLアド返信のデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-URL_ITEM_NAME'})) {
# デフォルト設定:URL
$config_ref->{$config_ref->{'id-0'}.'-URL_ITEM_NAME'} = 'URL';
}
# URLアド返信のデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-FLAG_ITEM_NAME'})) {
# デフォルト設定:FLAG
$config_ref->{$config_ref->{'id-0'}.'-FLAG_ITEM_NAME'} = 'FLAG';
}
# ---------------------------------------------------------------------------- #
# 次ページのデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-PREV_PAGE_ITEM_NAME'})) {
# デフォルト設定:PREV_PAGE
$config_ref->{$config_ref->{'id-0'}.'-PREV_PAGE_ITEM_NAME'} = 'PREV_PAGE';
}
# 前ページのデータ・アイテム名のチェック
if(!($config_ref->{$config_ref->{'id-0'}.'-NEXT_PAGE_ITEM_NAME'})) {
# デフォルト設定:NEXT_PAGE
$config_ref->{$config_ref->{'id-0'}.'-NEXT_PAGE_ITEM_NAME'} = 'NEXT_PAGE';
}
# ---------------------------------------------------------------------------- #
# フォームバッファサイズ
if(!($config_ref->{$config_ref->{'id-0'}.'-FORM_BUF_SIZE'})) {
# デフォルト設定:200KB
$config_ref->{$config_ref->{'id-0'}.'-FORM_BUF_SIZE'} = 200;
} elsif($config_ref->{$config_ref->{'id-0'}.'-FORM_BUF_SIZE'} > 400) {
# 最大件数:400KB
$config_ref->{$config_ref->{'id-0'}.'-FORM_BUF_SIZE'} = 400;
}
# 最大ログ保持数の設定
if(!($config_ref->{$config_ref->{'id-0'}.'-LOG_PAGE_MAX'})) {
# デフォルト設定:10件
$config_ref->{$config_ref->{'id-0'}.'-LOG_PAGE_MAX'} = 10;
} elsif($config_ref->{$config_ref->{'id-0'}.'-LOG_PAGE_MAX'} > 99) {
# 最大件数:99件
$config_ref->{$config_ref->{'id-0'}.'-LOG_PAGE_MAX'} = 99;
}
# 1ログ/HTMLログページあたりの最大発言数 (SOFT LIMIT)
if(!($config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'})) {
# デフォルト設定:10件
$config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} = 10;
} elsif($config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} > 20) {
# 最大件数:20件
$config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} = 20;
}
# 1ログ/HTMLログページあたりの最大発言数 (HARD LIMIT)
# if(!($config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG_MAX'})) {
# デフォルト設定:$config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} + 10件;
$config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG_MAX'} = $config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} + 10;
# } elsif($config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG_MAX'} > ($config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} + 30)) {
# # 最大件数:$config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} + 30件
# $config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG_MAX'} = $config_ref->{$config_ref->{'id-0'}.'-CMT_PER_LOG'} + 30;
# }
# ---------------------------------------------------------------------------- #
if(defined $config_ref->{$config_ref->{'id-0'}.'-CGI_EXEC_MODE'}) {
$g_cgi_exec_mode = $config_ref->{$config_ref->{'id-0'}.'-CGI_EXEC_MODE'};
if($g_cgi_exec_mode) {
$g_in{'VISIT_MODE-0'} = 1;
$g_in{'VISIT_MODE-1'} = 1;
$g_in{'VISIT_MODE-2'} = 1;
$g_in{'VISIT_MODE-3'} = 1;
$g_in{'VISIT_MODE-4'} = 1;
$g_in{'VISIT_MODE-5'} = 1;
$g_in{'VISIT_MODE-6'} = 1;
$g_in{'VISIT_MODE-7'} = 1;
$g_in{'VISIT_MODE-8'} = 1;
$g_in{'VISIT_MODE-9'} = 1;
} else {
$g_in{'ADMIN_MODE-0'} = 1;
$g_in{'ADMIN_MODE-1'} = 1;
$g_in{'ADMIN_MODE-2'} = 1;
$g_in{'ADMIN_MODE-3'} = 1;
$g_in{'ADMIN_MODE-4'} = 1;
$g_in{'ADMIN_MODE-5'} = 1;
$g_in{'ADMIN_MODE-6'} = 1;
$g_in{'ADMIN_MODE-7'} = 1;
$g_in{'ADMIN_MODE-8'} = 1;
$g_in{'ADMIN_MODE-9'} = 1;
}
} else {
&$g_error_proc_ref($error_proc_name.'CGI実行モードの指定がありません。');
}
# ---------------------------------------------------------------------------- #
}
# ディスク空き容量チェック
sub check_disk_availability
{
my($usr_cfg_ref) = @_;
my($error_str);
my($result) = &tk_util6::check_disk_availability($usr_cfg_ref->{'global-CHECK_DISK_AVAILABILITY_SIZE'});
if($result) {
if($result == 1) {
$error_str = '現在,ディスク空き容量が不足している為に記事に関する全ての処理を見合わせております。しばらくしてからもう一度アクセスして下さい。';
} else {
$error_str = 'ディスク空き容量の取得に失敗しました。CGIが正しく設定されているかどうか確かめて下さい。';
}
## &debug_msg('check_disk_availability(); disk check fail. type = $result');
&$g_error_proc_ref($error_str, 0, 0, 1);
} else {
## &debug_msg('check_disk_availability(); free disk space ok.');
}
}
sub auto_link
{
# AUTO LINK:START ------------------------------------------------------------------------------------------------------------ #
# $g_in{'COMMENT'} =~ s/([^=^\"]|^)((ftp|http|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g;
# AUTO LINK:END -------------------------------------------------------------------------------------------------------------- #
}
sub del_auto_link
{
# DELETE AUTO LINK:START -
# $g_in{'COMMENT'} =~ s///g;
# $g_in{'COMMENT'} =~ s/<\/a>//g;
# DELETE AUTO LINK:END -
}
# デバッグメッセージ出力関数
sub debug_msg
{
if($g_debug) {
print DEBUG @_, "\n";
}
}
#EOF
1;