#!/usr/local/bin/perl
#===============================================================================
#
# 神戸学院大学附属高校
#  「掲示板ＣＧＩ」フォーム  ver 1.1 (2000.7.21)
#   
#　　by
#
#	#	簡易ゲストブック
#	# じょじょゲスト ver.6.01  Copyright(c) 1997-2000 JoJo's Web Lab.
#	#
#	#   File:  guest.cgi
#	#   URL:   http://www.jedi.to/web/      Email: master@jedi.to
#	#
#
#    arranged by
#
#	# Kobe Gakuin Univ. High School
#
#
#  遵守事項
#
#   このファイルに一切の改造を加えてはなりません。
#  「部外への配布」・「指定場所以外への設置」は厳禁します。
#   その他、神戸学院大学人文学部が定める規定に従うこと。
#
#===============================================================================
# 管理者設定値（カスタマイズ）
#===============================================================================

#=======================================================
# システムに関する設定（変更不可）
#=======================================================

    #
    # 各ファイルのパス
    #
    #   ファイル名を変更せず、すべてのファイルを同一ディレクトリに入れる
    #   場合は、ここを書き換える必要はありません。
    #
    $script = 'bbs.cgi';    # このファイル
    $guest  = 'bbs.log';    # ログ・ファイル
    $jcode  = 'jcode.pl';     # jcode.pl（日本語コード変換ライブラリ）
    $jwlib  = 'jwlib.pl';     # jwlib.pl（じょじょのＷｅｂ工房共通ライブラリ）

    #
    # 文字コードセットの指定
    #
    #   EUC-JPを推奨しますが、このまま転送して使う場合はShift_JISになります。
    #   意味の分からない場合は、ここを書き換えないでください。
    #
    $charset = 'Shift_JIS';  # シフトJIS
    #$charset = 'EUC-JP';    # 日本語EUC

    #
    # jcode.plを使う場合の文字コードセットの指定
    #
    #   文字化けが起こる場合はjcode.plを使用します（文字化けがない場合は空欄のまま）。
    #   上で指定した文字コードセットに併せて指定してください。
    #
    #     Shift_JIS  →  $jcode = 'sjis';
    #     EUC-JP     →  $jcode = 'euc';
    #
    $jcode = '';

    #
    # Cookie関連
    #
    #   他にもCookieを使ったスクリプトが動いている場合、名前が重なってはいけません。
    #   Cookieはサーバ、ブラウザの両方が対応していないと働きません。
    #
#    $cookie_name = 'jojoguest';     # Cookieの名前
#    $cookie_life = 30;              # Cookieの寿命（日単位）

    #
    # 管理人コメントの色
    #     $comment_color = '#008800';
    #
    #

require 'settei.txt';

#=======================================================
# 機能に関する設定
#=======================================================

    #
    # IPアドレス表示フラグ
    #
    #   0：発言者のIPアドレスを一切表示しない。
    #   1：発言者のIPアドレスをコメントで表示する。
    #   2：発言者のIPアドレスを表示する。
    #
    $ip_show_flag = 2;

    #
    # 外部書き込みを禁止するか
    #
    #   外部からの書き込みを禁止する場合、ここに設置スクリプトのURLの一部を
    #   設定してください。
    #
    #       $referer = '/~foo/guest/guest.cgi';  # 例
    #
    $referer = '';

    #
    # 二重投稿禁止フラグ
    #
    #   0：二重投稿を許可する。
    #   1：二重投稿を禁止する。
    #
    $double_post = 1;

    #
    # 使用許可タグの設定
    #
    #   使用許可にするタグを「 /（半角）」で区切って並べます。
    #   すべてのタグを禁止するときは空文字 '' にします。
    #
    $tag = '';
    #$tag = 'b/i/strong/em/s/font/sup/sub/br/a';     # 例

#----------------------------------------
#
# タイトル下のコメント（EOFの直前までを編集してください）
#
$comment = <<"EOF";
<ul>
<li>誹謗中傷や公序良俗に反する書き込みは厳禁です。</li>
<li>書き込み時に［削除コード］を入力しておくと、後で自分の発言を削除することができます。</li>
</ul>

EOF

#<li>書き込みは$max_line件ずつ表\示されます。</li>
#<li>最大で$max_record件の書き込みが保存され、古いものから削除されます。</li>

