#!/usr/local/bin/perl # ========================================================================= # # /////apeboard+ for webmaster Ver.2.0 (Shift_JIS)///// # # Copyright (C) 2001,by 2apes.com # All rights reserved # http://www.2apes.com # ========================================================================= # 必要なファイルのパス指定 ------------------------------------------------ require './jcode.pl'; require './boardini.cgi'; require './skinini.cgi'; # 設定終了 ---------------------------------------------------------------- # ------------------------------------------------------------------------- # 基本処理 # ------------------------------------------------------------------------- form_decord(); get_cookie($mt_cookiename); $ck_pwd = $cookie{'pwd'}; $command = $FORMDATA{'command'}; $tgtid = $FORMDATA{'target'}; $pwd = $FORMDATA{'pwd'}; $msgnum = $FORMDATA{'msgnum'}; $old_pwd = $FORMDATA{'old_pwd'}; $new_pwd = $FORMDATA{'new_pwd'}; $cknew_pwd=$FORMDATA{'cknew_pwd'}; if ($msgnum eq ''){ $msgnum = 0; } if ($command eq 'read' || $command eq 'f_read'){ read_mes_res(); } elsif ($command eq 'res_mes'){ res_message(); read_mes_res(); } elsif ($command eq 'remove'){ remove_message(); read_mes_res(); } elsif ($command eq 'cg_mtpwd'){ shw_chpwd(); } elsif ($command eq 'cg_and_ck'){ check_change(); mt_login(); } else { mt_login(); } exit(0); # ------------------------------------------------------------------------- # フォームデータをデコードするためのサブルーチン # # @version 2.0 # ------------------------------------------------------------------------- sub form_decord { my($query,@queries,$key,$value); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query= $ENV{'QUERY_STRING'}; } @queries = split(/&/, $query); foreach (@queries) { ($key, $value) = split(/=/); $value =~ tr/+/ /; $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C", hex($1))/eg; $value =~ s/\r\n/\r/g; $value =~ s/\n/\r/g; $value =~ s/ \r \r//g; $value =~ s/\ \r\ \r//g; $value =~ s/ \r/\r/g; $value =~ s/\ \r/\r/g; $value =~ s/\r\r\r\r//g; $value =~ s/&/&/g; $value =~ s//>/g; $value =~ s/,/\0/g; if ($tagset eq 'off') { $value =~ s/"/"/g; } # jcode.pl による文字コードの変換 ------------------------------- &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); # ハッシュに格納 ------------------------------------------------ if ($key eq 'target'){ push(@RM, $value); } else { $FORMDATA{$key} = $value; } } } # ------------------------------------------------------------------------- # レス用のメッセージ入力画面の表示 # # @version 2.0 # ------------------------------------------------------------------------- sub read_mes_res { # データファイルを読み込む -------------------------------------- lock_open(TXT, "+<$datafile"); @txt = ; unlock_close(TXT); ($encoded_pass) = splice(@txt, 0, 1); chop($encoded_pass); if ($command ne 'f_read') { if ($is_tok2 eq '') { get_cookie($mt_cookiename); $pwd = $cookie{'pwd'}; } } if ($encoded_pass eq '' || mismatch_password($pwd, $encoded_pass)) { print_error("パスワードが不適切、もしくは正しく設定されていません。"); } # データの数を調べる -------------------------------------------- $volume = scalar(@txt); # 表示範囲の設定 ------------------------------------------------ $msgstart = $msgnum; if ($msgstart < 0) { $msgstart = 0; } $msgend = $msgnum + $data_out; if ($msgend > $volume) { $msgend = $volume; } # 画面に表示する前の設定 ---------------------------------------- if ($command eq 'f_read') { undef %cookie; $cookie{'pwd'} = $pwd; print_cookie($mt_cookiename, 1); } print "Content-type: text/html; charset=Shift_JIS\n\n"; # ヘッダ部分の作成と変換 ---------------------------------------- print "\n"; print "\n"; print "\n"; print "For Webmaster\n"; print "\n"; print "\n"; print "
\n"; print " 
\n"; print "For Webmaster
\n"; print "
\n"; print "ここは管理者用のページです。
管理者以外のアクセスを禁止します。
\n"; print "
\n"; print "
\n"; print "管理用ページを終了する。

