#! /usr/local/bin/perl # # ↑このパスはプロバイダによって違うので調べて設定します。 # # 簡易BBS version 6.2(フリーソフト) # # Script written by Kazu.Y # Created on: 96年5月2日 # Last Modified on: 97年3月29日 # I can be reached at: rescue@ask.or.jp # Scripts Found at: http://www.ask.or.jp/~rescue/ # # <利用規定の抜粋> # 1.このスクリプトは自分で使うために承諾なしに自由に改造することができます。 # 2.改造の有無にかかわらず、このスクリプトを再配布することはできません。 # # <準備> # 1.この minibbs.pl は minibbs.cgi にファイル名を変更して、パーミッションを 755 に設定します。 # 2.このプログラムの他に minibbs.dat という中身の無いからっぽのファイルを用意して、パーミッションを 666 に設定します。 ########################################################################################### # # 初期設定 # # 日本語コード変換ライブラリ(v2.0)の指定 # (このCGIと同じディレクトリに設置する場合は、'./jcode.pl'でよい) require './jcode.pl'; # 設置するURLを設定 $reload = 'http://www.efn.org/~gmine/minibbs.cgi'; # 内容が書き込まれる記録ファイルのパスを設定 # (このCGIと同じディレクトリに設置する場合は、'./minibbs.dat'でよい) $file = './minibbs.dat'; # 削除モード移行パスワードの設定 $password = 'unchiko'; # 掲示板の名前 $title = 'ただの伝言板'; # 1ページに表示する件数 $def = 30; # 書き込み件数の最大登録数の設定です。この件数を超えると、古いものから削除されていきます。 # ページ処理機能が付きましたので、この件数を大きくしても一度に表示される記事数は限定されます。 # 記録されたファイルの巨大化を防止する為に、ある程度の件数で自動削除されるようにします。 $max = '60'; # 海外サーバ等で時差が生じる場合は修正します # 海外時間に+9時間する場合 = localtime(time + 9*60*60); # 海外時間に−9時間する場合 = localtime(time - 9*60*60); # (参考)timeには1970年からの秒数が入っています ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); # クッキーを格納する名前を設定する # 複数の簡易BBSまたは他スクリプトで同じ名前のクッキーを使用すると弊害がある場合があります。 # 任意の英数字を設定します。 $cookie_name = 'user-00'; # クッキーの消化設定 # 最終書き込みから 30日後 30*24*60*60 # 1日後 24*60*60 # 10時間後 10*60*60 $ENV{'TZ'} = "GMT"; # 時刻取得を国際標準時とする ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = localtime(time + 30*24*60*60); ########################################################################################### # 上記の$monには0から11までの数字が入るので修正処理 $month = ($mon + 1); # 時刻を2桁に統一する処理 if ($month < 10) { $month = "0$month"; } if ($mday < 10) { $mday = "0$mday"; } if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } # 曜日変換処理 # $wdayには0から6までの数字が入り曜日に対応している $y0="日"; $y1="月"; $y2="火"; $y3="水"; $y4="木"; $y5="金"; $y6="土"; $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wday]; # 時刻フォーマット $date_now = "$month月$mday日($youbi)$hour時$min分$sec秒"; # フォーム入力されたデータを$bufferに格納する(getかpostかによって取得方法が異なる) if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # $bufferに格納されたデータを解析し、パーツごとに分けるためのサブルーチンへ &form; # 全体の流れを決定する(actionやpwdはフォーム入力されたデータを格納する名前) # action=remove かつ pwd=設定パスワード --> 削除処理して通常画面へ # action=remove --> 削除記事選択画面へ # action=regist --> 記事記録処理して通常画面へ # その他 --> 通常画面へ if ($FORM{'action'} eq 'remove' && $FORM{'pwd'} eq $password) { &remove2; &remove1; exit; } elsif ($FORM{'pwd'} eq $password) { &remove1; exit; } elsif ($FORM{'action'} eq 'regist') { ®ist; &html; } elsif ($FORM{'page'} ne '') { &html; } else { &html; } sub html { # <通常画面を生成するサブルーチン> # クッキーの取得(独自方式) $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookie_name}); foreach $pair (@pairs) { ($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } # 記録ファイルを読み出しオープンして、配列<@lines>に格納する if (!open(DB,"$file")) { &error(0); } @lines = ; close(DB); # CGIで出力されたデータをHTMLとして認識させるヘッダの出力 print "Content-type: text/html\n\n"; # ここからが画面の出力 # # 変数(頭に$が付いている英数字)が文字列にない場合は、表示文字列を '' で囲み、最後に . "\n"; を付ける # 例 print 'あいうえお

