#! /bin/perl require 'jcode.pl'; $title = "何でも 掲示板"; $method = "post"; $file = "webboard.idx"; $base_url = "http://www2.luice.or.jp/html/webboard"; #最後に/を付けないこと $base = "/www/httpd/html/webboard"; #最後に/を付けないこと ########################################################################################### ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if ($year < 10) { $year = "0$year"; } if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } $month = ($mon + 1); if ($month < 10) { $month = "0$month"; } if ($mday < 10) { $mday = "0$mday"; } $date_now = "$year/$month/$mday/$hour/$min/$sec"; # <-変更しないこと $date_fmt = "19$year年$month月$mday日 $hour時$min分$sec秒"; print "Content-type: text/html\n\n"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } &form; if (!open(IN,"$file")) { &error; } @lines = ; close(IN); if ($FORM{'root'} eq "set") { &root_set; } #管理パスワードチェック $pass = "off"; chop($lines[0]) if $lines[0] =~ /\n$/; if (!($lines[0] =~ /master_password/)) { &root_error; } ($dummy,$master_password) = split(/\:/,$lines[0]); if ( $FORM{'pass'} ne "") { $encode_pwd = $master_password; $plain_text = $FORM{'pass'}; &passwd_decode; if ($super eq "yes") { $pass = "on"; } } if ($buffer eq "") { $FORM{'limit'} = "on"; $kp = 20; &disp; } if ($FORM{'limit'} eq "next" || $FORM{'limit'} eq "all") { $kp = $FORM{'kp'}; &disp; } if ($FORM{'root'} eq "change") { if ($pass eq "on") { &root_change; } else { &error(not_root); } } if ($FORM{'action'} eq "reg") { ®ist; } if ($FORM{'action'} eq "search") { if ($FORM{'string'} eq "") { &disp; } else { &search; } } if ($FORM{'action'} eq "delete") { &delete; } exit; sub disp { $limit = $FORM{'limit'}; $j = 0; $kpf = $kp - 20; @LOG = reverse(@lines); print "$title\n"; &body; print "

$title

\n"; print "

[新しい書込み]\n"; print " [検索]\n"; print " [削除]\n"; print " [管理用]\n"; print " [バック]\n"; print " [旧掲示板]

\n"; $kpf2 = $kpf + 1; if ($FORM{'limit'} eq "all") { print "降順$kpf2〜すべての記事のリスト

\n"; } else { print "降順$kpf2〜$kpの記事のリスト

\n"; } print "

番号   投稿日          投稿者            res     題名\n";
	print "
"; foreach $line (@LOG) { $j++; if ($j > $kp && $limit eq "on") { $jj = 1; last; } elsif ($j <= $kpf && $limit eq "next") { next; } elsif ($j > $kp && $limit eq "next") { $jj = 1; last; } elsif ($j <= $kpf && $limit eq "all") { next; } if ($line =~ /\[(.*)\] (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*)/) { $name = $2; $email = $3; $page = $4; $keywd = $5; $subject = $6; $pwd = $7; $res = $8; $date = $1; if ($date =~ m#(.*)/(.*)/(.*)/(.*)/(.*)/(.*)#) { $date1 = "$1\/$2\/$3 $4\:$5"; } &disp2; } } print "
\n"; if ($jj eq "1") { $kp2 = $kp + 20; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; } ©right; } sub disp2 { $f1 = "$page"; $f2 = "$date1"; $f3 = "$name"; $f4 = "$res"; $f5 = "$subject"; print ""; write; } format STDOUT = @<<<<<<<< @<<<<<<<<<<<<< @<<<<<<<<<<<<<<< @<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $f1, $f2, $f3, $f4, $f5 . sub search { $FORM{'string'} =~ s/ / /g; $st = $FORM{'string'}; $st =~ s/ /,/g; @terms = split(/\s+/, $FORM{'string'}); $i = 0; if (!open(IN,"$file")) { &error; } @lines = ; $accesses = @lines; close(IN); @LOG = reverse(@lines); print "$title\n"; &body; print "

検索

\n"; print "検索文字列:$st

\n"; print "

番号   投稿日          投稿者            res     題名\n";
	print "
"; foreach $line (@LOG) { $match = "0"; if ($line =~ /\[(.*)\] (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*)/) { $name = $2; $email = $3; $page = $4; $keywd = $5; $subject = $6; $pwd = $7; $res = $8; $date = $1; if ($date =~ m#(.*)/(.*)/(.*)/(.*)/(.*)/(.*)#) { $date1 = "$1\/$2\/$3 $4\:$5"; } &jcode'convert(*line,'euc'); foreach $term (@terms) { &jcode'convert(*term,'euc'); if ($line =~ /$term/i) { $match = "1"; } } } if ($match eq "1") { $i++; &disp2; } } print "
\n"; $accesses2 = ($accesses - 1); if ($i eq "0") { print "

$accesses2記事中から検索しましたが見つかりませんでした。

\n"; } else { print "

$accesses2記事中$i件の記事が抽出されました。

