Trusted Solaris 開発ガイド

第 15 章 トラステッド X ウィンドウシステム

Trusted Solaris 7 は、CDE 1.0.2 の拡張版であるトラステッド共通デスクトップ環境 (CDE) を使用します。トラステッド CDE は、Trusted Solaris 7 X ウィンドウシステムサーバーに、X ウィンドウシステム Version 11 を使用します。トラステッド X ウィンドウシステムサーバーには、必須アクセス制御、任意アクセス制御、情報ラベルの浮上、および特権の使用をサポートするプロトコル拡張機能があります。クライアントは、UNIX ドメインと TCP/IP ドメインのネットワーク接続を介してトラステッド X ウィンドウシステムサーバーに接続します。

データ転送セッションは、複数の機密ラベルとユーザー ID でインスタンス化 (多重インスタンス化) されます。これは、1 つの機密ラベルまたはユーザー ID における特権のないクライアントのデータが、トラステッド X ウィンドウシステムの任意アクセス制御と必須アクセス制御ポリシーである同位書き込みと下位読み取りに違反して、別の機密ラベルまたはユーザー ID で別のクライアントに転送されないようにするためです。

Trusted Solaris 7 の X ウィンドウシステムプログラミングインタフェースを使用すると、セキュリティ関連の属性情報の取得と設定を行なったり、バイナリラベルを ASCII に変換し、フォントリストと幅を使用して Helvetica 14 ポイントのボールドなどの字体を ASCII 文字列出力に適用したりできます。これらのインタフェースは、通常、Motif ウィジェット、Xt イントリンシクス、Xlib、CDE インタフェースで記述された管理アプリケーションによって呼び出されます。

この章は、短い Motif アプリケーションを使用して、トラステッド X ウィンドウシステムのセキュリティポリシーと Trusted Solaris 7 インタフェースについて説明しています。

セキュリティ属性

トラステッド X ウィンドウシステムインタフェースは、さまざまな X ウィンドウオブジェクトのセキュリティ関連の属性情報を管理します。アプリケーション GUI が Motif だけで作成されている場合は、Xlib オブジェクトのセキュリティ属性情報を処理するために、Motif ウィジェットの下位層で使用されている Xlib オブジェクト ID を取得するには、Motif アプリケーション内で XToolkit ルーチンを使用する必要があります。

トラステッド X ウィンドウシステムインタフェースを使用してセキュリティ属性情報が取得できる X ウィンドウオブジェクトには、ウィンドウ、プロパティ、X ウィンドウサーバー、クライアントと X ウィンドウサーバー間の接続があります。Xlib には、ウィンドウ、プロパティ、ディスプレイ、およびクライアント接続 ID を取得する呼び出しがあります。

ウィンドウ、プロパティ、クライアント接続のセキュリティ属性は、所有者 ID と CMW ラベル情報から構成されます。ウィンドウのセキュリティ属性には、さらに、入力情報ラベルのセキュリティ属性も含まれます。これらの属性を取得する構造体の詳細は、「データ型、ヘッダーファイル、およびライブラリ」を参照してください。セキュリティ属性情報の取得と設定を行うインタフェースの詳細は、「プログラミングインタフェース宣言」を参照してください。

Solaris 7 

Trusted Solaris 7 

ウィンドウサーバーの所有者 ID 

機密ラベル 

ユーザー ID 

情報ラベル 

グループ ID 

入力情報ラベル 

クライアント ID 

X ウィンドウサーバーの認可上限 

IP アドレス 

X ウィンドウサーバーの最下位ラベル 

 

トラステッドパスウィンドウ 

セキュリティポリシー

ウィンドウ、プロパティ、ピクセルマップオブジェクトには、ユーザー ID、クライアント ID、CMW ラベルがあります。グラフィックコンテキスト、フォント、カーソルには、クライアント ID しかありません。クライアントと X ウィンドウサーバー間の接続には、ユーザー ID、X ウィンドウサーバーID、CMW ラベルがあります。

ユーザー ID は、オブジェクトを作成したクライアントの ID です。クライアント ID は、オブジェクトを作成するクライアントが接続している接続番号に関連しています。

オブジェクトに対して何か操作を行う場合、任意アクセスポリシーにより、クライアントはそのオブジェクトを所有していなければなりません。クライアントのユーザー ID がオブジェクトの ID と等しい場合、クライアントはそのオブジェクトを所有しています。接続要求を行うには、クライアントのユーザー ID が X ウィンドウサーバーワークステーションの所有者のアクセス制御リスト (ACL) に存在していなければなりません。存在しない場合には、「プロセスのセキュリティ属性フラグの取得と設定」で説明しているように、クライアントはトラステッドパス属性を表明する必要があります。

