#!/usr/local/bin/perl # ライブラリの読み込み require '../perl/cgi-lib.pl'; require '../perl/jcode.pl'; # バージョン $version = '0.70'; # CGIの名前 $cginame = 'guest.cgi'; # トップの場所+名前(このcgiからの相対パス) $toppage = '../../index.html'; # ゲストブックの場所+名前(このcgiからの相対パス) $guestbook = '../../guestbook/guest.html'; # ゲストブックの記憶場所(このcgiからの相対パス) # ゲストブックの形態(一行で) # (タイトル)%!%年%!%月%!%日%!%時%!%分%!%曜日%!%名前%!% # (メール)%!%(ホームページ)%!%(コメント)%!%(自分のコメント)%!% # $filename = 'guest.txt'; # げすとぶっく長さ $loglength = 300; # ID,パスワード配列(crypt.cgi より取得) # (注意:暗号化はしてますが、セキュリティーは完全ではありません # 自分のPC等のログインパスワードや簡単な単語などは使わないで下さい。) # ↓ちなみに、これは ID:ganchan パスワード:ganchan です。 @passwordset = ('yuuchan:rLO.F1OZ1NbeU','',''); # 時間取得 ($year,$mon,$day,$hour,$min,$wday) = &Today; # htmlからの読み込み &ReadParse(); # どこからlogを読むか(通常最初というか、一番時間の新しいもの) $log = 1; # HTMLより取得されたデータを変数に代入 # Writeの時使用 if ($in{'n'}) { $name = $in{'n'}; } if ($in{'k'}) { $ad = $in{'k'}; } if ($in{'m'}) { $mail = $in{'m'}; } if ($in{'h'}) { $hp = $in{'h'}; } if ($in{'t'}) { $title = $in{'t'}; } if ($in{'c'}) { $comment = $in{'c'}; } # read_modeの時使用 if ($in{'l'}) { $log = $in{'l'}; } # read_allの時使用 # Kanri-modeの時使用 if ($in{'comnum'}) { $comnum = $in{'comnum'}; } if ($in{'hc'}) { $hcomment = $in{'hc'}; } if ($in{'radio1'}) { $radio1 = $in{'radio1'}; } if ($in{'username'}) { $username = $in{'username'}; } if ($in{'password'}) { $password = $in{'password'}; } # action if ($in{'a'}) { $action = $in{'a'}; } if ($action == 1) { &write_mode; } elsif ($action == 2) { &read_mode; } elsif ($action == 3) { &read_all_mode; } elsif ($action == 4) { &kanri_form; } elsif ($action == 88) { &kanri_mode; } else { $action=2; &read_mode; } 1; ########################## # today value # 今日の日付を作成 # # command : &Today; # return : (YEAR,MONth,DAY,HOUR,MIN,WEEKDAY) ########################## sub Today { local($sec,$min,$hour,$day,$mon,$year,$wday); @wday_name = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time); $year += 1900; $mon++; # $wday : 0-6 0:Sun return ($year,$mon,$day,$hour,$min,$wday_name[$wday]); } ########################## # Print Header # ヘッダーを作成 # # command : &PHeader; # return : - ########################## sub PHeader { local($sentou,$saigo); print &PrintHeader; # cgi-lib.plより print << "EOH"; Basket Board

Guest Bookへようこそ!ここへいらしたら、ただ読むだけじゃだめです。
「書込む!」をクリックして、ぜったいにお言葉を残してって下さい!!
バスケットに関する話題は、[Basket Board]! へ!