' . "\n"; # # 変数がある場合は、その変数を例のように囲む # 例 print '最高' . $i . '件の記録ができます。

' . "\n"; # # または、""で囲ってもよいが、その中に""を入れる場合は、中に入る " の前に \ を入れる # 例 print "最高$i件の記録ができます。こちらを読んでください。

\n"; # # 文字化けについてはFAQを参照のこと print '' . $title . '' . "\n"; print '' . "\n"; print '

みんなのでででででんごんばん!

' . "\n"; # 投稿ボタンを押して Method not implemented.. というエラーが出る場合は post の代わりに get で試す print '

' . "\n"; print '' . "\n"; print 'なまえ:
' . "\n"; print 'めーるあどれす:
' . "\n"; print 'なまえをブラウザに記憶させとく

' . "\n"; print '

内容:
(アイウエオナンデスヨってやつは使えません。 ふつーのカナでうつっちゃいます)
' . "\n"; print '
 

' . "\n"; print '' . $max . '件まで表示します
'; print '1回の表示で' . $def . '件を越えたら次のページにいけます。


' . "\n"; # 記事一覧処理 # 配列<@lines>から1件ずつデータを取り出して処理する if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } $accesses = @lines; $accesses--; $page_end = $page + $def - 1; if ($page_end > $accesses) { $page_end = $accesses; } foreach ($page .. $page_end) { # データを各変数に代入する ($date,$name,$email,$value,$subject) = split(/\,/,$lines[$_]); # メールアドレスが記録されているデータにはリンクを付ける if ($email ne '') { print ' ' . $name . '' . "\n"; } else { print '' . $name . '' . "\n"; } print ' 投稿日:' . $date . '

' . "\n"; $value =~ s/\r/
/g; print"
$value


\n"; } print '

' . "\n"; $page_next = $page_end + 1; $i = $page + 1; $j = $page_end + 1; if ($page_end ne $accesses) { print "$i番目から$j番目のメッセージ・イズ・ヒア。

\n"; print '

' . "\n"; print '' . "\n"; print '
' . "\n"; } else { print "現在登録されている新着順$i番目から$j番目までの記事です。
\n"; print 'これ以上のメッセージはないそうだ。
' . "\n"; } print '
' . "\n"; print '

パスワード:' . "\n"; print '

' . "\n"; # このスクリプトの著作権表示(かならず表示してください) print '

MiniBBS v6.2 is Free.


| メインページ へ戻る |




gmine@efn.org