\n"; # 投稿の表示 ---------------------------------------------------- for ($i = $msgstart; $i < $msgend; $i++) { ($dispid,$dispname,$dispicon,$dispmail,$dispurl,$dispdate,$disppwd,$dispsubject,$dispmsg,$disphost,$dispres) = split(/,/, $txt[$i]); $dispname =~ s/\0/,/g; $dispicon =~ s/\0/,/g; $dispmail =~ s/\0/,/g; $dispurl =~ s/\0/,/g; $disppwd =~ s/\0/,/g; $dispsubject =~ s/\0/,/g; $dispmsg =~ s/\0/,/g; $disphost=~ s/\0/,/g; $dispres =~ s/\0/,/g; chomp($dispres); $dat_tmp = $dateline; ($d_year,$d_mon,$d_day,$d_weekstr,$d_hour,$d_min) = split(/&/, $dispdate); if ($addzero_md eq 'on') { if ($d_mon < 10) { $d_mon = "0$d_mon"; } if ($d_day <10) { $d_day = "0$d_day"; } if ($d_hour < 10) { $d_hour = "0$d_hour"; } if ($d_min < 10) { $d_min = "0$d_min"; } } $dat_tmp =~ s/year/$d_year/i; $dat_tmp =~ s/month/$d_mon/i; $dat_tmp =~ s/day/$d_day/i; $dat_tmp =~ s/week/$d_weekstr/i; $dat_tmp =~ s/hour/$d_hour/i; $dat_tmp =~ s/minute/$d_min/i; # 名前にメールアドレスのリンクをはる ---------------------------- if($dispmail ne '') { $dispname = '' . $dispname . ''; } # URLにリンクをはる --------------------------------------------- if($dispurl ne '') { $dispurl = '- ' . Website . ''; } # メイン部分の作成(親部分) ------------------------------------ print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "[$dispid] $dispsubject 
内容\n"; print "<$dat_tmp>[$disphost]
\n"; print "$dispsubject by $dispname $dispurl
\n"; print "

$dispmsg

\n"; print "\n"; # メイン部分の作成(子部分) ------------------ open(RES, $res_file) || print_error('レスファイルが開けません。'); $reshtml = join('',); close(RES); @part_res = split(/:&:/, $dispres); $res_volume = scalar(@part_res); for ($j = 0; $j < $res_volume; $j++) { ($dresnum,$dresname,$dresicon,$dresmail,$dresurl,$dresdate,$drespwd,$dressubject,$dresmsg,$dreshost) = split(/<>/, $part_res[$j]); $res_dat_tmp = $dateline; ($dres_year,$dres_mon,$dres_day,$dres_weekstr,$dres_hour,$dres_min) = split(/&/, $dresdate); if ($addzero_md eq 'on') { if ($dres_mon < 10) { $dres_mon = "0$dres_mon"; } if ($dres_day <10) { $dres_day = "0$dres_day"; } } if($addzero_hm eq 'on') { if ($dres_hour < 10) { $dres_hour = "0$dres_hour"; } if ($dres_min < 10) { $dres_min = "0$dres_min"; } } $res_dat_tmp =~ s/year/$dres_year/i; $res_dat_tmp =~ s/month/$dres_mon/i; $res_dat_tmp =~ s/day/$dres_day/i; $res_dat_tmp =~ s/week/$dres_weekstr/i; $res_dat_tmp =~ s/hour/$dres_hour/i; $res_dat_tmp =~ s/minute/$dres_min/i; # 名前にメールアドレスのリンクをはる ---------------------------- if($dresmail ne '') { $dresname = '' . $dresname . ''; }; # URLにリンクをはる --------------------------------------------- if($dresurl ne '') { $dresurl = '- ' . Website . ''; } print "
\n"; print " <$res_dat_tmp>[$dreshost]-削除用
\n"; print " $dressubject by $dresname $dresurl
\n"; print "
\n"; print "

