#!/usr/bin/perl
#↑Perlのパスをサーバに合わせて記述して下さい。



# ↓設定
#-----------------------------------------------------------------------------#
package AppsPage::Mailpro;
my $define = {};


#++++++++++++++++++++++++++++#
# 設定目次             
#++++++++++++++++++++++++++++#
# １：プログラム情報
# ２：ファイル構成図
# ３：基本設定
# ４：設置環境設定
#++++++++++++++++++++++++++++#




#【１：プログラム情報】
#-----------------------------------------------------------------------------#
#
# 著作権表示を残していただける範囲内であれば、
# 商用、非商用問わず、無料でお使いいただけ、改造も自由です。
#
# (C) Apps Page.
# http://apps.cside.com/
#


$define->{'THIS_NAME'} = '就職転職支援委員会宛';
$define->{'VERSION'}   = '1.22';
$define->{'LICENSE'}   = 'FREE';




#【２：ファイル構成図】
#-----------------------------------------------------------------------------#
#
# mailpro/  …………………………… (755) プログラムディレクトリ
#   │
#   ├ index.cgi  …………………… (755) 実行ファイル/このファイル
#   │
#   ├ data/  ………………………… (777) データ記録ディレクトリ
#   │  └ 各データファイル ……… (666) 全て同じパーミッション
#   │
#   ├ lock/  ………………………… (777) ロックディレクトリ
#   │  └ flock.cgi  ……………… (666) ロックファイル
#   │
#   └ lib/   ………………………… (755) ライブラリディレクトリ
#       ├ def/   …………………… (755) 標準データディレクトリ
#       │  └ 各ファイル   ……… (644) 全て同じパーミッション
#       ├ imgs/  …………………… (755) イメージディレクトリ
#       │  └ 各ファイル   ……… (644) 全て同じパーミッション
#       ├ modus/   ………………… (755) モジュールディレクトリ
#       │  └ 各ファイル   ……… (644) 全て同じパーミッション
#       └ tmpl/  …………………… (755) テンプレートディレクトリ
#           └ 各ファイル   ……… (644) 全て同じパーミッション
#
#
# ★簡単に設置するツボ★
# 通常「lib/」以下のディレクトリやファイルは、
# サーバへ転送した時点で、755または644のパーミッションに設定されるので、
# パーミッション変更なしで設置できます。
#
# ★簡単にデザイン改造するツボ★
# 「lib/tmpl/」以下のテンプレートファイルを改造することで、
# 比較的簡単に、デザイン改造できます。
#




#【３：基本設定】
#-----------------------------------------------------------------------------#


# ■管理用パスワード（記号を除く半角英数）
$define->{'ADMIN_PASSW'} = 'o12345';


# ■ファイルロック方法
# '0' mkdir関数  / *標準
# '1' flock関数  / より安全で、実行効率のよい設定
# '2' ロックしない
$define->{'LOCK_METHOD'} = '1';


# ■カラーチャートの表示方法
# '0' 直接表示   / *標準
# '1' CGIで表示  / cgi-binなど制限付きサーバ対策
$define->{'COLOR_CHART'} = '0';


# ※基本的に以上の設定で、サーバへ転送可能です。




#【４：設置環境設定】
#-----------------------------------------------------------------------------#
#
# 以下のの設定項目で、セキュリティ強化や、設置環境特有の状態に変更できますが、
# 分からない場合、変更しない方が無難です。
#


# ▼ディレクトリ構成（ファイル構成図参照）
	# ■index.cgi（このファイル名）
	# index.cgiがデフォルトファイルに設定されているサーバでは、
	# → './' と変更することも可能です。
	$define->{'INDEX_CGI'}     = './index.cgi';
	
	# ■ライブラリディレクトリ（このファイルからのパス）
	# ※２項目とも同じ設定
	$define->{'LIB_DIR'} = './lib/';
	
	# ■データ記録ディレクトリ（このファイルからのパス）
	$define->{'DATA_DIR'} = './data/';
	
	# ■ロックディレクトリ（このファイルからのパス）
	$define->{'LOCK_DIR'} = './lock/';
	
	# ■作業用ディレクトリ（このファイルからのパス）
	# 通常、データ記録ディレクトリと同じ。
	$define->{'TMP_DIR'} = './data/';


