#!/usr/local/bin/perl

## COSMO GATE-EX v2.51 (00/05/18)
## Copyright(C) Kent Web 2000
## E-Mail: webmaster@kent-web.com
## WWW: http://www.kent-web.com/

$ver = 'GATE-EX v2.51'; # バージョン情報

#--- [注意事項] ------------------------------------------------#
# 1. このスクリプトはフリーソフトです。このスクリプトを使用した	#
#    いかなる損害に対して作者は一切の責任を負いません。		#
# 2. 設置に関する質問はサポート掲示板にお願いいたします。	#
#    直接メールによる質問は一切お受けいたしておりません。	#
#---------------------------------------------------------------#

# [設置例] (かぎかっこ内の数値はパーミッション)
#
#   /home/kent/
#           |
#           +-- private_html / secret.html [666] (隠しファイルトップページ)
#           |                  file1.html  [666] (隠しファイル第1ページ)
#           |                  file2.html  [666] (隠しファイル第2ページ)
#           |                  file3.html  [666] (隠しファイル第3ページ)
#           |                     :                        :
#           |                  pass.txt    [666]
#           |                  log.dat     [666]
#           |
#           +-- public_html / index.html (ホームページ等)
#                  |
#                  +-- gatex / gatex.cgi   [755] ...(最初にアクセスされる所)
#
#                             --- 以下はユーザで ID/PASS 発行の場合 ---
#                              index.html (ID/PASS発行トップページ)
#                              regist.cgi  [755]
#
# ---------
# [画像／アプリデータの記述方法] : 下記４データに対応しています
#  --> seceret.html や file1.html 等に以下のタグを記述します
#  GIF  : <img src="http://〜〜/gatex.cgi?gif=xxx">  : xxx.gifの場合
#  JPEG : <img src="http://〜〜/gatex.cgi?jpeg=xxx"> : xxx.jpgの場合
#  PDF  : <a href="http://〜〜/gatex.cgi?pdf=xxx">xxx.pdf</a>   : xxx.pdfの場合
#  EXCEL: <a href="http://〜〜/gatex.cgi?excel=xxx">xxx.xls</a> : xxx.xlsの場合

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

# 隠しディレクトリ
$targetdir = "/home/xpress/secret";

# 隠しファイル（トップ）
$targets[0] = "secret.html";

# 以下は隠しファイル（次ページ以降分）
#  --> [1] [2] [3] ... と順に続ける
#  --> CGIの場合のみ http://から記述すること
$targets[1] = "http://may.sakura.ne.jp/~xpress/_index/webcreator/mmx_index.cgi"; # 隠しファイル1
$targets[2] = "http://may.sakura.ne.jp/~xpress/_index/manual/"; # 隠しファイル2
$targets[3] = ""; # 隠しファイル3

# ID/PASS記録ファイル
$passfile = 'pass.cgi';

# アクセス履歴ファイル
$reclog = 'log.cgi';

# パスワードシステムのタイトル名
$title = "MEMBER's ROOM";

# 管理者用パスワード（複雑な方がよい）
$pass = 'NT127piraokan';

# 管理画面からの戻り先URL
$back_url = 'http://may.sakura.ne.jp/~xpress/index/';

# スクリプトファイル名
$script = './gatex.cgi';

# method形式（POST or GET）
$method = 'POST';

# ロックファイルの形式 (0=no 1=symlink 2=open)
$lockkey = 0;

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

# CGIファイルのアクセス許可時間 （要cook.cgi)
$cgitime = 3;

# bodyタグ
$body = '<body bgcolor="#EEEEEE" text="#000000" link="#0000FF" vlink="#800080">';

#============#
#  設定完了  #
#============#


