Trusted Solaris 開発ガイド

対話形式のユーザーインタフェースの作成

次の図は、この図の後に挙げたコードから作成される GUI を示しています。main プログラムは、1 つのプッシュボタン (display) を持つ親フォーム (form) を作成します。プッシュボタンコールバックは、tsol_lbuild_create(3) に対する呼び出しで作成されたラベルビルダーのダイアログボックスを表示します。

図 16-1 CMW ラベルの構築インタフェース

Graphic

右側のラベルビルダーのダイアログボックスは、左側の「表示 (Show)」プッシュボタンが選択されるときに表示されます。tsol_lbuild_create(3) に渡されたパラメータがラベルビルダーのダイアログボックス上に表示される位置と果たす役割は矢印で示されています。

#include <X11/Intrinsic.h>
 #include <X11/StringDefs.h>
 #include <Xm/Xm.h>
 #include <Xm/PushB.h>
 #include <Xm/Form.h>
 #include <Dt/ModLabel.h>

ModLabelData *data;

/* tsol_lbuild_create() に渡されるコールバック */
void callback_function()
{ 
	char 		*title, *userval;
	char		*string = (char *)0;
	char		*string1 = (char *)0;
	int mode, 	view;
	Boolean		show;
	bslabel_t	sl_label, work_sl_label;
	Position	x, y;

/* サイトのアプリケーション独自の設定はここで行う */
	printf("OK pushbutton called¥n"); 
	
/* 照会の設定 */
	mode = (int)tsol_lbuild_get(data, LBUILD_MODE);
	title = (String)tsol_lbuild_get(data, LBUILD_TITLE);
	sl_label = *(bslabel_t*) tsol_lbuild_get(data, LBUILD_VALUE_SL);
	work_sl_label = *(bslabel_t*) tsol_lbuild_get(data, LBUILD_WORK_SL);
	view = (int )tsol_lbuild_get(data, LBUILD_VIEW);
	x = (Position ) tsol_lbuild_get(data, LBUILD_X);
	y = (Position ) tsol_lbuild_get(data, LBUILD_Y);
	userval = (char *)tsol_lbuild_get(data, LBUILD_USERFIELD);
	show = (Boolean )tsol_lbuild_get(data, LBUILD_SHOW);

	bsltos(&sl_label, &string, 0, LONG_WORDS);
 	bsltos(&work_sl_label, &string1, 0, LONG_WORDS);
	printf("Mode = %d, Title = %s, SL = %s, WorkSL = %s, View = %d, ",
		mode, title, string, string1, view);
	printf("X = %d, Y = %d, Userval = %s, Show = %d¥n",
		x, y, userval, show);

}

/* プッシュボタンが押下されたときにダイアログボックスを表示するコールバック */
void Show(Widget display, caddr_t client_data, caddr_t call_data)
{
	tsol_lbuild_set(data, LBUILD_SHOW, TRUE, NULL);
}

main(int argc, char **argv)
{
	Widget 		form, topLevel, display;
	Arg 		args[9];
	int 		i = 0, error, retval;
	char		*sl_string = "[C]";
	bslabel_t	sl_label;

	topLevel = XtInitialize(argv[0], "XMcmds1", NULL, 0, &argc, argv);
	form = XtCreateManagedWidget("form",
		xmFormWidgetClass, topLevel, NULL, 0);

	retval = stobsl(sl_string, &sl_label, NEW_LABEL, &error);
	printf("Retval = %d¥n", retval);

	data = tsol_lbuild_create( form, callback_function,
		LBUILD_MODE, LBUILD_MODE_SL,		
		LBUILD_TITLE, "Building Sensitivity Label",	
		LBUILD_VALUE_SL, sl_label,		
		LBUILD_VIEW, LBUILD_VIEW_EXTERNAL,	
		LBUILD_X, 200,				
		LBUILD_Y, 200,				
		LBUILD_USERFIELD, "/export/home/zelda",	
		LBUILD_SHOW, FALSE,			
		NULL);

	i = 0;
	XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
	display = XtCreateManagedWidget("Show",
		xmPushButtonWidgetClass, form, args, i);
	XtAddCallback(display, XmNactivateCallback, Show,0);
	XtRealizeWidget(topLevel);

	XtMainLoop();

	tsol_lbuild_destroy(data);

}

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


