#!/usr/bin/perl -w

#############################################################################
# BadStore.cgi v1.2.3s
# BadStore用のCGIプログラムファイル
#
# 著作権 2004-6 - Kurt R. Roemer
# 開発および保守: Kurt R. Roemer, CISSP
# 最終更新: 2006年5月10日 - kroemer@netcontinuum.com
# 最新版は www.badstore.net/downloads を参照
#
# 警告! - これはデモおよび
# セキュリティ研修専用の安全でないプログラムである。実在の店舗ではない。
# このプログラムの詳細については免責事項を参照
#
# このプログラムはフリーソフトウェアであり、再配布および/または
# GNU General Public License の条件に従って改変できる。
# Free Software Foundation が公開したバージョン2、または
# 任意でそれ以降のバージョンを選択できる。
#
# このプログラムは有用であることを期待して配布されるが、
# ただし、いかなる保証もない。商品性や
# 特定目的への適合性についての黙示的保証もない。
# 詳細は GNU General Public License を参照。
#
# このプログラムとともに GNU General Public License の写しを
# 受け取っているはずである。受け取っていない場合は Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA に連絡すること。
#
#############################################################################

### 必要なPerlモジュールを指定 ###
use utf8;
use open ':std', ':encoding(UTF-8)';
use CGI::Carp qw(fatalsToBrowser);
use DBI;
use CGI qw(:standard :html3);
use Digest::MD5 qw(md5_hex);
use MIME::Base64;

### グローバル変数を設定 ###
$time = time;
$ipaddr = $ENV{'REMOTE_ADDR'};
binmode STDOUT, ':encoding(UTF-8)';

### URLまたはフォームから送信データを取得 ###
$query=new CGI;
$action=$query->param('action');

my %color_labels = (
	green => '緑',
	blue => '青',
	red => '赤',
	orange => 'オレンジ',
	purple => '紫',
	yellow => '黄'
);

### ヘッダーとフッターを設定 ###
open (BSHEADER, '<:encoding(UTF-8)', '../data/header.txt') or die "Cannot open header file\n";
@header=<BSHEADER>;
close (BSHEADER);
open (BSFOOTER, '<:encoding(UTF-8)', '../data/footer.txt') or die "Cannot open footer file\n";
@footer=<BSFOOTER>;
close (BSFOOTER);

### URLまたはフォームデータから処理内容を判定 ###

if ($action eq 'whatsnew')
{
   &whatsnew;

} elsif ($query->url_param('action') eq 'cartadd') {
   &cartadd;

#} elsif ($action eq 'cartremove') {
#   &cartremove;

#} elsif ($action eq 'cartchangeqty') {
#   &cartqty;

} elsif ($action eq 'cartview') {
   &cartview;

} elsif ($query->url_param('action') eq 'order') {
   &order;

} elsif ($query->url_param('action') eq 'viewprevious') {
   &viewprevious;

} elsif ($query->url_param('action') eq 'submitpayment') {
   &submitpayment;

} elsif ($action eq 'guestbook') {
   &guestbook;

} elsif ($query->url_param('action') eq 'doguestbook') {
   &doguestbook;

} elsif ($action eq 'aboutus') {
   &aboutus;

} elsif ($action eq 'loginregister') {
   &loginregister;

} elsif ($query->url_param('action') eq 'login'){
   &authuser;

} elsif ($query->url_param('action') eq 'register'){
   &authuser;

} elsif ($action eq 'search') {
   &search;

} elsif ($action eq 'supplierlogin') {
   &supplierlogin;

} elsif ($query->url_param('action') eq 'supplierportal') {
   &supplierportal;

} elsif ($query->url_param('action') eq 'supupload') {
   &supupload;

} elsif ($action eq 'admin') {
   &admin;

} elsif ($query->url_param('action') eq 'adminportal') {
   &adminportal;

} elsif ($action eq 'myaccount'){
  &myaccount;

} elsif ($query->url_param('action') eq 'moduser'){
  &moduser;

} else {
   &home;
}

exit;

############
### ホーム ###
############

sub home
{
	&printheaders;
	print @header,
	start_html("BadStore v1.2.3sへようこそ - ネット上でもっとも安全でない店舗"),
	"<center>",h1("<font color=#004b2c>BadStoreへようこそ!</font>"), hr, p,
	img({-src=>'/images/store1.jpg',-border=>'0'}),"</center>", p,
	@footer,
	end_html();
}

##################
### 新着情報 ###
##################

sub whatsnew
{
	local (@data);

	### SQLデータベースへ接続 ###
	my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
		or die "Cannot connect: " . $DBI::errstr;

	### SQLクエリを準備して実行 ###
	my $sth = $dbh->prepare( "SELECT itemnum, sdesc, ldesc, price FROM itemdb WHERE isnew = 'Y'")
                or die "Couldn't prepare statement: " . $dbh->errstr;
          $sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;

	&printheaders;
	print @header;
	print start_html("BadStoreの新着情報");
	if ($sth->rows == 0) {
      	print h2("新着商品はありません! "),"$sth.\n\n";
      } else {
		print start_form( -action=>'/cgi-bin/badstore.cgi?action=cartadd');
		### 一致したレコードを読み込んで出力 ###
		print h1("次の商品が新着です:"), hr, "<TABLE BORDER=1>";
		print Tr( th('商品番号'),th('商品'),th('説明'),th('価格'),th('画像'),th('カートに追加'));
          		while (@data = $sth->fetchrow_array()) {
				$image='/images/' . $data[0] . '.jpg';
				print Tr( td( \@data ),td({-align=>CENTER},"<IMG SRC=$image>"),td({-align=>CENTER},"<INPUT type=checkbox name='cartitem' value=$data[0]>") );
			}
		print "</TABLE>\n\n", p, "<Center>", submit('選択した商品をカートに追加'), "   ", reset('リセット'), "</Center>", end_form;
		}

	### ステートメントハンドルを閉じる ###
	$sth->finish;

	### データベースから切断 ###
	$dbh->disconnect;

	print @footer;
	print end_html();
}

##############
### 検索 ###
##############