\n"; } ©right; } sub form { @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s///g; # $value =~ s//>/g; #タグを禁止する場合は左端の#を削除する # $value =~ s/"/"/g; #タグを禁止する場合は左端の#を削除する $value =~ s/\n//g; $value =~ s/^//g; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $FORM{$name} = $value; } } sub regist { ✓ $remote_host=$ENV{'REMOTE_HOST'}; &number_get; if (!open(OUT,">>$file")) { &error; } if ($fup_num ne "") { print OUT "\[$date_now\] $name ^ $email ^ $num ^ $keywd ^ $subject ^ $pwd ^ re$fup_num\n"; } else { $res = ""; print OUT "\[$date_now\] $name ^ $email ^ $num ^ $keywd ^ $subject ^ $pwd ^ $res\n"; } close(OUT); if (!open(OUT,">$base/msg/$num\.html")) { &error; } print OUT "$title:$subject\n"; print OUT "\n"; print OUT "

$subject

\n"; print OUT "記事番号:$num
\n"; print OUT "投稿者:$name
\n"; print OUT "リモートホスト:$remote_host
\n"; print OUT "メールアドレス:
$email
\n"; print OUT "投稿日:$date_fmt
\n"; print OUT "キーワード:$keywd

\n"; print OUT "[記事一覧に戻る]
\n"; if ($fup_num ne "") { print OUT "このコメントは[$fup_sub]に対するレスポンスです。
\n"; } print OUT "\n"; print OUT "

内容

\n"; print OUT "
$body
\n"; print OUT "
\n"; print OUT "\n"; print OUT "\n"; print OUT "\n"; print OUT "

\n"; print OUT "

\n"; print OUT "\n"; close(OUT); if ($fup_num ne "") { if (!open(IN,"$base/msg/$fup_num\.html")) { &error(fup_deleted); } @lines = ; close(IN); if (!open(OUT,">$base/msg/$fup_num\.html")) { &error(fup_deleted); } foreach $line (@lines) { if ($line =~ //) { print OUT "この記事には[$subject]というタイトルのコメントが投稿されています。
\n"; print OUT "\n"; } else { print OUT "$line"; } } close(OUT); &respon; } ®ist2; } sub regist2 { &number_put; if (!open(IN,"$file")) { &error; } @lines = ; close(IN); $FORM{'limit'} = "on"; $kp = 20; &disp; } sub respon { if (!open(IN,"$file")) { &error; } @lines = ; close(IN); foreach $line (@lines) { if ($line =~ /\[(.*)\] (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*)/) { $date = $1; $name = $2; $email = $3; $page = $4; $keywd = $5; $subject = $6; $pwd = $7; $res = $8; if ($page eq $fup_num && $res eq "") { $user = "[$date] $name ^ $email ^ $page ^ $keywd ^ $subject ^ $pwd ^ res"; } else { $user = "[$date] $name ^ $email ^ $page ^ $keywd ^ $subject ^ $pwd ^ $res"; } push(@NEW,$user); } } if (!open(OUT,">$file")) { &error; } print OUT "master_password\:$master_password\n"; foreach (@NEW) { print OUT "$_\n"; } close(OUT); } sub copyright { print "\n"; } sub delete { foreach $line (@lines) { if ($line =~ /\[(.*)\] (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*) \^ (.*)/) { $date = $1; $name = $2; $email = $3; $page = $4; $keywd = $5; $subject = $6; $pwd = $7; $res = $8; $user = "[$date] $name ^ $email ^ $page ^ $keywd ^ $subject ^ $pwd ^ $res"; if ($FORM{'remove'} eq $page) { $plain_text = $FORM{'pwd'}; $encode_pwd = $pwd; if ($plain_text eq $encode_pwd) { $super = "yes"; } else { &passwd_decode; } if ($super ne "yes" && $pass ne "on") { &error(pw_not_same); } $filename = "$base/msg/$page\.html"; if (-e $filename) { unlink("$filename") || push(@not_removed,$page); } push(@removed,$page); } else { push(@NEW,$user); } } } if (!open(OUT,">$file")) { &error; } print OUT "master_password\:$master_password\n"; foreach (@NEW) { print OUT "$_\n"; } close(OUT); print "記事の削除(結果)\n"; &body; print "

記事の削除(結果)

\n"; $rmd=@removed; if ($rmd eq "0") { print "既に記事が存在しませんでした:

\n"; } else { print "削除した記事番号: @removed

\n"; } if (@not_removed) { print "削除時にエラーが発生しました: @not_removed

\n"; } print "[記事一覧に戻る]

\n"; print "\n"; } sub root_error { print "$title\n"; &body; print "

初期設定

\n"; print "管理パスワードが設定されていません。新規設定をします。\n"; print "

\n"; print "

\n"; print "\n"; print "管理ワード:
\n"; print "管理パスワード:
\n"; print "確認の為もういちど:

\n"; print "

