#! /usr/bin/perl
#*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*
#         Simple Change_Html  text.ver
#                   [change_html.cgi] ver0.25
#
#
#         >> Created by eshima
#>>Copyright (c) 2002.05 eshima. All rights reserved.
#*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*-*=*

############################ 各種設定 ##################################
require './jcode.pl';
require './cgi-lib.pl';

$script = './change_html.cgi';

$title = "今月のおすすめ";

$logfile ="./logs.txt";

$pass = 'mentai3139';

$max = 10;

$body = '<body bgcolor="#FFFFCC" margin="0">';

#表示させるログの数（1〜10まで）
$p_log = 1;

#タグの許可（0:不許可　1:許可）
$tagkey= 1;

#投稿処理の権限
#　0;誰でも投稿可能
#  1;管理者のみが投稿可能
$PostMode = 1;

#++++++++++++++各種設定終了++++++++++++++++++

#if($ImgDir !~ /\/$/){ $ImgDir .= "/"; }
#if($ImgUrl !~ /\/$/){ $ImgUrl .= "/"; }

&decode;
if ($mode eq 'regist') { &regist; }
elsif ($mode eq 'admin') { &admin; }
elsif ($mode eq 'check') { &check; }
&html;

#++++++++++++++記事表示処理+++++++++++++++++