sub search
{
	local (@data, $squery, $temp, $sql);
	$squery=$query->param('searchquery');

	### SQLデータベースへ接続 ###
	my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
		or die "Cannot connect: " . $DBI::errstr;

	### SQLクエリを準備して実行 ###
	$sql="SELECT itemnum, sdesc, ldesc, price FROM itemdb WHERE '$squery' IN (itemnum,sdesc,ldesc)";
	my $sth = $dbh->prepare($sql)
                or die "Couldn't prepare SQL statement: " . $dbh->errstr;
	$temp=$sth;
      $sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;

	&printheaders;
	print @header;
	print start_html("BadStore - 検索結果");
	print comment('Search code developed by Bobby Jones - summer intern, 1996');
	print comment('Comment the $sql line out after troubleshooting is done');

          if ($sth->rows == 0) {
            print h2("検索条件に一致する商品はありません: "), $sql, $sth->errstr;
          } else {
	### 一致したレコードを読み込んで出力 ###
	print h2("次の商品が検索条件に一致しました:"), "<HR>",
	start_form( -action=>'/cgi-bin/badstore.cgi?action=cartadd'),"<TABLE BORDER=1>",
	Tr( th('商品番号'),th('商品'),th('説明'),th('価格'),th('画像'),th('カートに追加'));
          while (@data = $sth->fetchrow_array()) {
		$image='/images/' . $data[0] . '.jpg';
		print Tr( td( \@data ),td({-align=>CENTER},"<IMG SRC=$image>"),td({-align=>CENTER},"<INPUT type=checkbox name='cartitem' value=$data[0]>") );
		}
	print "</TABLE>\n\n", p, "<Center>", submit('選択した商品をカートに追加'), "   ", reset('リセット'), "</Center>", end_form;
	}

	### ステートメントハンドルを閉じる ###
	$sth->finish;

	### データベースから切断 ###
	$dbh->disconnect;

	print @footer;
	print end_html();
}

#########
# 管理者 #
#########

sub admin
{
	&printheaders;
	print @header;
	print start_html("BadStore 管理者専用ポータル"),
	h1("秘密の管理メニュー"), hr, p;

	print start_form(-action=>'/cgi-bin/badstore.cgi?action=adminportal'),
	p, h2("今日はどの管理画面に移動しますか?"),
	popup_menu(-name=>'admin', -values=>['View Sales Reports','Reset User Password','Add User','Delete User','Show Current Users','Troubleshooting','Backup Databases'], -labels=>{'View Sales Reports'=>'売上レポートを表示','Reset User Password'=>'ユーザーパスワードをリセット','Add User'=>'ユーザーを追加','Delete User'=>'ユーザーを削除','Show Current Users'=>'現在のユーザーを表示','Troubleshooting'=>'トラブルシューティング','Backup Databases'=>'データベースをバックアップ'}),
	submit('実行'), end_form,
	@footer,
	end_html();
}

################
# 管理者ポータル #
################

