コマンド処理のフロー
すべてのコマンド(&fml8; への命令)処理は最終的に「FML::Command」クラス
経由で「FML::Command::モード::コマンド」クラスを呼び出します。GUI およ
び CUI、コマンドメールは、そこに至る前処理の段階が異なるだけです。
コマンドメールの処理
2004/03/05 以降は、新しいフレームワークとなりました。
本節はコマンドメールの話です。
メールの本文が複数行あり、それが複数の命令を含むと想定します。
まず、メールは行単位で解析されます。
これは、一行に一つのコマンドが書いてあるという想定です。
空行を無視するなどの基本的な処理の後、コマンド(行の先頭の文字列)が、現
在のコンテキストで許されるコマンドか否か?を確認します。
1) guide や subscribe のようにメンバー以外にも許されるコマンドであれば、
そこから直接、コマンド呼び出しルーチンへ処理が移ります。
ここで許されるコマンドは anonymous_command_mail_allowed_commands
変数で定義されているコマンドです。
2) あらかじめ指定されたユーザだけに許されるコマンドの場合、
command_mail_restrictions のルールに従って他の条件を確認し、
許されたなら、呼び出しルーチンへ処理が移ります。
ここで許されるコマンドは user_command_mail_allowed_commands
で定義されているコマンドです。
「あらかじめ指定されたユーザ」には、一般ユーザと管理者が含まれます。
ただし、それぞれの処理のフローが異なります。
「呼び出しルーチン」では、
(コマンドに依存した)返事の送り先の確認と
(コマンドに依存する)シンタックスチェックを経て、
FML::Command クラス経由でコマンドが実行されます。
この実行は一般ユーザ権限で実行されます。
admin コマンドも「あらかじめ指定されたユーザ」ですが、
admin コマンドの実行は、ここでは行なわれません。
「admin ...」コマンドは、まず一般ユーザ権限の admin コマンド
注: admin コマンドは user_command_mail_allowed_commands で許されています
の実行として処理が進められ、最終的に「FML::Command::User::admin」クラ
スが呼び出されます。このクラスの中で、admin_command_mail_restrictions
変数 に基づいてリモート権限があるか?が確認され、もう一度
「FML::Command」クラス経由で管理者権限の「FML::Command::Admin::コマン
ド」クラスが呼び出されます(つまりトランポリン・メカニズムです)。
CUI (makefml/fml)の処理
このプログラムを使える時点で管理者権限(MLのサーバにリモートで入り、
ユーザ fml に su できる権限)があるはずです。よって、特別な制限はありま
せん。FML::Command経由で「FML::Command::Admin::コマンド」クラスを直接
呼び出しています。
なお、サーバへリモートからログインするためには SSH で「RSA 2048 ビット
以上の鍵のみを許す、パスワード認証は認めない」といった強固な運用ルール
を課して下さい。