| ナビゲーションリンクをスキップ | |
| 印刷ビューの終了 | |
|
Trusted Extensions 開発者ガイド Oracle Solaris 10 1/13 Information Library (日本語) |
1. Trusted Extensions API およびセキュリティーポリシー
9. Solaris Trusted Extensions ラベル API のための試験的な Java バインディング
印刷アプリケーションでは、ラベルを検証するためのコードが lp/cmd/lpsched/validate.c ファイルに含まれています。
アプリケーションの種類によっては、指定された 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 error on printer max label */
return (0);
}
if ((range = getdevicerange(printer)) == NULL) {
m_label_free(sl);
return (0);
}
/* blinrange returns true (1) if in range, false (0) if not */
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 を許可ユーザーのセットと照合し、リクエストに関連付けられたラベルを各プリンタに関連付けられているラベル範囲と照合します。
/*
* If a single printer was named, check the request against it.
* Do the accept/reject check late so that we give the most
* useful information to the user.
*/
if (pps) {
(pc = &single)->pps = pps;
/* Does the printer allow access to the user? */
if (!CHKU(prs, pps)) {
ret = MDENYDEST;
goto Return;
}
/* Check printer label range */
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;
}
}