sub adminportal
{
	local ($aquery, $email, $newpasswd, @data, $stemp, @s_cookievalue, $passwd, $fullname, $role);
	&printheaders;
	print @header,
	start_html("BadStore 管理者専用ポータル"),
	h1("秘密の管理ポータル"), hr, p;
	$aquery=$query->param('admin');
	my %admin_action_map = (
		'売上レポートを表示' => 'View Sales Reports',
		'ユーザーパスワードをリセット' => 'Reset User Password',
		'ユーザーを追加' => 'Add User',
		'ユーザーを削除' => 'Delete User',
		'現在のユーザーを表示' => 'Show Current Users',
		'トラブルシューティング' => 'Troubleshooting',
		'データベースをバックアップ' => 'Backup Databases'
	);
	$aquery = $admin_action_map{$aquery} if exists $admin_action_map{$aquery};

	### SSOidクッキーを読み込む ###
	$stemp=cookie('SSOid');
	$stemp=decode_base64($stemp);
	@s_cookievalue=split(":", ("$stemp"));
	$email=shift(@s_cookievalue);
	$passwd=shift(@s_cookievalue);
	$fullname=shift(@s_cookievalue);
	if ($fullname eq '') {
		$fullname="{未登録ユーザー}";
	}
	$role=shift(@s_cookievalue);

	### SSOクッキーの管理者権限を確認 ###
	if ($role eq 'A') {

	### SQLデータベースへ接続 ###
	my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
	or die "Cannot connect: " . $DBI::errstr;
	
		### 売上レポートを準備 ###
		if ($aquery eq 'View Sales Reports') {
		my $sth = $dbh->prepare("SELECT * FROM orderdb ORDER BY 'orderdate','ordertime'")
			or die "Couldn't prepare statement: " . $dbh->errstr;
		$sth->execute() or die "Couldn't execute SQL statement: " .$sth->errstr;

		print h2("<Center>BadStore 売上レポート",p,&getdate,"</center>"), "<HR>",
		"<TABLE BORDER=1>",
		Tr(th('日付'),th('時刻'),th('金額'),th('数量'),th('商品数'),th('アカウント'),th('IP'),th('支払済み'),th('使用したクレジットカード'),th('有効期限'));
		while (@data=$sth->fetchrow_array()){
			$data[9]=~ s/(\d\d\d\d)[\-\s]?/$1-/g;
			$data[9]=~ s/-$//;
			print Tr(td(font({face=>'Arial', size=>'-2'},$data[1])),td(font({face=>'Arial', size=>'-2'},$data[2])),td(font({face=>'Arial', size=>'-2'},$data[3])),td(font({face=>'Arial', size=>'-2'},$data[4])),td(font({face=>'Arial', size=>'-2'},$data[5])),td(font({face=>'Arial', size=>'-2'},$data[6])),td(font({face=>'Arial', size=>'-2'},$data[7])),td(font({face=>'Arial', size=>'-2'},$data[8])),td(font({face=>'Arial', size=>'-2'},$data[9])),td(font({face=>'Arial',size=>'-2'},$data[10])));
		}
		print "</TABLE>\n\n",p;

		} elsif ($aquery eq 'Reset User Password') {

			### ユーザーパスワードをリセット ###
			### SQLクエリを準備して実行 ###
			my $sth = $dbh->prepare( "SELECT email FROM userdb")
	            	    or die "Couldn't prepare statement: " . $dbh->errstr;
		      $sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;
			while (@data=$sth->fetchrow_array()) {
				@ids=(@ids, $data[0]);
			}
			print start_form( -action=>'/cgi-bin/badstore.cgi?action=moduser'),
			p, "パスワードをリセットするユーザー: ",
			popup_menu(-name=>'email', -values=>[@ids]),
			submit(-name=>'DoMods',-value=>'ユーザーパスワードをリセット'), end_form;
	
			### ステートメントハンドルを閉じる ###
			$sth->finish;

     		} elsif ($aquery eq 'Troubleshooting') {

			### CGI環境を出力 ###
			print h2("CGI環境変数"), "<TABLE BORDER=1>";

			my %env_info = (
		  	    SERVER_SOFTWARE     => "the server software",
			    SERVER_NAME         => "the server hostname or IP address",
			    GATEWAY_INTERFACE   => "the CGI specification revision",   
			    SERVER_PROTOCOL     => "the server protocol name",
			    SERVER_PORT         => "the port number for the server",
			    REQUEST_METHOD      => "the HTTP request method",
			    PATH_INFO           => "the extra path info",
			    PATH_TRANSLATED     => "the extra path info translated",
			    DOCUMENT_ROOT       => "the server document root directory",
			    SCRIPT_NAME         => "the script name",
			    QUERY_STRING        => "the query string",
			    REMOTE_HOST         => "the hostname of the client",
			    REMOTE_ADDR         => "the IP address of the client",
			    AUTH_TYPE           => "the authentication method",
			    REMOTE_USER         => "the authenticated username",
			    REMOTE_IDENT        => "the remote user is (RFC 931): ",
			    CONTENT_TYPE        => "the media type of the data",
			    CONTENT_LENGTH      => "the length of the request body",
			    HTTP_ACCEPT         => "the media types the client accepts",
			    HTTP_USER_AGENT     => "the browser the client is using",
			    HTTP_REFERER        => "the URL of the referring page",
			    HTTP_COOKIE         => "the cookie(s) the client sent"
			);

			# Webサーバーまたはブラウザで定義された追加変数を追加
			foreach $name ( keys %ENV ) {
			    $env_info{$name} = "an extra variable provided by this server"
		        unless exists $env_info{$name};
			}
			print Tr( th('変数名'),th('説明'),th('値'));
			foreach $name ( sort keys %env_info ) {
		    		my $info = $env_info{$name};
		   		my $value = $ENV{$name} || "<I>未定義</I>";
				print Tr( td(font({face=>'Arial', size=>'-2'}, $name )),td(font({face=>'Arial', size=>'-2'}, $info )), td(font({face=>'Arial', size=>'-2'}, $value )));
			}
			print "</TABLE>",p,
			h2("最近のApacheエラーログ"),p,hr,
			`tail /usr/local/apache/logs/error_log`,
			p, h2("Apacheアクセスログ"),p,hr,
			`cat /usr/local/apache/data/userdb`;

			} elsif ($aquery eq 'Add User') {

			### ユーザーを追加 ###
			print start_form(-method=>'POST',-action=>'/cgi-bin/badstore.cgi?action=moduser'),
			"メールアドレス:  ",textfield(-name=>'email',-size=>40),p,
			hidden(-name=>'password',-default=>[md5_hex('Welcome')]),
			"パスワードヒント:  ",popup_menu(-name=>'pwdhint',-values=>['green','blue','red','orange','purple','yellow'],-labels=>\%color_labels),p,			
			"氏名:  ",textfield(-name=>'fullname',-size=>50),p,
			"権限:  ",textfield(-name=>'role',-size=>1),p,
			submit(-name=>'DoMods',-value=>'ユーザーを追加'), reset('リセット'), end_form,hr;

			} elsif ($aquery eq 'Delete User') {
			### ユーザーを削除 ###
			### SQLクエリを準備して実行 ###
			my $sth = $dbh->prepare( "SELECT email FROM userdb")
	            	    or die "Couldn't prepare statement: " . $dbh->errstr;
		      $sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;

			while (@data=$sth->fetchrow_array()) {
				@ids=(@ids, $data[0]);
			}

			print start_form(-action=>'/cgi-bin/badstore.cgi?action=moduser'),
			p, "削除するユーザー: ",
			popup_menu(-name=>'email', -values=>[@ids]),
			submit(-name=>'DoMods',-value=>'ユーザーを削除'), end_form;
	
			### ステートメントハンドルを閉じる ###
			$sth->finish;

			} elsif ($aquery eq 'Show Current Users') {

			### 現在のユーザーを表示 ###
			### SQLクエリを準備して実行 ###
			my $sth = $dbh->prepare( "SELECT * FROM userdb")
	            	    or die "Couldn't prepare statement: " . $dbh->errstr;
		      $sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;
			print "<TABLE BORDER=1>",
			Tr(th('メールアドレス'),th('パスワード'),th('パスワードヒント'),th('氏名'),th('権限'));	
			while (@data=$sth->fetchrow_array()) {
				print Tr(td(font({face=>'Arial', size=>'-2'},$data[0])),td(font({face=>'Arial', size=>'-2'},$data[1])),td(font({face=>'Arial', size=>'-2'},$data[2])),td(font({face=>'Arial', size=>'-2'},$data[3])),td(font({face=>'Arial', size=>'-2'},$data[4])));
			}
			print "</TABLE>";
			} elsif ($aquery eq 'Backup Databases') {
			### テーブルをバックアップ ###
			my $sth = $dbh->prepare( "SELECT * FROM orderdb INTO OUTFILE '/usr/local/apache/htdocs/backup/orderdb.bak'")
	            	    or die "Couldn't prepare statement: " . $dbh->errstr;
		      	$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;
			my $sth = $dbh->prepare( "SELECT * FROM userdb INTO OUTFILE '/usr/local/apache/htdocs/backup/userdb.bak'")
	            	    or die "Couldn't prepare statement: " . $dbh->errstr;
		      	$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;
			print h2("データベースのバックアップが完了しました - ファイルは www.badstore.net/backup にあります");
			}
		### データベースから切断 ###
		$dbh->disconnect;

	} else {
		### 管理者ユーザーではない ###
		print h2("エラー - $fullname は管理者ではありません!"), hr,
		"不正な操作が発生しました - あなたは ",
		"管理ポータルにアクセスしようとしましたが、管理者ユーザーではありません。", p,
		"このリソースにアクセスするには、管理者としてログインする必要があります。", p,
		"ブラウザの戻るボタンでログイン画面に戻ってください。", p, p, p,
		h3("(もしハッキングを試みているなら、あなたが誰かは分かっています:   $ipaddr)");
	}
	print @footer,
	end_html();
}

