#! /usr/bin/perl -- use CGI; use CGI::Session; use Jcode; use MIME::Lite; $cgi = CGI->new; require "config.pl"; # コンフィグファイル require "globals.pl"; # グローバル変数の定義 require "input_validation.pl"; # 入力チェック require "session.pl"; # セッション関連 require "convert_string.pl"; # 文字列変換ユーティリティ require "ip.pl"; # ip抜き出し require "limitation.pl"; # 送信制限 require "log.pl"; # ログファイル require "send.pl"; # メール送信 require "id.pl"; # 問合せid作成 # 以下はview require "print_helper.pl"; require "print_form.pl"; require "print_check.pl"; require "print_success.pl"; require "print_error.pl"; require "print_header.pl"; require "print_footer.pl"; require "print_helper.pl"; &main(); return 0; #### main関数ここから #### sub main { my $req_type = $cgi->request_method(); my @pram_name; my $action; my $sid; if( $req_type eq 'GET'){ &action_get(); return; } # POSTの場合 # 登録情報の読み出しと前の画面がどこかを決定 $action = $cgi->param($hidden); if($action eq "input"){ &load_inquiry_data('FORM'); }else{ &load_inquiry_data('COOKIE'); } # session idをチェック # sessionが不正ならgetへ飛ばす my $tmp = &validate_session_ID($inquiry_data{$session_id}); if(&validate_session_ID($inquiry_data{$session_id}) != 0){ &action_get(); return; } #### アクションへの(頭の悪い)ルーティング # $action に画面遷移を決定する情報が入っている if($action eq 'mod'){ # "修正"が押された場合 &print_form(); return; } if($action eq 'error_back'){ #送信失敗から戻った場合:確認画面を表示する &print_check(); return; } # フォームから入力 if($action eq 'input'){ &action_input(); return; } # メール送信 if($action eq 'sendmail'){ &action_send_mail(); return; } &action_get(); return; } ## actionの実装 sub action_get{ my $sid = $inquiry_data{$session_id}; if($sid){ &remove_session($sid); } # セッション作成 $sid = &init_session(); # formを出して終わり &print_form($sid); return; } # フォームからの入力 sub action_input{ &validate_form(); $err_num = @errors; if( $err_num > 0){ # 登録情報にエラーがある # セッションIDをチェックしてなかったら作ったほうがいいかも &print_form($inquiry_data{"session_ID"}); }else{ &print_check(); &write_session_data($inquiry_data{"session_ID"}, %inquiry_data); } return; } # メール送信 sub action_send_mail{ # メール送信 # 再投稿のチェック if( $limitation and (!&check_send_limitation()) ){ # 送信制限にかかった &print_send_limitation(); my $tmp=$cgi->remote_host; &write_log( $inquiry_data{$client_ip}, $tmp, "1", "送信制限"); return; } my $ret; if( &make_inquiry_ID() ne "OK"){ # 問い合わせID作成失敗 &print_abort("ID_FAIL"); &delete_send_limitation(); return; } # 問い合わせIDの作成成功 $ret = &send(); if( $ret eq "OK"){ # アルファに送信成功 &print_success(); &remove_session(); return; }else{ &print_abort($ret); return; } } # データ読み出し関数 # 関数 load_inquiry_data # 連想配列 inquiry_dataを設定する sub load_inquiry_data { my $request = $cgi; my $sid = $request->cookie('CGISESSID')||undef; if ($_[0] eq 'FORM' ){ # formからデータを設定 $inquiry_data{$session_id} = $sid; foreach $elem (@elements){ $inquiry_data{$elem} = $request->param($elem); } # my @checks1; # my @checks2; # @checks1 = $request->param($device); # $inquiry_data{$device} = \@checks1; # @checks2 = $request->param($solution); # $inquiry_data{$solution} = \@checks2; }else{ # セッション情報からデータを設定 my $session; if($sid ne "" ){ $session = CGI::Session->load(undef,$sid,{Directory=>"$session_path"}); if($session){ foreach $key (keys %inquiry_data){ my $str = $session->param($key); $inquiry_data{$key} = $str; } } } } $inquiry_data{$client_ip} = &get_ip(); } # validate関数 # 各validate_xxxを呼び出してチェックをしていく sub validate_form { if( &validate_session_ID($inquiry_data{"session_ID"}) == 1){ $inquiry_data{"session_ID"} = &init_session(); push(@errors,"セッションが無効になりました。お手数ですが再度ご入力をお願いいたします。\n"); } # 全角のチェック my $sp = '(?:\xA1\xA1)'; # 全角スペース my $katakana = '(?:\xA5[\xA1-\xF6])'; # 全角カタカナ my $hiragana = '(?:\xA4[\xA1-\xF3])'; # 全角ひらがな my $kanji = '(?:[\xB0-\xF4][\x00-\xFF])'; # 漢字 my $bar ='(?:\xA1\xBC)'; # 全角ー my $regex_name = "($katakana|$hiragana|$kanji|$sp|$bar)*"; my $regex_kana = "($katakana|$sp|$bar|' ')*"; # 半角スペースを追加 my $text = $inquiry_data{$detail}; $text =~ s/\r\n/\r/g; $text =~ s/\r/\n/g; $text =~ s/\n//g; # 全角カナのチェック &validate_textbox($inquiry_data{$name}, "お名前", undef, $name_length); &validate_textbox($inquiry_data{$name_kana}, "お名前(フリガナ)", $regex_kana, $name_length); &validate_textbox($inquiry_data{$company}, "御社名", undef, $company_length); &validate_tel($inquiry_data{$tel}, "ご連絡先電話番号"); &validate_mail_address($inquiry_data{$mail}, $inquiry_data{$mail_conf}, "メールアドレス", "メールアドレス(確認)"); &validate_radio($inquiry_data{$class}, "ご質問内容", %class_options); &validate_textbox($text, "ご質問内容", undef, $detail_length); &validate_radio($inquiry_data{$inform}, "カスタマイズサービスに関する情報", %inform_options); } sub debug_print { print "Content-type: text/html; charset=euc-jp\n"; print "\n"; print <<"END_OF_HEADER";
$_
END_OF_HEADER exit(); }