必須アクセスポリシーでは、ウィンドウに名前をつけるときは同位書き込みと同位読み取り、属性に対しては下位書き込みとなります。CMW ラベルの機密ラベル部は、作成クライアントの機密ラベルに設定されます。CMW ラベルの情報ラベル部は、初めは ADMIN_LOW であり、クライアントがウィンドウに書き込むデータの情報ラベルに従って浮上します。

ウィンドウは、複数のクライアントで共有される情報が入った属性を所有できます。ウィンドウ属性は、アプリケーションが動作している機密ラベルで作成されます。これは、属性データに対するアクセスをアプリケーションの機密ラベルによって区別するためです。クライアントは、必須アクセス制限と任意アクセス制限による条件を満たしていれば属性を作成し、ウィンドウの属性にデータを格納し、属性からデータを取得することができます。多重インスタンス化されていない属性を指定するには /user/openwin/server/tsol/property.atoms を参照してください。

すべてのウィンドウには入力情報ラベルがあり、そのデフォルトは ADMIN_LOW です。トラステッドパスメニューを使用により、ユーザーは、ウィンドウの入力情報ラベルを設定できます。入力情報ラベルは、キーやボタンを押して離す操作によるデータ入力に割り当てられ、イベントの情報ラベルを浮上させます。

ルートウィンドウ

ルートウィンドウは、ウィンドウ階層の最上位にあります。ルートウィンドウは、どのクライアントにも属さない公開オブジェクトですが、保護すべきデータも含まれます。ルートウィンドウの属性は、ADMIN_LOW で保護されます。

クライアントウィンドウ

クライアントには、少なくともルートウィンドウから派生した最上位クライアントウィンドウが 1 つあり、その最上位ウィンドウには入れ子になった別のウィンドウが含まれます。クライアントの最上位ウィンドウから派生したすべてのウィンドウは、同じ機密ラベルを持ちます。情報ラベルは、最上位ウィンドウから派生した各ウィンドウの情報ラベルをすべて結合したものに浮上します。クライアントの最上位ウィンドウから派生したサブウィンドウは、クライアントの最上位ウィンドウと同じ入力情報ラベルを持ちます。

override-redirect ウィンドウ

メニューやある種のダイアログボックスのような、override-redirect ウィンドウは、入力フォーカスを別のクライアントから切り替え、不正な機密ラベルでのファイル入力を入力フォーカスが受け入れることを防止できません。override-redirect は作成クライアントに所有されており、ほかのクライアントがこのウィンドウを使用して別の機密ラベルでデータにアクセスすることはできません。

キーボード、ポインタ、サーバー制御

キーボード、ポインタ、サーバー制御を取得するには、クライアントは必須アクセス権と任意アクセス権を必要とします。フォーカスをリセットするには、クライアントはそのフォーカスを所有しているか、あるいは win_devices 特権を持っていなければなりません。

ポインタをワープするには、クライアントは、ポインタ制御と対象ウィンドウに対する必須アクセス権、および任意アクセス権を必要とします。明示的なユーザーアクションを含むイベントには、X 座標と Y 座標を取得できます。

選択マネージャ

選択マネージャは、情報が非トラステッドウィンドウ間で転送されるカット&ペーストやドラッグ&ドロップのような、ユーザーレベルのウィンドウ間データ移動を調整します。転送が試みられる場合、選択マネージャは、転送を捕獲し、転送を制御しているユーザーの承認を検証し、そのユーザーに確認とラベル付け情報を要求します。選択マネージャは、エンドユーザーが書き込みアプリケーションコードなしでデータ移動を試みる場合に常に表示されます。

管理者は、一部の転送形式に対し自動確認を設定できます。この場合、選択マネージャは表示されません。転送が必須アクセスポリシーと任意アクセスポリシーを満たす場合、データ転送は達成されます。ファイルマネージャとウィンドウマネージャ、それらの専用ドロップ領域に対する選択エージェントとしても動作します。多重インスタンス化された選択ターゲットを指定するには、/usr/openwin/server/tsol/selection.atoms を参照してください。どの選択ターゲットが自動的に承認されるか決定するには、/usr/dt/config/sel_config を参照してください。

デフォルト資源

ADMIN_LOW とラベル付けされたデフォルト資源は、クライアントでは作成できません。デフォルト資源を変更できるのは、ADMIN_LOW で動作しているか適切な特権を持つクライアントだけです。

ウィンドウ間のデータ移動

