) {
print OUT;
}
close(IN);
close(OUT);
if ((-s "$g_dirname/$file") == (-s "$dir/$file")) {
unlink("$g_dirname/$file");
}
next;
}
# 1行分のエントリを作成する
if ($listmode eq "manage") {
$item =
""
. "$date | "
. " | "
. "$file | "
. "$solved | "
. "削 | "
. "送 | "
. "$title ($count件) | "
. "
\n";
} else {
if ($listmode eq "hist") {
$file = substr("$dirname/$file", 7);
}
$item =
""
. "$date | "
. " | "
. "$from | "
. "$solved | "
. "$title ($count件) | "
. "
\n";
}
push(@items, $item);
}
# ソートする
@items = sort { $b cmp $a; } @items;
@dirs = sort { $b cmp $a; } @dirs;
# 50件以上古いものを過去の履歴にほうり込む
# if ($listmode ne "hist") {
# @logs = splice(@items, 50);
# foreach $_ (@logs) {
# $_ =~ /([0-9][0-9]\/[0-9][0-9]\/[0-9][0-9])/;
# $date = $1;
# $_ =~ /print\+([0-9]*.txt)/i;
# $file = $1;
# $dir = "$g_dirname/lng" . substr($date, 0, 2) . substr($date, 3, 2);
# mkdir($dir, 0777);
# open(IN, "$g_dirname/$file");
# open(OUT, "> $dir/$file");
# while () {
# print OUT;
# }
# close(IN);
# close(OUT);
# if ((-s "$g_dirname/$file") == (-s "$dir/$file")) {
# unlink("$g_dirname/$file");
# }
# }
# }
# 書き出す
print "\n";
print " Low Rider's ラウンジ\n";
if ($listmode ne "hist") {
print "Low Rider とDYNAのラウンジです。誰でも自由に書き込んでください。\n";
print "テクニカル、ノンテクニカル、雑談、何でもOKです。\n";
print "気になったテーマを話題にして話し合うもよし。質問するもよし。\n";
print "そふていら〜、ろうきんなども歓迎します。\n";
print "\n";
if ($return_url ne "") {
print "[戻る]\n";
}
print "[新規質問]\n";
print "[過去の履歴]\n";
}
print " \n";
print "質問の一覧\n";
print "\n";
print "\n";
if ($listmode eq "hist") {
return;
}
print " \n";
print "";
print "新しい質問を書き込む";
print "\n";
print "\n";
print "- 誰でも自由に質問/投稿できます。\n";
print "
- 質問の場合は質問形式で、それ以外は自由形式\n";
print "
- 名前、メールアドレス、URLは匿名(空欄)でもかまいません。\n";
print "
- 終了したらお礼を書き込んで[解決]をチェックしてください。\n";
print "
- HTMLのタグは使えません。そのまま表\示されます。\n";
print "
- 再表\示を行うと発言が重複する事があります。注意してください。";
print "
\n";
print "\n";
print " \n";
print "過去の履歴";
print "\n";
print @dirs;
print " \n";
}
#
# 発言を追加する
#
sub writeMessage {
#
# 空発言は無視する
#
if ($FORM{'MESSAGE'} eq "") {
return(1);
}
#
# 名前無記入は「匿名希望」とする
#
if ($FORM{'FROM'} eq "") {
$FORM{'FROM'} = "匿名希望";
}
#
# ラウンジファイルに発言を追加する
#
open(OUT, ">> $g_dirname/$g_filename");
print OUT "========================================\n";
print OUT "From: $FORM{'FROM'}\n";
if ($FORM{'EMAIL'} ne "") {
print OUT "E-Mail: $FORM{'EMAIL'}\n";
}
if ($FORM{'HPAGE'} ne "") {
print OUT "HomePage: $FORM{'HPAGE'}\n";
}
($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime();
$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d",
$year + 1900, $mon + 1, $mday, $g_wdays[$wday], $hour, $min, $sec);
print OUT "Date: $date\n";
if ($FORM{'SOLVED'} eq "on") {
print OUT "Solved: $FORM{'SOLVED'}\n";
}
print OUT "\n";
print OUT "$FORM{'MESSAGE'}\n";
close(OUT);
#
# 質問者にメールで知らせる
#
$mailto = "";
open(IN, "$g_dirname/$g_filename");
while () {
if (/^Reply-To:/) {
chop($_);
$mailto = $_;
$mailto =~ s/^Reply-To: //;
}
if (/^========/) {
last;
}
}
if ($mailto ne "") {
seek(IN, 0, 0);
open(OUT, "| $nkf -j | $sendmail $mailto");
print OUT "To: $mailto\n";
print OUT "Subject: Tohoho Lounge\n";
print OUT "\n";
while () {
$_ =~ s/<//g;
$_ =~ s/&/&/g;
print OUT;
}
close(OUT);
}
close(IN);
return(true);
}
#
# 過去n日分を表示する
#
sub printList {
$nowtime = time();
$limittime = $nowtime - ($days * 3600 * 24);
opendir(DIR, "wwwlng");
@filelist = readdir(DIR);
closedir(DIR);
foreach $file (@filelist) {
if ($file !~ /.txt$/) {
next;
}
$mtime = (stat("wwwlng/$file"))[9];
if ($mtime >= $limittime) {
push(@filelist2, "$mtime $file");
}
}
@filelist2 = sort { $b cmp $a; } @filelist2;
foreach $g_filename (@filelist2) {
$g_filename =~ s/^[0-9]+ //;
&printFile($g_filename);
}
}
sub printFile {
$g_filename = $_[0];
$subject = "";
open(IN, "wwwlng/$g_filename") || print "Can't open $g_filename \n";
$subject = ;
$subject =~ s/^Subject: //;
$subject =~ s/[\r\n]$//;
print "■ $subject\n";
while () {
chop($_);
if ($_ =~ /^Reply-To: /) {
next;
} elsif ($head && $_ =~ /^From: /) {
$_ =~ s/^From: //;
print "$_\n";
} elsif ($head && $_ =~ /^E-Mail: /) {
$_ =~ s/^E-Mail: //;
print "Mail\n";
} elsif ($head && $_ =~ /^HomePage: /) {
$_ =~ s/^HomePage: //;
print "HomePage\n";
} elsif ($head && $_ =~ /^Date: /) {
$_ =~ s/^Date: //;
print "$_ \n";
} elsif ($head && $_ =~ /^Solved: /) {
print "[[解決]] \n";
} elsif ($_ eq "========================================") {
print " \n";
$head = 1;
} elsif ($_ eq "") {
$head = 0;
} else {
$_ =~ s/(http:\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:]+)/$1<\/A>/g;
print "$_ ";
}
}
print " \n";
print "[↑の記事に追加発言]\n";
print " \n";
close(IN);
}
#
# サブジェクトを表示する
#
sub printSubject {
#
# 既存の発言を表示する
#
open(IN, "$g_dirname/$g_filename");
$_ = ;
$_ =~ s/^Subject: //;
$subject = 1;
print "Content-type: text/html\n";
print "\n";
print "\n";
print "\n";
print "$_\n";
print "\n";
print "\n";
print "$_\n";
while () {
chop($_);
if ($subject && $_ =~ /^Reply-To: /) {
next;
} elsif ($head && $_ =~ /^From: /) {
$_ =~ s/^From: //;
print "$_\n";
} elsif ($head && $_ =~ /^E-Mail: /) {
$_ =~ s/^E-Mail: //;
print "Mail\n";
} elsif ($head && $_ =~ /^HomePage: /) {
$_ =~ s/^HomePage: //;
print "HomePage\n";
} elsif ($head && $_ =~ /^Date: /) {
$_ =~ s/^Date: //;
print "$_ \n";
} elsif ($head && $_ =~ /^Solved: /) {
print "[[解決]] \n";
} elsif ($_ eq "========================================") {
print " \n";
$head = 1;
$subject = 0;
} elsif ($_ eq "") {
$head = 0;
} else {
$_ =~ s/(http:\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:]+)/$1<\/A>/g;
print "$_ ";
}
}
close(IN);
#
# 発言追加フォームを表示する
#
if ($g_filename =~ /^lng/) {
return;
}
print " \n";
print "追加発言\n";
print "\n";
print "\n";
print "\n";
print "- 誰でも自由に発言を追加してください。\n";
print "
- 名前、メール、URLは省略してもかまいません。\n";
print "
- HTMLのタグは使えません。そのまま表\示されます。\n";
print "
- 再表\示を行うと発言が重複する事があります。\n";
print "
\n";
print "\n";
}
#
# サブジェクトを管理者にメールで送信する
#
sub sendMail {
open(OUT, "| $nkf -j | $sendmail $mailto");
print OUT "To: $mailto\n";
print OUT "Subject: $_[0]\n";
print OUT "\n";
open(IN, "$g_dirname/$_[0]");
while () {
print OUT $_;
}
close(IN);
close(OUT);
print "メール送信を完了しました。";
}
#
# サブジェクトを削除する
#
sub deleteSubject {
unlink("$g_dirname/$_[0]");
print "削除完了しました。";
}
#
# 自己テスト
#
sub localTest {
print " OK. CGIは正常に動作しています。\n";
if (-d $lock_file) {
print " NG. ロックファイル($lock_file)が残っています。\n";
print "rmdir で削除してください。\n";
}
if ($manage ne "") {
print " OK. 管理者モードが有効です。\n";
}
if ($mailto ne "") {
print " OK. メール送信機能が有効です。\n";
if (! -f $nkf) {
print " NG. $nkfが存在しません。\n";
}
if (! -f $sendmail) {
print " NG. $sendmailが存在しません。\n";
}
}
}
#
# フォームに入力されたデータを読みこむ
#
sub readParam {
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
@a = split(/&/, $query_string);
foreach $x (@a) {
($name, $value) = split(/=/, $x);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
$value =~ s/&/&/g;
$value =~ s/</g;
$value =~ s/>/>/g;
$value =~ s/\n$//;
&jcode'convert(*value, $kanji_code);
$FORM{$name} = $value;
}
}
#
# 管理者用パスワードのチェック
#
sub passwdCheck {
if ($_[0] ne $password) {
print "管理者用パスワードが不正です。\n";
return(0);
} else {
return(1);
}
}
#
# ファイルロック開始
#
sub fileLock {
if ($file_lock_flag) {
for ($i = 1; $i <= 6; $i++) {
if (mkdir($lock_file, 755)) {
last;
} elsif ($i < 6) {
sleep(2);
} else {
return(undef);
}
}
}
return(true);
}
#
# ファイルロック解除
#
sub fileUnlock {
if ($file_lock_flag) {
for ($i = 1; $i <= 4; $i++) {
if (rmdir($lock_file) == 0) {
last;
} elsif ($i < 4) {
sleep(1);
} else {
return(undef);
}
}
}
return(true);
}
#
# プログラム中断時の処理
#
sub sigexit {
rmdir($lock_file);
exit(0);
}
#=======================================================================
#
# 検索
#
sub searchKeyword {
#
# 複数のワードを分割する
#
@words = split(/ +/, $FORM{'WORD'});
#
# メタ文字を無効化する
#
for ($i = 0; $i <= $#words; $i++) {
$words[$i] =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
}
#
# HTML文書を書き出す
#
print "Low Rider's ラウンジ(検索結果)\n";
print " \n";
if (defined($FORM{'WORD'})) {
print "\n";
&search1($target_dir);
print " \n";
print " \n";
print "検索が完了しました。\n";
}
print "\n";
print "\n";
}
#
# すべてのファイルをなめ回す
#
sub search1 {
local(@filelist, $dir);
$dir = $_[0];
opendir(DIR, $dir);
@filelist = readdir(DIR);
closedir(DIR);
foreach $file (@filelist) {
if ($file eq ".") { next; }
if ($file eq "..") { next; }
$g_filename = "$dir/$file";
if (-d $g_filename) {
&search1($g_filename);
} else {
&search2($g_filename);
}
}
}
#
# ファイルの中身を検索する
#
sub search2 {
local($target);
$target = $_[0];
undef %wordflag;
undef %wordtext;
$title = "";
$match_count = 0;
open(IN, $target);
loop: while () {
chop($_);
if (($title eq "") && ($_ =~ /^Subject:/)) {
$title = substr($_, 9);
}
foreach $word (@words) {
if ($wordflag{$word} == 1) { next; }
if (!($_ =~ /$word/i)) { next; }
$_ =~ s/<[^>]*>//g;
$wordtext{$word} = $_;
if (($FORM{'ANDOR'} eq "or") ||
(++$match_count == $#words + 1)) {
if ($title eq "") {
$title = $target;
}
$target =~ s/wwwlng\///;
print "\n";
print " ";
print "$title\n";
print "";
foreach $wd (@words) {
print "$wordtext{$wd} ";
}
print "\n";
last loop;
}
$wordflag{$word} = 1;
}
}
undef @lines;
close(IN);
}
|