#----------------------------------------
# ---見出し組み込み
$guest_name2='';
$INCF        = 'midasi.txt';	# 組み込みファイル名

		if( open(INC,"<$INCF") ) {
			while(<INC>) { $guest_name2 .= $_; }
			close(INC);
		} else {$guest_name2='midasi.txtが異常です';}


# ---メッセージ組み込み
$mesbuff='';
$INCF        = 'welcome.txt';	# 組み込みファイル名

		if( open(INC,"<$INCF") ) {
			while(<INC>) { $mesbuff .= $_; }
			close(INC);
		} else {$mesbuff='welcome.txtが異常です';}

    #
    # Copyright
    #
    #   ここは変えないでください。
    #
    $copyright = "<strong><font size=\"2\" color=\"$title_color\">じょじょゲスト ver.6.00<br>\n" .
                 "created by <a href=\"http://www.jedi.to/web/\" target=\"_top\">" .
                 "じょじょのＷｅｂ工房</a></font></strong><br>arranged by Kobe Gakuin Univ. High School";


# ---ブラウザ種別をチェック

$kei = 0;
$nn = 0;

	$user_agent = $ENV{'HTTP_USER_AGENT'};

	if($user_agent =~ /DoCoMo\//)      { $kei =  1; }	# iモード

	if($user_agent =~ /UP\.Browser\//) { $kei =  1; }	# EZインターネット
	if($user_agent =~ /PDXGW\/\d\.\d/) { $kei =  1; }	# PメールDX
	if($ENV{'HTTP_X_JPHONE_MSNAME'} ne '') { $kei = 1; }	# J-SkyWeb (Ver3.10)

	if($user_agent =~ /Mozilla/i) {
		 if($user_agent =~ /IE/i) { $nn=0; } else { $nn = 1; }
	 }	# ネスケ=1

								# PDAモード（ザウルス・コミパル・Dialo）
#	if($user_agent =~ /sharp pda browser/ || $user_agent =~ /Dialo/) { $pda = 1; }

if ($kei == 1){$max_line   = 1;}


#	if($user_agent =~ /UP\.Browser\//) { $mode = -1; }	# EZインターネット
#	if($user_agent =~ /PDXGW\/\d\.\d/) { $mode = -2; }	# PメールDX
#	if($ENV{'HTTP_X_JPHONE_MSNAME'} ne '') { $mode = 2; }	# J-SkyWeb (Ver3.10)
								# PDAモード（ザウルス・コミパル・Dialo）
#	if($user_agent =~ /sharp pda browser/ || $user_agent =~ /Dialo/) { $pda = 1; }

#######
# 投稿欄の幅

	if ($nn == 1) { $haba1 = $haban1; } # NN
	if ($nn == 1) { $haba2 = $haban2; } # NN
	if ($nn == 1) { $haba3 = $haban3; } # NN

	if ($nn == 0) { $haba1 = $habai1; } # NN以外
	if ($nn == 0) { $haba2 = $habai2; } # NN以外
	if ($nn == 0) { $haba3 = $habai3; } # NN以外

#===============================================================================
# メイン・ルーチン
#===============================================================================
{
    # パッケージライブラリの取り込み
    if ($encode) { require $jcode; }
    require $jwlib;

    # 発言者情報の作成
    $date = &jwlib'makeDate(" yyyy.mm.dd (w) hh:nn ");

    $host = $ENV{'REMOTE_HOST'};
    if ($host eq '') { $host = $ENV{'REMOTE_ADDR'}; }
    if ($host2 = $ENV{'HTTP_X_FORWARDED_FOR'}) {
        $host .= ' - ' . $host2;
    }

    if    ($ip_show_flag == 1) { $info = "$date"; }
    elsif ($ip_show_flag == 2) { $info = "$date"; }
    else                       { $info = "$date"; }

# <!--$host-->
#    elsif ($ip_show_flag == 2) { $info = "($date $host)"; }

    # フォームの取得
    %FORM = &jwlib'getForm(1, $encode);
    $subject = $FORM{'subject'};
    $name    = $FORM{'name'};
    $email   = $FORM{'email'};
    $url     = $FORM{'url'};
    $mes     = $FORM{'mes'};
    $code    = $FORM{'code'};
    $page    = $FORM{'page'};
    $val     = $FORM{'val'};
    $mode    = $FORM{'mode'};
    undef(%FORM);

    # GETの場合の対処
    if ($ENV{'REQUEST_METHOD'} eq 'GET') {
        if ($mode != 0) { &jwlib'outError(8); }
    }

    # 外部書き込みの場合
    if ($referer) {
        if ($mode != 0 && $ENV{'HTTP_REFERER'} !~ /$referer/) { &jwlib'outError(8); }
    }

    # 管理者のチェック
    if ($mode == 2 && $passwd ne $admin_password) {
        &jwlib'outError(1);
    }

    # メイン処理
    if ($mode == 1 && $code eq $admin_password && $val =~ /[0-9]+/ && $val > 0) {
        $mode = 2;
    }
    if    ($mode == 1) { &Write;   }    # 発言
    elsif ($mode == 2) { &Comment; }    # コメント（管理者）
    elsif ($mode == 3) { &Delete;  }    # 削除
    &View;                              # 閲覧

    # 終了
    exit(0);
}


#===============================================================================
# 画面の表示
#===============================================================================
sub View
{

if ($kei== 0) {

    # Cookieの取得
    #if ($cookie_flag == 0) {
    #    %COOKIE = &jwlib'getCookie($cookie_name);
    #    $name  = $COOKIE{'name'};
    #    $email = $COOKIE{'email'};
    #    $url   = $COOKIE{'url'};
    #    $code  = $COOKIE{'code'};
    #    $name  = &jwlib'checkTag($name);
    #    $email = &jwlib'checkTag($email);
    #    $url   = &jwlib'checkTag($url);
    #}

    # ログの読み込み
    @log = &jwlib'readFile($guest, $page*$max_line+1, $max_line+1);
    if ($log[$max_line] ne '') {
        $last = $log[$max_line];
        pop(@log);
    } else { $last = ''; }
    foreach (@log) {
        ($main, $sub, $number) = split(/\t/, $_);
        $_ = $main . $sub . "<hr>\n";
    }

    # 移動ボタン
    $back = '';
    $foward = '';
    $navi = '';
    if ($last) {
        $page_num = $page + 1;
        $back = "<form method=\"post\" action=\"$script\">\n<div>\n" .
                "<input type=\"hidden\" name=\"page\" value=\"$page_num\">\n" .
                "<input type=\"submit\" value=\"前ページ\">\n" .
                "</div>\n</form>\n";
    }
    if ($page) {
        $page_num = $page - 1;
        $foward = "<form method=\"post\" action=\"$script\">\n<div>\n" .
                  "<input type=\"hidden\" name=\"page\" value=\"$page_num\">\n" .
                  "<input type=\"submit\" value=\"次ページ\">\n" .
                  "</div>\n</form>\n";
    }
    if ($back ne '' || $foward ne '') {
        $navi = "<table cellpadding=\"0\" cellspacing=\"0\" summary=\"移動ボタン\">\n" .
                "<tr><td>\n$back</td><td>\n$foward</td></tr>\n" .
                "</table>\n";
    }

    # 削除ボタン
    $delete = "<form method=\"post\" action=\"$script\">\n" .
              "<div>\n削除するNo：<input type=\"text\" name=\"val\" value=\"\" size=\"3\">\n" .
              "削除コード：<input type=\"password\" name=\"code\" value=\"\" size=\"$haba3\" maxlength=\"10\">\n" .
              "<input type=\"submit\" value=\"削除\">\n" .
              "<input type=\"hidden\" name=\"page\" value=\"$page\">\n" .
              "<input type=\"hidden\" name=\"mode\" value=\"3\">\n</div>\n</form>\n";

    # 操作ボタン
    $button = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" summary=\"操作ボタン\">\n" .
              "<tr><td align=\"left\">\n$navi</td>" .
              "<td nowrap align=\"right\">\n$delete</td></tr>\n</table>";

# 画面の表示
print <<"EOF";
Content-Type: text/html; charset=$charset
Content-Style-Type: text/css
Content-Language: ja

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html40/loose.dtd">
<html>
<head>
<link rev="made" href="mailto:$my_email" title="$my_name">
<link rel="prev" href="$my_home" title="ホーム">
<title>$guest_name1</title>

<style type="text/css">
<!--
    form  { margin: 0em 0em 0em 0em; }
    .talk { margin: 1.5em 1.5em 1em 1.5em; }
    .comment { margin: 1.5em 2em 1em 5em; }
-->
</style>
</head>

$body

$guest_name2

$mesbuff

<br>
<form method="post" action="$script">
<center>
<table border="4"><tr><td>
<br>
	<table summary="入力欄">
	<colgroup>
	<col span="1" align="right" valign="middle">
	<col span="1">
	</colgroup>
	<tbody>
	<tr valign="middle"><td>　　</td><td nowrap align="right">タイトル </td><td align="left"> <input type="text" name="subject" value="" size="$haba1" maxlength="60"></td><td>　　</td></tr>
	<tr valign="middle"><td></td><td nowrap align="right">名前 </td><td align="left"> <input type="text" name="name" value="$name" size="$haba1" maxlength="60"></td><td></td></tr>
	<tr valign="middle"><td></td><td nowrap align="right">内容 </td><td align="left"> <textarea name="mes" rows="7" cols="$haba2"></textarea></td><td></td></tr>
	<tr valign="middle"><td></td><td nowrap align="right">削除コード </td><td align="left"> <input type="password" name="code" value="$code" size="$haba3" maxlength="10"></td><td></td></tr>

	<tr></tr>
	<tr></tr>

	<tr><td colspan="4" align="center"><hr><input type="submit" value="　送  信　">　　　<input type="reset" value=" 書き直し ">
<input type="hidden" name="mode" value="1"></td></tr>
	</tbody>
	</table>

</td></tr></table>
</center>
</form>
$comment
<hr>
$button
<hr>
@log
$button
<hr>
<div align="right">$copyright</div>
</body>
</html>
EOF
}

else {


    # ログの読み込み
    @log = &jwlib'readFile($guest, $page*$max_line+1, $max_line+1);
    if ($log[$max_line] ne '') {
        $last = $log[$max_line];
        pop(@log);
    } else { $last = ''; }
    foreach (@log) {
        ($main, $sub, $number) = split(/\t/, $_);
        $_ = $main . $sub . "<hr>\n";
    }

    # 移動ボタン
    $back = '';
    $foward = '';
    $navi = '';
    if ($last) {
        $page_num = $page + 1;
        $back = "<form method=\"post\" action=\"$script\">\n<div>\n" .
                "<input type=\"hidden\" name=\"page\" value=\"$page_num\">\n" .
                "<input type=\"submit\" value=\"前ページ\">\n" .
                "</div>\n</form>\n";
    }
    if ($page) {
        $page_num = $page - 1;
        $foward = "<form method=\"post\" action=\"$script\">\n<div>\n" .
                  "<input type=\"hidden\" name=\"page\" value=\"$page_num\">\n" .
                  "<input type=\"submit\" value=\"次ページ\">\n" .
                  "</div>\n</form>\n";
    }
    if ($back ne '' || $foward ne '') {
        $navi = "<table cellpadding=\"0\" cellspacing=\"0\" summary=\"移動ボタン\">\n" .
                "<tr><td>\n$back</td><td>\n$foward</td></tr>\n" .
                "</table>\n";
    }

    # 削除ボタン
    $delete = "<form method=\"post\" action=\"$script\">\n" .
              "<div>\n削除するNo：<input type=\"text\" name=\"val\" value=\"\" size=\"3\">\n" .
              "削除コード：<input type=\"password\" name=\"code\" value=\"\" size=\"15\" maxlength=\"10\">\n" .
              "<input type=\"submit\" value=\"削除\">\n" .
              "<input type=\"hidden\" name=\"page\" value=\"$page\">\n" .
              "<input type=\"hidden\" name=\"mode\" value=\"3\">\n</div>\n</form>\n";

    # 操作ボタン
    $button = "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" summary=\"操作ボタン\">\n" .
              "<tr><td align=\"left\">\n$navi</td>" .
              "<td align=\"right\">\n$delete</td></tr>\n</table>";

# 画面の表示
print <<"EOF";
Content-Type: text/html; charset=$charset
Content-Style-Type: text/css
Content-Language: ja

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html40/loose.dtd">
<html>
<head>
<link rev="made" href="mailto:$my_email" title="$my_name">
<link rel="prev" href="$my_home" title="ホーム">
<title>$guest_name1</title>

<style type="text/css">
<!--
    form  { margin: 0em 0em 0em 0em; }
    .talk { margin: 1.5em 1.5em 1em 1.5em; }
    .comment { margin: 1.5em 2em 1em 5em; }
-->
</style>
</head>

$body

$guest_name2
<center>閲覧専用モード</center>
<br>
@log
$button
</body>
</html>
EOF
}

}


#<br>コメント対象No（管理人専用）：<input type="text" name="val" value="" size="3">

#===============================================================================
# 発言
#===============================================================================
sub Write
{
    # エラーチェック
    if ($name eq '') { &jwlib'outError(2, '名前'); }
    if ($mes eq '')  { &jwlib'outError(2, '内容'); }

    # Cookieの書き込み
    #$COOKIE{'name'}  = $name;
    #$COOKIE{'email'} = $email;
    #$COOKIE{'url'}   = $url;
    #$COOKIE{'code'}  = $code;
    #&jwlib'setCookie($cookie_name, $cookie_life, %COOKIE);
    #$subject = &jwlib'checkTag($subject);
    #$name    = &jwlib'checkTag($name);
    #$email   = &jwlib'checkTag($email);
    #$url     = &jwlib'checkTag($url);
    #$cookie_flag = 1;

    # 改行の編集
    $mes = &jwlib'checkTag($mes, $tag);

    # URL、引用の編集
#    $mes =~ s/((http|https|ftp):\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:]+)/<a href="$1" target="\_top">$1<\/a>/g;
    @comment = split(/<br>/i, $mes);
    $mes = '';
    foreach (@comment) {
        $_ =~ s/(^( |　)*(&gt;|>|＞).*$)/<font color="$quote_color">$1<\/font>/;
        $mes = $mes . $_ . '<br>';
    }

    # データの編集
    if ($subject eq '') { $subject = '（無題）'; }
    if ($email) { $name2 = "<strong><a href=\"mailto:$email\">$name</a></strong> ( $email )"; }
    else { $name2 = "<strong><font color=\"$name_color\">$name</font></strong>"; }
    if ($url) { $url2 = "<br>　 <a href=\"$url\">$url</a>"; }
    else { $url2 = ''; }
    $code2 = crypt($code, substr($admin_password, 0, 2));

    # ファイルの更新
    @log = &jwlib'readFile($guest, 0, $max_record);
    $log[0] =~ s/\r?\n?$//;
    ($number, $last) = split(/\t/, $log[0]);
    if ($double_post && $mes eq $last) { &jwlib'outError(5); }
    $number++;
    $log[0] = "<div><font color=\"$number_color\">[$number]</font> " .
              "<strong><font color=\"$subject_color\">$subject</font></strong> " .
              "<font size=\"-1\">　 投稿者： </font> $name2</div>" .
              "<div class=\"talk\">$mes$url2</div><div align=\"right\">$info　[$host]</div>\t\t$number\t$code2\n";
    unshift(@log, "$number\t$mes\n");
    &jwlib'writeFile($guest, @log);
    undef(@log);

    $subject = '';
    $name    = '';
    $email   = '';
    $url     = '';
    $mes     = '';
    $code    = '';

}

#  $info
#  $url2

#===============================================================================
# コメントの追加
#===============================================================================
sub Comment
{
    # エラーチェック
    if ($mes eq '') { &jwlib'outError(2, '内容'); }

    # データの編集
    $mes = &jwlib'checkTag($mes, $tag);
    $mes =~ s/((http|https|ftp):\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:]+)/<a href="$1" target="\_top">$1<\/a>/g;
    $mes = "<div class=\"comment\"><font color=\"$comment_color\">$mes</font></div>";

    # ファイルの更新
    @log = &jwlib'readFile($guest, 0, $max_record+1);
    foreach (@log) {
        ($buf, $comm, $number, $dcode) = split(/\t/, $_);
        if ($number == $val) {
            $_ = $buf . "\t" . $mes . "\t" . $number . "\t" . $dcode;
            &jwlib'writeFile($guest, @log);
            last;
        }
    }
    undef(@log);
}


#===============================================================================
# 削除
#===============================================================================
sub Delete
{
    # エラーチェック
    if ($val eq '') { &jwlib'outError(2, '発言番号'); }
    if ($val =~ /[^0-9]/) { &jwlib'outError(6, '数字以外'); }

    # 削除コードの作成
    $code2 = crypt($code, substr($admin_password, 0, 2));

    # ファイルの更新
    @log = &jwlib'readFile($guest, 0, $max_record+1);
    $num = @log;
    foreach (1 .. $num-1) {
        ($buf, $comm, $number, $del) = split(/\t/, $log[$_]);
        $del =~ s/\r?\n?$//;
        if ($number == $val) {
             if ($del eq $code2 || $code eq $admin_password) {
                splice(@log, $_, 1);
                &jwlib'writeFile($guest, @log);
                last;
            } else { &jwlib'outError(9); }
        }
    }
    undef(@log);

    $code    = '';

}
__END__
#END_OF_FILE