クライアントが選択マネージャを介さずにウィンドウ間でデータ移動を行うには、win_selection 特権が必要です。選択マネージャの詳細は、「選択マネージャ」を参照してください。

プロセス属性フラグの取得と設定の詳細は、第 2 章「プログラミングインタフェースの概要」を参照してください。

特権の必要な処理

ユーザーの介入なしでウィンドウ、プロパティ、アトム名にアクセスするライブラリルーチンには、必須アクセスと任意アクセスが必要です。フレームバッファのグラフィックコンテキスト、フォント、カーソルにアクセスするライブラリルーチンは、任意アクセスを必要とし、次に説明している特殊な作業を行う場合にはさらに別の特権が必要になる場合があります。

クライアントは、オブジェクトに対するアクセスが拒否される場合、有効セットに win_dac_readwin_dac_writewin_mac_readwin_mac_write 特権が 1 つ以上必要になる場合があります。これらのポリシーを有効または無効にするには、/user/openwin/server/tsol/confi.privs を参照してください。

資源の設定と削除

クライアントは、X ウィンドウサーバーに永続的に保持されたウィンドウまたはプロパティを設定または削除する場合、有効セットに win_config 特権を必要とします。この種の資源の例として、スクリーンセーバーの時間切れが挙げられます。

入力デバイス

クライアントは、キーボード制御とポインタ制御の取得と設定、またはマウスボタンとキー割り当ての変更を行う場合、有効セットに win_devices 特権を必要とします。

ダイレクトグラフィックスアクセス

クライアントは、X プロトコルの拡張機能であるダイレクトグラフィックスアクセス (DGA) を使用する場合、有効セットに win_dga 特権を必要とします。

ラベルの降格

クライアントは、ウィンドウ、ピクセルマップ、プロパティの情報ラベルや機密ラベルを既存の情報ラベルよりも優位でない新しいラベルに変更する場合、有効セットに win_downgrade_il または win_downgrade_sl 特権を必要とします。

ラベルの昇格

クライアントプロセスは、ウィンドウ、ピクセルマップ、プロパティの情報ラベルや機密ラベルを既存のラベルよりも優位な新しいラベルに変更する場合、有効セットに win_upgrade_il または win_upgrade_sl 特権を必要とします。

情報ラベルの浮上の停止

クライアントは、オブジェクトの情報ラベルを浮上させることなくウィンドウ、ピクセルマップ、プロパティに書き込みを行う場合、有効セットに win_nofloat 特権を必要とします。

フォントパスの設定

クライアントは、フォントパスを変更する場合、有効セットに win_fontpath 特権を必要とします。

データ型、ヘッダーファイル、およびライブラリ

この章で説明しているトラステッド X11 プログラミングインタフェースを使用するには、次のヘッダーファイルが必要です。

#include <tsol/Xtsol.h>

トラステッド X11 の例は、次のライブラリを使用してコンパイルしています。

-lXtsol -ltsol

この章で説明している、X11 ウィンドウシステムのラベルクリッピング用のプログラミングインタフェースを使用するには、次のヘッダーファイルが必要です。

#include <tsol/label_clipping.h>

ラベルクリッピング例は、次のライブラリを使用してコンパイルしています。

-lDtTsol -ltsol

オブジェクトの種類

ResourceType 型定義は、処理される資源の種類を示します。値には、IsWindow も指定できます。

オブジェクトの属性

XTsolResAttributes 構造体は、資源の属性を含みます。

CARD32

ouid

ワークステーションサーバーの所有者のユーザー ID 

CARD32

uid

ウィンドウのユーザー ID 

bslabel_t

sl

機密ラベル 

bilabel_t

il

情報ラベル 

bilabel_t

iil

入力情報ラベル 

プロパティの属性

XTsolPropAttributes 構造体は、プロパティの属性を含みます。

CARD32

uid

プロパティのユーザー ID 

bslabel_t

sl

機密ラベル 

bilabel_t

il

情報ラベル 

クライアントの属性

XTsolClientAttributes 構造体は、クライアントの属性を含みます。

uid_t

uid

クライアントを開始したユーザーの ID 

gid_t

gid

グループ ID 

pid_t

pid

プロセス ID 

u_long

sessionid

セッション ID 

au_id_t 

auditid 

監査 ID 

u_long

iaddr

クライアントが動作しているワークステーションの IP アドレス 

フラグの設定

setting_flag 型の定義は、CMW ラベルのフラグ値を次のように定義します。

SETCL_SL - CMW ラベルの機密ラベル部を設定する。SETCL_IL - CMW ラベルの情報ラベル部を設定する。SETCL_ALL - CMW ラベルの全体を設定する。

