#!/usr/bin/perl
#
# $RCSfile: gatepass.cgi $
# $Revision: 1.9 $
#

##########
# ↓実行テストを単独で行うとき 1 にする。
$testing    = 0;
# ↓漢字ライブラリ jcode.pl のファイル名
$jcodelib   = 'jcode.pl';
# ↓保存されるファイルの漢字コード（'sjis' 'euc' 'jis' のいずれか）
$kanjicode = 'sjis';
# ↓（必ず修正）あなたの名前（画面の最下部に表示）
$modifier  = 'mikami';
# ↓（必ず修正）あなたのホームページのURL（エラー時に表示）
$homeurl   = 'http://www.sapporo-u.ac.jp/~taka1/';
# ↓（必ず修正）あなたのメールアドレス（エラー時に表示）
$admin      = 'nadja@sapporo-u.ac.jp';
# ↓（必ず修正）このCGIのURL
$thisurl   = 'gatepass.cgi';
# ↓（必ず修正）正しいパスワード
$valid_password  = 'philosophy';
# ↓（必ず修正）最初に表示されるメッセージ
$notice_show = "パスワードを入力して入室ボタンを押してください。";
# ↓（必ず修正）認証成功時に表示されるHTMLファイルの名前
$html_good = "./gatepass.htm";
# ↓認証失敗時の一行コメント
$msg_bad  = 'パスワードが誤っています';
# ↓認証失敗時の内容（目的に合わせて修正）
$notice_bad  = '正しいパスワードを入力してください。';
# ↓タイトル
$title = 'BBS @ Kudo';
# ↓表示されるページの  タグ（背景色や背景イメージ指定で利用）
$bodytag    = "";
# ↓'post'で Method not implemented エラーになるとき 'get' にする
$method = 'post';
##########
# 著作権文字列
$copyright = '(C) 2003- Kudo.';
# 修正者の表示
$modification = "Modified by $modifier\n";
##########
# バージョン管理情報
@rcs = split(/ /, '$RCSfile: gatepass.cgi $$Revision: 1.0 $');
$version = "$rcs[1] $rcs[3]";
##########
# 区切り線
$hrule = "<HR>";
##########
# DOCTYPE宣言
$doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
# $doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">';
##########
# 文字化け防止の Content-type
if ($kanjicode eq 'sjis') {
    $contenttype = "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">";
    # $contenttype = "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">";
} elsif ($kanjicode eq 'euc') {
    $contenttype = "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=EUC-JP\">";
    # $contenttype = "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-euc-jp\">";
} elsif ($kanjicode eq 'jis') {
    $contenttype = "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=iso-2022-jp\">";
}
##########
# ページ先頭のナビゲーションバー
$navibar = "<P><A HREF=\"$homeurl\">RETURN</A></P>";

# 漢字ライブラリの読み込み
require "$jcodelib";

# 初期化
&init_form($kanjicode);

# 情報の取得
if ($testing) {
    # 動作テスト用
    $mypass = 'Matrix';
    # $mypass = 'bad password';
    # $mycmd  = 'enter';
    $mycmd  = '';
} else {
    $mycmd = $form{'mycmd'};
    $mypass = $form{'mypass'};
}

# コマンドによる処理の分岐
if ($mycmd eq 'enter') {
    &do_enter;
} else {
    &do_show;
}
exit(0);

#####

# 認証ページ表示
sub do_show {
    print "Content-type: text/html\n";
    print "\n";
    print "$doctype\n";
    print "\n";
    print "<HEAD>\n";
    print "$contenttype\n";
    print "<TITLE>$title</TITLE>\n";
    print "</HEAD>\n";
    print "$bodytag\n";
    print "$navibar\n";
    print "<H3  ALIGN=center>$title</H3>\n";
    print "<P ALIGN=center>\n";
    print "ここから先はメンバー専用です。<BR>\n";
    print "<BR>\n";
    print "<BR>\n";
    print "$notice_show\n";
    print "</P>\n";
    
    print "<FORM ACTION=\"$thisurl\" METHOD=\"$method\">\n";
    print "<TABLE BORDER=3 ALIGN=center>\n";
    print "<TR><TD>password</TD><TD><INPUT TYPE=PASSWORD NAME=mypass SIZE=25></TD></TR>\n";
    print "<TR>";
    print " <TD COLSPAN=2><INPUT TYPE=submit VALUE=\"　入室　\">\n";
    print " <INPUT TYPE=HIDDEN NAME=mycmd VALUE=enter>\n";
    print " </TD>\n";
    print "</TR>\n";
    print "</TABLE>\n";
    print "</FORM>\n";
    # 最後
    print "$hrule\n";
	print "<P ALIGN=center>\n";
    print "$copyright<BR>\n";
	print "</P>\n";
    print "\n";
}

# 認証処理
sub do_enter {
    if ($mypass eq $valid_password) {
        if (!open(TXT, $html_good)) {
            print "Content-type: text/html\n";
            print "\n";
            print "$doctype\n";
            print "\n";
            print "<HEAD>\n";
            print "$contenttype\n";
            print "<TITLE>$title - ファイルが見つからない</TITLE>\n";
            print "</HEAD>\n";
            print "$bodytag\n";
            print "$navibar\n";
            print "<H1>$title - ファイルが見つからない</H1>\n";
            print "<P>\n";
            print "認証は成功しましたが、表示すべきファイルが見つかりません。\n";
            print "恐れ入りますが、再度試していただくか、";
            print "<A HREF=\"mailto:$admin\">$admin</A>";
            print "までお知らせください。\n";
            print "</P>\n";
            print "$hrule\n";
            print "$version<BR>$copyright<BR>$modification<BR>\n";
            print "\n";
            exit(0);
        }
        print "Content-type: text/html\n";
        print "\n";
        @txt = <TXT>;
        print @txt;
        close(TXT);
    } else {
        print "Content-type: text/html\n";
        print "\n";
        print "$doctype\n";
        print "\n";
        print "<HEAD>\n";
        print "$contenttype\n";
        print "<TITLE>$title - $msg_bad</TITLE>\n";
        print "</HEAD>\n";
        print "$bodytag\n";
        print "$navibar\n";
        print "<H1>$title - $msg_bad</H1>\n";
        print "<P>\n";
        print "$notice_bad\n";
        print "</P>\n";
        print "$hrule\n";
        print "$copyright<BR>\n";
        print "\n";
    }
}

# フォームからの情報を連想配列 %form に入れる
# &init_form('euc');
sub init_form {
    local($query, @assocarray, $assoc, $property, $value, $charcode, $method);
    $charcode = $_[0];
    $method = $ENV{'REQUEST_METHOD'};
    $method =~ tr/A-Z/a-z/;
    if ($method eq 'post') {
        read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    } else {
        $query = $ENV{'QUERY_STRING'};
    }
    @assocarray = split(/&/, $query);
    foreach $assoc (@assocarray) {
        ($property, $value) = split(/=/, $assoc);
        $value =~ tr/+/ /;
        $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
        &jcode'convert(*value, $charcode);
        $form{$property} = $value;
    }
}