0001 #(★)The following statement is unnecessary in the case of WindowsNT.
0002 #!/perl/bin/perl
0003
0004 ;# ↑このパスはプロバイダによって違うので調べて設定する
0005 ;# (これはこのスクリプトの最初の1行になければならず、それより上に空行があってもいけません。)
0006 ;# (この設定が必要ないサーバもあります。一般的な場合を想定して解説を入れています。)
0007 ;# (他に、プロバイダからアナウンスされている情報を十分理解しておいてください。)
0008 ;#
0009 ;# 簡易BBS version 9.02(フリーソフト)
0010 ;#
0011 ;# Script written by Kazu.Y
0012 ;# Created on: 02/05/96
0013 ;# Last Modified on: 03/SEP/98
0014 ;# I can be reached at: rescue@ask.ne.jp
0015 ;# Scripts Found at: http://www.rescue.ne.jp/
0016
0017 # [History]
0018 # v8.90 11/AUG/98 v8.8にロック機能を付加
0019 # v9.00 12/AUG/98 タグ処理を制限してセキュリティアップ
0020 # v9.01 24/AUG/98 未入力処理(クッキー消去)時にリストされな不具合を修正
0021 # v9.02 03/SEP/98 改行の扱いを3種類に変更
0022
0023 #(★)-----------(★)#
0024 #(★) の部分は、WindowsNT用にカスタマイズした部分です。
0025 #(☆) の部分は、私の好みで変更した部分です。
0026 #(◎) の部分は、新たに機能追加した部分です。
0027
0028 # Update by A.Chiba
0029 # [WindowsNT Version History]
0030 # v1.00 11/SEP/98 WindowsNT用に改造
0031 # $reload = './minibbs.pl'; <-- 相対パスに変更
0032 # ls <-- dirに変更
0033 # rename <-- rename実行前にunlinkを追加
0034 # chmod <-- 無意味なので削除
0035 # v1.01 16/SEP/98 二重投稿禁止処理追加
0036 # v1.02 17/SEP/98 特定ホスト接続規制処理追加
0037 # v1.03 18/SEP/98 二重投稿禁止オプション追加(3モード)
0038 # v1.04 19/SEP/98 投稿者名チェック処理追加
0039 # v1.05 19/OCT/98 NGワードのチェック処理追加
0040 # v1.06 22/OCT/98 ログファイル保存処理追加
0041 # v1.07 26/OCT/98 プロキシ接続規制処理追加
0042
0043 ###########################################################################################
0044 #
0045 #■重要! v9シリーズはそれ以前のヴァージョンとデータの互換性がありません。
0046 #
0047 # 基本構成
0048 #
0049 # /public_html/(ホームページディレクトリ)
0050 # |
0051 # |-- /cgi-bin/(任意のディレクトリ)
0052 # |
0053 # |-- jcode.pl (755)
0054 # |-- minibbs.cgi (755)
0055 # |
0056 # |-- /data/ (777)
0057 # |
0058 # |-- minibbs.dat (666)
0058 # |
0060 # |-- log.txt (666)
0061 #
0062 # ・minibbs.dat は中身が空っぽのファイルをパソコン上で作成して転送する
0063 # ・( )内はパーミッッション値
0064 #
0065 ###########################################################################################
0066
0067 #----------------#
0068 # 初期設定 #
0069 #----------------#
0070
0071 #--- 必ずあなたの環境に合わせて書き替える項目 --------------------------------------------#
0072
0073 #◆掲示板の名前
0074 # ''内に記述しますが、'を入れたい場合は '' を "" に替えてください.
0075 # ただしその場合、文字によって化けが生じることがあります.
0076 # 詳しくは当サイトのFAQを参照してください.
0077 $title = 'D2 Kernel Support BBS';
0078
0079 #◆このスクリプトをURLで設定
0080 #(★)WindowsNT用にカスタマイズする (★)#
0081 #$reload = 'http://設置したURL/cgi-bin/minibbs.cgi';
0082 $reload = './minibbs.pl';
0083
0084 # ◆画面の「終了」リンク先をURLで設定
0085 $modoru = 'http://186.32.1.32/';
0086
0087
0088 #--- 必要に応じて設定する項目 ------------------------------------------------------------#
0089
0090 #◆画面の色や背景の設定 (HTML書式)
0091 $body = '<body bgcolor="turquoise">';
0092
0093 #◆タイトル背景とタイトル文字色の設定
0094 $title_back = 'turquoise';
0095 $title_str = '#ffffff';
0096
0097 #◆投稿毎に管理者へ内容をメールする
0098 # メール機能は、いち早く不適切な投稿等をチェックすることができるように設計しました.
0099 # メールしない場合は $mailto $sendmail を設定する必要はありません.
0100 # 投稿者がEメールを記入している場合は、返信アドレスにそのEメールが記載されます.
0101 # メールする:1 しない:0
0102
0103 $s_mail = 0;
0104 $mailto = 'user@mail.host'; # 送信先Eメール
0105 $sendmail = '/usr/lib/sendmail'; # 送信スクリプト(sendmail) プロバイダに聞くこと
0106
0107 #◆画面内に記述する文字列等 (HTML書式)
0108 # ''内に記述しますが、'を入れたい場合は '' を "" に替えてください.
0109 # ただしその場合、文字によって化けが生じることがあります.
0110 # 詳しくは当サイトのFAQを参照してください.
0111 # 必要ない場合は '' 内に何も書きません.
0112
0113 #◇タイトルの下位置に表示する文字列
0114 $msg_top1 = '<A HREF="mailto:chiba@mob.ntc.co.jp"><b>MiniBBS 0115 V1.07 for WindowsNT.</b></A><br>';
0116 $msg_top2 = 'The original version of MiniBBS is 9.02.<br>';
0117 $msg_top3 = '書き込み直後にブラウザのリロード機能を使用すると二重投稿となります.';
0118
0119 #◇投稿フォームの下位置に表示する文字列
0120 $msg_mid1 = '■投稿時には、この記事を削除する時に利用する削除キーを設定してください.<br>';
0121 $msg_mid2 = '■一度設定して投稿すれば一定期間同じ削除キーが保存されます.<br>';
0122 $msg_mid3 = '■入力欄に記憶された内容を消去するには、[書き直し]→[書き込む]を順番に押します.';
0123
0124 #◇最下部に表示する文字列
0125 $msg_btm1 = '■削除は、[削除]欄をチェックして、投稿時に設定した削除キーをすぐ上の欄に入力してボタンを押します.<br>';
0126 $msg_btm2 = '■削除キーが合致しない記事は削除されません.<br>';
0127 $msg_btm3 = '■削除キー欄にマスターキー(管理者のみ)を入力するとすべての記事の削除が可能です.';
0128
0129 #◆$reloadで設定した設置URL以外のフォームからの投稿を禁止する処置する:1 しない:0
0130 # 悪戯の防止用ですが、利用サーバやブラウザによっては正規投稿もできなくなる場合もあります.
0131 $ref_axs = 1;
0132
0133 #◆1記事の最大記録サイズ(bytes) 0で無制限
0134 $max_size = 0;
0135
0136 #◆1画面に表示する記事件数
0137 $def = 20;
0138
0139 #◆書き込み件数の最大登録数の設定です。この件数を超えると、古いものから削除されていきます.
0140 # ページ処理機能が付きましたので、この件数を大きくしても一度に表示される記事数は限定されます.
0141 # 記録されたファイルの巨大化を防止する為に、ある程度の件数で自動削除されるようにします.
0142 # サーバ負荷を考慮して、あまり大きくしないことが重要です.
0143 $max = '500';
0144
0145 #◆日本語コード変換ライブラリ
0146 # minibbs.cgiと同じ場所に設置する場合はこのままでよい.
0147 require './jcode.pl';
0148
0149 #◆内容が書き込まれる記録ファイルの名前(パスの設定ではない!)
0150 $file = 'minibbs.dat';
0151
0152 #◆データディレクトリのパスの設定(処理の都合上 / で閉じない)
0153 $tmp_dir = './data';
0154
0155 #◆海外サーバ等で時差が生じる場合は修正します
0156 # 海外時間に+9時間する場合 = localtime(time + 9*60*60);
0157 # 海外時間に−9時間する場合 = localtime(time - 9*60*60);
0158 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
0158
0160 #◆クッキーの消化設定
0161 # 最終書き込みから 30日後 30*24*60*60
0162 #           1日後 24*60*60
0163 #          10時間後 10*60*60
0164 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time+365*24*60*60);
0165
0166 #◆入力形式の設定 標準入力:1(post) その他:0(get)
0167 # 投稿ボタンを押して Method not implemented.. 等というエラーが出る場合はget で試すこと
0168 # getの場合は文字制限がありますので長い文章等は途中で切れる可能性があります.
0169 # さらに、getの場合は不要な悪戯を受けてしまう環境になりますので、注意してください.
0170 # POST:1 GET:0
0171 $method = 1;
0172
0173 # ----<ここから>---- #
0174 #(◎) 新規追加サービス (◎)#
0175 #(◎) 二重書き込み禁止設定 (◎)#
0176 #(◎) 二重書き込みを禁止する (非通知):2 (◎)#
0177 #(◎) 二重書き込みを禁止する (通知型):1 (◎)#
0178 #(◎) 二重書き込みを禁止しない(無視型):0 (◎)#
0179 $mflag = 2 ;
0180 # ----<ここまで>---- #
0181
0182 # ----<ここから>---- #
0183 #(◎) 投稿者名チェック (◎)#
0184 #(◎) 投稿を禁止する :1 (◎)#
0185 #(◎) 投稿を禁止しない:0 (◎)#
0186 $chkname = 1 ;
0187
0188 #(◎) 禁止投稿者名(この名前で投稿するとブラウザがクラッシュします。)(◎)#
0189 @nameng = (
0190 "アニキ",
0191 "サブ",
0192 "ボス",
0193 "匿名",
0194 "anonymous"
0195 );
0196 # ----<ここまで>---- #
0197
0198 # ----<ここから>---- #
0199 #(◎) 新規追加サービス(◎)#
0200 #(◎) 特定ホストからのアクセス禁止設定 (◎)#
0201 #(◎) アクセスを禁止する :1 (◎)#
0202 #(◎) アクセスを禁止しない:0 (◎)#
0203 $reject = 1 ;
0204
0205 #(◎) 変更不可 (◎)#
0206 $wflag = 0 ;
0207
0208 #(◎) アクセス禁止ホスト名の設定 (◎)#
0209 @reject_host = (
0210 "186\.32\.1\.31",
0211 "186\.32\.1\.35",
0212 "186\.32\.1\.36",
0213 "209\.75\.196.2",
0214 "anonymizer\.com",
0215 "",
0216 );
0217 # ----<ここまで>---- #
0218
0219 # ----<ここから>---- #
0220 #(◎) 新規追加サービス (◎)#
0221 #(◎) NGワードチェック設定 (◎)#
0222 #(◎) 不適切な投稿を禁止する :1 (◎)#
0223 #(◎) 不適切な投稿を禁止しない:0 (◎)#
0224 $lang = 1 ;
0225
0226 #(◎) NGワードの設定 (◎)#
0227 #(◎) データフォーマットは、単語数(1≦n≦3) 単語1 単語2 or @@@@ 単語3 or @@@@ (◎)#
0228 #(◎) 各項目は、必ずブランク(半角)で結合すること (◎)#
0229 @ngword = (
0230 "1 いい根性 @@@@ @@@@",
0231 "2 攻撃前準備 軍団 @@@@",
0232 "2 掲示板 破壊 @@@@",
0233 "3 下らない 掲示板 破壊",
0234 );
0235 # ----<ここまで>---- #
0236
0237 # ----<ここから>---- #
0238 #(◎) アクセスログを記録する(投稿者の詳細なログは投稿一覧画面でも確認できます)(◎)#
0239 #(◎) 記録しない: 1 記録する : 0 (◎)#
0240 $alog = 0;
0241
0242 #(◎) ログ最大記録件数(設定数値以上のものは古いものから順に削除されます)(◎)#
0243 $logcnt = "500";
0244
0245 #(◎) アクセスログを使う場合は保存ファイル名を設定 (◎)#
0246 $access_log = "./log.txt";
0247 # ----<ここまで>---- #
0248
0249 # ----<ここから>---- #
0250 #(◎) IPを吐かないプロキシ経由でのアクセスと書き込みの許可設定 (◎)#
0251 #(◎) 許可する : 0 書き込みのみ拒否する(閲覧は可): 1 閲覧、書き込み共に拒否:2 (◎)#
0252 $proxy = 1;
0253 # ----<ここまで>---- #
0254
0255 #(◎) 新規追加サービス (◎)#
0256 &connect_chk;
0257
0258 #(◎) 新規追加サービス (◎)#
0258 if ($proxy eq '2') { &proxy_chk;}
0260
0261 ###########################################################################################
0262 #
0263 # ・記録ファイルには処理の都合上特殊コードが記録されますので、直接編集はできません。
0264 # ・スクリプトの中身を書き替える場合は、perlやCGIやHTMLなどのそれなりの知識が必要です。
0265 #
0266 ###########################################################################################
0267
0268 @wday_array = ('日','月','火','水','木','金','土');
0269 $date_now = sprintf("%01d月%01d日(%s)%02d時%02d分",$mon+1,$mday,$wday_array[$wday],$hour,$min);
0270 $date_num = sprintf("%02d%02d%02d%02d%02d",$mon +1,$mday,$hour,$min,$sec);# <-変更禁止
0271
0272 &lock0;
0273
0274 if ($method eq '1' && $ENV{'QUERY_STRING'} ne '') { &error('エラー','不正利用の可能性があります.');}
0275
0276 if ($method eq '1') { $method = 'post'; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});}
0277 else { $method = 'get'; $buffer = $ENV{'QUERY_STRING'}; }
0278
0279 @pairs = split(/&/,$buffer);
0280 @pairs = (grep(/^action=/,@pairs),grep(!/^action=/,@pairs));
0281 foreach $pair (@pairs) {
0282
0283 ($name, $value) = split(/=/, $pair);
0284 $value =~ tr/+/ /;
0285 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
0286
0287 &jcode'convert(*value,'sjis');
0288
0289 if ($value =~ /(.*)\"\,\"(.*)/) { &error('記入ミス','記録できない文字の並び「","」があります.');}
0290 $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g;
0291
0292 if ($s_mail && $name eq 'value') {
0293
0294 $mail_value = $value;
0295 if ($mail_value =~ /\r\n/) { $mail_value =~ s/\r\n/\n/g; }
0296 if ($mail_value =~ /\r/) { $mail_value =~ s/\r/\n/g; }
0297 }
0298
0299 if ($FORM{'action'} eq 'regist') {
0300
0301 if ($value =~ /\r\n/) { $value =~ s/\r\n/\r/g; }
0302 if ($value =~ /\n/) { $value =~ s/\n/\r/g; }
0303 }
0304
0305 if ($name eq 'name' || $name eq 'email') { $value =~ s/\;//g; $value=~ s/\://g; $value =~ s/\,//g; }
0306
0307 if ($name eq 'target') { push(@RM,$value); }
0308 else { $FORM{$name} = $value; }
0309 }
0310
0311 if ($FORM{'action'} eq 'password') { &encode; }
0312
0313 $cookies = $ENV{'HTTP_COOKIE'};
0314
0315 @pairs = split(/;/,$cookies);
0316 foreach $pair (@pairs) {
0317
0318 ($name, $value) = split(/=/, $pair);
0319 $name =~ s/ //g;
0320 $DUMMY{$name} = $value;
0321 }
0322
0323 @pairs = split(/,/,$DUMMY{$reload});
0324 foreach $pair (@pairs) {
0325
0326 ($name, $value) = split(/:/, $pair);
0327 $COOKIE{$name} = $value;
0328 }
0329
0330 if ($FORM{'admin'} eq 'change') { &password; exit; }
0331 if ($FORM{'action'} eq 'remove') { &remove; }
0332 elsif ($FORM{'action'} eq 'regist') { &regist; }
0333
0334 if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$fileが設定された場所にありません."); }
0335 @lines = <DB>;
0336 close(DB);
0337
0338 if (-z "$tmp_dir\/$file") { $first = 1; &password; exit;}
0339 elsif (@lines[0] =~ /MiniBBSv8/) { &error('データエラー',"$fileのデータ形式は簡易BBSv8シリーズのものと思われますので使えません.");}
0340 elsif (!(@lines[0] =~ /MiniBBSv9/)) { &error('データエラー',"$fileのデータはこの簡易BBSでは使えない構造である可能性があります.");}
0341
0342 &html;
0343 exit;
0344
0345 sub html {
0346 &chk_acount;
0347
0348 #--- 入力フォーム画面 --------------------------------#
0349
0350 print "Content-type: text/html\n\n";
0351
0352 print "<html><head><title>$title</title></head>\n";
0353 print "$body\n";
0354 #(☆) フォントサイズを変更する (☆)#
0355 # print "<h1>$title</h1>\n";
0356 print "<font size=5>$title</font><br>";
0357
0358 print "$msg_top1\n";
0358 print "$msg_top2\n";
0360 print "$msg_top3<p>\n";
0361
0362 print "<form method=$method action=\"$reload\">\n";
0363 print "<input type=hidden name=\"action\" value=\"regist\">\n";
0364
0365 print "投稿者 <input type=text name=\"name\" size=20 value=\"$COOKIE{'name'}\" maxlength=19><br>\n";
0366 print "メール <input type=text name=\"email\" size=40 value=\"$COOKIE{'email'}\"><br>\n";
0367 print "題 名 <input type=text name=\"subject\"size=70 maxlength=69><br>\n";
0368 print "内 容 <font size=-1> ";
0369 print "<input type=radio name=\"how\" value=\"2\"checked>改行有効 ";
0370 print "<input type=radio name=\"how\" value=\"0\">改行無効";
0371 print "<input type=radio name=\"how\" value=\"1\">図/表\モード</font><br>\n";
0372 print "<textarea name=\"value\" rows=5 cols=70></textarea><br>\n";
0373 print "<font size=-1><input type=checkbox name=\"link\"value=\"1\" checked>URL/Emailをリンクする</font><p>\n";
0374
0375 print "<input type=submit value=\" 書き込む \"><inputtype=reset value=\"書き直し\"> ";
0376 print "削除キー <input type=password name=\"pwd\"size=10 value=\"$COOKIE{'pwd'}\"> <font size=-1>(記事削除時に使用)</font></form><p>";
0377
0378 print "$msg_mid1\n";
0379 print "$msg_mid2\n";
0380 print "$msg_mid3<p>\n";
0381
0382 #(☆) 投稿画面をカスタマイズする (☆)#
0383 # print "<table border=1 cellpadding=2 cellspacing=2><tr>\n";
0384 # print "<th><font size=+1><a href=\"$reload\">更新</a></font></th>\n";
0385 # print "<th><font size=+1><a href=\"$modoru\"target=\"_top\">終了</a></font></th>\n";
0386 # print "</tr></table><p>\n\n";
0387
0388 #--- 記録記事の出力 ----------------------------------#
0389 #(◎) 新規追加サービス (◎)#
0390 # ここから3ステップは、アカウントチェックを追加したため、データファイルを再度読み込む処理です.#
0391 # アカウントチェックを実行しない場合は、コメントにして下さい.(オーバーヘッド対策!)#
0392 if (!open(DB,"$tmp_dir\/$file")) { &error(0); }
0393 @lines = <DB>;
0394 close(DB);
0395 # ここまで #
0396
0397 @lines = reverse(@lines);
0398
0399 if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'};}
0400
0401 $page_end = $page + $def - 1;
0402 if ($page_end > $#lines) { $page_end = $#lines; }
0403
0404 print "<form method=$method action=\"$reload\">\n";
0405 print "<input type=hidden name=\"action\" value=\"remove\">\n";
0406
0407 foreach ($page .. $page_end) {
0408
0409 if ($lines[$_] =~ /^\"(\d+)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\",\"(.*)\"/){
0410
0411 $number = $1;
0412 $pwd = $2;
0413 $name = $3;
0414 $email = $4;
0415 $host = $5;
0416 $date = $6;
0417 $subject = $7;
0418 $link = $9;
0419 $how = $10;
0420
0421 $value = $8;
0422 $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g;
0423
0424 if ($link == 1) {
0425
0426 $value =~ s/(https?|ftp|gopher|telnet|whois|news):\/\/([\w|\!\#\$\%\&\(\)\=\-\^\`\\\|\@\~\[\{\]\}\;\+\:\*\,\.\?\/]+)/
0427 <a href=\"$1:\/\/$2\" ta0001 rget=\"_blank\">$1:\/\/$2<\/a>/g;
0428 $value =~ s/([\w|\!\#\$\%\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+)\@([\w|\!\#\$\%\'\(\)\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+)/
0429 <a href="mailto:$1\@$2">0001 $1\@$2<\/a>/g;
0430 }
0431
0432 print "<hr size=5><p>\n";
0433 #(☆) フォントサイズを変更する (☆)#
0434 # print "<table width=100% border=0><tr><td bgcolor=$title_back><font size=+2 color=$title_str><b>$subject</b></font></td></tr></table>\n";
0435 print "<table width=100% border=0><tr><td bgcolor=$title_back><font size=+1 color=$title_str><b>$subject</b></font></td></tr></table>\n";
0436
0437 print "<i><b>投稿日</b> $date ";
0438 if ($email) { print "<b>投稿者</b> <a href=\"mailto:$email\">$name</a>[$host] "; } else { print "投稿者 $name [$host] "; }
0439
0440 print "<input type=checkbox name=\"target\" value=\"$number\">削除<p></i>\n";
0441
0442
0443 #(☆) フォントサイズを変更する (☆)#
0444 # print "<blockquote><font size=+1>\n";
0445 print "<blockquote><font size=+0>\n";
0446
0447 if ($how == 1) { print "<pre>$value</pre><p>\n";}
0448 elsif ($how == 2) { $value =~ s/\r/<br>\r/g; print "$value<p>\n";}
0449 else { print "$value<p>\n"; }
0450
0451 print "</font></blockquote>\n";
0452 }
0453 }
0454
0455 #--- 改ページ処理 ------------------------------------#
0456
0457 $page_next = $page_end + 1;
0458 $i = $page + 1; $j = $page_end + 1;
0458
0460 print "<hr><p><table border=1 cellpadding=2 cellspacing=2><tr>\n";
0461
0462 print "<td>削除キー <input type=password name=\"pwd\"size=10 value=\"$COOKIE{'pwd'}\"> ";
0463 print "<input type=submit value=\"削除\"></td></form>\n";
0464
0465 if ($#lines >= 0) {
0466
0467 if ($page_end ne $#lines) {
0468
0469 print "<td>新着順 $i \- $j</td>\n";
0470 print "<form method=$method action=\"$reload\">\n";
0471 print "<input type=hidden name=\"page\" value=\"$page_next\">\n";
0472 print "<td><input type=submit value=\"次のページ\"></td></form>\n";
0473 }
0474 else { print "<td>新着順 $i \-&gt; 最後</td>\n";}
0475 }
0476
0477 print "<td>最大記録件数 $max</td>\n";
0478
0479 #(☆) 投稿画面をカスタマイズする (☆)#
0480 # print "<th><font size=+1><a href=\"$reload\">更新</a></font></th>\n";
0481 # print "<th><font size=+1><a href=\"$modoru\"target=\"_top\">終了</a></font></th>\n";
0482 # print "</tr></table><p>\n\n";
0483 print "</table><p>\n\n";
0484
0485 print "$msg_btm1\n";
0486 print "$msg_btm2\n";
0487 print "$msg_btm3<p>\n";
0488
0489 print "<table border=1 cellpadding=2 cellspacing=2><tr>\n";
0490 print "<form method=$method action=\"$reload\">\n";
0491 print "<input type=hidden name=\"admin\" value=\"change\">";
0492 print "<td><input type=submit value=\"マスターキー変更\"></td></form>\n";
0493 print "</tr></table><p>\n\n";
0494
0495 # このスクリプトの著作権表示(かならず表示してください)
0496 print "<h5 align=right><a href=\"http://www.rescue.ne.jp/\"target=\"_top\">MiniBBS v9.02</a></h5>\n";
0497
0498 print "</body></html>\n";
0499
0500 }
0501
0502 sub regist {
0503 #(◎) 新規追加サービス (◎)#
0504 if ($proxy eq '1') { &proxy_chk; }
0505
0506 if ($ref_axs) {
0507
0508 $ref = $ENV{'HTTP_REFERER'};
0509 $ref_url = $reload; $ref_url =~ s/\~/.*/g;
0510 if (!($ref =~ /$ref_url/i)) { &error('利用不可',"「$reload」以外からの投稿は受け付けられません.");}
0511 }
0512
0513 if ($FORM{'name'} eq '') { &error('入力ミス','投稿者を記入してください.');}
0514 $FORM{'name'} =~ s/</&lt;/g; $FORM{'name'} =~ s/>/&gt;/g;
0515
0516 if ($FORM{'email'} ne '' && !($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)){ &error('入力ミス','メールアドレスの形式が間違っています.'); }
0517 $FORM{'email'} =~ s/</&lt;/g; $FORM{'email'} =~ s/>/&gt;/g;
0518
0519 if ($FORM{'pwd'} eq '' || $FORM{'pwd'} =~ /\W/ || length($FORM{'pwd'})> 10) {
0520 &error('入力ミス','ボタンの右側にある削除キー欄に10文字以内の半角英数字で記入してくだ 0521 さい.<br>これは記事の削除時に利用するものです.'); }
0522
0523 if ($FORM{'subject'} eq '' && $FORM{'value'} eq '') {
0524
0525 $COOKIE{'name'} = '';
0526 $COOKIE{'email'} = '';
0527 $COOKIE{'pwd'} = '';
0528 &cookie;
0529 print "Set-Cookie: $reload=\n";
0530 if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$fileが設定された場所にありません."); }
0531 @lines = <DB>;
0532 close(DB);
0533
0534 &html;
0535 exit;
0536 }
0537
0538 if ($FORM{'subject'} eq '') { &error('入力ミス','題名を記入してください.');}
0539 $FORM{'subject'} =~ s/</&lt;/g; $FORM{'subject'} =~ s/>/&gt;/g;
0540
0541 #(◎) 新規追加サービス (◎)#
0542 &word_chk ;
0543
0544 if ($FORM{'value'} eq '') { &error('入力ミス','内容を記入してください.');}
0545 if ($max_size) {
0546
0547 $value_size = length($FORM{'value'});
0548 if ($value_size > $max_size) { &error('入力ミス',"最大記録サイズ$max_sizeを超えています.現在$value_sizeサイズです."); }
0549 }
0550
0551 &cookie;
0552 $cook="name\:$FORM{'name'}\,email\:$FORM{'email'}\,pwd\:$FORM{'pwd'}";
0553 print "Set-Cookie: $reload=$cook; expires=$date_gmt\n";
0554
0555 #-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここから --#
0556 # $host = $ENV{'REMOTE_HOST'};
0557 # $addr = $ENV{'REMOTE_ADDR'};
0558 # if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
0559 #-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここまで --#
0560
0561 &lock1;
0562
0563 if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$fileが見つかりません. 設定を確認してください."); }
0564 @lines = <DB>; $password = shift(@lines);
0565 close(DB);
0566
0567 &encode2($FORM{'pwd'});
0568
0569 #(◎) 新規追加サービス (◎)#
0570 &name_chk;
0571
0572 #(◎) 新規追加サービス (◎)#
0573 &reload_chk;
0574 if ($wflag eq 0) {
0575
0576 if ($max <= $#lines + 1) { shift(@lines); }
0577 push(@lines,"\"$date_num\"\,\"$pwd\"\,\"$FORM{'name'}\"\,\"$FORM{'email'}\"\,\"$host\"\,\"$date_now\"\,\"
0578 $FORM{'subject'}\"\,\"$FORM{'value'}\"\,\"$FORM{'link'}\"\,\"$FORM{'how'}\"\n");
0579 }
0580 if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.');}
0581 print DB $password;
0582 print DB @lines;
0583 close(DB);
0584
0585 &lock2;
0586
0587 $COOKIE{'name'} = $FORM{'name'};
0588 $COOKIE{'email'} = $FORM{'email'};
0589 $COOKIE{'pwd'} = $FORM{'pwd'};
0590 if ($s_mail) { &e_mail; }
0591 }
0592
0593 sub cookie {
0594
0595 if ($yearg < 10) { $yearg = "0$yearg"; }
0596 if ($secg < 10) { $secg = "0$secg"; }
0597 if ($ming < 10) { $ming = "0$ming"; }
0598 if ($hourg < 10) { $hourg = "0$hourg"; }
0599 if ($mdayg < 10) { $mdayg = "0$mdayg"; }
0600
0601 $y0="Sunday"; $y1="Monday"; $y2="Tuesday";$y3="Wednesday"; $y4="Thursday"; $y5="Friday";$y6="Saturday";
0001 $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wdayg];
0602
0603 $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr";$m4="May"; $m5="Jun";
0604 $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct";$m10="Nov"; $m11="Dec";
0605 $month = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11) [$mong];
0606
0607 $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
0608 }
0609
0610 sub error {
0611
0612 print "Content-type: text/html\n\n";
0613 print "<html><head><title>$title</title></head>\n";
0614 print "$body\n";
0615 print "<h1>$_[0]</h1>\n";
0616 print "<h3>$_[1]</h3>\n";
0617 print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.<p>\n";
0618 print "</body></html>\n";
0619 exit;
0620 }
0621
0622 sub remove {
0623
0624 &lock1;
0625
0626 if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$fileが見つかりません. 設定を確認してください."); }
0627 @lines = <DB>;
0628 close(DB);
0629
0630 $password = shift(@lines);
0631 chop($password);
0632 ($header,$password1) = split(/:/,$password);
0633 if ($password1 =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; }
0634
0635 $target = join('|',@RM);
0636 if (crypt($FORM{'pwd'}, substr($password1,$salt,2)) eq $password1){ $admin = 1; }
0637
0638 foreach $line (@lines) {
0639
0640 if ($line =~ /^\"(\d+)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\",\"(.*)\"/){
0641
0642 $number = $1;
0643 $pwd = $2;
0644
0645 if ($number =~ /$target/) {
0646
0647 if (!$admin && crypt($FORM{'pwd'}, substr($pwd,$salt,2)) ne $pwd) { push(@NEW,$line);}
0648 }
0649 else { push(@NEW,$line); }
0650 }
0651 }
0652
0653 if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.');}
0654 print DB "$password\n";
0655 print DB @NEW;
0656 close(DB);
0657
0658 &lock2;
0658
0660 @lines = @NEW;
0661 }
0662
0663 sub password {
0664
0665 if (-z "$tmp_dir\/$file") { $first = 1; }
0666
0667 print "Content-type: text/html\n\n";
0668 print "<html><head><title>$title</title></head>\n";
0669 print "$body\n";
0670 print "<h1>マスターキーの設定/変更</h1>\n";
0671
0672 if ($first && $message eq '') { print "記事を削除するための管理パスワードを登録します。<p>\n";}
0673 else { print "$message<p>\n"; }
0674
0675 print "<form method=$method action=\"$reload\">\n";
0676 print "<input type=hidden name=\"action\" value=\"password\">\n";
0677 if (!$first) { print "旧パスワード <input type=password name=\"password_old\"size=10><br>\n"; }
0678 print "新パスワード <input type=password name=\"pwd\"size=10><br>\n";
0679 print "新パスワード <input type=password name=\"pwd2\"size=10>(確認のためもう一度)<p>\n";
0680 print "<input type=submit value=\" 登録 \"></form><p>\n";
0681 print "</body></html>\n";
0682 }
0683
0684 sub encode {
0685
0686 &lock1;
0687
0688 if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$fileが見つかりません. 設定を確認してください."); }
0689 @lines = <DB>;
0690 close(DB);
0691
0692 $password = shift(@lines);
0693 chop($password);
0694 ($header,$password1) = split(/:/,$password);
0695 if ($password1 =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; }
0696
0697 if ($header eq 'MiniBBSv9') { if (crypt($FORM{'password_old'}, substr($password1,$salt,2)) ne $password1) {
0698 $message = '旧パスワードが認証されませんでした.'; &password; exit;}}
0699 if ($FORM{'pwd'} =~ /\W/ || $FORM{'pwd'} eq '') { $message = '新パスワードに英数字以外の文字が含まれているか空欄です.';&password; exit; }
0700 if ($FORM{'pwd'} ne $FORM{'pwd2'}) { $message = '確認のために入力された新パスワードが一致しません.';&password; exit; }
0701
0702 &encode2($FORM{'pwd'});
0703
0704 if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.');}
0705 print DB "MiniBBSv9\:$pwd\n";
0706 print DB @lines;
0707 close(DB);
0708
0709 &lock2;
0710
0711 &html; exit;
0712 }
0713
0714 sub encode2 {
0715
0716 $now = time;
0717 ($p1, $p2) = unpack("C2", $now);
0718 $wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
0719 @saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
0720 $nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
0721 if (!eval '$pwd = crypt($_[0], $nsalt);') { &error('エラー','暗号処理コマンドが使えませんので設置できません.');}
0722 }
0723
0724 sub e_mail {
0725
0726 # 管理者に投稿をメールする
0727
0728 if (!open(OUT,"| $sendmail -t")) { return; }
0729
0730 print OUT "To: $mailto\n";
0731 if ($FORM{'email'} ne '') { print OUT "From: $FORM{'email'}\n";}
0732 else { print OUT "From: $mailto\n"; }
0733 $subject = "[$title] 新着情報";
0734 &jis("Subject: $subject"); print OUT "$msg\n";
0735 print OUT "Content-Transfer-Encoding: 7bit\n";
0736 print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n\n";
0737
0738 &jis("投稿者: $FORM{'name'}"); print OUT "$msg\n";
0739 &jis("Eメール: $FORM{'email'}"); print OUT "$msg\n";
0740 &jis("題名: $FORM{'subject'}"); print OUT "$msg\n";
0741 &jis("\n$mail_value"); print OUT "$msg\n\n";
0742
0743 close(OUT);
0744 }
0745
0746 sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); }
0747
0748 sub lock0 {
0749
0750 $ps = $$;
0751 if ($ps eq '') { $ps = $date_num; }
0752 $tmp_file = "$ps\.tmp";
0753 $ls = "$tmp_dir\/*\.tmp";
0754 }
0755
0756 sub lock1 {
0757
0758 #(★) WindowsNT用にカスタマイズする (★)#
0759 # $list = `ls $ls`;
0760 $list = `dir $ls`;
0761 @lists = split(/\s+/,$list);
0762
0763 local($retry) = 3;
0764 while (@lists) {
0765
0766 if (--$retry <= 0) {
0767
0768 foreach (@lists) { unlink; }
0769 &error("Busy(1)",'ただ今混雑しております.<br>再度実行してください.');
0770 }
0771 sleep(1);
0772 #(★) WindowsNT用にカスタマイズする (★)#
0773 # $list = `ls $ls`;
0774 $list = `dir $ls`;
0775 @lists = split(/\s+/,$list);
0776 }
0777 }
0778
0779 sub lock2 {
0780
0781 #(★) WindowsNT用にカスタマイズする (★)#
0782 # $list = `ls $ls`;
0783 $list = `dir $ls`;
0784 @lists = split(/\s+/,$list);
0785 @lists = grep(!/$tmp_file/,@lists);
0786 if (@lists) { unlink("$tmp_dir\/$tmp_file"); &error("Busy(2)",'書き込みに失敗しました.<br>再度実行してください.');}
0787
0788 #(★) WindowsNT用にカスタマイズする (★)#
0789 if (!unlink("$tmp_dir\/$file")) { &error("Busy(3-1)",'削除に失敗しました.<br>再度実行してください.');} ;
0790 if (!rename("$tmp_dir\/$tmp_file","$tmp_dir\/$file")){ &error("Busy(3)",'書き込みに失敗しました.<br>再度実行してください.');} ;
0791 #(★) WindowsNT用にカスタマイズする (★)#
0792 # chmod 0666,"$tmp_dir\/$file";
0793 }
0794
0795 #(◎) 新規追加サービス (◎)#
0796 sub reload_chk {
0797 $wflag = 0;
0798 if($mflag ne '0'){
0799 $judge="$date_now\"\,\"$FORM{'subject'}\"\,\"$FORM{'value'}";
0800 foreach $line (@lines) {
0801 if(index($line,$judge)>=0) {
0802 if($mflag eq '1') {
0803 &error('二重書き込みエラー',"いたずら防止のために二重投稿を禁止します.");
0804 }
0805 elae{
0806 $wflag = 1;
0807 last;
0808 }
0809 }
0810 }
0811 }
0812 }
0813
0814 #(◎) 新規追加サービス (◎)#
0815 sub connect_chk {
0816
0817 #-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここから --#
0818
0819 $host = $ENV{'REMOTE_HOST'};
0820 $addr = $ENV{'REMOTE_ADDR'};
0821 if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
0822
0823 #-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここまで --#
0824 if($reject ne '0'){
0825 foreach $rhost (@reject_host) {
0826 if ($rhost ne '' && $host =~ /$rhost/i) { &error('アクセスエラー',"Host:$host からのアクセスは禁止されています."); last; }
0827 }
0828 }
0829 }
0830
0831 #(◎) 新規追加サービス (◎)#
0832 #接続規制(名前)をチェックする
0833 sub name_chk {
0834 if($chkname ne '0'){
0835 $formname = $FORM{'name'};
0836 foreach $nemex (@nameng) {
0837 if ($formname =~ /$nemex/i) { &clash ;}
0838 }
0839 }
0840 }
0841
0842 #(◎) 新規追加サービス (◎)#
0843 #NGワードをチェックする
0844 sub word_chk {
0845 if($lang ne '0'){
0846 foreach $language (@ngword) {
0847 ($pi,$language1,$language2,$language3)=($language =~ /^(\S+)\s+(\S+)\s+(\S+)\s*(.*)/);
0848 if($pi eq '1'){
0849 $result1=grep(/$language1/,$FORM{'value'}) ;
0850 if($result1) { error('冗談は顔だけにしなさい。(^_^)',"その手の発言は投稿できません。");last;}
0851 }
0852 elsif($pi eq '2'){
0853 $result1=grep(/$language1/,$FORM{'value'}) ;
0854 $result2=grep(/$language2/,$FORM{'value'}) ;
0855 if($result1 || $result2) { error('冗談は顔だけにしなさい。(^_^)',"その手の発言は投稿できません。");last;}
0856 }
0857 elsif($pi eq '3'){
0858 $result1=grep(/$language1/,$FORM{'value'}) ;
0858 $result2=grep(/$language2/,$FORM{'value'}) ;
0860 $result3=grep(/$language3/,$FORM{'value'}) ;
0861 if($result1 || $result2 || $result3) { error('冗談は顔だけにしなさい。(^_^)',"その手の発言は投稿できません。");last;}
0862 }
0863 }
0864 }
0865 }
0866
0867 #(◎) 新規追加サービス (◎)#
0868 #アクセスデータを取得する
0869 sub chk_acount {
0870 if ($alog eq "0") {
0871 $date = $date_now;
0872 $trueip= &getipadr;
0873 $via = $ENV{'HTTP_VIA'};
0874 $hua = $ENV{'HTTP_USER_AGENT'};
0875 $addr = $ENV{'REMOTE_ADDR'};
0876 $host = $ENV{'REMOTE_HOST'};
0877 if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
0878
0879 $href = $ENV{'HTTP_REFERER'};
0880 if ($href =~ /$reload/) { $href=""; }
0881 elsif ($href =~ /file:/) { $href=""; }
0882
0883 if (!open(LOG,"$tmp_dir\/$access_log")) { &error('設定ミス',"$access_logが見つかりません. 設定を確認してください."); }
0884 @lines=<LOG>;
0885 close(LOG);
0886
0887 $axs=@lines;
0888 $logcnt2 = ($logcnt - 2);
0889 if ($axs >= $logcnt) {
0890 if (!open(LOG,">$tmp_dir\/$access_log")) { &error('設定ミス',"$access_logが見つかりません. 設定を確認してください."); }
0891 print LOG "[$date] $href - $host - $addr - $via - $trueip - $hua\n";
0892 foreach $axs (0..$logcnt2) {
0893 print LOG $lines[$axs];
0894 }
0895 }
0896 else {
0897 if (!open(LOG,">$tmp_dir\/$access_log")) { &error('設定ミス',"$access_logが見つかりません. 設定を確認してください."); }
0898 print LOG "[$date] $href - $host - $addr - $via - $trueip - $hua\n";
0899 foreach $log (@lines) {
0900 print LOG $log;
0901 }
0902 }
0903 close(LOG);
0904 }
0905 }
0906
0907 #(◎) 新規追加サービス (◎)#
0908 #IPアドレスを収集し編集する
0909 sub getipadr{
0910 $trueip=$ENV{'HTTP_SP_HOST'} if( $ENV{'HTTP_SP_HOST'} ne "");
0911 $trueip=$ENV{'HTTP_VIA'} if( $ENV{'HTTP_VIA'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/);
0912 $trueip=$ENV{'HTTP_CLIENT_IP'} if( $ENV{'HTTP_CLIENT_IP'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/);
0913 $trueip=$ENV{'HTTP_FORWARDED'} if( $ENV{'HTTP_FORWARDED'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/);
0914 $trueip=$ENV{'HTTP_X_FORWARDED_FOR'} if( $ENV{'HTTP_X_FORWARDED_FOR'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/);
0915 $trueip=$ENV{'HTTP_FROM'} if( $ENV{'HTTP_FROM'} ne "");
0916 return $trueip;
0917 }
0918
0919 #(◎) 新規追加サービス (◎)#
0920 #プロキシ接続をチェックする
0921 sub proxy_chk {
0922 $addr = $ENV{'REMOTE_ADDR'};
0923 $host = $ENV{'REMOTE_HOST'};
0924 $CONNECTION = $ENV{'HTTP_PROXY_CONNECTION'};
0925 $INFO = $ENV{'HTTP_CACHE_INFO'};
0926 $VIA = $ENV{'HTTP_VIA'};
0927 $XFOR = $ENV{'HTTP_X_FORWARDED_FOR'};
0928 $FORWARDED = $ENV{'HTTP_FORWARDED'};
0929 $hua = $ENV{'HTTP_USER_AGENT'};
0930 if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
0931 $proxy=0;
0932 if($CONNECTION ne ""){ $proxy=1;}
0933 if($INFO ne ""){ $proxy=1;}
0934 if($VIA ne ""){ $proxy=1;}
0935 if($XFOR ne ""){ $proxy=1;}
0936 if($FORWARDED ne ""){ $proxy=1;}
0937 if($host =~/proxy|cache|^delegate|^dns|keeper|^mail|www|^ns\./i){$proxy=1;}
0938 if($hua=~ /via|squid|delegate|httpd|proxy|cache/i){ $proxy=1;}
0939
0940 # << 一般のプロキシ(漏れプロキシ)は許す >> #
0941 # << 全てアクセスを禁止する場合は下3行を削除する >> #
0942 if($XFOR =~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/ ){ $proxy=0;}
0943 if($FORWARDED =~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ){ $proxy=0;}
0944 if($VIA =~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ ){ $proxy=0;}
0945
0946 if($proxy){ &proxyerror('匿名プロキシ','匿名プロキシ経由は許可されていません.',"ADDRESS:$addr",
0947 "HOST:$host","CONNECTION:$CONNECTION","INFORMATION:$INFO","VIA:$VIA",
0948 "XFORWARDED:$XFOR","FORWARDED:$FORWARDED","HUA:$fua");}
0949 }
0950
0951 #(◎) 新規追加サービス (◎)#
0952 #プロキシ接続規制の場合のメッセージを表示する
0953 #一応、知り得る範囲内で、接続情報を表示する
0954 sub proxyerror {
0955
0956 print "Content-type: text/html\n\n";
0957 print "<html><head><title>$title</title></head>\n";
0958 print "$body\n";
0958 print "<h1>$_[0]</h1>\n";
0960 print "<h3>$_[1]</h3>\n";
0961 print "$_[2]<br>\n";
0962 print "$_[3]<br>\n";
0963 print "$_[4]<br>\n";
0964 print "$_[5]<br>\n";
0965 print "$_[6]<br>\n";
0966 print "$_[7]<br>\n";
0967 print "$_[8]<br>\n";
0968 print "$_[9]<br>\n";
0969 print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.<p>\n";
0970 print "</body></html>\n";
0971 exit;
0972 }
0973
0974 #(◎) 新規追加サービス (◎)#
0975 #ブラウザをクラッシュさせる
0976 sub clash {
0977 error('冗談は顔だけにしなさい。(^_^)',"$language な発言は入力できません");
0978 print "Content-type: text/html\n\n";
0979 print "<html><head><title>$title</title></head>\n";
0980 print "$body\n";
0981 print "<h3>クラッシュ</h3>\n";
0982
0983 print "<table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table>
0984 <tr><td><table><tr><td><table><tr><td><table><tr><td>\n";
0985 print "<table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table>
0986 <tr><td><table><tr><td><table><tr><td><table><tr><td>\n";
0987 0001 print "<table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table>
0988 <tr><td><table><tr><td><table><tr><td><table><tr><td>\n";
0989 print "<table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table>
0990 <tr><td><table><tr><td><table><tr><td><table><tr><td>\n";
0991 print "<table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table>
0992 <tr><td><table><tr><td><table><tr><td><table><tr><td>\n";
0993 print "<table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table><tr><td><table>
0994 <tr><td><table><tr><td><table><tr><td><table><tr><td>\n";
0995 print "</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
0996 </td></tr></table></td></tr></table></td></tr></table></td></tr></table>\n";
0997 print "</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
0998 </td></tr></table></td></tr></table></td></tr></table></td></tr></table>\n";
0999 print "</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
1000 </td></tr></table></td></tr></table></td></tr></table></td></tr></table>\n";
1001 print "</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
1002 </td></tr></table></td></tr></table></td></tr></table></td></tr></table>\n";
1003 print "</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
1004 </td></tr></table></td></tr></table></td></tr></table></td></tr></table>\n";
1005 print "</td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table>
1006 </td></tr></table></td></tr></table></td></tr></table></td></tr></table>\n";
1007 print "</body></html>\n";
1008 exit;
1009 }