#############
# ゲストブック #
#############

sub guestbook
{
	&printheaders;
	print @header,
	start_html("BadStore - ゲストブックに署名"),
	h1("ゲストブックに署名してください!"), hr,
	p,
	"ゲストブックに記入するには、このフォームを入力してください。メール欄は必須ではありませんが、フィードバックに返信する際の連絡先として役立ちます。ありがとうございます!",
	p, hr, "<TABLE BORDER=0 CELLLPADDING=10>";
	print start_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=doguestbook');
	print Tr( td('お名前:'), td('<INPUT TYPE=text NAME=name SIZE=30>'));
	print Tr( td('メール:'), td('<INPUT TYPE=text NAME=email SIZE=40>'));
      print Tr( td({-valign=>TOP},'コメント:'), td('<TEXTAREA NAME=comments COLS=60 ROWS=4></TEXTAREA>'));
	print "</TABLE>\n<HR>\n",
	'<Center><INPUT TYPE=submit VALUE="投稿する">  <INPUT TYPE=reset></Center>';
	p,
	submit('送信'), reset('リセット'),
	end_form,
	hr,
	@footer, end_html();
}

################
# ゲストブック処理 #
################

sub doguestbook
{
	local($timestamp, $name, $email, $comments, %fields);
	my ($dataFile) = "/usr/local/apache/data/guestbookdb";
	
	$timestamp=&getdate;
	$name=$query->param('name');
	$email=$query->param('email');
	$comments=$query->param('comments');
	chomp($comments);

    &saveFormData(\%fields, $dataFile);

	&printheaders;
	print @header;
	print start_html("BadStore ゲストブックへようこそ");

    print h1("ゲストブック"), hr;
    &readFormData($dataFile);

	print @footer;
	print end_html();
}

sub saveFormData {
    my($hashRef) = shift;
    my($dbfile) = shift;

    open(FILE, ">>$dbfile") or die("Unable to open ゲストブック data file $dbfile: $!\n");
    print FILE ("$hashRef->{'timestamp'}$timestamp~");
    print FILE ("$hashRef->{'name'}$name~");
    print FILE ("$hashRef->{'email'}$email~");
    print FILE ("$hashRef->{'comments'}$comments");
    print FILE ("\n");
    close(FILE);
}

sub readFormData {
    my($dbfile)    = shift;

    open(FILE, "<$dbfile") or die("Unable to open ゲストブック data file.");
    while (<FILE>) {
        my($timestamp, $name, $email, $comments) = split(/~/, $_);

        print("$timestamp: <B>$name</B> <A HREF=mailto:$email>$email</A>\n");
        print("<OL><I>$comments</I></OL>\n");
        print("<HR>\n");
    }
    close(FILE);
}

###############################
### 日付を取得して整形 ###
###############################

sub getdate
{
   local ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$date);
   local (@days, @months);

   @days = ('Sunday','Monday','Tuesday','Wednesday','Thursday', 'Friday', 'Saturday');

   @months = ('January','February','March','April','May','June','July','August','September','October','November','December');

   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);

   if ($hour < 10){ $hour = "0$hour"; }
   if ($min < 10){ $min = "0$min"; }
   if ($sec < 10){ $sec = "0$sec"; }

   $year += 1900;
   $date = "$days[$wday], $months[$mon] $mday, $year at $hour\:$min\:$sec";

   return $date;
}

###############
# カートに追加 #
###############

sub cartadd
{
	local($temp, @contents, $cookievalue);

	### 既存クッキーを確認し、空のカートを設定 ###
	if ($cartcookie eq "")
		{
		($sessid)=($time);
		$cartitems=0;
		$cartcost=0;
		@contents=$query->param('cartitem');
		}

	chomp(@contents);
	### 更新値が0かどうかを確認 ###
	if ($contents[0] eq ""){
		&printheaders;
		print start_html("BadStore - カートエラー"), @header,
		h1("カートエラー - 商品が選択されていません"), hr,
		"不正な操作が発生しました - 商品を選択せずにカートへ追加しようとしました!",p,
		"ブラウザの戻るボタンで戻り、もう一度お試しください。", p, p, p,
		h3("(もしハッキングを試みているなら、あなたが誰かは分かっています:   $ipaddr)"),
		@footer, end_html();

	} else {
		### SQLデータベースへ接続 ###
		my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
			or die "Cannot connect: " . $DBI::errstr;

		foreach $temp (@contents) {
			$cartitems = $cartitems + 1;
			my $sth = $dbh->prepare( "SELECT price FROM itemdb WHERE itemnum = '$temp'")
            		or die "Couldn't prepare statement: " . $dbh->errstr;
          		$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;

          		if ($sth->rows == 0) {
            		die "商品 number not found: " . $sth->errstr;
          		} else {
			### カート金額を更新 ###
			$cartcost = $cartcost + $sth->fetchrow_array();
			}
		}

		### 初期CartIDクッキーを作成
		$cookievalue=join(":", ($sessid, $cartitems, $cartcost, @contents));
		$cartcookie=cookie( -name=>'CartID', -value=>$cookievalue, -path=>'/');
		print "Set-Cookie: $cartcookie\n";

	&home
	}
}

###############
# 注文する #
###############