CMW ラベル

バイナリ CMW ラベルを示すデータ構造体です。インタフェースは、bclabel_t 型の構造体であるバイナリ CMW ラベルを受け入れて返します。

情報ラベル

バイナリ CMW ラベルの情報ラベル部を示す型定義です。インタフェースは、bilabel_t 型の構造体であるバイナリの情報ラベルをパラメータとして受け入れて返します。

認可上限

認可上限を示す型定義です。インタフェースは、bclear_t 型の構造体であるバイナリの認可上限をパラメータとして受け入れて返します。

プログラミングインタフェース宣言

この節では、トラステッド X11 インタフェースの宣言と、X11 ウィンドウシステムのラベルクリッピングインタフェースの宣言を説明します。

ウィンドウの属性

次のルーチンは、*resattrp 内の、ウィンドウ ID の資源属性を返します。詳細は、XTSOLgetResAttributes(3X11TSOL) のマニュアルページを参照してください。

Status 	XTSOLgetResAttributes(							Display *display,
 								XID object,
 								ResourceType resourceFlag,
 								XTsolResAttributes *resattrp);

プロパティの属性

次のルーチンは、*propattrp 内の、ウィンドウ ID のプロパティ属性を返します。詳細は、XTSOLgetPropAttributes(3X11TSOL) のマニュアルページを参照してください。

Status		XTSOLgetPropAttributes(							Display *display,
 									Window win,
 									Atom property,
 									XTsolPropAttributes *propattrp);

クライアント接続の属性

次のルーチンは、*clientattrp 内のクライアント属性を返します。詳細は、XTSOLgetClientAttributes(3X11TSOL) のマニュアルページを参照してください。

Status		XTSOLgetClientAttributes(							Display *display,
 									XID win,
 									XTsolClientAttributes *clientattrp);

ウィンドウの CMW ラベル

次のルーチンは、ウィンドウの CMW ラベルの取得と設定を行います。詳細は、XTSOLgetResLabel(3X11TSOL)XTSOLsetResLabel(3X11TSOL) のマニュアルページを参照してください。

Status 	XTSOLgetResLabel(								Display *display,
 									XID object,
 									ResourceType resourceFlag,
 									bclabel_t *cmwlabel);

 void		XTSOLsetResLabel(							Display *display,
 									XID object,
 									ResourceType resourceFlag,
 									bclabel_t *cmwLabel,
 									enum setting_flag labelFlag);

ウィンドウのユーザー ID

次のインタフェースは、ウィンドウのユーザー ID の取得と設定を行います。詳細は、XTSOLgetResUID(3X11TSOL)XTSOLsetResUID(3X11TSOL) のマニュアルページを参照してください。

Status		XTSOLgetResUID(					Display *display,
 							XID object,
 							ResourceType resourceFlag,
 							uid_t *uidp);

 void 		XTSOLsetResUID(					Display *display,
 							XID object,
 							ResourceType resourceFlag,
 							uid_t *uidp);

ウィンドウの入力情報ラベル

ウィンドウの入力情報ラベルが変わる場合、クライアントの最上位ウィンドウから派生しているすべてのウィンドウの入力情報ラベルも変わります。そのウィンドウの所有者と同じ機密ラベルおよびユーザー ID を持つ別のクライアントが入力ウィンドウ上のキーボードイベントを求めた場合、そのキーボードイベントは両クライアントに送られます。このときの入力情報ラベルは、イベントが発生したところの入力情報ラベルです。

次のルーチンは、ウィンドウに対応した入力情報ラベルの取得と設定を行います。詳細は、XTSOLgetWindowIIL(3X11TSOL)XTSOLsetWindowIIL(3X11TSOL) のマニュアルページを参照してください。

Status 	XTSOLgetWindowIIL(						Display *display,
 							Window win,
 							bilabel_t *label);
 void 		XTSOLsetWindowIIL(					Diplay *display,
 							Window win,
 							bilabel_t *label);

プロパティの CMW ラベル

次のルーチンは、ウィンドウプロパティの CMW ラベルの取得と設定を行います。詳細は、XTSOLgetPropLabel(3X11TSOL)XTSOLsetPropLabel(3X11TSOL) のマニュアルページを参照してください。

Status		XTSOLgetPropLabel(					Display *display,
 							Window win,
 							Atom property,
 							bclabel_t *cmwlabel);

 void 		XTSOLsetPropLabel(					Display *display,
 							Window win,
 							Atom property,
 							bclabel_t *cmwLabel,
 							enum setting_flag labelFlag);