# //// GateEXのメイン処理 ///////////////
&decode;
if (!$buffer) { &enter; }
if ($mode eq "admin") { &pre_admin; }
elsif ($in{'gif'} || $in{'jpeg'}) { &image; }
elsif ($in{'pdf'} || $in{'excel'}) { &appli; }
elsif ($mode eq "axslog") { &axslog_view; }
elsif ($mode eq "pre_admin") { &admin; }
elsif ($mode eq "regist") { &regist; }
elsif ($mode eq "del") { &uid_del; }
elsif ($mode eq "check") { &check; }
elsif ($page eq 'top') { &page_top; }
else {

	# ID/PASSをクッキーに保存
	if ($mode eq "chk") { &set_cookie; }

	# パスファイルを開く
	$flag=0;
	open(IN,"$targetdir\/$passfile") || &error("Open Error : $passfile");
	while (<IN>) {
		($logid,$logpw) = split(/<>/);
		if ($id eq "$logid") { $flag=1; last; }
	}
	close(IN);

	if (!$flag) { &ErrMessage; }

	# 照合処理
	$check = &decrypt("$pw", "$logpw");
	if ($check ne "yes") { &ErrMessage; }

	# 認証がOKの場合
	&goto_html;

	# 入室記録をとる
	if ($in{'action'} eq 'gate') { &record; }
	exit;
}

#------------#
#  認証画面  #
#------------#
sub enter {
	# クッキーを取得
	&get_cookie;

	# OK ボタン幅をブラウザによって調整
	$agent = $ENV{'HTTP_USER_AGENT'};
	if ($agent =~ /MSIE/) {	$ok = " 　Ｏ Ｋ　 "; }
	else { $ok = " 　Ｏ　Ｋ　 "; }

	&header;
	print <<"EOM";
<body bgcolor="#FFFFFF" text="#000000">
<BR><BR><BR>
<center>
<form action="$script" method="$method">
<input type=hidden name=action value="gate">
<table width="455" border=1 cellspacing=0 cellpadding=3>
<tr><td bgcolor=#004080>
<font color=#FFFFFF>ネットワークパスワードの入力</font>
</td></tr>
<tr><td bgcolor=#C0C0C0>
  <table width="100%" border=0 cellspacing=3>
  <tr><td valign=top width=390 rowspan=2>
    <CENTER>認証情報を入力してください。</CENTER>
  </td>
  <td>
    <input type=submit value="$ok">
  </td>
</tr>
<tr>
  <td>
    <input type=reset value="キャンセル">
  </td>
</tr>
</table>
  <BLOCKQUOTE>
  <table border=0 cellpadding=0 cellspacing=5 width=350>
  <tr><td>リソ\ース： </td><td>$title</td></tr>
  <tr><td>ユーザ名(<U>U</U>)： </td>
      <td><input type=text name=id size=25 value="$c_id"></td>
  </tr>
  <tr><td>パスワード(<U>P</U>)：</td>
  <td><input type=password name=pw size=25 value="$c_pw"></td></tr>
  <tr><td colspan=2><input type=checkbox name=mode value="chk" checked>
  このパスワードを保存する(<U>S</U>)</td></tr>
  </table>
  </BLOCKQUOTE>
</td></tr></table>
</form></center>
<br><br><br>
<div align=right>
<!-- 著作権表\示：削除改変禁止($ver) -->
<small>
- <a href="http://www.kent-web.com/" target='_top'>Cosmo GateEX</a> -
</small></div>
</body></html>
EOM
	exit;
}

#---------------------------#
#  ID/PASS不一致のアラーム  #
#---------------------------#
sub ErrMessage {
	&header;
	print <<"EOM";
<body bgcolor=#ffffff>
<H1>Authorization Required</H1>
This server could not verify that you
are authorized to access the document you
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.<P>
</BODY></HTML>
EOM
	exit;
}

#------------------#
#  認証後表示処理  #
#------------------#
sub goto_html {
	# 認証時にクッキーを取得
	if ($in{'action'} eq 'gate') { &set_cookie(gatex_cgi); }

	if ($page eq '') { $target_file = $targets[0]; }
	else { $target_file = $targets[$page]; }

	# ジャンプ先がHTMLファイルの場合
	unless ($targets[$page] =~ /^http\:\/\//) {

		$file = "$targetdir\/$target_file";
		open(IN,"$file") || &error("Open Error : $file");
		print "Content-type: text/html\n\n";
		while (<IN>) {

			# リンク部及び画像にID/PASS情報を付加
			$_ =~ s/\?page=/\?id=$id\&pw=$pw\&page=/g;
			$_ =~ s/\?gif=/\?id=$id\&pw=$pw\&gif=/g;
			$_ =~ s/\?jpeg=/\?id=$id\&pw=$pw\&jpeg=/g;
			$_ =~ s/\?excel=/\?id=$id\&pw=$pw\&excel=/g;
			$_ =~ s/\?pdf=/\?id=$id\&pw=$pw\&pdf=/g;
			$_ =~ s/<form action=(.*)>/<form action=$1>\n<input type=hidden name=id value=\"$id\">\n<input type=hidden name=pw value=\"$pw\">/ig;

			print $_;
		}
		close(IN);
	}
	# ジャンプ先がCGIファイルの場合
	else {
		# IISサーバ対応
		if ($ENV{'PERLXS'} eq "PerlIS") {
			print "HTTP/1.0 302 Temporary Redirection\r\n";
			print "Content-type: text/html\n";
		}
		print "Location: $target_file\n\n";
	}
}