sub order
{
	local (@data, $temp, @cookievalue, $price, $id, $items, $cost, $cartitems, $cartcookie, $ccard, $expdate);

	### CartIDクッキーを読み込む ###
	$temp=cookie('CartID');
	@cookievalue=split(":", ("$temp"));
	$id=shift(@cookievalue);
	$items=shift(@cookievalue);
	$cost=shift(@cookievalue);
	$price='$' . sprintf("%.2f", $cost);
	$cartitems=join(",", @cookievalue);
	$email=$query->param('email');

	### クッキーを期限切れにする ###
	$cartcookie=cookie( -name=>'CartID', -value=>'', -expires=>'-1d', -path=>'/');
	print "Set-Cookie: $cartcookie\n";

	### 隠しフィールドを取得 ###
	$ccard=$query->param('ccard');
	$expdate=$query->param('expdate');

	&printheaders;
	print @header,
	start_html("BadStore - 注文手続き"),
	h1("注文が完了しました"), hr, p;

	### カートが空かどうかを確認 ###
	if ($items < "1") {
		print h2("カートに商品がありません。"), p,
		"商品を選んで注文してください!", p;
	} else {

		### SQLデータベースへ接続 ###
		my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
			or die "Cannot connect: " . $DBI::errstr;

	### 注文済み商品を注文データベースに追加 ###
	$dbh->do("INSERT INTO orderdb (sessid, orderdate, ordertime, ordercost, orderitems, itemlist, accountid, ipaddr, cartpaid, ccard, expdate) VALUES ('$id', CURDATE(), CURTIME(), '$price', '$items', '$cartitems', '$email', '$ipaddr', 'Y', '$ccard', '$expdate')")
	or die "Couldn't prepare SQL statement for order: " . $dbh->errstr;

		print h2("次の商品を購入しました:"), p;

		### SQLクエリを準備して実行 ###
		my $sth = $dbh->prepare( "SELECT itemnum, sdesc, ldesc, price FROM itemdb WHERE itemnum IN ($cartitems)")
           		or die "Couldn't prepare statement: " . $dbh->errstr;
     		$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;
     		if ($sth->rows == 0) {
           		die "商品 number not found: " . $sth->errstr;
     		} else {
		### 一致したレコードを読み込んで出力 ###
		print "<TABLE BORDER=1>",
		Tr( th('商品番号'),th('商品'),th('説明'),th('価格'),th('画像'));
          	while (@data = $sth->fetchrow_array()) {
			$image='/images/' . $data[0] . '.jpg';
			print Tr( td( \@data ),td({-align=>CENTER},"<IMG SRC=$image>") );
			}
		print "</TABLE>\n\n", p,
		h3("購入内容:   $items 点、合計 $price"), p, "<Center><i>BadStoreをご利用いただきありがとうございます!</i></Center>";
		}
	### ステートメントハンドルを閉じる ###
	$sth->finish;

	### データベースから切断 ###
	$dbh->disconnect;
	}
	print	@footer,
	end_html();
}

##################
# 支払いを送信 #
##################

sub submitpayment
{
	local($stemp, @s_cookievalue, $email, $passwd, $fullname, $ccard, $expdate);

	### SSOidクッキーを読み込む ###
	$stemp=cookie('SSOid');
	$stemp=decode_base64($stemp);
	@s_cookievalue=split(":", ("$stemp"));
	$email=shift(@s_cookievalue);
	&printheaders;
	print @header, start_html(-title=>"BadStore - 注文手続き", -script=>{-language=>'JavaScript',-src=>'/cardvrfy.js'}),
	h1("BadStoreでご注文いただきありがとうございます!"), hr;

	print start_form( -action=>'/cgi-bin/badstore.cgi?action=order', -onSubmit=>'return DoCardvrfy(this);');

	### ログイン済みの場合はメールアドレスを入力し、歓迎メッセージを表示 ###
	if ($email eq '') {
	    	print "メールアドレス: ", textfield(-name=>'email', -size=>15, -maxlength=>40);
	} else {
		print "ようこそ、<b>$email</b> さん",
		hidden(-name=>'email', -default=>[$email]);
	}
   	print p,
    	"クレジットカード番号: ", textfield(-name=>'ccard', -size=>16, -maxlength=>16),"     有効期限: ",textfield(-name=>'expdate',-size=>4),p,p,hr,p,
      "<Center>BadStoreでは次のお支払い方法を利用できます",p,
	img{src=>'/images/visa.jpg'},"        ",img{src=>'/images/mastercard.jpg'},"        ",img{src=>'/images/discover.jpg'},"        ",img{src=>'/images/amex.jpg'},p,
 	submit(-name=>'subccard', -value=>'注文する'),
	end_form;

	print @footer, end_html();
}


########################
# 過去の注文を表示 #
########################

sub viewprevious
{
	local ($email, @data, $stemp, @s_cookievalue, $passwd, $fullname, $role);

	### SSOidクッキーを読み込む ###
	$stemp=cookie('SSOid');
	$stemp=decode_base64($stemp);
	@s_cookievalue=split(":", ("$stemp"));
	$email=shift(@s_cookievalue);
	$passwd=shift(@s_cookievalue);
	$fullname=shift(@s_cookievalue);
	$role=shift(@s_cookievalue);

	&printheaders;
	print @header,
	start_html("BadStore - 過去の注文を表示"),
	h1("これまでに次の注文を行いました:"), hr, p;

	if ($fullname eq '{未登録ユーザー}') {
		print h2('ログインしていません!'), p,
		"ブラウザの戻るボタンで戻り、ログインを選択してください。";
	} else {
		### SQLデータベースへ接続 ###
		my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
			or die "Cannot connect: " . $DBI::errstr;

		my $sth = $dbh->prepare( "SELECT orderdate, ordercost, orderitems, itemlist, ccard FROM orderdb WHERE accountid = '$email' ORDER BY orderdate,ordertime")
                or die "Couldn't prepare statement: " . $dbh->errstr;
        	$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;

     		if ($sth->rows == 0) {
		print h2('過去の注文はありません!'), p,
		"ブラウザの戻るボタンで戻り、ログインを選択してください。";
     		} else {

		print "<TABLE BORDER=1>",
		Tr( th('注文日'),th('注文金額'),th('商品数'),th('商品リスト'),th('使用カード'));
          	while (@data = $sth->fetchrow_array()) {
			$data[4]=~ s/(\d\d\d\d)[\ \s]?/$1 /g;
			$data[4]=~ s/ $//;			
			print Tr( td( \@data ));
			}
		print "</TABLE>\n\n", p,
		"<Center><i>BadStoreをご利用いただきありがとうございます!</i></Center>";
		}

	### ステートメントハンドルを閉じる ###
	$sth->finish;

	### データベースから切断 ###
	$dbh->disconnect;
	}
	print	@footer,
	end_html();
}

