#!/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/\<\;/g; # < => <
$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";
 |  |
| タイトル | $tmp[0] |
| お名前 | $tmp[7] |
| 時間 | $tmp[1]年$tmp[2]月$tmp[3]日($tmp[6])
$tmp[4]時$tmp[5]分 |
| お住まい | $tmp[8] |
RDO
# メールアドレスは 「@」を含まないと表示されない。
if ($tmp[8] =~ '@') {
print '| Mail Address | ',$tmp[9],' |
',"\n";
}
# ホームページは、http://小文字英数字でないと表示されない
if ($tmp[10] =~ /http:\/\/[0-9a-zA-Z]+/) {
print '| Home Page | ',$tmp[10],' |
',"\n";
}
print '| こう言いたい! | ',$tmp[11],' |
',"\n";
if ($tmp[12] ne '') {
print 'ゆうちんの こめんと | ',$tmp[12],' |
',"\n";
}
print '
';
}
##########################
#
# 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 '| ',$number,' | ',$tmp[7],' | ',$tmp[0],' | ',
"$tmp[1]-$tmp[2]-$tmp[3]-$tmp[6] | ",'みる↓ |
',"\n";
$number++;
}
print << "EOA";
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 '
';
&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 =~ /\) { &error(4); }
foreach (@passwordset) {
($id,$pwd) = split(/\:/);
if ($id ne $username) { next; }
if (crypt($password,$pwd) ne $pwd) { &error(5); }
}
# ファイルを開く
open (FILE,$filename) || &error(2);
@txt = ;
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);
}