#--------------------------------#
#  認証トップページへの戻り処理  #
#--------------------------------#
sub page_top {
	# クッキーを取得
	&get_cookie(gatex_cgi);

	# ID/PASS をクッキーから定義
	$id = $c_id;
	$pw = $c_pw;

	# トップページを表示
	&goto_html;

	exit;
}

#----------------#
#  画像出力処理  #
#----------------#
sub image {
	# ID/PWチェック
	&PWCheck;

	# ファイル名及び出力ヘッダを定義
	if ($in{'gif'}) {
		$imgfile = "$in{'gif'}\.gif";
		$imghead = "image/gif";
	}
	elsif ($in{'jpeg'}) {
		$imgfile = "$in{'jpeg'}\.jpg";
		$imghead = "image/jpeg";
	}
	else { die "NO IMAGE-DATA"; }

	# 画像を出力
	open(IMG,"$targetdir\/$imgfile");
	print "Content-type: $imghead\n\n";
	binmode(IMG);
	binmode(STDOUT);
	print <IMG>;
	close(IMG);
	exit;
}

#------------------------#
#  リンクデータ出力処理  #
#------------------------#
sub appli {
	# ID/PWチェック
	&PWCheck;

	# ファイル名及び出力ヘッダを定義
	if ($in{'pdf'}) {
		$AplFile = "$in{'pdf'}\.pdf";
		$AplHead = "application/pdf";
	}
	elsif($in{'excel'}) {
		$AplFile = "$in{'excel'}\.xls";
		$AplHead = "application/msexcel";
	}
	else { die "NO APPLI-DATA"; }

	# 画像を出力
	open(APL,"$targetdir\/$AplFile") || &error("Open Error : $AplFile");
	print "Content-type: $AplHead\n\n";
	binmode(APL);
	binmode(STDOUT);
	print <APL>;
	close(APL);
	exit;
}


#-----------------#
#  ID/PWチェック  #
#-----------------#
sub PWCheck {
	# パスファイルを開く
	$flag=0;
	open(IN,"$targetdir\/$passfile") || &error("Open Error : $passfile");
	while (<IN>) {
		($logid,$logpw) = split(/<>/);
		if ($id eq "$logid") { $flag=1; last; }
	}
	close(IN);

	if (!$flag) { die "ID not Found"; }

	# 照合処理
	$check = &decrypt("$pw", "$logpw");
	if ($check ne "yes") { die "PASSWORD ERROR"; }
}

#--------------------#
#  アクセス履歴処理  #
#--------------------#
sub record {
	# ロック開始
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# 記録ファイルを開く
	open(REC,"$targetdir\/$reclog") || &error("Open Error : $reclog");
	@lines = <REC>;
	close(REC);

	# IDのマッチング
	local($flag) = 0;
	@new = ();
	foreach $line (@lines) {
		($rid,$rdate,$rcnt,$rmemo,$raddr,$rtime,$rname,$remail) = split(/<>/,$line);
		if ($rid eq "$id") {
			$flag = 1;
			$rcnt++;
			$line = "$rid<>$date<>$rcnt<>$rmemo<>$ENV{'REMOTE_ADDR'}<>$times<>$rname<>$remail<>\n";
		}
		push(@new,$line);
	}

	if ($flag == 1) {
		# 履歴を上書き
		open(REC,">$targetdir\/$reclog") || &error("Can't write $reclog");
		print REC @new;
		close(REC);

	} else {
		# 新規ログを追加
		open(REC,">>$targetdir\/$reclog") || &error("Can't write $reclog");
		print REC "$id<>$date<>1<><>$ENV{'REMOTE_ADDR'}<>$times<><><>\n";
		close(REC);
	}

	# ロック解除
	if (-e $lockfile) { unlink($lockfile); }
}

