============================================================================== gwBBS 3.0 (code name "Gloriosa(グロリオサ)") 仕様書 ============================================================================== 最終更新日:2003-01-14 14:05 ■概要 本体を核として,そこから拡張スクリプト形式で機能拡張を施せるタイプの Web 掲示板です. 言語は Perl スクリプトを使用します. ■拡張スクリプトのインプリメント 今回はメインで使用するする部分以外は全て拡張スクリプトとして別にします. これにより部分編集を可能にし,メインスクリプトの肥大化を防ぎます. 別ファイルの変数定義は,メインスクリプトで行わずに,分割されている拡張 スクリプトで行います. メインスクリプトは拡張スクリプトが無くても動作に支障が出ないようにしな ければなりません. サブスクリプト内で組込エラーが発生した場合は eval でエラーレベルが返り ます. エラーレベルが格納される変数は $PLUGIN_FLAG{PLUGIN_FILENAME}; となっています. PLUGIN_FILENAME には拡張スクリプトのファイル名 (plugin.pl) が入ります. このエラーレベルは 2種類に分かれていて,以下のようなものになっています. 0: require 失敗 原因:ファイルが存在しない,require したときのスクリプトエラー など 1: require 成功 拡張スクリプトを製作する場合は,このエラーレベルを必ず組み合わせて命令 を実行してください. エラーレベルを見ないで実行すると,拡張スクリプトのインプリメントに失敗 していたときに致命的エラーでエラーになります. ■開発順序 各スクリプトの開発順序は現在以下のようになっています. *1 DPL:Development Priority Level (開発優先レベル) config.pl (属性:MAIN / DPL:LEVEL-1) CGI 内部固有の設定を別ファイルにもたせたもの. これにより複数の掲示板をまとめてアップデートする際には本体を差 し替えるだけで済むことになる. gwbbs.cgi (属性:MAIN / DPL:LEVEL-1) 最低限,書き込み・閲覧・削除・管理者操作 (削除・復活) だけを行 う物とする. 保存ログ型式は現行の「HyperBBS G兄スペシャル」「gwBBS 2.x.x」 を引き継ぐ物とする. gwbbs_config.cgi (属性:MAIN / DPL:LEVEL-1) グロリオサの環境設定を行う. msgcrypt.pl (属性:SUB / DPL:LEVEL-1) 書き込みを暗号化するサブスクリプト. prxenv_save.pl (属性:SUB / DPL:LEVEL-3) アクセスしてきたクライアントの環境変数を抜き出せるだけ全て抜き 出す. access_save.pl (属性:SUB / DPL:LEVEL-2) アクセスログ保存用サブスクリプト. 掲示板を叩いた時点でユーザー情報を抜く. 抜く情報は ・アクセス日付 ・アクセス時間 ・リモートIP ・リモートホスト ・リンク元アドレス ・名前 ※リモートIP/ホストは串の後ろの情報が抜けた場合はそれらの情報 になる ファイルフォーマットは 1バイトカンマ区切りの CSV 型式になり, 新規情報が常に上になる. ログ保存数は gwbbs.ini の acslogsave_max に依存し,0 の場合は 保存数無制限となる. ログファイルは config.pl 内で指定されたログファイル保存ディレ クトリに,サブスクリプト内で指定されたファイルヘッダ文字列 + YYYYMMDD 型式のファイル名で保存される. ログファイルがなければ新規作成され,存在する場合はそれに追記す る形になるので,ログ保存ディレクトリはパーミッションを必ず 777 にしておかなければならない. ログが貯まってきた場合は,ログメンテナンスサイクル毎に圧縮・削 除を行うようになっている. これは,アクセスログサブスクリプトが起動され,ログが保存された 後に現在のログの個数を確認し,古い側から指定個数分のログが貯ま っていれば,それらを圧縮し,不要になったログを削除する. ログ圧縮の個数指定は $mente_cycle で定義され,ログファイルの圧 縮は1つ1つ圧縮されるようになっている. アーカイバは扱いの簡単な LHA を使用しているが,サブルーチン acslog_maintenance の使用しているアーカイバ名を変更することに よってどれにでも対応できるはずである. anonyprx_block.pl (属性:SUB / DPL:LEVEL-2) 匿名串リスト内に含まれるプロキシを使ってアクセスしたユーザーを 弾くためのサブスクリプト. blms.cgi (属性:SUB / DPL:LEVEL-4) メインとサブ,両用のスクリプト. BLMS (Back Log Make System) の名の示すとおり,HTML型の過去ログ を自動生成するスクリプト. これは gwbbs.cgi から叩かれ,独立して動く. また,外部から直接指定で叩くことも可能. なお,過去ログを吐く場合はログが暗号化されていない物のみを対象 とし,その判別はBLMS側で行う. blms.pl (属性:SUB / DPL:LEVEL-4) 生ログ型バックアップログ作成エンジン. これは生ログのバックアップだけを生成する. mdc.pl (属性:SUB / DPL:LEVEL-3) 書き込まれる文字を制限するエンジン.インターネットで利用不可と されている文字のブロックなどに使用. adminonly.pl (属性:SUB / DPL:LEVEL-5) 管理者のみが行える作業をこのファイルに作る. [現行機能] ・パスワード変更 ・スレッドロック titlelist.pl (属性:SUB / DPL:開発途中) タイトル一覧を構築するためだけのサブスクリプト. この中では Gloriosa 自体で表示するタイトルリスト及び外部ファイ ルにタイトルリストを出力するエンジンを持っている. 使用利用スイッチ: use_frame : 1|0 (GET形式 - 可) フレームを使用するかしないか. する :1 しない:0 mailchecker.pl (属性:SUB / DPL:) メールアドレスのドメインが存在するかどうかをチェックするサブス クリプト. 偽ドメインの発見などに使用. 以前は SMTP にユーザーを問い合わし,そのユーザーが存在するかど うかを判断させようとしたが,うまくユーザー検索ができないので取 りやめた. calender.pl (属性:SUB / DPL:開発終了) ※名前空間独立型 スケジュール機能を実装したカレンダー. 試験的に名前空間を独立させて使っている名前空間独立型サブスクリ プト. オプションにより,任意の月の表示が可能となっている. 予定はテーブル左右分割の右側に表示され,左側のカレンダー内には, 予定がある箇所は太文字イタリックで表示され,スケジュールエディ タへのハイパーリンクが張られる. また,左側のカレンダー内にある予定日の上にマウスカーソルを置い たままにしておくと,IE ではポップアップでその日の予定を表示す る (NN ではその仕様のためにポップアップが効かない). 任意の月を表示する場合はフォームデータで gwbbs.cgi にオプショ ンを送信する必要があり,そのオプションは以下のようになっている. cal_year 表示したい年. cal_month 表示したい月. このオプションは GET,POST メソッドの両対応になっている. もしこのオプションが指定されていないときは,&make_date で作成 された当月の年月を使用してカレンダーを生成する. 右側テーブルに表示される予定一覧は,指定もしくは当月の予定以外 は表示しないようにする. 使用するスケジュールファイルのフォーマットは以下のようになって いる. YYYYMMDD,HOLIDAY_FLAG,SCEDULE_DESCRIPTION YYYYMMDD: 422形式の日付を記述. HOLIDAY_FLAG: 休日フラグ. 0:無変更 1:休日 SCEDULE_DESCRIPTION: 予定内容.改行コードは \r になる. 1レコードは必ず1行で記述し,レコード終端文字コードは \n にする こと. スケジュールファイルの格納場所はログファイルと同じ場所にするこ と. カレンダーの表示はユーザー設定での表示設定に依存するばかりでは なく,スレッド単一表示の際にも表示されない. sceduleeditor.cgi (属性:SUB / DPL:開発途中) スケジュールファイルをオンラインで編集するためのスクリプト. 書き込みは,第三者の書き込みを防止するためにパスワードロックを 仕掛けてある. パスワードはシステムパスワードを使用し,パスワード認証は gwbbs.pl/adminpass_check サブルーチンを使用する. スケジュール編集は,当初の予定とは大幅に仕様変更を施し,カレン ダーから予定修正画面へのダイレクトジャンプもサポートするよう, 日別編集を可能にした. スケジュールファイルの格納場所はログファイルと同じ場所にするこ と. この中でも一番ややこしいのは,スケジュールデータの更新アルゴリ ズムだろう. これは別日付への上書きを禁止しないで了承させているためかもしれ ない. ここは, ・まずは入力された日付を走査し,発見されれば削除する.これは新 規登録時もそうなる. accesslogview.cgi (属性:SUB / DPL:開発途中) access_save.pl で生成された日別アクセスログの集計用スクリプト. その機能としては ・ドメイン別集計 ・時間別集計 ・訪問者別集計 を取ることが出来る. ドメイン別集計は,アクセスログに記述されているリモートホスト名 を元に集計をかけている. このドメイン名は辞書引きが出来なく IP アドレスのみが記述されて いる場合があるので,ホスト名が記述されていない場合は IP アドレ スを使用する. ソートはアクセスの多いものを先頭にソートしている. 時間別集計は,アクセスログに記述されている HH:MM:SS 型式の HH を取り出して,それを元に集計をかけている. さらに,そのままだと表示したときに時間順にはならないので,時間 順にソートをしている. 表示はアクセスのあった時間だけではなく,すべての時間において表 示をしている (0〜23時). 訪問者別集計は,アクセスログに記述されているハンドルを元に集計 をかけている. 表示はアクセスの多いものを先頭にソートをして表示している. このスクリプトにはフォーム用オプションがあり,その内容は以下の ようになっている. logfile ログファイルへのファイルパス. 例) 〜.cgi?logfile=./log/acslogYYYYMMDD.txt このオプションは GET,POST メソッドの両対応になっている. このオプションが指定されなかったときは,config.pl で指定された ログファイルディレクトリ内の acslog*.txt を走査し,それをハイ パーリンク化されたリスト表示して終了する. gwbbs.pl (属性:SUB / DPL:LEVEL-1) 各スクリプト共通コード,もしくは再利用の出来るコードを一点に集 めたファイル. この中のサブルーチンを呼び出すことで,複数のスクリプトで共通の コードを使えたり,何度も利用するようなコードを何度も書かなくて も良くなる. 詳しくは gwbbs_pl.txt を参照. 現行開発では,gwbbs.cgi,gwbbs_config.cgi を最優先開発 (LEVEL-1) とす る. レベル数値は,数値が小さくなるにつれて優先度が高くなる. 数値は通常は 1〜だが,0 の「超最優先開発」を発行する場合もあり,これは 主にシステムの不具合や掲示板に対する攻撃悪化などで,現在の開発を中止し てでも優先的に開発を行わなければならないレベルである. 格サブスクリプト内のルーチンを呼び出す場合は,eval を使用して require で各サブスクリプトを取り込み,そのれ返り値を見て使用を判断させること. ■各スクリプトの概要 各スクリプトの概要を説明する. 変数を定義できる部分はなるだけここで定義しておくこと. ○gwbbs.cgi - コアとなるシステム >>保証しなければならない動作: ・書き込み ・閲覧 ・削除 ・管理者の手による記事削除 ・管理者の手による削除記事復活 ・記事検索 (スレッドレベルでの AND/OR) ・クッキー保存 ・カウンタ (サブスクリプト仕様だったがコードが極短いの でこちらに格納) ・設定ファイル読み込み ・gzip 圧縮転送のサポート (サブスクリプトにできないの でこちらに格納) ・インラインリンクサポート (サブスクリプトにできないの でこちらに格納) ・リンク先限定機能 >>現行の gwBBS から省くべき機能 (コアベースと考えたとき) ・ドメインチェックによる閲覧拒否 ・デモモード >>このスクリプト内での開発優先順位 1.書き込み,閲覧,削除,管理者の手による記事削除,クッ キー保存,設定ファイル読み込み 2.インラインリンクサポート,リンク先限定機能 3.記事検索 4.管理者の手による削除記事復活 5.gzip 圧縮転送のサポート ○adminonly.pl - 管理者専用拡張メニュー メニューへは通常,mode の引数を元にして分岐するが,このファイ ル内での分岐はこれにさらにサブキー「ao_mode」を持たせる. これでこのファイル内の分岐を行わせる. また,このファイルで何かの動作を行わせるときは,事前に INPUT タグの HIDDEN オブジェクトでパスワードを常時渡しておく. これは書くサブルーチンの入り口でパスワードチェックを行っている ためであり,これがないとサブルーチンが機能しない. サブルーチンを組む場合は,一度必ずパスワードチェックルーチンへ 飛ばすこと.これを怠るとセキュリティホールの危険性が大きくなる. >>スレッドロック 特定のスレッドを書込禁止にしたいときに使用. $rip(リモートアドレス) の先頭に * を付けることによりロ ックと認識させる. ロックさせた場合は,レス書込用フォームは存在する物の, 書込ボタンがコメントアウトされている. これで通常は書き込めないが,トリッキーなことをすると書 き込めるかも知れないので,サブルーチン regist に,$rip の先頭が * ならば書き込みできないようにする罠を仕掛け ておくこと. >>管理者パスワードの変更 管理者パスワードを変更する. 変更は旧パスワードと新パスワード,新パスワードの確認用 の 3つを同時に入力する. ■各スクリプト内の詳細動作仕様 ○gwbbs.cgi << スレッド構築 >> ログ読み込み:@LOG ↓ ヘッダを吐く ↓ まずはルート記事だけを抜き取る:foreach (@LOG) { if (書き込み表示モードはスレッド?) { NO: $rnb が空の場合は @ROOT に現在のレコードを push で追加 (時系列順表示) ↓ 不要になった書き込みは削除しておく (splice) } elsif ($rnb は空?) { YES: $rnb が空の場合は @ROOT に現在のレコードを push で追加 ↓ 不要になった書き込みは削除しておく (splice) NO :素通り } } ↓ レスは書き込み順,つまり古い順番に表示しなければならないのでこ こで @LOG をひっくり返しておく (reverse) ↓ ルート記事を元にスレッド構築:foreach (@ROOT) { $nb にルート記事番号を放り込む ↓ HTML整形してルート記事を表示 ↓ 表示形式がスレッド構築型であればログを回す:foreach (@LOG) { $r_rnb にレス先番号を放り込む ↓ ・$nb と $r_rnb が一致したらそれをHTML整形して 表示してからいらなくなったレコードを splice で削除しておく ・一致しなければ素通り } } ↓ フッタを吐く ↓ おわり ○adminonly.pl キー仕様: mode=adminonly:メインキー → このキーで adminonly.pl に制御を移す. ao_mode=XXX:サブキー → このキーで adminonly.pl 内の 分岐制御をする. mode=adminonly をメインキーに見つけた場合はこちらに制御を移す. ↓ まずはここで管理者パスを問いただす. ↓ 管理者パスが合致すれば合致フラグを受け渡してメニューを表示させ る. ↓ ao_mode がサブキーになり,これでこの制御内を分岐させる. ○titlelist.pl を使ってのフレーム 2分割 BBS での書込及びタイトルリスト 更新動作 フレーム定義ファイル名:frame.html 各フレーム名:gwbbs.cgi 側 > bbs リスト表示側 > titlelist >初期起動時 frame.html が叩かれる ↓ titlelist.html (Gloriosa により生成) 及び,フレーム分 割モードスイッチを指定された Gloriosa が起動. フレーム分割モードスイッチは mode で指定する. >タイトルリストからの呼び出し タイトルリストのハイパーリンクをクリック ↓ 掲示板ウィンドウにフレーム分割モードスイッチ有りで呼び 出す. このとき gwbbs.cgi 内部ではスレッド構築部分でターゲッ ト番号が指定されているときはスレッドを構築するようにし ておく. >書込動作時 gwbbs.cgi で書込動作が行われる.このとき書込フォーム内 にフレーム分割スイッチを保持しておく.使用するスイッチ はフレーム分割モードスイッチとは違う文字列を使用するこ と. ↓ 通常では書込動作が終了するとそのままスレッドが表示され るが,フレーム分割モードスイッチが指定された状態では, 書込動作が終了した時点で frame.html を呼び出し,タイト ル一覧 (titlelist.html) を表示更新する. ↓ 書込が終了したらフレーム titlelist を JavaScript で表 示更新する. >タイトルリスト更新 gwbbs.cgi をタイトルリスト更新スイッチ付きで呼び出す ↓ タイトルリストを書き換える ↓ 書込が終了したらフレーム titlelist を JavaScript で表 示更新する.