OK pushbutton called  
Mode = 12, Title = Building Sensitivity label, SLlabel = [C], 
WorkSL = [S], View = 1, X = 200, Y = 200, Userval = /export/home/zelda, 
Show = 1

ラベルビルダーの動作

ラベルビルダーのダイアログボックスは、エンドユーザーに対し情報の入力を求め、その入力から有効な CMW ラベルを生成します。入力は、キーボードから行うことも、オプションを選択して行うこともできます。どちらの方法を使用しても、そのシステムの label_encodings(4) ファイルの定義どおりに有効なラベルまたは認可上限が構築されます。

ラベルビルダーでは、「了解 (OK)」、「リセット (Reset)」、「取り消し (Cancel)」、「更新 (Update)」プッシュボタンのデフォルトの動作が用意されています。tsol_lbuild_create(3) に渡されるコールバックは、「了解 (OK)」プッシュボタンに割り当てられ、アプリケーション固有の動作が行われます。

キーボード入力

「更新 (Update)」プッシュボタンは、エンドユーザーが入力するテキストを「更新後のラベル (Update With)」フィールドに取り込み、その文字列が label_encodings(4) ファイルの定義どおりに有効なラベルまたは認可上限であるかを検査します。

エンドユーザーが「了解 (OK)」プッシュボタンを選択すると、ユーザーが構築した値は、「了解 (OK)」プッシュボタンのコールバック実装に従って処理されます。

オプションの選択

「ラベルの設定 (Label Settings)」ラジオボタンを使用すると、格付けとコンパートメントから機密ラベルまたは認可上限を構築するか、あるいは格付け、コンパートメント、マーキングから情報ラベルを構築できます。モードによっては、これらのボタンの 1 つがグレー表示される場合があります。この設定は、前述したキーボード入力および「更新 (Update)」プッシュボタン方式には依存しません。

格付け、コンパートメント、マーキングの情報は、システムの label_encodings(4) ファイルから出力されます。label_encodings ファイルに指定された組み合わせと制限は、無効な組み合わせをグレー表示することによって適用されます。エンドユーザーがオプションを選択する場合、「ラベル (Label)」フィールドは、上側の「ラベル (Label)」フィールドを更新し、その値を tsol_lbuild_create(3) が返す ModLabelData 変数の適切な作業ラベルフィールドに格納します (「ModLabelData 構造体」を参照)。エンドユーザーは、表示される「格付け (CLASS)」ラジオボタンと「コンパートメント (COMPS)」ラジオボタンから、機密ラベル、認可上限、または CMW ラベルの機密ラベル部を構築できます。

エンドユーザーが「了解 (OK)」プッシュボタンを選択すると、ユーザーが構築した値は、「了解 (OK)」プッシュボタンのコールバック実装に従って処理されます。

「リセット (Reset)」プッシュボタン

「リセット (Reset)」プッシュボタンは、「ラベル (Label)」フィールド内のテキストを、アプリケーションの開始時の値に設定します。

「取り消し (Cancel)」プッシュボタン

「取り消し (Cancel)」プッシュボタンは、アプリケーションを終了します。

アプリケーション固有の機能

ラベルビルダーのユーザーインタフェースによって生成される有効なラベルや認可上限と併せ、アプリケーション固有のコールバックやエラー処理、その他の機能を追加するかどうかは、開発者しだいです。

特権の必要な処理

ラベルビルダーがユーザーに表示するのは、ワークスペースの機密ラベルより優位でない格付け (および関連するコンパートメントとマーキング) だけです。ただし、実行可能ファイルの有効セットに sys_trans_label 特権がある場合は別です。

「了解 (OK)」プッシュボタンのコールバックに対するアプリケーション固有の実装は、特権を必要とする場合があります。

エンドユーザーにラベルの昇格または降格を行う承認がない場合や、ユーザーが構築したラベルがユーザーの認可範囲外の場合は、エンドユーザーが作業を完了できないように「了解 (OK)」ボタンと「リセット (Reset)」ボタンはグレー表示されます。これらの制限を無効にする特権はありません。

ルーチンの作成

