Solaris Trusted Extensions 開発ガイド

プリンタのラベル範囲に対するラベル要求の検査

印刷アプリケーションには、ラベルを検査するためのコードが lp/cmd/lpsched/validate.c ファイルに含まれています。

アプリケーションのタイプによっては、2 つの特定ラベルを比較する必要があります。たとえば、アプリケーションは、あるラベルが別のラベルより厳密に優位であるか否かを判別しなければならないことがあります。このようなアプリケーションは、2 つのラベルを比較するための API 関数を使用します。

ただし、印刷アプリケーションは、ラベルの範囲を基準にしています。プリンタは、異なるラベルの範囲からの印刷要求を受け入れるように構成されます。そのため、印刷アプリケーションは、ラベルと範囲を照合する API 関数を使用します。アプリケーションは、遠隔ホストのラベルがプリンタによって許可されるラベルの範囲内にあることを検査します。

validate.c ファイルでは、印刷アプリケーションは blinrange() 関数を使用して、遠隔ホストのラベルとプリンタのラベル範囲を照合します。この検査は、次に示すように tsol_check_printer_label_range() 関数内で実行されます。

static int
tsol_check_printer_label_range(char *slabel, const char *printer)
{
	int			in_range = 0;
	int			err = 0;
	blrange_t		*range;
	m_label_t	*sl = NULL;

	if (slabel == NULL)
		return (0);

	if ((err =
	    (str_to_label(slabel, &sl, USER_CLEAR, L_NO_CORRECTION, &in_range)))
	    == -1) {
		/* プリンタ最大ラベルに対する str_to_label エラー */
		return (0);
	}
	if ((range = getdevicerange(printer)) == NULL) {
		m_label_free(sl);
		return (0);
	}

	/* blinrange は範囲内には 真 (1)、範囲外には偽 (0) を返す */
	in_range = blinrange(sl, range);

	m_label_free(sl);
	m_label_free(range->lower_bound);
	m_label_free(range->upper_bound);
	free(range);

	return (in_range);
}

tsol_check_printer_label_range() 関数は、get_peer_label() 関数によって返されるラベル、およびプリンタ名をパラメータとして受け取ります。

ラベルを比較する前に、tsol_check_printer_label_range()str_to_label() 関数を使用して文字列をラベルに変換します。

ラベルタイプが USER_CLEAR に設定され、これによって、関連付けられているオブジェクトの認可上限ラベルが生成されます。認可上限ラベルは、blinrange() 関数が実行する範囲検査で適切なレベルのラベルが使用されるようにします。

str_to_label() から取得される sl ラベルが検査されることによって、要求されるデバイスであるプリンタの範囲内に遠隔ホストのラベル slabel があるか否かを判別します。このラベルはプリンタのラベルと照合されます。プリンタの範囲は、選択したプリンタに対して getdevicerange() 関数を呼び出すことによって取得されます。範囲は blrange_t データ構造体として返されます。

blrange_t データ構造体のプリンタのラベル範囲は、要求元の認可上限ラベルとともに blinrange() 関数に渡されます。blinrange(3TSOL) のマニュアルページを参照してください。

次のコード抜粋は、validate.c ファイルの _validate() 関数を示します。この関数は、印刷要求を処理するためのプリンタの検索に使用されます。このコードは、要求に関連付けられているユーザー ID およびラベルを、各プリンタに関連付けられている許可ユーザーおよびラベル範囲のセットと照合します。

/*
 * 1 台のプリンタが指定された場合、要求はそのプリンタと照合される。
 * もっとも有用な情報をユーザーに示すことができるように、あとで
 * 受け入れ/拒否検査を実行する。
 */
if (pps) {
	(pc = &single)->pps = pps;

	/* プリンタはユーザーへのアクセスを許可するか? */
	if (!CHKU(prs, pps)) {
		ret = MDENYDEST;
		goto Return;
	}

	/* プリンタラベル範囲を検査する */
	if (is_system_labeled() && prs->secure->slabel != NULL) {
		if (tsol_check_printer_label_range(prs->secure->slabel,
			pps->printer->name) == 0) {
			ret = MDENYDEST;
			goto Return;
		}
	}