プロパティのユーザー ID

次のインタフェースは、ウィンドウプロパティのユーザー ID の取得と設定を行います。詳細は、XTSOLgetPropUID(3X11TSOL)XTSOLsetPropUID(3X11TSOL) のマニュアルページを参照してください。

Status 		XTSOLgetPropUID(					Display *display,
 							Window winID,
 							Atom property,
 							uid_t *uidp);

 void 		XTSOLsetPropUID(					Display *display,
 							Window win,
 							Atom property,
 							uid_t *uidp);

ワークステーションの所有者 ID

次のルーチンは、ワークステーションサーバーの所有者のユーザー ID の取得と設定を行います。詳細は、XTSOLgetWorkstationOwner(3X11TSOL)XTSOLsetWorkstationOwner(3X11TSOL) のマニュアルページを参照してください。


注 -

XTSOLsetWorkstationOwner(3X11TSOL) は、ウィンドウマネージャ用に予約されています。


Status		XTSOLgetWorkstationOwner(							Display *display,
 									uid_t *uidp);

 void 		XTSOLsetWorkstationOwner(							Display *display,
 									uid_t *uidp);

X ウィンドウサーバーの認可上限と最下位ラベル

次のルーチンは、X ウィンドウサーバーに対し、セッション認可上限と最下位のセッションラベルを設定します。詳細は、XTSOLsetSessionHI(3X11TSOL)XTSOLsetSessionLO(3X11TSOL) のマニュアルページを参照してください。


注 -

これらのインタフェースは、ウィンドウマネージャ用に予約されています。


void 		XTSOLsetSessionHI(						Display *display,
 								bclear_t *clearance);

 void 		XTSOLsetSessionLO(						Display *display,
 								bslabel_t *sl);

トラステッドパスウィンドウ

次のルーチンは、指定されたウィンドウをトラステッドパスウィンドウに設定し、その後、指定されたウィンドウがトラステッドパスウィンドウかをテストします。詳細は XTSOLMakeTPWindow(3X11TSOL) のマニュアルページを参照してください。

void 		XTSOLMakeTPWindow(						Display *dpy,
 								Window win);

 Bool 		XTSOLIsWindowTrusted(						Display *display,
 								Window win);

トラステッドストライプの高さ

次のインタフェースは、トラステッドストライプの高さの取得と設定 (加減操作) を行います。トラステッドストライプがまったくないか、あるいは極端に大きくならないように気を付けてください。詳細は、XTSOLsetSSHeight(3X11TSOL)XTSOLgetSSHeight(3X11TSOL) のマニュアルページを参照してください。


注 -

これらのインタフェースは、ウィンドウマネージャ用に予約されています。


Status 		XTSOLgetSSHeight(						Display *display,
 								int screen_num,
 								int *newHeight);

 void 		XTSOLsetSSHeight(						Display *display,
 								int screen_num,
 								int newHeight);

多重インスタンス化の情報

次のルーチンを使用すると、クライアントは、クライアント自身の機密ラベルとは異なる機密ラベルで、プロパティ情報を取得できます。最初の呼び出しでは、希望する機密ラベルとユーザー ID を指定し、enabled を TRUE に設定します。続いて、XTSOLgetPropAttributes(3X11TSOL)XTSOLgetPropLabel(3X11TSOL)XTSOLgetPropUID(3X11TSOL) のいずれかを呼び出します。最後に、enabled を FALSE に設定し、このルーチンを再び呼び出します。詳細は、XTSOLsetPolyInstInfo(3X11TSOL) のマニュアルページを参照してください。

void 		XTSOLsetPolyInstInfo(						Display *dpy,
 								bslabel_t *senslabel,
 								uid_t *userID, int enabled);

X11 ウィンドウのラベルクリッピングインタフェース

次のルーチンは、フォントリストを使用して、バイナリの CMW ラベル、機密ラベル、情報ラベル、認可上限を、複合された文字列に変換します。戻される文字列は、指定されるピクセル幅にクリップされます。幅 (width) が画面幅 (display) と等しい場合には、画面幅の半分でラベルが折り返されます。flags パラメータの詳細は、第 6 章「ラベルのコード例」「バイナリと ASCII」に挙げられています。詳細は、labelclipping(3) のマニュアルページを参照してください。

/* CMW ラベル */
 	XmString					Xbcltos(					Display *display,
 											const bclabel_t *cmwlabel,
 											const Dimension width,
 											const XmFontList fontlist,
 											const int flags);