############
# 会社概要 #
############

sub aboutus
{
	&printheaders;
	print @header,
	start_html('BadStore - 私たちについて'),
	h2("私たちについて!"), hr, p,
	img{src=>'/images/seal.jpg', align=>'RIGHT'},
	p, "皆さまのご意見を大切にしています。ここをクリックしてご意見をお聞かせください!  ", p,
	a({-href=>'mailto:spam@badstore.net'}, 'メールを送る!'), " 件名を 'Howdy' にして、言いたいことを何でもお送りください",
	p,
	"私たちは小さなサイトかもしれませんが、皆さまのオンラインセキュリティを本当に大切にしています。そのため、数年ごとにSecurity Seal認証を受けています。Security Sealは非常に厳格な手続きで、当社のセキュリティプロセスを説明するために、ファイルキャビネットいっぱいの書類を作成しなければなりません。本当に大変な作業です。", p,
	@footer, end_html();
}

##################
# 取引先ログイン #
##################

sub supplierlogin
{
	&printheaders;
	print @header, start_html('BadStore - 取引先ポータルログイン'),
	h1("取引先の方はログインしてください:"), hr, p,
	start_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=supplierportal'),
	" メールアドレス:  ", textfield(-name=>'email', -size=>15, -maxlength=>40), p,
	" パスワード:  ", password_field(-name=>'passwd', -size=>8 -maxlength=>8),p,
	submit("ログイン"), end_form,
	@footer, end_html();
}

###################
# 取引先ポータル #
###################

sub supplierportal
{
	local($email, $passwd);
	$email=$query->param('email');
	$passwd=$query->param('passwd');
	chomp($email);
	chomp($passwd);
	$passwd=md5_hex($passwd);

	### SQLデータベースへ接続 ###
	my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
		or die "Cannot connect: " . $DBI::errstr;

	### SQLクエリを準備・評価して実行 ###
	my $sth = $dbh->prepare("SELECT * FROM userdb WHERE email='$email' AND passwd='$passwd' ");
	eval {
	     	$sth->execute();
		1;
	} or do {
		print "Location: /cgi-bin/badstore.cgi?action=supplierlogin\n\n";
	};

	&printheaders;
	print @header, start_html("BadStore 取引先ポータルへようこそ"),
	h1("取引先の方へようこそ"), hr;
     	
	if ($sth->rows == 0) {
           		print h2("ユーザーIDまたはパスワードが見つかりません!"),
			"ブラウザの戻るボタンで戻り、もう一度お試しください。";
     		} else {
		# ログイン認証情報は有効
		print h2("価格表をアップロード"), p, p, p, h3("ローカルシステム上のファイル名: "),
   		start_multipart_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=supupload', -enctype=>'multipart/form-data'),
    		filefield(-name=>'uploaded_file', -size=>50, -maxlength=>80), br, br,
		h3("BadStore上のファイル名: "), textfield(-name=>'newfilename', size=>25, -maxlength=>50),
  		submit('アップロード'), end_form;
		}
	print hr,h2("<B>近日公開 - Webサービス!</B>");
	### ステートメントハンドルを閉じる ###
	$sth->finish;

	### データベースから切断 ###
	$dbh->disconnect;
	print @footer, end_html();
}

###################
# 取引先アップロード #
###################

sub supupload
{
	(local $host);
	&printheaders;
	print @header, start_html("BadStore - 取引先アップロード");

	$referer  = $ENV{HTTP_REFERER};
	$host = $ENV{HTTP_HOST};

	### 取引先ポータルからの有効な参照元を確認
	if ($referer and $referer !~ m|^http://$hostname/| ) {

		print h1("ファイルをアップロード");

		$newfilename = $query->param('newfilename');
		$filename = $query->param('uploaded_file'); 
		$filename =~ s/.*[\/\\](.*)/$1/;
		chomp($filename); 
		$upload_filehandle = $query->upload('uploaded_file'); 
		open (OUT, ">../data/uploads/$newfilename") or die "Can't open $newfilename for appending: $!\n";
		while (<$upload_filehandle>) 
		{ 
			print OUT;
		}
		close OUT; 
		print p, h2("新しい価格ファイルをアップロードしていただきありがとうございます!"), p, 
		h3("ファイルがアップロードされました: $newfilename"), p,

	} else {
		### 無効な参照元 ###
		print h1("エラーが発生しました"),
		h3("アップロードは取引先ポータルで認証した場合のみ受け付けます!")
	}
	end_html();
}

######################
# カートの内容を表示 #
######################