' . "\n"; } sub regist { # 入力されたデータのチェック if ($FORM{'name'} eq "") { &error(1); } if ($FORM{'value'} eq "") { &error(2); } if ($FORM{'email'} ne "") { if (!($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)) { &error(3); }} $FORM{'name'} =~ s//>/ig; $FORM{'subject'} =~ s//>/ig; if ($FORM{'cookie'} eq "on") { # クッキーの仕様通りに真面目にフォーマット(指定時刻はGMT) # クッキーの仕様書 http://www.netscape.com/newsref/std/cookie_spec.html if ($yearg < 10) { $yearg = "0$yearg"; } if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wdayg]; $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; $month = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11) [$mong]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; # 独自方式のクッキーフォーマット # # この簡易BBSでは名前とメールアドレスを保存の対象にしています。 # それぞれを独立したクッキーとしてブラウザに食べさせればとても簡単ですが、 # ブラウザがクッキーを格納できる数に制限があるため、できるだけ一つのクッキーに # 保存データをまとめて食べさせることが望まれます。そのためにここでは独自の方法で # 1つのクッキー内に複数のデータを詰め込み、クッキーの取得時にそれらを展開して利用しています。 #  # name:,email: という形式にまとめて、これを一つのクッキーとして # cookieという名前でブラウザに送信しています。 # # 独自フォーマット cookie=name:,email: $cook="name\:$FORM{'name'}\,email\:$FORM{'email'}"; print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n"; } else { # 保存しない場合は、空のデータを保存させることで前のデータを消去する print "Set-Cookie: $cookie_name=; expires=$date_gmt\n"; } # 記入者のリモートホスト名を取得する(これは表示されずHTMLソースで閲覧できる) $id = $ENV{'REMOTE_HOST'}; # 記録ファイルを読み出しオープンして、配列<@lines>に格納する if (!open(DB,"$file")) { &error(0); } @lines = ; close(DB); # 最大保持記録数の処理 $i = 0; foreach $line (@lines) { $i++; if ($i == $max) { last; } push(@new,$line); } $value = "$date_now\,$FORM{'name'}\,$FORM{'email'}\,$FORM{'value'}\,$FORM{'subject'}\n"; unshift(@new,$value); # 記録ファイルを上書きオープンして、配列<@new>を書き出す if (!open(DB,">$file")) { &error(0); } print DB @new; close(DB); # 記録処理後、再読み込みする print "Location: $reload" . '?' . "\n\n"; exit; } sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = '記録ファイルの入出力にエラーが発生しました。'; } elsif ($error eq "1") { $error_msg = '名をなのれ!'; } elsif ($error eq "2") { $error_msg = '何が言いたいのかちゃんと書いてちょ〜'; } elsif ($error eq "3") { $error_msg = '冒険の書が消えました・・・じゃなくてメールアドレスがちゃんと書かれてないらしいぞぃ。 チェックするべし…。'; } elsif ($error eq "4") { $error_msg = '題名忘れたようでっせ、おやびん'; } print "Content-type: text/html\n\n"; print '' . $title . '' . "\n"; print '' . "\n"; print '

おしらせ

' . "\n"; print "$error_msg\n"; print '

' . "\n"; exit; } sub form { # $bufferに格納された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/\n//g; $value =~ s/\,//g; # 掲示板に書き込まれたくないタグが含まれる内容を消去する(タグが使える場合) # ここでは、; close(DB); print "Content-type: text/html\n\n"; print '削除モード' . "\n"; print '' . "\n"; print '削除モード ' . "\n"; print '[戻る]

' . "\n"; print '

' . "\n"; print '' . "\n"; print '
';
   print '   登録日                  投稿者               タイトル              内容
'; foreach $line (@lines) { ($date,$name,$email,$value,$subject) = split(/\,/,$line); $name =~ s//>/ig; $subject =~ s//>/ig; chop($subject) if $subject =~ /\n/; $value =~ s///ig; $value =~ s//>/ig; $value =~ s/\n/./g; $value =~ s/\r/./g; $i1 = length($subject); if ($i1 > 20) { $subject = substr($subject,0,18); $subject = $subject . '..'; } elsif ($i1 < 20) { $blank = ' ' x (20 - $i1); $subject = $subject . $blank; } $i2 = length($name); if ($i2 > 20) { $name = substr($name,0,18); $name = $name . '..'; } elsif ($i2 < 20) { $blank = ' ' x (20 - $i2); $name = $name . $blank; } if (length($value) > 40) { $value = substr($value,0,40); } print ""; print "$date $name $subject $value\n"; } print "

\n"; print '' . "\n"; print '' . "\n"; print '

' . "\n"; print "\n"; } sub remove2 { if (!open(DB,"$file")) { &error(0); } @lines = ; close(DB); foreach $line (@lines) { ($date,$name,$email,$value,$subject) = split(/\,/,$line); $del = 0; foreach $target (@RM) { if ($target eq $date) { $del = 1; } } if ($del == 0) { push(@new,$line); } } if (!open(DB,">$file")) { &error(0); } print DB @new; close(DB); } #end_of_script