/* 機密ラベル */
 	XmString					Xbsltos(					Display *display,
 											const bslabel_t *senslabel,
 											const Dimension width,
 											const XmFontList fontlist,
 											const int flags);

/* 情報ラベル */
 	XmString					Xbiltos(					Display *display,
 											const bilabel_t *inflabel,
 											const Dimension width,
 											const XmFontList fontlist,
 											const int flags);

/* 認可上限 */
 	XmString					Xbcleartos(					Display *display,
 											const bclear_t *clearance,
 											const Dimension width,
 											const XmFontList fontlist,
 											const int flags);

Motif アプリケーションの例

次の図の Motif アプリケーション例は、xclock または xterm アプリケーションを起動します。このアプリケーションは Trusted Solaris 7 X ウィンドウのプログラミングインタフェースが Motif アプリケーション内からどのように呼び出されるかを示すことが目的なので、その構造はシンプルです。このアプリケーションのプロセスの機密ラベルは Confidential で、情報ラベルは Unclassified です。

図 15-1 簡単な Motif アプリケーション

Graphic

以降の節では、セキュリティ属性を処理し、フォントリストを使用してバイナリラベルを ASCII に変換する Trusted Solaris 7 インタフェースコールを使用するコードセグメント例を示しています。このコードセグメントは、アプリケーションプログラムでもっとも一般的な操作であるウィンドウのセキュリティ属性の処理に焦点を当てています。クライアントは、しばしば、適切な特権を使用して別のアプリケーションが作成したオブジェクトのセキュリティ属性を取得します。また、そのオブジェクトに対する操作がシステムの任意の所有権ポリシーと必須アクセスの同位書き込みおよび下位読み取りポリシーに許可されるかを確認するために、その属性をチェックします。アクセスが拒否されると、アプリケーションはエラーを表示するか、妥当な場合には特権を使用します。特権が必要な場合については、「特権の必要な処理」を参照してください。

次のコードセグメントを含むこの Motif アプリケーションのソースコードは、「コード」に示されています。Trusted Solaris 7 プログラミングインタフェースに渡すオブジェクト ID を取得する Xlib 呼び出しは、取得する ID が存在するように、適切なオブジェクトを作成してから指定してください。このソースコードでは、Xlib 呼び出しは XtRealizeWidget() が呼び出された後に指定されています。

ウィンドウ属性の取得

XTSOLgetResAttributes(3X11TSOL) ルーチンは、ウィンドウのセキュリティ関連の属性を返します。指定するのは、ディスプレイとウィンドウの ID、セキュリティ属性を有効にしたいオブジェクトがウィンドウであることを示すフラグ、および返される属性を受け取る XtsolResAttributes 構造体です。クライアント自身が作成したウィンドウのセキュリティ属性を取得するため、クライアントは特権を必要としません。

/* Xlib 呼び出しを使用して上位のウィンドウを検出し、ID を表示する */
 	window = XtWindow(topLevel);
 	display = XtDisplay(topLevel);

/* ウィンドウのセキュリティ属性を取り出す */
 	retval = XTSOLgetResAttributes(display, window, IsWindow, &winattrs);

/* ラベルを文字列に変換する */
 	retval = bsltos(&winattrs.sl, &string1, 0, LONG_WORDS);
 	retval = biltos(&winattrs.il, &string2, 0, LONG_WORDS);
 	retval = biltos(&winattrs.iil, &string3, 0, LONG_WORDS);

/* セキュリティ属性情報を出力する */
 	printf("Workstation owner ID = %d, User ID = %d, SL = %s, IL = %s, IIL = %s¥n",
 			winattrs.ouid, winattrs.uid,string1, string2, string3);

printf(1) 文によって、次のように出力されます。

Workstation owner ID = 29378

User ID = 29378

SL = CONFIDENTIAL

IL = UNCLASSIFIED

IIL = UNCLASSIFIED

フォントリストによるラベルの変換

次の例は、プロセスの機密ラベルを取得し、フォントリストとピクセル幅を使用してその機密ラベルを ASCII に変換します。また、ラベルの文字列を使用して、ラベルウィジェットを作成します。プロセスの機密ラベルはウィンドウの機密ラベルと同等であるため、特権は必要ありません。

最終文字列が幅より長い場合、文字列はクリップされ、クリップを示すインジケータが使用されます。クリップされた機密ラベルのクリップインジケータの詳細は、「機密ラベルと情報ラベル」および sbsltos(3) のマニュアルページを参照してください。X ウィンドウシステムのラベル変換インタフェースは指定されたピクセル数にクリップし、ラベルのクリッピングインタフェースは指定された文字数にクリップします。