tsol_lbuild_create(3) ルーチンは、任意のウィジェット、ブール値、コールバック、NULL で終了した一連の処理とその値の組み合わせを受け入れます。返されるのは、ModLabelData 型の変数です。

	data= tsol_lbuild_create( form, callback_function,
 		LBUILD_MODE, 						LBUILD_MODE_CMW,
 		LBUILD_TITLE, 						"Building CMW Label",
 		LBUILD_VALUE_CMW,						cmwlabel,
 		LBUILD_VIEW,						LBUILD_VIEW_EXTERNAL
 		LBUILD_X, 						200,
 		LBUILD_Y, 						200,
 		LBUILD_USERFIELD						"/export/home/zelda"
 		LBUILD_SHOW, 						FALSE,
 		NULL);

拡張処理

この節では、拡張処理と、tsol_lbuild_create(3)tsol_lbuild_get(3)tsol_lbuild_set(3) に渡せる有効な値について説明します。tsol_lbuild_create(3) に渡される値は、その戻り値 ModLabelData 型に格納されます。これらの値は、tsol_lbuild_get(3)tsol_lbuild_set(3) の呼び出しによってアクセスできます。ModLabelData 構造の詳細は、「ModLabelData 構造体」を参照してください。

拡張処理はすべて、tsol_lbuild_get(3) に渡すことができます。しかし、LBUILD_WORK_ で始まる名前を持つ処理を、tsol_lbuild_set(3) または tsol_lbuild_create(3) に渡すことは有効ではありません。これは、これらの値がエンドユーザー入力に従ってラベルビルダーによって設定されるためです。このような例外は、説明に記述してあります。

LBUILD_MODE - tsol_lbuild_create(3) に対し、情報ラベル、機密ラベル、CMW ラベル、または認可上限を構築するユーザーインタフェースを作成するように指示できます。デフォルトの値は、LBUILD_MODE_CMW です。


注 -

アプリケーションを実行するシステムのラベルがどのように設定されているかがわかると、使用すべきモードを判断しやすくなります。たとえば、情報ラベルを使用しないシステムにはユーザーが情報ラベルを構築しないように設定できます。システムのセキュリティ構成のチェック方法は、第 2 章「プログラミングインタフェースの概要」「システムセキュリティ構成の照会」を参照してください。


LBUILD_VALUE_SL - モードが LBUILD_MODE_SL の場合に「更新後のラベル (Update With)」フィールドの上の「ラベル (Label)」フィールドに最初に表示される機密ラベルです。この値のデフォルトは、ADMIN_LOW です。

LBUILD_VALUE_CMW - モードが LBUILD_MODE_CMW の場合に「更新後のラベル (Update With)」フィールドの上の「ラベル (Label)」フィールドに最初に表示される CMW ラベルです。この値のデフォルトは、ADMIN_LOW[ADMIN_LOW]です。

LBUILD_VALUE_CLR - モードが LBUILD_MODE_CL の場合に「更新後のラベル (Update With)」フィールドの上の「ラベル (Label)」フィールドに最初に表示される認可上限です。この値のデフォルトは、ADMIN_LOW です。

LBUILD_USERFIELD - ラベルビルダーのダイアログボックスの最上部に表示される、文字列プロンプトです。値のデフォルトは NULL です。

LBUILD_SHOW - ラベルビルダーのダイアログボックスを表示または非表示にします。値のデフォルトは FALSE です。

LBUILD_TITLE - ラベルビルダーのダイアログボックスの最上部に表示されるタイトルの文字列です。値のデフォルトは NULL です。

LBUILD_WORK_SL - エンドユーザーが構築している機密ラベルです。値は、エンドユーザーが「更新 (Update)」プッシュボタンを選択するか、対話形式でオプションを選択する場合、エンドユーザーの入力値に更新されます。値のデフォルトは ADMIN_LOW です。この拡張処理は、tsol_lbuild_set(3)tsol_lbuild_create(3) には無効です。

LBUILD_WORK_CMW - エンドユーザーが構築している CMW ラベルです。値は、エンドユーザーが「更新 (Update)」プッシュボタンを選択するか、対話形式でオプションの 1 つを選択する場合、エンドユーザーの入力値に更新されます。値のデフォルトは ADMIN_LOW[ADMIN_LOW] です。この拡張オペレーションは、tsol_lbuild_set(3)tsol_lbuild_create(3) には無効です。