# ▼セキュリティ強化
	# ■暗号化に使う文字列（半角英数２文字）
	$define->{'SALT'} = 'PW';
	
	# ■セッション変数発行に使う文字列（半角英数８文字まで）
	$define->{'SESS_CHAR'} = 'SESSION';
	
	# ■参照元アドレスによる一部機能のアクセス制限
	# 例１：設置アドレスが、http://www.yourserver.com/script/ の場合
	# '' → 'http://www.yourserver.com/'
	# 例２：設置アドレスが、http://www.hoge.com/~name/script/ の場合
	# '' → 'http://www.hoge.com/~name/'
	$define->{'HTTP_REF'} = '';
	
	# ■suExec環境オプション（'0'#標準 / '1' suExec環境限定）
	# '0'#標準の場合、データファイルパーミッションは常に666です。
	# '1'を設定した場合、更新時、元のパーミッションを引継ぐか、644です。
	# ※分からない方、suExec環境でない方は、『絶対に』変更しないで下さい。
	$define->{'SU_MODE'} = '0';
	
	# ■管理画面へのキー（記号を除く半角英数）
	# 例： 'admin' → 'seclet' とした場合、
	# 管理画面へのアドレスは
	# http://設置アドレス/index.cgi?m=admin から、
	# http://設置アドレス/index.cgi?m=seclet へ変更されます。
	$define->{'ADMIN_KEY'} = 'admin';
	
	# ■管理画面へのリンク（'0'非表示 / '1'表示#標準）
	# ※非表示にした場合、上記の"管理画面へのキー"を参考にアクセスして下さい。
	$define->{'ADMIN_LINK'} = '1';


# ▼クッキー
	# ■クッキー発行元パス（ウェブサーバルートパスからの記述）
	# 設定するとセキュリティが向上します。
	# 例１：設置アドレスが、http://www.hoge.com/script/ の場合
	# '/' → '/script/'
	# 例２：設置アドレスが、http://www.hoge.com/~name/script/ の場合
	# '/' → '/~name/script/'
	$define->{'CK_PATH'} = '/';
	
	# ■クッキーネーム（記号を除く半角英数）
	# 複数設置する場合に、適当な名前を付けて区別できます。
	# 例： 'mailpro' → 'mailpro2'
	$define->{'CK_NAME'} = 'mailpro';
	
	# ■クッキー有効日数（半角数字）
	$define->{'CK_DAYS'} = '30';


# ▼flock関数の因数（通常変更不要）
	# ■共有ロック
	$define->{'LOCK_SH'} = '1';
	
	# ■排他ロック
	$define->{'LOCK_EX'} = '2';
	
	# ■アンロック
	$define->{'LOCK_UN'} = '8';




#=============================================================================#
#
# これ以下は、変更の必要ありません。
#
#=============================================================================#




sub new { return bless $define; }




# ↓主なクラス
#-----------------------------------------------------------------------------#
package AppsPage::Mailpro::Main;


#use strict;
my $this = new();
$this->start;
$this->stop;




# →コンストラクタ
sub new {
	my $this = new AppsPage::Mailpro::;
	return bless $this;
}