サイトが label_encodings ファイルを英語以外の言語で使用する場合、ISO 8859-1 文字セットの 128 以上の文字コードをもつアクセント文字は変換されない場合があります。このプログラム例では、アジア諸国の文字セットは変換されません。

	retval = getcmwplabel(&cmwlabel);
 	getcsl(&senslabel, &cmwlabel);

/* フォントリストを作成して、ラベルを変換する */
 	italic = XLoadQueryFont(XtDisplay(topLevel),
 															"-adobe-times-medium-i-*-*-14-*-*-*-*-*-iso8859-1");
 	fontlist = XmFontListCreate(italic, "italic");
 	xmstr = Xbsltos(XtDisplay(topLevel), &senslabel, width, fontlist, LONG_WORDS);

/* フォントリストとラベルテキストを使用して、ラベルウィジェットを作成する */
 	i=0;
 	XtSetArg(args[i], XmNfontList, fontlist); i++;
 	XtSetArg(args[i], XmNlabelString, xmstr); i++;
 	label = XtCreateManagedWidget(													"label", xmLabelWidgetClass, form, args, i);

斜体で示された機密ラベル文字列と非斜体のラベル「Launch an application (アプリケーションの起動)」のソースコードは、「コード」に示されています。次の図に示すようにラベルウィジェット内で斜体の機密ラベル文字列を表示するには、任意のコマンド行引数を指定してこのアプリケーションを起動してください。

図 15-2 斜体のラベルテキスト

Graphic

ウィンドウの CMW ラベルの取得

次の例は、ウィンドウの CMW ラベルを取得します。プロセスの機密ラベルはウィンドウの機密ラベルと同等であるため、特権は必要ありません。

/* ウィンドウの CMW ラベルを検出する */
 	retval = XTSOLgetResLabel(display, window, IsWindow, &cmwlabel);

/* ラベルを文字列に変換し出力する */
 	retval = bcltos(&cmwlabel, &string, 0, LONG_WORDS);
 	printf("CWM label = %s¥n", string);

printf(1) 文によって、次のように出力されます。

CMW label = UNCLASSIFIED[C]

ウィンドウの CMW ラベルの設定

次の例は、ウィンドウの CMW ラベルを設定します。新しい機密ラベルは、ウィンドウの機密ラベルおよびプロセスの機密ラベルよりも優位です。クライアントは、それ自身よりも優位なラベルを変換する場合、有効セットに sys_trans_label 特権を必要とします。また、そのウィンドウの機密ラベルを変更するには、win_upgrade_sl 特権を必要とします。

/* 機密ラベルを ASCII 文字列からバイナリに変換し */
/* 有効セット内で sys_trans_label をオン (有効) にする */
 	retval = stobsl(&string4, &senslabel, NEW_LABEL, &error);
/* sys_trans_label をオフ (無効) にする */
/* cmwlabel 構造体に機密ラベルを設定する */
 	setcsl(&cmwlabel, &senslabel);

/* CMW ラベルの機密ラベル部に新しい値を設定し */
/* 有効セット内で win_upgrade_sl をオン (有効) にする */
 	retval = XTSOLsetResLabel(display, window, IsWindow, &cmwlabel, SETCL_SL);
/* win_upgrade_sl をオフ (無効) にする */

ウィンドウのユーザー ID の取得

次の例は、ウィンドウのユーザー ID を取得します。プロセスはウィンドウ資源を所有しており、同じ機密ラベルで動作しているため、特権は必要ありません。

/* ウィンドウのユーザー ID を取得する */
 	retval = XTSOLgetResUID(display, window, IsWindow, &uid);

X ウィンドウサーバーワークステーションの所有者 ID の取得

次の例は、X ウィンドウサーバーにログインしているユーザーの ID を取得します。プロセスの機密ラベルはウィンドウの機密ラベルと同等であるため、特権は必要ありません。

/* ウィンドウのユーザー ID を取得する */
 	retval = XTSOLgetWorkstationOwner(display, &uid);

ソースコード

これは、図 15-1図 15-2 に示している簡単な Motif アプリケーションのソースコードです。ラベルウィジェットで斜体の ASCII ラベル文字列を表示するには、任意のコマンド行引数を使用してアプリケーションを起動してください。

コピー元のファイル

次に、この簡単な Motif アプリケーションのコピー元のファイルを示します。ファイルを作成し、XENVIRONMENT 変数にパス名を設定すれば、このアプリケーションが使用できます。

phoenix% setenv XENVIRONMENT /export/home/zelda/resfile