EOH if ($action == 2) { $sentou = $log; $saigo = $next - 1; print $sentou,'番目から',$saigo,'番目までの書き込みです。',"\n
\n"; } print ' '; if ($action == 2) { print ' '; } print '
'; } ########################## # Print Footer # フッターを作成 # # command : &PFooter; # return : - ########################## sub PFooter { print '

[管理人] '; if ($action == 2) { print ' '; } print '


'; } ########################## # Convert String # 文字を変換する # # command : &ConvString(STRING); # return : STRING ########################## sub ConvString { local($str) = @_; $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $str =~ s/\&/\&\;/g; # & => & $str =~ s/ < $str =~ s/>/\>\;/g; # > => > $str =~ s/\"/\"\;/g; # " => " $str =~ s/#!#/#!#/g; # 区切り文字 #!# => #!# $str =~ s/\r\n/
/g; # 改行文字 =>
$str =~ s/\n/
/g; $str =~ s/\r/
/g; &jcode'convert(*str,'euc'); return $str; } ########################## # error jump # エラー処理 # # command : &error(Error_Number); # return : exit(0); ########################## sub error { local($enum) = @_; @error_log = ('無事入力されました。
ありがとうございました。
', '名前が入力されていません。
ブラウザのバックボタンで戻って下さい。
', 'ファイルがうまく開きませんでした。
時間を置いてもう一度実行して下さい。
ブラウザのバックボタンで戻って下さい。
', '名前もしくはパスワードが入力されていません。
ブラウザのバックボタンで戻って下さい。
', '名前もしくはパスワードに使われてはいけない文字が含まれています。
ブラウザのバックボタンで戻って下さい。
', '名前もしくはパスワードが間違っています。
ブラウザのバックボタンで戻って下さい。
', '入力番号が範囲外です。
ブラウザのバックボタンで戻って下さい。
', '','','','' ); &PHeader; print $error_log[$enum]; &PFooter; exit(0); } ########################## # read one # ある1行を見る。 # # command : &read_one(STRING) # return : - # # $title,$year,$mon,$day,$hour,$min,$wday,$name,$ad,$mail,$hp,$comment ########################## sub read_one { local($strings) = @_; local(@tmp); @tmp = split(/\#!\#/,$strings); print << "RDO"; RDO # メールアドレスは 「@」を含まないと表示されない。 if ($tmp[8] =~ '@') { print '',"\n"; } # ホームページは、http://小文字英数字でないと表示されない if ($tmp[10] =~ /http:\/\/[0-9a-zA-Z]+/) { print '',"\n"; } print '',"\n"; if ($tmp[12] ne '') { print '',"\n"; } print '
タイトル$tmp[0]
お名前$tmp[7]
時間$tmp[1]年$tmp[2]月$tmp[3]日($tmp[6]) $tmp[4]時$tmp[5]分
お住まい$tmp[8]
Mail Address',$tmp[9],'
Home Page',$tmp[10],'
こう言いたい!',$tmp[11],'
ゆうちんの
こめんと
',$tmp[12],'
'; } ########################## # # Action Mode # # ########################## # write mode # ファイル「$filename」に書かれる。 # # 必要な値 : # $title => 題名 # $name => 名前 *必ず必要 # $ad => アドレス # $mail => メール # $hp => ホームページ # $comment => コメント # # 自動的に入る値 # $year,.....$wday # # 書かれる順番 (一行で書かれている) # 0 1 2 3 4 5 6 7 8 9 10 # (題名)#!#年#!#月#!#日#!#時#!#分#!#曜日#!#名前#!#(お住まい)#!#(メール)#!#(HP)#!# # 11 12 # (コメント)#!#(主のコメント)#!# ########################## sub write_mode { local($i); local($nbuf) = ''; # 名前がないときはエラー if (length($name) <= 0) { &error(1); } $comment = &ConvString($comment); $name = &ConvString($name); if (length($title) <= 0) { $title = '(たいとるないの。。。)'; } $title = &ConvString($title); $mail = &ConvString($mail); $hp = &ConvString($hp); # ファイルが開かないときはエラー # ログデータ取得 open (FILE,$filename) || &error(2); @txt = ; close (FILE); # ファイルが開かないときはエラー open (WFILE,">$filename") || &error(2); $all = join ('#!#',$title,$year,$mon,$day,$hour,$min,$wday,$name,$ad,$mail,$hp, $comment,$nbuf,$nbuf); print WFILE $all,"\n"; # 長さが指定されたログ長より大きくならないようにする。 $i = 1; FLOOP: foreach (@txt) { print WFILE; $i++; if ($i > $loglength) { last FLOOP; } } close (WFILE); &error(0); } ########################## # read mode # $filenameの読み込み。 # # $logより10個読む。 ########################## sub read_mode { local($line); local(@tmp); # ログ読みの飛び先指定 if ($log < $loglength) { $next = $log + 10; } else { $next = $loglength; } if ($log > 10) { $prev = $log - 10; } else { $prev = 1; } &PHeader; # ファイルが開かないとエラー open (FILE,$filename) || &error(2); print "
\n"; $line = 1; while () { if ($log <= $line && $line < $log + 10) { &read_one($_); } $line++; } print "
\n"; &PFooter; exit(0); } ########################## # read all mode # # 0 1 2 3 4 5 6 7 8 9 10 11 12 # $title,$year,$mon,$day,$hour,$min,$wday,$name,$mail,$ad,$hp,$comment,$hcomment # # 全体を見る。管理メニューへ行ける。 # ########################## sub read_all_mode { $number = 1; &PHeader; # ファイルが開かないとエラー open (FILE,$filename) || &error(2); print ' '; while() { @tmp = split(/\#!\#/,$_); print '",'',"\n"; $number++; } print << "EOA";
記事番号名前タイトル日時書き込み
',$number,'',$tmp[7],'',$tmp[0],'', "$tmp[1]-$tmp[2]-$tmp[3]-$tmp[6]みる↓