$dresmsg

\n"; print "
\n"; } if ($reshtml =~ /ressubject/i){ print "
題名\n"; print "\n"; } print "
レス\n"; print "\n"; print "

\n"; } # フッタの作成と文字列の変換 ------------------------------------ $nextmsg = $msgend ; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; if ($is_tok2 ne '') { print "Password :\n" } print "\n"; print "\n"; print "
\n"; print "
\n"; print ""; print "\n"; print "\n"; if ($data_out + $msgnum + 1 > $volume) { print "\n"; print "
< TopLog \n"; } else { print "OldLog >\n"; } print "
\n"; print "
\n"; print "

 

\n"; print "\n"; print "\n"; exit(0); } # ------------------------------------------------------------------------- # レスをデータファイルに書き込むサブルーチン # ------------------------------------------------------------------------- sub res_message { if (!@RM) { print_error('メッセージが指定されていません。
チェックボックスを確認して下さい。'); } # データファイルを読み込む -------------------------------------- if ($is_tok2 eq '') { get_cookie($mt_cookiename); $ck_pwd = $cookie{'pwd'}; } else { $ck_pwd = $pwd; } lock_open(TXT, "+<$datafile"); @txt = ; ($encoded_pass) = splice(@txt, 0, 1); chop($encoded_pass); if (mismatch_password($ck_pwd, $encoded_pass)) { unlock_close(TXT); print_error("パスワードの有効期間が過ぎています。
再度ログインして下さい。"); } # レスの対象となる投稿を決定 ------------------------------------ @tmp = @RM; foreach $tgtid(@tmp){ if ($tgtid =~ /_/i){ print_error("レスを付ける際は親記事のみチェックして下さい。"); } $index = find_msg(); if ($index < 0) { unlock_close(TXT); print_error("そのメッセージは存在しません。"); } ($dispid,$dispname,$dispicon,$dispmail,$dispurl,$dispdate,$disppwd,$dispsubject,$dispmsg,$disphost,$dispres) = split(/,/, $txt[$index]); chomp($dispres); # レスのデータを整える ------------------------------------------ $respnum = 'resp' . "$dispid"; $subjnum = 'subject' . "$dispid"; $resp = $FORMDATA{"$respnum"}; $r_subj=$FORMDATA{"$subjnum"}; $resp =~ s/\r/
/g; # タグの使用不可の場合(URL にリンクをはる) -------------------- if ($tagset eq 'off') { if ($autolink ne '') { $resp =~ s/(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/$autolink<\/a>/ig; } else { $resp =~ s/(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/$1<\/a>/ig; } } # タグの使用可の場合の各処理 ------------------------------------ if ($tagset eq 'on') { $resp =~ s/(<[^&]*)
([^&]*>)/$1$2/gi; if ($tagimg eq 'on') { $resp =~ s/(<(img([^&]+))>)/$1/gi; } $resp .= "
" x ( ($resp =~ s/(<(a href=([^&]+))>)//gi) - ($resp =~ s/<\/a>/<\/a>/gi) ); if ($tagfnt eq 'on') { $resp .= "" x ( ($resp =~ s/(<(font([^&]*))>)//gi) - ($resp =~ s/<\/font>/<\/font>/gi) ); } $resp .= "" x ( ($resp =~ s/<b>//gi) - ($resp =~ s/<\/b>/<\/b>/gi) ); $resp .= "" x ( ($resp =~ s/<i>//gi) - ($resp =~ s/<\/i>/<\/i>/gi) ); $resp =~ s/("[^ "<>]+)>/$1">/gi; } # 作業の分岐 ---------------------------------------------------- @part_res = split(/:&:/, $dispres); # 日付の取得 ---------------------------------------------------- $datestr = get_date_string(); # 記事番号の設定 ------------------------------------------------ $id = 1; for ($i = 0; $i < @part_res; $i++) { ($thisid) = split(/<>/, $part_res[$i]); ($pnum,$cnum) = split(/_/,$thisid); if ($cnum >= $id) { $id = $cnum + 1; } } $id = "$dispid" . '_' . "$id"; # host 情報の取得 ----------------------------------------------- $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } # 書き込む情報の整列 -------------------------------------------- $encpwd = encode_pwd($ck_pwd); $oneline = "$dispid,$dispname,$dispicon,$dispmail,$dispurl,$dispdate,$disppwd,$dispsubject,$dispmsg,$disphost,$dispres$id<>$master_name<>master<>$admin<>$indexurl<>$datestr<>$encpwd<>$r_subj<>$resp<>$host:&:\n"; if ($res_sort eq 'on'){ splice(@txt, $index, 1); seek(TXT, 0, 0); print TXT "$encoded_pass\n"; unshift(@txt, $oneline); } else { splice(@txt, $index, 1, $oneline); seek(TXT, 0, 0); print TXT "$encoded_pass\n"; } } print TXT @txt; unlock_close(TXT); } # ------------------------------------------------------------------------- # メッセージを削除するサブルーチン # ------------------------------------------------------------------------- sub remove_message { if (!@RM) { print_error('メッセージが指定されていません。
チェックボックスを確認して下さい。'); } if ($is_tok2 eq '') { get_cookie($mt_cookiename); $ck_pwd = $cookie{'pwd'}; } else { $ck_pwd = $pwd; } lock_open(TXT, "+<$datafile"); @txt = ; ($encoded_pass) = splice(@txt, 0, 1); chop($encoded_pass); if (mismatch_password($ck_pwd, $encoded_pass)) { unlock_close(TXT); print_error("パスワードの有効期間が過ぎています。
再度ログインして下さい。"); } @tmp = @RM; foreach $tgtid(@tmp){ if ($tgtid =~ m/\d+_\d+/) { ($pnum,$cnum) = split (/_/, $tgtid); $tgtid = $pnum; } $index = find_msg(); if ($index < 0) { unlock_close(TXT); print_error("そのメッセージは存在しません。"); } ($dispid,$dispname,$dispicon,$dispmail,$dispurl,$dispdate,$disppwd,$dispsubject,$dispmsg,$disphost,$dispres) = split(/,/, $txt[$index]); if ($cnum) { $tgtrsid = "$tgtid" . '_' ."$cnum"; chomp($dispres); @part_res = split(/:&:/, $dispres); for ($i = 0; $i < @part_res; $i++) { ($dresnum,$dresname,$dresicon,$dresmail,$dresurl,$dresdate,$drespwd,$dressubject,$dresmsg,$dreshost) = split(/<>/, $part_res[$i]); if ($tgtrsid eq $dresnum) { splice(@part_res, $i, 1); $dispres = join(':&:',@part_res); $oneline = "$dispid,$dispname,$dispicon,$dispmail,$dispurl,$dispdate,$disppwd,$dispsubject,$dispmsg,$disphost,$dispres:&:\n"; $oneline =~ s/,:&:/,/i; splice(@txt, $index, 1, $oneline); last; } } } else { splice(@txt, $index, 1); } } unshift(@txt, ("$encoded_pass\n")); seek(TXT, 0, 0); print TXT @txt; truncate(TXT, tell(TXT)); unlock_close(TXT); } # ------------------------------------------------------------------------- # 管理者用パスワード入力画面の表示 # # @version 1.0 # ------------------------------------------------------------------------- sub mt_login { print "Content-type: text/html; charset=Shift_JIS\n"; print "\n"; print "\n"; print "\n"; print "apeboard for webmaster\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "For Webmaster only!