\n"; exit; } sub check { $fup_num=$FORM{'fup_num'}; $fup_sub=$FORM{'fup_sub'}; $name=$FORM{'name'}; $name =~ s/ / /g; if ($name eq "") { &error(quit); } $name =~ s//>/g; $name =~ s/"/"/g; $subject=$FORM{'subject'}; $subject =~ s/ / /g; if ($subject eq "") { &error(quit); } $subject =~ s//>/g; $subject =~ s/"/"/g; $body=$FORM{'body'}; $body =~ s/ / /g; if ($body eq "") { &error(quit); } $email=$FORM{'email'}; $email =~ s/ //g; if ($email eq "") { &error(quit); } else { if ($email =~ /(.*)\@(.*)\.(.*)/) { $user_id = $1; } else { &error(quit); } } $keywd=$FORM{'keywd'}; $keywd =~ s/ / /g; $keywd =~ s/ /,/g; $keywd =~ s//>/g; $keywd =~ s/"/"/g; $input_pwd = $FORM{'pwd'}; if ($input_pwd =~ / / || $input_pwd eq "") { &error(bad_passwd); } if ($input_pwd =~ /(\W)/) { &error(bad_passwd); } $pwd_len=length("$input_pwd"); if ($pwd_len > 10 || $pwd_len < 4) { &error(bad_passwd); } &passwd_encode; } sub body { print "\n"; } sub number_get { if (!open(IN,"$base/number.dat")) { &error; } $num = ; close(IN); if ($num == 9999) { &error(full); } else { $num++; } } sub number_put { if (!open(OUT,">$base/number.dat")) { &error; } print OUT "$num"; close(OUT); } sub passwd_encode { #入力 $user_id $input_pwd #出力 $pwd $now = time; ($p1, $p2) = unpack("C2", $user_id); $wk = $now / (60*60*24*7) + $p1 + $p2 - 8; @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); $nsalt = $saltset[$wk % 64] . $saltset[$now % 64]; $pwd = crypt($input_pwd, $nsalt); } sub passwd_decode { #入力 $plain_text $encode_pwd #出力 $super = "no"; if (crypt($plain_text, substr($encode_pwd,0,2)) eq $encode_pwd) { $super = "yes"; } } sub root_set { if ($lines[0] =~ /master_password/) { &error(root_ready); } if ($FORM{'passwd_1'} ne $FORM{'passwd_2'}) { &error(pw_not_same); } $input_pwd = $FORM{'passwd_1'}; if ($input_pwd =~ / / || $input_pwd eq "") { &error(bad_passwd); } if ($input_pwd =~ /(\W)/) { &error(bad_passwd); } $pwd_len=length("$input_pwd"); if ($pwd_len > 10 || $pwd_len < 4) { &error(bad_passwd); } $user_id = "webmaster"; if ($FORM{'user'} ne "webmaster") { &error(pw_not_same); } &passwd_encode; if (!open(OUT,">$file")) { &error; } print OUT "master_password\:$pwd\n"; print OUT @lines; close(OUT); print "$title\n"; &body; print "

OK

\n"; print "管理パスワードを設定しました。

\n"; print "[記事一覧]

\n"; exit; } sub root_change { if ($FORM{'passwd_1'} ne $FORM{'passwd_2'}) { &error(pw_not_same); } $user_id = "webmaster"; $input_pwd = $FORM{'passwd_1'}; if ($input_pwd =~ / / || $input_pwd eq "") { &error(bad_passwd); } if ($input_pwd =~ /(\W)/) { &error(bad_passwd); } $pwd_len=length("$input_pwd"); if ($pwd_len > 10 || $pwd_len < 4) { &error(bad_passwd); } &passwd_encode; if (!open(OUT,">$file")) { &error; } print OUT "master_password\:$pwd\n"; shift(@lines); print OUT @lines; close(OUT); print "$title\n"; &body; print "

OK

\n"; print "管理パスワードを変更しました。

\n"; print "[記事一覧]

\n"; exit; } sub error { $error = $_[0]; if ($error eq "not_root") { $error_msg = "管理パスワードが認識できません。"; } elsif ($error eq "fup_deleted") { $error_msg = "あなたがフォローアップしようとした元になった記事は既に削除されていました。"; } elsif ($error eq "quit") { $error_msg = "入力されていない項目があります。[BACK]で画面を戻して再入力してください。"; } elsif ($error eq "full") { $error_msg = "記事番号がいっぱいになったので投稿できません。"; } elsif ($error eq "root_ready") { $error_msg = "既に管理パスワードは設定されています。"; } elsif ($error eq "pw_not_same") { $error_msg = "パスワードまたはユーザ名が確認できませんでした。"; } elsif ($error eq "bad_passwd") { $error_msg = "パスワードは4〜10文字の英数字を使ってください。"; } else { $error_msg = "処理に何らかのエラーが発生し作業は中止されました。"; } print "$title\n"; &body; print "

ERROR

\n"; print "$error_msg

\n"; print "\n"; if ($error eq "fup_deleted") { ®ist2; } exit; }