管理モード
ゲストブック番号
 
EOA &PFooter; exit(0); } ########################## # kanri form # 掲示板1行削除、コメント作成/変更/削除 # フォーム作成 # ########################## sub kanri_form { local($this_log,$i); local(@tmp,@tmp2); $_ = $comnum; ($comnum) = /(\d+)/; if ($comnum <= 0 || $comnum > 300) { &error(6); } open (FILE,$filename) || &error(2); $i = 1; &PHeader; print '
'; while() { if ($i == $comnum) { $this_log = $_; &read_one($_); } $i++; } close(FILE); if ($comnum >= $i) { print '
入力番号が範囲外です。
ブラウザのバックボタンで戻って下さい。
'; &PFooter; exit(0); } ## $all = join ('#!#',$title,$year,$mon,$day,$hour,$min,$wday,$name,$ad,$mail,$hp,$comment); @tmp = split(/\#!\#/,$this_log); @tmp2 = split(/
/,$tmp[12]); print '

コメント追加/変更  コメント削除  このメッセージを削除
管理者ID   
管理パスワード 
 
'; &PFooter; exit(0); } ########################## # kanri mode # ID,パスワードの照合 # コメントの削除/変更など # メッセージ削除の際は気を付けて!! ########################## sub kanri_mode { local($this_log); local($dummy) = ''; local(@tmp); # ID,パスワード取得 if ($username eq "" || $password eq "") { &error(3); } if ($username =~ /\>/ || $password =~ /\; close (FILE); if ($radio1 == 1) { $hcomment = &ConvString($hcomment); } elsif ($radio1 == 2) { $hcomment = ''; } open (WFILE, ">$filename") || &error(2); $i = 1; &PHeader; foreach (@txt) { chop; if ($comnum == $i) { @tmp = split(/\#!\#/); if ($radio1 == 3) { &read_one($_); print '第',$comnum,'番目(名前:',$tmp[7],'::たいとる:',$tmp[0],')を削除しました。'; } else { $tmp[12] = $hcomment; $tmp[12] =~ s/[ \t]//g; $_ = join('#!#',$tmp[0],$tmp[1],$tmp[2],$tmp[3],$tmp[4],$tmp[5], $tmp[6],$tmp[7],$tmp[8],$tmp[9],$tmp[10],$tmp[11],$tmp[12],$dummy); &read_one($_); print WFILE $_,"\n"; print '第',$comnum,'番目(名前:',$tmp[7],'::たいとる:',$tmp[0],')を変更しました。'; } } else { print WFILE $_,"\n"; } $i++; } &PFooter; close (WFILE); exit(0); }