Example.*geometry: 										400X100
 Example.*orientation:										XmHORIZONTAL
 Example.*label.labelString: 										Launch an application
 Example.*xclock.labelString: 										Run xclock
 Example.*xterm.labelString: 										Run xterm
 Example.*xmag.labelString: 										Run xmag
 Example.*goodbye.labelString: 										Quit
 Example.*XmPushButton*background: 										blue
 Example.*XmLabel*foreground: 										white
 Example.*XmLabel*foreground:										white

コンパイルコマンド


phoenix% cc -I/usr/openwin/include -I/usr/dt/include ex.c -o ¥
Example -L/usr/openwin/lib -L/usr/dt/lib -lXm -lXt -lX11 -lXtsol -ltsol -lDtTsol

コード

#include <stdio.h>
 #include <X11/Intrinsic.h>
 #include <X11/StringDefs.h>
 #include <Xm/Xm.h>
 #include <Xm/Label.h>
 #include <Xm/PushB.h>
 #include <Xm/Form.h>
 #include <tsol/Xtsol.h>
 #include <Dt/label_clipping.h>

 XTsolResAttributes								winattrs;
 int								retval, error;
 uid_t								uid;
 Window								window;
 Display								*display;
 char								*string = (char *)0, *string1 = (char *)0, *string2 = (char *)0,
 								*string3 = (char *)0, *string4 = "SECRET";
 XmFontList								fontlist;
 XmString 								xmstr;
 XFontStruct 								*italic;
 Arg 								args[9];
 Dimension								width = 144;
 Widget								stringLabel;
 bslabel_t								senslabel;
 bclabel_t								cmwlabel;

/* コールバック */

 void Xclock(Widget w, caddr_t client_data, caddr_t call_data)
 { system("xclock &"); }

 void Xterm(Widget w, caddr_t client_data, caddr_t call_data)
 { system("xterm &"); }

 void Quit(Widget w, caddr_t client_data, caddr_t call_data)
 {
 	fprintf(stderr, "exiting  . . .¥n");
 	exit(0);
 }
 main(int argc, char **argv)
 {
 	Widget rowcolumn, label, xclock, xterm, quit, form, topLevel;
 	int i = 0;
 	Arg args[9];

/* ウィジェットを作成する */
 	topLevel = XtInitialize(argv[0], "XMCmds1", NULL, 0, &argc, argv);
 	form = XtCreateManagedWidget("form", xmFormWidgetClass, topLevel, NULL, 0);

/* コマンドの引数にラベルウィジェットが使用する ASCII 文字列とフォントリストを持つ */
/* アプリケーションはここで起動する */

 	if (argc == 2) {
/* フォントリストを作成しラベルを変換する */
 			retval = getcmwplabel(&cmwlabel);
 			getcsl(&senslabel, &cmwlabel);
 			italic = XLoadQueryFont(XtDisplay(topLevel),
 														"-adobe-times-medium-i-*-*-14-*-*-*-*-*-iso8859-1");
 			fontlist = XmFontListCreate(italic, "italic");
 			xmstr = (XmString)Xbsltos(XtDisplay(topLevel), &senslabel,
 								width, fontlist, LONG_WORDS);

/* フォントリストとラベルテキストを使用してラベルウィジェットを作成する */
 			i=0;
 			XtSetArg(args[i], XmNfontList, fontlist); i++;
 			XtSetArg(args[i], XmNlabelString, xmstr); i++;
 			label = XtCreateManagedWidget(																"label", xmLabelWidgetClass, form, args, i);
 	}

/* コマンドの引数にラベルウィジェット用の資源ファイル内のテキストを使用しない */
/* アプリケーションはここで起動する */

 	else {
 			label = XtCreateManagedWidget("label", xmLabelWidgetClass, form, NULL, 0); }

/* 引き続きウィジェットを作成する */
 	i=0;
 	XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET);	i++;
 	XtSetArg(args[i], XmNtopWidget, label);									i++;
 	XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
 	XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION);	i++;
 	XtSetArg(args[i], XmNrightPosition, 33); i++;
 	XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); 							i++;
 	xclock = XtCreateManagedWidget("xclock", xmPushButtonWidgetClass, form, args, i);

 	i=0;
 	XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET);																													i++;
 	XtSetArg(args[i], XmNtopWidget, label); i++;
 	XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION);	i++;
 	XtSetArg(args[i], XmNleftPosition, 33); i++;
 	XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION);i++;Ha>

ウィンドウのシステム構成の変更

Trusted Solaris オペレーティング環境におけるウィンドウの動作は、以下のファイルの設定によって変更できます。