JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Trusted Extensions 開発者ガイド     Oracle Solaris 10 1/13 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  Trusted Extensions API およびセキュリティーポリシー

2.  ラベルと認可上限

3.  ラベルのコード例

4.  印刷とラベル API

ラベル付き出力の印刷

ラベル対応アプリケーションの設計

マルチレベル印刷サービスについて

get_peer_label() ラベル対応関数

印刷サービスがラベル付き環境で実行されているかどうかの確認

リモートホストの資格について

資格とリモートホストラベルの取得

label_to_str() 関数の使用

メモリー管理の処理

返されたラベル文字列の使用

プリンタのラベル範囲に基づいたラベルリクエストの検証

5.  プロセス間通信

6.  Trusted X Window System

7.  ラベルビルダー API

8.  信頼できる Web ガードプロトタイプ

9.  Solaris Trusted Extensions ラベル API のための試験的な Java バインディング

A.  プログラマーのリファレンス

B.  Trusted Extensions API リファレンス

索引

プリンタのラベル範囲に基づいたラベルリクエストの検証

印刷アプリケーションでは、ラベルを検証するためのコードが 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;
        }
    }