sub cartview
{
	local (@data, $temp, @cookievalue, $price, $id, $items, $cost, $cartitems);

	&printheaders;
	print @header,
	start_html("BadStore - カートの内容を表示"),
	h1("買い物を続ける!"), hr, p;

	### CartIDクッキーを読み込む ###
	$temp=cookie('CartID');
	@cookievalue=split(":", ("$temp"));
	$id=shift(@cookievalue);
	$items=shift(@cookievalue);
	$cost=shift(@cookievalue);
	$price='$' . sprintf("%.2f", $cost);
	$cartitems=join(",", @cookievalue);

	### カートが空かどうかを確認 ###
	if ($items < "1") {
		print h2("カートに商品がありません。"), p,
		" 商品を選んで注文してください!", p;
	} else {

		### SQLデータベースへ接続 ###
		my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
			or die "Cannot connect: " . $DBI::errstr;

		print h2("カートには次の商品が入っています:"), p,
		h3("カートの内容:   $items 点、合計 $price"), p;

		### SQLクエリを準備して実行 ###
		my $sth = $dbh->prepare( "SELECT itemnum, sdesc, ldesc, price FROM itemdb WHERE itemnum IN ($cartitems)")
           		or die "Couldn't prepare statement: " . $dbh->errstr;
     		$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;
     		if ($sth->rows == 0) {
           		die "商品 number not found: " . $sth->errstr;
     		} else {
		### 一致したレコードを読み込んで出力 ###
		print start_form( -action=>'/cgi-bin/badstore.cgi?action=submitpayment'),"<TABLE BORDER=1>",
		Tr( th('商品番号'),th('商品'),th('説明'),th('価格'),th('画像'),th('注文'));
          	while (@data = $sth->fetchrow_array()) {
			$image='/images/' . $data[0] . '.jpg';
			print Tr( td( \@data ),td({-align=>CENTER},"<IMG SRC=$image>"),td({-align=>CENTER},"<INPUT type=checkbox checked name='cartitem' value=$data[0]>") );
			}
		print "</TABLE>\n\n", p, "<Center>", submit('注文する'), "   ", reset('リセット'), "</Center>", end_form;
		}
	### ステートメントハンドルを閉じる ###
	$sth->finish;

	### データベースから切断 ###
	$dbh->disconnect;
	}
	print	@footer,
	end_html();
}

#####################
### ヘッダーを出力 ###
#####################

sub printheaders
{
	print "Content-type: text/html; charset=UTF-8\n";
	print "Server: Apache/1.3.20 Sun Cobalt (Unix) mod_ssl/2.8.4 OpenSSL/0.9.6b PHP/4.0.6 mod_auth_pam_external/0.1 FrontPage/4.0.4.3 mod_perl/1.25\n";
	print "ETag: CPE1704TKS\n";
	print "Cache-Control: no-cache\n";
	print "Pragma: no-cache\n\n";
}

#####################
# ログインまたは登録 #
#####################

sub loginregister
{
	&printheaders;
	print @header, start_html('BadStore - 登録/ログイン'),
	h2("アカウントにログイン、または新規登録"), hr, p,
	h3("アカウントにログイン"),
	start_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=login'),
	"メールアドレス:  ", textfield(-name=>'email', -size=>20, -maxlength=>40), p,
	"パスワード:  ", password_field(-name=>'passwd', -size=>8 -maxlength=>8),p,
	submit("ログイン"), end_form, hr, p,
	h3("新規アカウント登録"),
	start_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=register'),
	"氏名:  ", textfield(-name=>'fullname', -size=>25, -maxlength=>40), p,
	"メールアドレス:  ", textfield(-name=>'email', -size=>20, -maxlength=>40), p,
	"パスワード:  ", password_field(-name=>'passwd', -size=>8 -maxlength=>8),p,
	"パスワードヒント - 好きな色は何ですか?:  ",popup_menu(-name=>'pwdhint',-values=>['green','blue','red','orange','purple','yellow'],-labels=>\%color_labels),p,
	"<font face=Arial size=2><i>(パスワードヒントは、忘れたパスワードを復旧するためのセキュリティ対策として使用されます。現在のパスワードを忘れた場合、アカウントにアクセスするにはメールアドレスとこのヒントの両方が必要です。)</i></font>",p,
	hidden(-name=>'role', -default=>['U']),
	submit("登録"), end_form, p,
	@footer, end_html();
}

##############
# マイアカウント #
##############

sub myaccount
{
	local($aquery, $email, $passwd, $pwdhint, $fullname, $role, $newpasswd, $vnewpasswd, $encpasswd);
 
	### SSOidクッキーを読み込む ###
	$stemp=cookie('SSOid');
	$stemp=decode_base64($stemp);
	@s_cookievalue=split(":", ("$stemp"));
	$email=shift(@s_cookievalue);
	$passwd=shift(@s_cookievalue);
	$fullname=shift(@s_cookievalue);
	$role=shift(@s_cookievalue);

	&printheaders;
	print @header, start_html(-title=>'BadStore - マイアカウントサービス',-script=>{language=>'JavaScript',-src=>'/frmvrfy.js'});

	if ($fullname eq '') {
		$fullname="{未登録ユーザー}";
		print h2(' ようこそ、',$fullname,' として次の操作ができます:'),p,
		"アカウントにログイン / 新規アカウント登録 - <A HREF='/cgi-bin/badstore.cgi?action=loginregister'>こちらをクリック</A><BR>", p,
		" パスワードをリセットする", p,
		start_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=moduser'),
		"<font face=Arial size=2> アカウント作成時に選択したメールアドレスとパスワードヒントを入力してください:</font>",p,
		" メールアドレス:  ", textfield(-name=>'email', -size=>15),p,
		" パスワードヒント - 好きな色は何ですか?:  ",popup_menu(-name=>'pwdhint',-values=>['green','blue','red','orange','purple','yellow'],-labels=>\%color_labels),p,
		"<font face=Arial size=2><i> (パスワードヒントは、忘れたパスワードを復旧するためのセキュリティ対策として、新規登録時に選択したものです...)</i></font>",p,
		submit(-name=>'DoMods',-value=>'ユーザーパスワードをリセット'), end_form;

	} else {
		print h2(" ようこそ、",$fullname), hr, p,
		"<B> アカウント情報を更新: </B>",p,p,
		start_form(-method=>'POST', -action=>'/cgi-bin/badstore.cgi?action=moduser', -onSubmit=>'return DoPwdvrfy(this);'),
		" 現在の氏名:  ", $fullname,p,
		" 新しい氏名 =  ",textfield(-name=>'fullname', -size=>25, -maxlength=>40),p,br,
		" 現在のメールアドレス:  ", $email,p,
		" 新しいメールアドレス =  ",textfield(-name=>'newemail', -size=>20, -maxlength=>40),p,br,
		" パスワード変更:  ", password_field(-name=>'newpasswd', -size=>8 -maxlength=>8),"  確認:  ", password_field(-name=>'vnewpasswd', -size=>8 -maxlength=>8),p,br,
		hidden(-name=>'role', -default=>[$role]),
		hidden(-name=>'email',-default=>[$email]),
		submit(-name=>'DoMods',-value=>'アカウントを変更'), end_form, p;
	}
	print @footer, end_html();
}