#--------------------#
#  アクセスログ閲覧  #
#--------------------#
sub axslog_view {
	open(IN,"$targetdir\/$reclog") || &error("Can't open $reclog");
	@lines = <IN>;
	close(IN);

	local($flag) = 0;
	foreach (@lines) {
		($rid,$rdate,$rcount,$rmemo,$raddr,$rtime,$rname,$remail) = split(/<>/,$_);
		if ($id eq "$rid") { $flag=1; last; }
	}

	&header;
	print "$body\n";
	print "<table width='100%'>\n<tr><th bgcolor=#008080>\n";
	print "<font color=#FFFFFF>アクセスログ閲覧</font>\n";
	print "</th></tr></table>\n";
	print "<hr><P><center>\n";

	if ($flag == 0) {
		print "<b>アクセス履歴はありません</b>";

	} else {
		if ($remail) { $remail = "<a href=mailto\:$remail>$remail</a>"; }

		print "<table border=0>\n";
		print "<tr><td>USER ID</td><td>：</td><td><b>$in{'id'}</b></td></tr>\n";
		print "<tr nowrap><td>最終ログイン</td><td>：</td><td>$rdate</td></tr>\n";
		print "<tr><td>アクセス回数</td><td>：</td><td><b>$rcount</b></td></tr>\n";
		print "<tr><td>会員名</td><td>：</td><td><b>$rname</b></td></tr>\n";
		print "<tr><td>E-Mail</td><td>：</td><td>$remail</td></tr>\n";
		print "<tr><td valign=top>メモ情報</td><td valign=top>：</td><td>$rmemo</td></tr>\n";
		print "</table>\n";

	}

	print "<P><hr></center>\n";
	print "</body></html>\n";
	exit;
}

#----------------------------#
#  管理用パスワード入力画面  #
#----------------------------#
sub pre_admin {
	&header;
	print "$body\n";
	print "<table width='100%'><tr><th bgcolor=#008080>\n";
	print "<font color=#FFFFFF>管 理 モ ー ド</font>\n";
	print "</th></tr></table>\n";
	print "<P><center><h4>パスワードを入力して下さい</h4>\n";
	print "<P><form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=\"pre_admin\">";
	print "<input type=password size=8 name=pass>";
	print "<input type=submit value=\"認証\">\n";
	print "</form></center>\n";
	print "</body></html>\n";
	exit;
}

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

	&header;
	print <<"EOF";
$body
<B><a href="$back_url" target="_top">▲ TOP</a></B>
<table width=100%><tr>
<th bgcolor=#008080>
<font color=#ffffff>管 理 画 面</font></th>
</tr></table>
<P><font color=#006400><b>1. ＩＤの新規登録</b></font><P>
<blockquote>
<form action="$script" method="$method">
<input type=hidden name=mode value="regist">
<input type=hidden name=pass value="$in{'pass'}">
<table>
<tr>
  <td>USER ID</td>
  <td><input type=text name=usrid size=10></td>
</tr>
<tr>
  <td>PASSWORD</td>
  <td><input type=text name=usrpw size=10></td>
</tr>
<tr>
  <td colspan=2><hr></td>
</tr>
<tr>
  <td><font color=#dd0000>*</font> 会員名</td>
  <td><input type=text name=name size=20></td>
</tr>
<tr>
  <td><font color=#dd0000>*</font> E-Mail</td>
  <td><input type=text name=email size=20></td>
</tr>
<tr>
  <td><font color=#dd0000>*</font> メモ情報</td>
  <td><textarea name=memo cols=20 roes=2></textarea></td>
