<!-- -*- mode:text coding:euc-jp -*-
   $FML: dataflow.sgml,v 1.6 2008/08/17 18:28:36 fukachan Exp $
-->


<sect1 id="fml.command.dataflow">
	<title>
	コマンド処理のフロー
	</title>


<!--
  <graphic entityref="image.command.dataflow"></graphic>
-->

<para>
すべてのコマンド(&fml8; への命令)処理は、
最終的に「FML::Command」クラス経由で
「FML::Command::モード::コマンド」クラスを呼び出します。
GUI および CUI、コマンドメールは、そこに至る前処理段階が異なるだけです。
</para>


<sect2 id="fml.command.dataflow.newframework">
	<title>
	コマンドメールの処理
	</title>

<caution>
<para>
2004/03/05 以降は、新しいフレームワークとなりました。
</para>
</caution>

<para>
本節は、コマンドメールの話です。
メールの本文が複数行あり、それが複数の命令を含むと想定します。
</para>

<para>
まず、メールは行単位で解析されます。
これは、一行に一つのコマンドが書いてあるという想定です。
</para>

<para>
空行を無視するなどの基本的な処理の後、
コマンド(行の先頭の文字列)が、
現在のコンテキストで許されるコマンドか否か？を確認します。
</para>

<para>
1) guide や subscribe のようにメンバー以外にも許されるコマンドであれば、
   そこから直接、コマンド呼び出しルーチンへ処理が移ります。
   ここで許されるコマンドは
   anonymous_command_mail_allowed_commands
   変数で定義されているコマンドです。
</para>

<para>
2) あらかじめ指定されたユーザだけに許されるコマンドの場合、
   command_mail_restrictions
   のルールに従って他の条件を確認し、
   コマンドの実行が許される場合のみ、
   コマンド呼び出しルーチンへ処理が移ります。
   ここで実行が許されるコマンドは
   user_command_mail_allowed_commands
   で定義されているコマンドです。
</para>

<para>
「あらかじめ指定されたユーザ」には、一般ユーザと管理者が含まれます。
ただし、それぞれの処理のフローが異なります。
</para>

<para>
「呼び出しルーチン」では、
(コマンドに依存した)返事の送り先の確認と
(コマンドに依存する)シンタックスチェックをへて、
FML::Command クラス経由でコマンドが実行されます。
この実行は一般ユーザ権限で実行されます。
</para>

<para>
admin コマンドも「あらかじめ指定されたユーザ」ですが、
admin コマンドの実行は、ここでは行なわれません。
「admin ...」コマンドは、まず一般ユーザ権限の admin コマンド
<footnote>
<para>
注: admin コマンドは user_command_mail_allowed_commands で許されています
</para>
</footnote>
の実行として処理が進められ、
最終的に「FML::Command::User::admin」クラスが呼び出されます。
このクラスの中で、
admin_command_mail_restrictions 変数 にもとづいて、
このユーザはリモートコマンドを実行する権限があるか？が確認されます。
その後、もう一度
「FML::Command」クラス経由で、
管理者権限の「FML::Command::Admin::コマンド」クラスが呼び出されます
(つまりトランポリン・メカニズムです)。
</para>

</sect2>


<sect2 id="fml.command.dataflow.cui">
	<title>
	CUI (makefml/fml)の処理
	</title>

<para>
このプログラムを使える時点で管理者権限(ＭＬのサーバにリモートで入り、
ユーザ fml に su できる権限)があるはずです。
よって、特別な制限はありません。
FML::Command 経由で
「FML::Command::Admin::コマンド」クラスを直接呼び出しています。
</para>

<para>
なお、
サーバへリモートからログインするためには
SSH で「RSA 2048 ビット以上の鍵のみを許す、パスワード認証は認めない」
といった強固な運用ルールを課して下さい。
</para>

</sect2>


</sect1>