##########################
# ユーザー属性を変更 #
##########################

sub moduser
{
	local($aquery, $email, $passwd, $pwdhint, $fullname, $role, $newpasswd, $encpasswd, $vnewpasswd, $newemail);
	$aquery=$query->param('DoMods');
	my %mod_action_map = (
		'ユーザーパスワードをリセット' => 'Reset User Password',
		'ユーザーを追加' => 'Add User',
		'ユーザーを削除' => 'Delete User',
		'アカウントを変更' => 'Change Account'
	);
	$aquery = $mod_action_map{$aquery} if exists $mod_action_map{$aquery};
	$email=$query->param('email');
	$passwd=$query->param('passwd');
	$pwdhint=$query->param('pwdhint');
	$fullname=$query->param('fullname');
	$role=$query->param('role');
	$vnewpasswd=$query->param('vnewpasswd');
	$newemail=$query->param('newemail');
	chomp($email);
	chomp($passwd);
	chomp($pwdhint);
	chomp($fullname);
	chomp($role);
	$newpasswd="Welcome";
	$encpasswd=md5_hex($newpasswd);
	$vencpasswd=md5_hex($vnewpasswd);
	&printheaders;

	### SQLデータベースへ接続 ###
	my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
		or die "Cannot connect: " . $DBI::errstr;

	### ユーザーパスワードをリセット ###
	if ($aquery eq 'Reset User Password') {
		print @header, start_html('BadStore - ユーザーパスワードをリセット');
		### SQLクエリを準備して実行 ###
		my $sth=$dbh->prepare("UPDATE userdb SET passwd = '$encpasswd' WHERE email='$email'")
			or die "Could not update password: ".$dbh->errstr;
		$sth->execute() or die "Couldn't execute SQL statement: ".$sth->errstr;
	
		print h2('ユーザーのパスワード:  ', $email,p, ' ...は次にリセットされました: ',$newpasswd),

	}elsif ($aquery eq 'Add User'){
		print @header, start_html('BadStore - ユーザーを追加');
		$dbh->do("INSERT INTO userdb (email, passwd, pwdhint, fullname, role) VALUES ('$email','$encpasswd','$pwdhint', '$fullname', '$role')")
			or die "Couldn't prepare SQL statement for Registration: " . $dbh->errstr;
		print h2("ユーザー:  ",$fullname," が追加されました。");

	}elsif ($aquery eq 'Delete User'){
		print @header, start_html('BadStore - ユーザーを削除');
		$dbh->do("DELETE FROM userdb WHERE email='$email'")
			or die "Couldn't prepare SQL statement for Registration: " . $dbh->errstr;
		print h2("ユーザー:  ",$email," が削除されました。");

	### アカウント情報を変更 ###
	}elsif ($aquery eq 'Change Account'){
		print @header, start_html('BadStore - ユーザー情報を更新');
		$dbh->do("UPDATE userdb SET fullname='$fullname' WHERE email='$email'")
			or die "Couldn't prepare SQL statement: " .$dbh->errstr;
		$dbh->do("UPDATE userdb SET passwd='$vencpasswd' WHERE email='$email'")
			or die "Couldn't prepare SQL statement: " .$dbh->errstr;
		$dbh->do("UPDATE userdb SET email='$newemail' WHERE email='$email'")
			or die "Couldn't prepare SQL statement: " .$dbh->errstr;
		print h2(" アカウント情報: "),
		" 氏名: ",$fullname,p," メール: ",$newemail,p," パスワード: ",$vnewpasswd,p,
		h3(" 更新されました!");
	}
	print @footer, end_html();

	### データベースから切断 ###
	$dbh->disconnect;
}

#############
# ユーザー認証 #
#############

sub authuser
{
	local(@data, $email, $passwd, $pwdhint,$fullname, $role);
	$email=$query->param('email');
	$passwd=$query->param('passwd');
	$pwdhint=$query->param('pwdhint');
	$fullname=$query->param('fullname');
	$role=$query->param('role');
	chomp($email);
	chomp($passwd);
	chomp($pwdhint);
	chomp($fullname);
	chomp($role);
	$passwd=md5_hex($passwd);

	### SQLデータベースへ接続 ###
	my $dbh = DBI->connect("DBI:mysql:database=badstoredb;host=localhost", "baduser", "secret",{'RaiseError' => 1})
		or die "Cannot connect: " . $DBI::errstr;

	### 既存アカウントにログイン ###
	if ($query->url_param('action') eq 'login') {

		### 認証情報を確認するSQLクエリを準備して実行 ###
		my $sth = $dbh->prepare("SELECT * FROM userdb WHERE email='$email' AND passwd='$passwd'")
      		or die "Couldn't prepare statement: " . $dbh->errstr;
     		$sth->execute() or die "Couldn't execute SQL statement: " . $sth->errstr;

		if ($sth->rows == 0) {
			&printheaders;
			print @header,
			start_html("BadStore - ログインエラー"),
           		h2("ユーザーIDまたはパスワードが見つかりません!"),
			"ブラウザの戻るボタンで戻り、もう一度お試しください。",
			@footer, end_html();
			exit;
     		} else {
		### ログイン認証情報は有効 ###

		@data=$sth->fetchrow_array();
		$fullname=$data[3];
		$role=$data[4];

		### ステートメントハンドルを閉じる ###
		$sth->finish;
		}
	} else {

		### 通常ユーザーとして新規アカウントを登録 ###
		### 注文済み商品を注文データベースに追加 ###
		$dbh->do("INSERT INTO userdb (email, passwd, pwdhint, fullname, role) VALUES ('$email', '$passwd','$pwdhint', '$fullname', '$role')")
			or die "Couldn't prepare SQL statement for Registration: " . $dbh->errstr;
	}

	### SSOクッキーを設定 ###
		$cookievalue=join(":", ($email, $passwd, $fullname, $role));
		$cookievalue=encode_base64($cookievalue);
		$cartcookie=cookie( -name=>'SSOid', -value=>$cookievalue, -path=>'/');
		print "Set-Cookie: $cartcookie\n";

	### データベースから切断 ###
	$dbh->disconnect;
	&home;
}