\n"; print "管理者用パスワードを入力して下さい。

\n"; print "  "; print "\n"; print "
"; print "


\n"; print "
\n"; print "\n"; print "\n"; exit(0); } # ------------------------------------------------------------------------- # 管理者用パスワード変更画面の表示 # # @version 1.0 # ------------------------------------------------------------------------- sub shw_chpwd { print "Content-type: text/html; charset=Shift_JIS\n"; print "\n"; print "\n"; print "\n"; print "apeboard for webmaster\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "For Webmaster only!

\n"; print "パスワードは半角英数 4 文字以上で指定

\n"; print "現在の管理者用パスワード:\n"; print "

"; print "新しい管理者用パスワード:\n"; print "

"; print "確認用にもう一度

\n"; print "新しい管理者用パスワード:\n"; print "

"; print "\n"; print "
"; print "


\n"; print "
\n"; print "\n"; print "\n"; exit(0); } # ------------------------------------------------------------------------- # 管理者用パスワードのチェックと変更 # # @version 1.0 # ------------------------------------------------------------------------- sub check_change { lock_open(TXT, "+<$datafile"); @txt = ; ($encoded_pass) = splice(@txt, 0, 1); chop($encoded_pass); if ($encoded_pass eq '' || mismatch_password($old_pwd, $encoded_pass)) { unlock_close(TXT); print_error("現在のパスワードが不適切、もしくは正しく設定されていません。"); } if ($new_pwd ne $cknew_pwd) { unlock_close(TXT); print_error('新しいパスワードが確認用に入力されたものと一致しません。'); } if ($new_pwd eq '' || length($new_pwd) < 4) { unlock_close(TXT); print_error('パスワードが入力されていないか、短すぎます。'); } $encmaster = &encode_pwd($new_pwd); seek(TXT, 0, 0); print TXT "$encmaster\n"; unlock_close(TXT); print "Content-type: text/html; charset=Shift_JIS\n"; print "\n"; print "\n"; print "\n"; print "- 変更完了 -\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "Password has changed.