# →処理開始
sub start {
	my $this = shift;
	$this->{'input'}  = {};
	$this->{'cookie'} = {};
	$this->{'config'} = {};
	$this->{'recs'}   = [];
	$this->{'fields'} = {};
	$this->{'tmpl'}   = {};
	
	
	#ライブラリ
	require($this->{'LIB_DIR'}.'modus/l_mylib1.cgi');
	require($this->{'LIB_DIR'}.'modus/l_mylib2.cgi');
	
	
	#ファイルロック
	$this->{'lock'} = new
	AppsPage::Mailpro::Filelock::(
		$this->{'LOCK_METHOD'},
		$this->{'LOCK_DIR'},
		'flock',
		$this->{'LOCK_EX'},
		$this->{'LOCK_SH'},
		$this->{'LOCK_UN'}
	);
	
	
	#データファイル
	$this->{'data'} = new
	AppsPage::Mailpro::Datafile::(
		$this->{'DATA_DIR'},
		$this->{'TMP_DIR'},
		'.cgi',
		$this->{'SU_MODE'}
	);
	
	#設定ファイル
	$this->{'data'}->composeClass(
		'config',
		'Config',
		'config'
	);
	
	#CGI関係
	$this->{'funcs'} = new AppsPage::Mailpro::CGIFuncs::;
	$this->{'funcs'}->setHeader(
		'Content-Type: text/html;accept-charset=Shift_JIS'
	);
	
	
	########## 区切 ##########
	
	
	#入力値解析
	$this->{'req_method'} =
	$this->{'funcs'}->parseInput($this->{'input'});
	
	
	#入力
	if($this->{'input'}->{'m'} eq 'step1') {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi');
		require($this->{'LIB_DIR'}.'modus/m_step1.cgi');
		$this->processStep1;
	}
	
	#内容確認
	elsif($this->{'input'}->{'m'} eq 'step2') {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		$this->{'subtitle'} = '内容確認';
		require($this->{'LIB_DIR'}.'modus/jcode.pl');
		require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi');
		require($this->{'LIB_DIR'}.'modus/l_incheck.cgi');
		require($this->{'LIB_DIR'}.'modus/m_step2.cgi');
		$this->processStep2;
	}
	
	#送信
	elsif($this->{'input'}->{'m'} eq 'step3') {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		$this->{'subtitle'} = '送信完了';
		require($this->{'LIB_DIR'}.'modus/jcode.pl');
		require($this->{'LIB_DIR'}.'modus/mimew.pl');
		require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi');
		require($this->{'LIB_DIR'}.'modus/l_incheck.cgi');
		require($this->{'LIB_DIR'}.'modus/l_writelib.cgi');
		require($this->{'LIB_DIR'}.'modus/m_step3.cgi');
		$this->processStep3;
	}
	
	#使い方
	elsif($this->{'input'}->{'m'} eq 'usage') {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		$this->{'subtitle'} = '使い方';
		require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi');
		require($this->{'LIB_DIR'}.'modus/m_usage.cgi');
		$this->processUsage;
	}
	
	#管理用(1)
	elsif($this->{'input'}->{'m'} eq $this->{'ADMIN_KEY'}) {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		require($this->{'LIB_DIR'}.'modus/m_admin.cgi');
		AppsPage::Mailpro::Main::Admin::processAdmin($this);
	}
	
	
	#管理用(2)
	elsif($this->{'input'}->{'m'} eq $this->{'ADMIN_KEY'}.'.2') {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		require($this->{'LIB_DIR'}.'modus/m_admin.cgi');
		AppsPage::Mailpro::Main::Admin::processAdmin2($this);
	}
	
	
	#管理用(3)
	elsif($this->{'input'}->{'m'} eq $this->{'ADMIN_KEY'}.'.m') {
		$this->{'funcs'}->setHeader('Pragma: content="no-cache');
		$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
		require($this->{'LIB_DIR'}.'modus/m_admin.cgi');
		AppsPage::Mailpro::Main::Admin::processAdmin3($this);
	}
	
	
	#その他
	elsif($this->{'input'}->{'m'} eq 'chart') {
		require($this->{'LIB_DIR'}.'modus/m_chart.cgi');
		$this->outColorChart;
	}
	elsif($this->{'input'}->{'m'} eq 'license') {
		$this->{'funcs'}->sendHeader;
		$this->{'funcs'}->verify($this->{'LICENSE'});
	}
	elsif($this->{'input'}->{'m'} eq '') {
		require($this->{'LIB_DIR'}.'modus/l_mylib3.cgi');
		require($this->{'LIB_DIR'}.'modus/m_step1.cgi');
		$this->{'input'}->{'m'} = 'step1';
		$this->processStep1;
	}
	else { $this->error('Q'); } 
}




# →終了
sub stop {
	my $this = shift;
	$this->{'lock'}->unlock;
	if($ENV{'MOD_PERL'}) { Apache::exit(0); }
	exit(0);
}




# →エラー
sub error {
	my $this = shift;
	$this->{'data'}->settle;
	$this->{'lock'}->unlock;
	$this->{'funcs'}->setHeader( 'Cache-Control: no-cache' );
	$this->{'funcs'}->sendHeader;
	my(@err) = @_;
	$this->{'funcs'}->outErrMsgs(\@err);
	$this->stop;
}


sub getHTTPDate {
	my( $time ) = @_;
	if( !$time ) { $time = time(); }
	my @mon = (
		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
	);
	my @week = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" );
	my @tinfo = gmtime(time + (60 * 60 * 24 * $exp));
	my $ret .= "";
	$ret .= sprintf(
		"%s, %02d %s %04d %02d:%02d:%02d GMT",
		$week[$tinfo[6]],
		$tinfo[3], $mon[$tinfo[4]], $tinfo[5]+1900,
		$tinfo[2], $tinfo[1], $tinfo[0]
	);
	return $ret;
}



0;