LBUILD_WORK_CLR - エンドユーザーが構築している認可上限です。値は、エンドユーザーが「更新 (Update)」プッシュボタンを選択するか、対話形式でオプションの 1 つを選択する場合、エンドユーザーの入力値に更新されます。値のデフォルトは ADMIN_LOW です。この拡張オペレーションは、tsol_lbuild_set(3)tsol_lbuild_create(3) には無効です。

LBUILD_X - ラベルビルダーのダイアログボックスの左上隅から画面の左上隅までの、ピクセル単位の X オフセットです。ラベルビルダーのダイアログボックスのデフォルトの位置は、画面の中央です。

LBUILD_Y - ラベルビルダーのダイアログボックスの左上隅から画面の左上隅までの、ピクセル単位の Y オフセットです。ラベルビルダーのダイアログボックスのデフォルトの位置は、画面の中央です。

LBUILD_UPPER_BOUND - 対話形式でラベルまたは認可上限を構築するためにユーザーが使用できるもっとも高い格付け (および関連するコンパートメントとマーキング) であり、ラジオボタンで示されます。指定する値は、ユーザーの認可範囲でなければなりません。値が指定されないと、実行可能ファイルに sys_trans_label 特権がある場合はユーザーの認可上限が使用され、この特権がない場合にはユーザーのワークスペースの機密ラベルが使用されます。

LBUILD_LOWER_BOUND - 対話形式でラベルまたは認可上限を構築するためにユーザーが使用できるもっとも低い格付け (および関連するコンパートメントとマーキング) であり、ラジオボタンで示されます。この値は、ユーザーの最下位ラベルです。

LBUILD_CHECK_AR - ユーザーが構築するラベルがユーザーの認可範囲内であることをチェックします。値 1 はチェックすることを意味し、値 0 はチェックしないことを意味します。ラベルが認可範囲外の場合は、エンドユーザーにエラーが表示されます。デフォルトでは、チェックが行われます。

LBUILD_VIEW - 内部ラベル表示または外部ラベル表示を使用します。値のデフォルトは、LBUILD_VIEW_EXTERNAL です。

ModLabelData 構造体

ModLabelData 構造体は、tsol_lbuild_create(3) に対する呼び出しで作成されるラベルビルダーインタフェースの状態についての情報を含みます。次の表は、ModLabelData フィールドについて説明しています。ウィジェットとコールバックを除くすべてのフィールドは、一覧に示す拡張処理と有効な値を tsol_lbuild_set(3) または tsol_lbuild_get(3)、あるいはこれら両方に対する呼び出しに指定してアクセスできます。拡張処理の詳細は、「拡張処理」を参照してください。

表 16-1 ModLabelData 構造体

データ型 

フィールド 

拡張オペレーション / 内容 

コメント 

int

mode

LBUILD_MODE 

 

int

check_ar

LBUILD_CHECK_AR 

 

int

view

LBUILD_VIEW 

 

Bool

show

LBUILD_SHOW 

 

char

*userfield

LBUILD_USERFIELD 

 

char

*lbuild_title

LBUILD_TITLE  

 

Position

x

LBUILD_X 

 

Position

y

LBUILD_Y 

 

bslabel_t

sl

LBUILD_VALUE_SL 

 

bclabel_t

cmw

LBUILD_VALUE_CMW 

 

bclear_t

clr

LBUILD_VALUE_CLR 

 

bslabel_t

sl_work

LBUILD_WORK_SL 

tsol_lbuild_set()

tsol_lbuild_create() には無効

bclabel_t

cmw_work

LBUILD_WORK_CMW 

tsol_lbuild_set()

tsol_lbuild_create() には無効

bclear_t

clr_work

LBUILD_WORK_CLR 

tsol_lbuild_set()

tsol_lbuild_create() には無効

brange_t

range

LBUILD_UPPER_BOUND、LBUILD_LOWER_BOUND 

 

Widget

lbuild_dialog

ラベルビルダーのダイアログボックス 

 

Widget

ok

「了解 (OK)」プッシュボタン 

 

Widget

cancel

「取り消し (Cancel)」プッシュボタン 

 

Widget

reset

「リセット (Reset)」プッシュボタン 

 

Widget

help

「ヘルプ (Help)」プッシュボタン 

 

void

(*event_handler)()

tsol_lbuild_create() に渡されるコールバック