#!/usr/local/bin/perl

###############################################
#   rest7.cgi
#      V2.0 (2005.1.8)
#                     Copyright(C) CGI-design
###############################################

$script = 'rest7.cgi';
$base = './restdata';					#データ格納ディレクトリ
$opfile = "$base/option.cgi";

open (IN,"$opfile") || &error("OPEN ERROR");	$opdata = <IN>;		close IN;
if (!$opdata) {
	$pass = &crypt('cgi');
	chmod(0666,$opfile);	open (OUT,">$opfile") || &error("OPEN ERROR");
	print OUT "$pass<>$pass<>";
	close OUT;
}

###　メイン処理　###
if ($ENV{'REQUEST_METHOD'} eq "POST") {read(STDIN,$in,$ENV{'CONTENT_LENGTH'});} else {$in = $ENV{'QUERY_STRING'};}
foreach (split(/&/,$in)) {
	($n,$val) = split(/=/);
	$val =~ tr/+/ /;
	$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$val =~ s/&/&amp;/g;	$val =~ s/</&lt;/g;		$val =~ s/>/&gt;/g;		$val =~ s/"/&quot;/g;	$val =~ s/\r\n|\r|\n/<br>/g;
	$in{$n} = $val;
}
$mode = $in{'mode'};

open (IN,"$opfile") || &error("OPEN ERROR");
($pass,$pw,$resturl) = split(/<>/,<IN>);
close IN;

if ($mode eq 'admin') {&admin;} else {&main;}

print "</html>\n";
exit;

###
sub header {
	print "Content-type: text/html\n\n";
	print "<html><head><META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print "<title>認証</title></head>\n";
	$head = 1;
}

###
sub main {
	if ($in{'pw'} eq '') {&error("パスワードを入力して下さい");}
	$mat = &decrypt($in{'pw'},$pw);
	if (!$mat) {&error("パスワードが違います");}
	if (!$resturl) {&error("ＵＲＬが設定されていません");}

	&header;
	print "<frameset cols=\"100%,*\" border=0 frameborder=0><frame src=\"$resturl\"></frameset>\n";
}

###
sub admin {
	&header;
	print "<body><center>\n";
	$inpass = $in{'pass'};
	if ($inpass eq '') {
		print "<br><br><br><br><h4>管理パスワードを入力して下さい</h4>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=password size=10 maxlength=8 name=pass>\n";
		print " <input type=submit value=\" 認証 \"></form>\n";
		print "</center></body></html>\n";
		exit;
	}
	$mat = &decrypt($inpass,$pass);
	if (!$mat) {&error("管理パスワードが違います");}

	if ($in{'wrt'}) {
		if ($in{'newpass'} ne '') {$pass = &crypt($in{'newpass'});}
		if ($in{'newpw'} ne '') {$pw = &crypt($in{'newpw'});}
		$resturl = $in{'resturl'};

		open (OUT,">$opfile") || &error("OPEN ERROR");
		print OUT "$pass<>$pw<>$resturl";
		close OUT;
	}
	print "<br><br>下記に入力後、「設定する」を押して下さい。\n";
	print "<form action=\"$script\" method=\"POST\">\n";
	print "<input type=hidden name=mode value=\"admin\">\n";
	print "<input type=hidden name=pass value=\"$inpass\">\n";
	print "<input type=submit name=wrt value=\"設定する\"><br><br>\n";

	print "<table bgcolor=\"#dddddd\" cellspacing=10><tr><td><table cellspacing=1 cellpadding=0>\n";
	print "<tr><td><b>認証ＵＲＬ</b></td><td><input type=text size=60 name=resturl value=\"$resturl\"></td></tr>\n";
	print "<tr><td><b>認証パスワード</b></td><td><input type=password name=newpw size=10 maxlength=8> （英数8文字以内）</td></tr>\n";
	print "<tr><td><b>管理パスワード</b></td><td><input type=password name=newpass size=10 maxlength=8> （英数8文字以内）</td></tr>\n";
	print "</table></td></tr></table></form><br>\n";
	# 次の行は著作権表示ですので削除しないで下さい。#
	print "<a href=\"http://cgi-design.net\" target=\"_blank\">CGI-design</a>\n";
	print "</center></body>\n";
}

###
sub crypt {
	@salt = ('a' .. 'z','A' .. 'Z','0' .. '9');
	srand;
	$salt = "$salt[int(rand($#salt))]$salt[int(rand($#salt))]";
	return crypt($_[0],$salt);
}

###
sub decrypt {
	$salt = $_[1] =~ /^\$1\$(.*)\$/ && $1 || substr($_[1],0,2);
	if (crypt($_[0],$salt) eq $_[1] || crypt($_[0],'$1$' . $salt) eq $_[1]) {return 1;}
	return 0;
}

###
sub error {
	if (!$head) {&header; print "<body><center>\n";}
	print "<br><br><br><br><h3>ERROR !!</h3><font color=red><b>$_[0]</b></font>\n";
	print "</center></body></html>\n";
	exit;
}