\n"; print "管理者用パスワードを変更しました。
\n"; print "新しいパスワードで再ログインして下さい。

\n"; print "  "; print "\n"; print "
"; print "


\n"; print "
\n"; print "\n"; print "\n"; exit(0); } # ------------------------------------------------------------------------- # メッセージを探すサブルーチン # # @return 見つからなかった場合は、-1 # @version 2.0 # ------------------------------------------------------------------------- sub find_msg { my($i, $foundindex, $dispid); $foundindex = -1; for ($i = 0; $i < @txt; $i++) { ($dispid) = split(/,/, $txt[$i]); if ($tgtid == $dispid) { $foundindex = $i; last; } } return $foundindex; } # ------------------------------------------------------------------------- # 現在日時を得るサブルーチン # # @version 2.0 # ------------------------------------------------------------------------- sub get_date_string { my(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); my($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); $year += 1900; $mon++; $weekstr = $week[$weekday]; return "$year&$mon&$day&$weekstr&$hour&$min"; } # ------------------------------------------------------------------------- # ファイルロックのサブルーチン # # @param *FILE ファイルハンドラ # @param $lk_name ファイル名 # @version 2.0 # ------------------------------------------------------------------------- sub lock_open { local(*FILE, $lk_name) = @_; if (!open(FILE, $lk_name)) { print_error("$lk_nameが開けませんでした。"); } if ($lock) { eval("flock(FILE, 2)"); # 2=LOCK_EX if ($@) { print_error("この環境ではロックは使えません。boardini.cgi を \$lock = 0 と変更してください。"); } } seek(FILE, 0, 0); } # ------------------------------------------------------------------------- # ファイルアンロックのサブルーチン # # @param *FILE ファイルハンドラ # @version 2.0 # ------------------------------------------------------------------------- sub unlock_close { local(*FILE) = @_; if ($lock) { eval("flock(FILE, 8)"); # 8=LOCK_UN } close(FILE); } # ------------------------------------------------------------------------- # パスワード暗号化のサブルーチン # # @return 暗号化されたパスワード # @see #write_message() # @see #set_mtpassword() # @version 2.0 # ------------------------------------------------------------------------- sub encode_pwd { my($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); my(@token) = ('0'..'9', 'A'..'Z', 'a'..'z'); my($pass) = @_; my($encpass, $salt1, $salt2); $salt1 = $token[(time | $$) % scalar(@token)]; $salt2 = $token[($sec + $min*60 + $hour*60*60) % scalar(@token)]; $encpass = crypt($pass, "$salt1$salt2"); return $encpass; } # ------------------------------------------------------------------------- # パスワードの照合 # # @param $pass 平文のパスワード # @param $encodedpass 暗号化されたパスワード # @return 一致した場合は 0, そうでない場合は 1 # @version 2.0 # ------------------------------------------------------------------------- sub mismatch_password { my($pass, $encodedpass) = @_; if ($encodedpass ne crypt($pass, $encodedpass)) { return 1; } else { return 0; } } # ------------------------------------------------------------------------- # クッキー取得のサブルーチン # # @param $cookiename クッキー名 # @version 2.0 # ------------------------------------------------------------------------- sub get_cookie { my($cookiename) = @_; my($key, $value, @pairs, $pair); @sqpairs = split(/;\s/, $ENV{'HTTP_COOKIE'}); foreach $sqpair (@sqpairs) { ($sqkey, $sqvalue) = split(/=/, $sqpair); if ($sqkey eq $cookiename) { $sqvalue =~ s/:/; /g; $sqvalue =~ s/_/=/g; @pairs = split(/;\s/, $sqvalue); foreach $pair (@pairs) { ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; $cookie{$key} = $value; } last; } } } # ------------------------------------------------------------------------- # クッキーを作るサブルーチン # # @param $cookiename クッキー名 # @return セットするクッキー # @see #print_cookie # @version 2.0 # ------------------------------------------------------------------------- sub make_cookie { my($cookiename) = @_; my(@sqcookie, $sqstr); my($encode) = '\%\+\;\,\=\&\_\:'; while (($key, $value) = each %cookie) { $key =~ s/([$encode])/'%'.unpack("H2", $1)/eg; $value =~ s/([$encode])/'%'.unpack("H2", $1)/eg; $key =~ s/\s/\+/g; $value =~ s/\s/\+/g; push(@sqcookie, "${key}_${value}"); } $sqstr = join(':', @sqcookie); return "$cookiename=$sqstr; "; } # ------------------------------------------------------------------------- # クッキーの有効期限設定のサブルーチン # # @param $days クッキーの有効日数 # @return クッキーの有効期限 # @see #print_cookie # @version 2.0 # ------------------------------------------------------------------------- sub get_expire_date_string { my($days) = @_; my(@month) = ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ); my(@week) = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ); my($sec, $min, $hour, $day, $mon, $year, $weekday) = gmtime(time + $days * 24 * 60 * 60); my($expiredate); $year += 1900; # 文字列化する_________________________________________________ if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $weekstr = $week[$weekday]; $monstr = $month[$mon]; $expiredate = "$weekstr, $day-$monstr-$year $hour:$min:$sec GMT"; return $expiredate; } # ------------------------------------------------------------------------- # クッキー表示のサブルーチン # # @param $cookiename クッキー名 # @param $days クッキーの有効日数 # @see #read_message() # @version 2.0 # ------------------------------------------------------------------------- sub print_cookie { my($cookiename, $days) = @_; my($cookiestr) = make_cookie($cookiename); my($expdate) = get_expire_date_string($days); print "Set-Cookie: $cookiestr;"; print " expires=$expdate;"; print "\n"; } # ------------------------------------------------------------------------- # エラー表示のサブルーチン # # @param $msg エラーメッセージ # @version 2.0 # ------------------------------------------------------------------------- sub print_error { my($msg) = @_; print "Content-type: text/html; charset=Shift_JIS\n"; print "\n"; print "\n"; print "\n"; print "$msg\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "

$msg


\n"; print "ブラウザの「戻る」でお戻り下さい。

"; print "Go To TopPage\n"; print "


\n"; print "
\n"; print "\n"; print "\n"; exit(0); } # End of Script