</tr>
<tr>
  <td colspan=2>
    <input type=submit value="発行する"><input type=reset value="リセット">
    (<font color=#dd0000>*</font> は任意項目)
  </td>
</tr>
</table>
</form>
</blockquote>
<hr>
<font color="#006400"><b>2. ＩＤの削除抹消</b></font><P>
<blockquote>
EOF

	open(DB,"$targetdir\/$passfile") || &error("Can't open $passfile");
	@lines = <DB>;
	close(DB);

	$count = @lines;
	print "■USER IDのリンク部をクリックすると、アクセス履歴を閲覧できます<br>\n";
	print "■現在 <b>$count</b>件の登録があります\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=\"del\">\n";
	print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
	print "<table border=1><tr><th>削除</th><th>USER ID</th><th>登録日時</th></tr>\n";

	foreach $line (@lines) {
		($userid,$pwd,$date) = split(/<>/,$line);
		print "<tr><th><input type=checkbox name=del value=\"$userid\"></th>\n";
		print "<th><a href=\"$script?mode=axslog&id=$userid\">$userid</a></th>\n";
		print "<td>$date</td></tr>\n";
	}

	print "</table><br><input type=submit value=\"削除する\">";
	print "<input type=reset value=\"リセット\"></form>\n";
	print "</blockquote>\n";
	print "</body></html>\n";
	exit;
}

#---------------------#
#  USER_IDの登録処理  #
#---------------------#
sub regist {
	if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }

	if ($usrid eq "" || $usrpw eq "") { &error("入力モレがあります"); }

	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# ファイルを読み込み
	open(PWD,"$targetdir\/$passfile") || &error("Open Error : $passfile");
	@lines = <PWD>;
	close(PWD);

	$flag = 'no';
	foreach $line (@lines) {
		($lid,$lpw,$ldate) = split(/<>/,$line);
		if ($usrid eq "$lid") { $flag = 'yes'; last; }
	}

	if ($flag eq 'yes') { &error("<b>$lid<b>は既に登録されています。"); }
	else {
		# パスワードを暗号化処理
		$ango = &encrypt($usrpw);

		# ファイルに追加上書き
		open(PWD,">>$targetdir\/$passfile") || &error("Can't write $passfile");
		print PWD "$usrid<>$ango<>$date<>\n";
		close(PWD);

		# 会員名又は E-Mail に入力がある場合はアクセスログに追加
		if ($name || $email || $memo) {
			open(LOG,">>$targetdir\/$reclog") || &error("Can't write $reclog");
			print LOG "$usrid<><>0<>$memo<><><>$name<>$email<>\n";
			close(LOG);
		}

		# ロック解除
		if (-e $lockfile) { unlink($lockfile); }

		# 初期画面にもどる
		&admin;
	}
}

#---------------------#
#  USER_IDの削除処理  #
#---------------------#
sub uid_del {
	if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }

	# ロック開始
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# パスワードファイルを開く
	open(DB,"$targetdir\/$passfile") || &error("Can't open $passfile");
	@lines = <DB>;
	close(DB);

	foreach $line (@lines) {
		($userid,$pwd,$date) = split(/<>/,$line);
		$flag = 0;
		foreach $del (@DEL) {
			if ($del eq "$userid") { $flag = 1; }
		}
		if ($flag == 0) { push(@new_data,$line); }
	}

	# パスワードファイルを更新
	open(DB,">$targetdir\/$passfile") || &error("Can't write $passfile");
	print DB @new_data;
	close(DB);

	# 履歴ファイルを開く
	open(IN,"$targetdir\/$reclog") || &error("Can't open $reclog");
	@RECORD = <IN>;
	close(IN);

	foreach $line (@RECORD) {
		($id,$date,$kaisu,$memo) = split(/<>/,$line);
		$flag = 0;
		foreach $del (@DEL) {
			if ($del eq "$id") { $flag = 1; }
		}
		if ($flag == 0) { push(@new_rec,$line); }
	}

	# 履歴ファイルを更新
	open(OUT,">$targetdir/$reclog") || &error("Can't write $reclog");
	print OUT @new_rec;
	close(OUT);

	# ロック解除
	if (-e $lockfile) { unlink($lockfile); }

	# 初期画面に戻る
	&admin;
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else { $buffer = $ENV{'QUERY_STRING'}; }
	@pairs = split(/&/, $buffer);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		if ($name eq "del") { push(@DEL,$value); }

		$in{$name} = $value;
	}
	$mode  = $in{'mode'};
	$del   = $in{'del'};
	$usrid = $in{'usrid'};
	$usrpw = $in{'usrpw'};
	$id    = $in{'id'};
	$pw    = $in{'pw'};
	$page  = $in{'page'};
	$name  = $in{'name'};
	$email = $in{'email'};
	$memo  = $in{'memo'};
	$memo  =~ s/\r\n/<br>/g;
	$memo  =~ s/\r|\n/<br>/g;

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

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