sub html{
	&header;
	print "<center>\n";

	#ページ区切り処理
	$start = $in{'page'} + 1;
	$end = $in{'page'} + $p_log;

	open(IN,"$logfile") || &error("Open Error : $logfile");
	$i=0;
	while(<IN>){
		$i++;
		if ($i < $start){ next; }
		if ($i > $end){ last; }

		($no,$com,$pw) = split(/<>/);

#	if (-e "$ImgDir$no$tail"){
#	if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png"){
#		if($W && $H){
#			print "<img src=\"$ImgUrl$no$tail\" width=\"$W\" height=\"$H\" border=0 align=center alt=\"$no$tail\">\n";
#		}else{
#			print "<img src=\"$ImgUrl$no$tail\" border=0 align=center alt=\"$no$tail\">\n";
#		}
#		print "<br>\n";
		print "<table border=0 cellpadding=2 cellspacing=0>\n";
		print "<tr>\n<td>$com</td>\n</tr>\n</table>\n\n";
#	}
#	}
	}
	close(IN);
	
	print <<"EOM";
<div align="right" valign="bottom"><font color=#000000><br><br><br><br><br>【<a href="$script?mode=admin">管理用</a>】</font></div>
EOM

	$next_page = $in{'page'} + $p_log;
	$back_page = $in{'page'} - $p_log;

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


#++++++++++++++書き込み処理+++++++++++++++++
sub regist{
	if (!&MethPost()) { &error("METHOD形式がPOSTでありません");}
	#パスワードチェック
	if ($PostMode && $in{'pass'} ne $pass){ &error("パスワードが認証できません");}
	if ($in{'comment'} eq ""){ &error("コメントが記入されていません");}
	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	($tno,$tcom,$tpw) = split(/<>/, $lines[0]);
	$no = $tno + 1;
	if ($in{'pwd'} ne "") { $PW = &encrypt($in{'pwd'}); }

	while($max <= @lines){
		$del = pop(@lines);
		local($no,$com,$pw,) = split(/<>/, $del);
#		if (-e "$ImgDir$no$tail"){ unlink("$ImgDir$no$tail"); }
	}

	#ファイル添付
#	if ($in{'upfile'}){ &UpFile; }

	#更新
	unshift(@lines,"$no<>$in{'comment'}<>$PW<><>\n");
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @lines;
	close(OUT);

	if($PostMode && $in{'action'} eq "regist"){
		&header;
		print "<center><br><br>書き込みました。\n";
		print "<br><form action=\"$script\">\n<input type=submit value='戻る'></form><br>\n";
		print "<br><form action=\"$script\" method=POST>\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=admin>\n";
		print "<input type=hidden name=action value=form>\n";
#		print "<input type=submit value='書換えページへ'></form>\n";
		print "</center>\n</body>\n</html>\n";
		exit;
	}
}


#+++++++++++++++管理モード++++++++++++++++++
sub admin{
	if ($in{'pass'} ne "" && $in{'pass'} ne "$pass"){
		&error("パスワードが違います");
	}
	if ($PostMode && $in{'action'} eq "form"){ &PostForm; }

	&header;
	print "<font color=#999999>[<a href=\"$script?\">$titleに戻る</a>]</font>\n";
	print "<center><table width='100%'><tr><td align=\"center\" bgcolor=\"#FF6600\">\n";
	print "<font color=\"#FFFFFF\"><b>管理ページ</b></font>\n";
	print "</td></tr></table>\n";

	if ($in{'pass'} eq ""){
		print "<font color=\"#000000\"><b>パスワードを入力してください</b></font><br><br>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";

		if ($PostMode) {
#			print "<input type=radio name=action value=log>ログ管理\n";
			print "<input type=radio name=action value=form checked>記事投稿<br>\n";
		}
		print "<input type=password name=pass size=8>";
		print "<input type=submit value=\" 認証 \"></form>\n";
	}
	print"</center>\n</body>\n</html>\n";
	exit;
}

#++++++++++++++投稿フォーム++++++++++++++++
sub form {
	print <<"EOM";
<center>
<form action="$script" method="POST" style=margin:1px>
<input type=hidden name=mode value="regist">
<input type=hidden name=action value="regist">
<input type=hidden name=pass value="$in{'pass'}">

<table border=0 cellpadding=2 bgcolor="#FF6600" width=100%>
<tr><td align="center">
<font color="#FFFFFF"><b>書き換えページ</b></font>
</td></tr></table>
<table border=0 cellpadding=2>
<tr><td colspan=2>
ページの内容を書き換えます。<br>
下のフォーム内に新着情報に掲載するコメントを書いて、送信ボタンを押してください。<br>
※送信ボタンを押しますと、前回の内容は消去され、新しい内容に変わります。<br>
間違えた場合は最初からやりなおしてください。
</td></tr>
<tr><td colspan=2 align=center>
<textarea rows=4 cols=18 name="comment"></textarea><br>
</td></tr>
<tr><td align="center" colspan=2>
<input type="submit" value="送　信"> <input type="reset" value="リセット">
</td></tr>
EOM

	if (!$PostMode) {
		print "<tr><td>削除キー</td>\n";
		print "<td><input type=password name=pwd size=8 maxlength=8>\n";
		print "<font color=#999999>（記事削除用。英数字8文字以内）</font></td></tr>\n";
	}
	print <<"EOM";
</table>
</form>
</center>
<br>
EOM
}

#++++++++++++++管理者用投稿フォーム+++++++++++++++
sub PostForm{
	&header;
	print "[<a href=\"javascript:history.back()\">戻る</a>]\n";
	&form;
	print "</body>\n</html>\n";
	exit;
}

#+++++++++++++++デコード処理++++++++++++++++
sub decode{
	&ReadParse;

	while(($key,$val) = each %in) {
		if($key ne "upfile") {
			&jcode'convert(*val, "sjis", "", "z");

			if ($tagkey) {
				$val =~ s/<>/&lt;&gt;/g;
			}else{
				$val =~ s/</&lt;/g;
				$val =~ s/>/&gt;/g;
			}

		if($key eq "comment"){
			$val =~ s/\r\n/<br>/g;
			$val =~ s/\r/<br>/g;
			$val =~ s/\n/<br>/g;
		} else {
			$val =~ s/\r//g;
			$val =~ s/\n//g;
		}
	}
	
	$in{$key} = $val;
	}
	$mode = $in{'mode'};
	$in{'url'} =~ s/^http\:\/\///;
}
#+++++++++++++ヘッダー処理++++++++++++++++++
sub header {
	$head_flag = 1;
	print "Content-type: text/html\n\n";
	print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<STYLE TYPE="text/css">
<!--
body { margin: 0px }
body,tr,td { font-size:12px; color: #000000 }
-->
</STYLE>
<title>$title</title></head>
$body
EOM
}
#++++++++++++++エラー処理+++++++++++++++++++
sub error{
	&header if(!$head_flag);
	print "<center><hr width=\"100%\">\n<font color=\"#0000FF\" size=2><b>ERROR！</b></font><br>\n";
	print "<font color=\"999999\" size=2><b>$_[0]</b></font><br><br><br>\n";
	print "<font color=\"#999999\" size=2><b><a href=\"$script\">戻る</a></b></font><br>\n";
	print "<hr width=\"100%\"></center>\n</body>\n</html>\n";
	exit;
}

#++++++++++++++パスワード暗号処理+++++++++++
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;
}

#+++++++++++++チェックモード+++++++++++++++++++++
sub check{
	&header;
	print "<font color=\"#000000\"><b>Check Mode</b></font><br><br>\n";
	print "<ul>\n";
	
	#ログファイル
	if (-e $logfile){ print "<LI>ログファイル：パスOK\n";}
	else { print"<LI>ログファイルのパスが不正です: $logfile\n"; }
	if (-r $logfile && -w $logfile){print "<LI>ログパーミッション: OK\n";}
	else {print "<LI>ログパーミッションが不正です。\n";}

	print "</UL>\n</body>\n</html>\n";
	exit;
}