#----------------------#
#  パスワード暗号処理  #
#----------------------#
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 {
	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 "<title>$title</title></head>\n";
}

#------------------#
#  エラー表示処理  #
#------------------#
sub error {
	if (-e $lockfile) { unlink($lockfile); }

	&header;
	print "$body\n";
	print "<center><hr width='400'><h3>ERROR !</h3>\n";
	print "<P><font color='#DD0000'><B>$_[0]</B></font>\n";
	print "<P><hr width='400'></center>\n";
	print "</body></html>\n";
	exit;
}

#------------------#
#  クッキーの発行  #
#------------------#
sub set_cookie {
	# クッキーIDを定義
	if ($_[0]) {
		$cook_id = "gatex_cgi";
		$cook_ex = time + $cgitime*60*60;
	} else {
		$cook_id = "gatex_html";
		$cook_ex = time + 30*24*60*60;
	}

	($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg)
							 = gmtime($cook_ex);
	$yearg += 1900;
	if ($secg  < 10)  { $secg  = "0$secg";  }
	if ($ming  < 10)  { $ming  = "0$ming";  }
	if ($hourg < 10)  { $hourg = "0$hourg"; }
	if ($mdayg < 10)  { $mdayg = "0$mdayg"; }
	$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$mong];
	$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wdayg];
	$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
	$cook = "id\:$id\,pw\:$pw";
	print "Set-Cookie: $cook_id=$cook; expires=$date_gmt\n";
}

#----------------#
#  クッキー取得  #
#----------------#
sub get_cookie {
	# クッキーIDを定義
	if ($_[0]) { $cook_id = "gatex_cgi"; }
	else { $cook_id = "gatex_html"; }

	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/,/,$DUMMY{$cook_id});
	foreach $pair (@pairs) {
		local($name, $value) = split(/:/, $pair);
		$COOKIE{$name} = $value;
	}
	$c_id  = $COOKIE{'id'};
	$c_pw  = $COOKIE{'pw'};

	if ($in{'id'}) { $c_id = $in{'id'}; }
	if ($in{'pw'}) { $c_pw = $in{'pw'}; }
}

#-----------------------------------#
#  ロックファイル処理：symlink関数  #
#-----------------------------------#
sub lock1 { 
	local($retry) = 5;
	while (!symlink(".", $lockfile)) {
		if (--$retry <= 0) { &error("LOCK is BUSY"); }
		sleep(1);
	}
}

#--------------------------------#
#  ロックファイル処理：open関数  #
#--------------------------------#
sub lock2 {
	local($flag) = 0;
	foreach (1 .. 5) {
		if (-e $lockfile) { sleep(1); }
		else {
			open(LOCK,">$lockfile");
			close(LOCK);
			$flag = 1;
			last;
		}
	}
	if (!$flag) { &error("LOCK is BUSY"); }
}

#------------------#
#  チェックモード  #
#------------------#
sub check {
	# パスワードの「パス」を確認
	unless (-e "$targetdir/$passfile") {
		&error("$targetdir/$passfileが存在しません<br>
			ファイル名の確認及び「パス」をチェックして下さい");
	}

	# パスワードファイルのパーミッションを確認
	unless (-r "$targetdir/$passfile" || -w "$targetdir/$passfile") {
		&error("$passfileのパーミッションが不正です");
	}

	# ログファイルの「パス」を確認
	unless (-e "$targetdir/$reclog") {
		&error("$targetdir/$reclogが存在しません<br>
			ファイル名の確認及び「パス」をチェックして下さい");
	}

	# ログファイルのパーミッションを確認
	unless (-r "$targetdir/$reclog" || -w "$targetdir/$reclog") {
		&error("$reclogのパーミッションが不正です");
	}

	# OKを表示
	&header;
	print "$body\n";
	print "<center><hr><h2>Check OK</h2><hr></center>\n";
	print "</body></html>\n";
	exit;
}

