Solaris Trusted Extensions 開発ガイド

第 7 章 ラベルビルダー API

Solaris Trusted Extensions は、Motif ベースの API のセットを提供します。これらのインタフェースを使用することによって、ユーザー入力から有効な機密ラベルまたは認可上限を作成するための対話型 GUI を作成できます。これらのインタフェースは「ラベルビルダー API」と呼ばれます。多くの場合、これらの API は管理アプリケーションから呼び出されます。

ラベルビルダー GUI は Solaris Trusted Extensions が構成されているシステム で使用されます。『Solaris Trusted Extensions ユーザーズガイド』では、これらのインタフェースについてエンドユーザーの観点から説明しており、ラベルビルダーライブラリルーチンによって提供される機能も示されています。

Trusted Extensions API を Solaris OS で使用する方法の例は、Solaris ソースコードを参照してください。OpenSolaris の Web サイト の左のナビゲーションバーにある「Source Browser」をクリックします。Source Browser を使用して Solaris のソースコードを検索します。

この章の内容は次のとおりです。

ラベルビルダー GUI 用の API

この節で説明する API を使用するには、次のヘッダーファイルを組み込む必要があります。


#include <Dt/ModLabel.h>

ライブラリビルダーの例は、-lDtTsol および -ltsol ライブラリオプションによってコンパイルされます。

次の API は、ラベル GUI の作成のために使用できます。データ型とパラメータのリストは「対話型ユーザーインタフェースの作成」にあります。

ModLabelData *tsol_lbuild_create(Widget widget, void (*event_handler)() ok_callback, lbuild_attributes extended_operation, ..., NULL);

tsol_lbuild_create() ルーチンは GUI を作成し、ユーザーインタフェースに関する情報を含む型 ModLabeldata のポインタ変数を返します。この情報は、tsol_lbuild_create() 入力パラメータリストに渡される値、指定されない情報に代わるデフォルト値、およびユーザーインタフェースの作成にラベルビルダーが使用するウィジェットに関する情報の組み合わせです。

LBUILD_WORK_SLLBUILD_WORK_CLR の操作値は、ユーザーが指定する入力によって設定される値なので、tsol_lbuild_create() には有効ではありません。

tsol_lbuild_get() および tsol_lbuild_set() ルーチンを使用して、拡張操作と値を取得および設定できます。ただし、これらのルーチンはウィジェット情報には使用できません。この情報は、ModLabelData 構造体のフィールドを参照することによって直接アクセスされます。labelbuilder(3TSOL) のマニュアルページを参照してください。

void tsol_lbuild_destroy(ModLabelData *lbdata);

tsol_lbuild_destroy() ルーチンは、tsol_lbuild_create() ルーチンによって返される ModLabelData 構造体を破棄します。

void *tsol_lbuild_get(ModLabelData *lbdata, lbuild_attributes extended_operation);

tsol_lbuild_get() ルーチンは、tsol_lbuild_create() によって作成されて ModLabelData 構造体に格納されるユーザーインタフェース情報にアクセスします。

void tsol_lbuild_set(ModLabelData *lbdata, lbuild_attributes extended_operation, ..., NULL);

tsol_lbuild_set() ルーチンは、tsol_lbuild_create() によって作成されて ModLabelData 構造体に格納されるユーザーインタフェース情報を変更します。LBUILD_WORK_SLLBUILD_WORK_CLR の操作値は、ユーザーが指定する入力によって設定される値なので、tsol_lbuild_set() には有効ではありません。

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

次の図は、図のあとに示すコードによって作成される GUI です。main プログラムは、1 つのボタン (display) を持つ親フォーム (form) を作成します。ボタンコールバックが、tsol_lbuild_create() ルーチンの呼び出しによって作成されるラベルビルダーのダイアログボックスを表示します。tsol_lbuild_create(3TSOL) のマニュアルページを参照してください。

図 7–1 ラベル作成のインタフェース

ウィンドウは、ラベルビルダーのパーツを示します。引出線は、ダイアログボックスのタイトル、ユーザーフィールド、ラベルビルダーフィールド、および「OK」ボタンコールバック機能を示します。

親フォームの「Show」ボタンをクリックすると、ラベルビルダーのダイアログボックスが表示されます。tsol_lbuild_create() ルーチンに渡されるパラメータがラベルビルダーのダイアログボックスのどこにあるかが引出線によって示されています。tsol_lbuild_create(3TSOL) のマニュアルページを参照してください。

次のコードによって、図に示すような GUI が作成されます。

#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;
	m_label_t *sl_label, *work_sl_label;
	Position x, y;

/* アプリケーション固有の実装を行う */
	printf("OK button called\n"); 

/* 照会の設定 */
	mode = (int)tsol_lbuild_get(data, LBUILD_MODE);
	title = (String)tsol_lbuild_get(data, LBUILD_TITLE);
	sl_label = (m_label_t*) tsol_lbuild_get(data, LBUILD_VALUE_SL);
	work_sl_label = (m_label_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);

	label_to_str(sl_label, &string, M_LABEL, LONG_NAMES);
	label_to_str(work_sl_label, &string1, M_LABEL, LONG_NAMES);
	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 = "CNF";
	m_label_t * sl_label;

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

	retval = str_to_label(sl_string, &sl_label, MAC_LABEL, L_NO_CORRECTION, NULL);
	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);

}

プログラムを実行すると、次の出力が生成されます。


OK button called  
Mode = 12, Title = Building Sensitivity label, 
Label = CNF, WorkSL = SECRET, 
View = 1, X = 200, Y = 200, 
Userval = /export/home/zelda, 
Show = 1

この節の内容は次のとおりです。

ラベルビルダーの動作

ラベルビルダーのダイアログボックスは、エンドユーザーに情報の入力を求め、その入力から有効な機密ラベルを生成します。ラベルビルダーは、有効なラベルまたは認可上限が確実に作成されるようにします。ラベルおよび認可上限は、システムの label_encodings ファイルに定義されます。

ラベルビルダーは、「OK」、「Reset」、「Cancel」、「Update」ボタンに対するデフォルト動作を提供します。tsol_lbuild_create() ルーチンに渡されるコールバックは、「OK」ボタンにマップされてアプリケーション固有の動作を提供します。

キーボード入力と「Update」ボタン

「Update」ボタンは、「Update With」フィールドにユーザーが入力するテキストを受け取り、その文字列が label_encodings ファイルに定義されている有効なラベルまたは認可上限であることを検査します。

ユーザーが「OK」をクリックすると、「OK」ボタンのコールバック実装に従ってユーザー作成の値が処理されます。

ラジオボタンオプション

「Label Settings」ラジオボタンオプションによって、格付けおよびコンパートメントから機密ラベルまたは認可上限を作成できます。また、このオプションでは、格付け、コンパートメント、およびマーキングから情報ラベルも作成できます。モードによっては、ボタンのいずれかがグレー表示になることがあります。この方法は、キーボード入力による方法、および前の節で説明した「Update」ボタンによる方法とは別です。

格付け、コンパートメント、およびマーキングに関する情報は、システムの label_encodings ファイルに指定します。label_encodings ファイルに指定される組み合わせおよび制約が強制されますが、無効な組み合わせはグレー表示です。ユーザーがオプションを選択すると、「Label」フィールドが更新され、tsol_lbuild_create() ルーチンによって返される ModLabelData 変数の該当する作業ラベルフィールドにその値が格納されます。ユーザーは格付け (CLASS) およびコンパートメント (COMPS) のリストにあるラジオボタンを選択することによって、機密ラベルまたは認可上限を作成できます。

ユーザーが「OK」をクリックすると、「OK」ボタンのコールバック実装に従ってユーザー作成の値が処理されます。

「Reset」ボタン

「Reset」ボタンは、「Label」フィールドのテキストをアプリケーションが起動したときの値に設定します。

「Cancel」ボタン

「Cancel」ボタンは、変更内容を保存せずにアプリケーションを終了します。

ラベルビルダーのアプリケーション固有の機能

ラベルビルダー GUI は、有効なラベルまたは認可上限を生成します。アプリケーション固有のコールバック、エラー処理、さらにラベルまたは認可上限に関連付けられるその他の機能も追加する必要があります。

特権操作とラベルビルダー

ラベルビルダーは、ワークスペース機密ラベルが優位である格付けおよび関連コンパートメントのみをユーザーに表示します。実行可能ファイルの実効セットに sys_trans_label 特権がある場合、それ以外の格付けおよびコンパートメントも表示されることがあります。

「OK」ボタンコールバックのアプリケーション固有の実装には、特権が必要な場合があります。

ユーザーがラベルをアップグレードまたはダウングレードする承認を持っていない場合、「OK」および「Reset」ボタンはグレー表示です。ユーザー作成のラベルがユーザーの範囲外の場合も同様です。グレー表示のボタンでは、ユーザーはタスクを完了できません。この制限を無効にできる特権はありません。

tsol_lbuild_create() ルーチン

tsol_lbuild_create() ルーチンは、ウィジェットのいずれも、コールバック関数、および NULL で終わる一連の名前と値のペアを受け入れます。名前が操作を表します。ルーチンは型 ModLabelData の変数を返します。

次に、tsol_lbuild_create() ルーチンによって受け入れられる情報について説明します。

拡張ラベルビルダー操作

この節では、拡張操作と、tsol_lbuild_create()tsol_lbuild_get()、および tsol_lbuild_set() ルーチンに渡すことができる有効な値について説明します。tsol_lbuild_create() に渡される値は、それの戻り値に格納されます。戻り値の型は ModLabelData です。パラメータに返される値には、tsol_lbuild_get() および tsol_lbuild_set() の呼び出しによってアクセスできます。ModLabelData 構造体は、ModLabelData 構造体」で説明されています。tsol_lbuild_create(3TSOL)tsol_lbuild_get(3TSOL)、および tsol_lbuild_set(3TSOL) のマニュアルページを参照してください。

すべての拡張操作は、tsol_lbuild_get() に渡すのに有効です。ただし、LBUILD_WORK_SL および LBUILD_WORK_CLR の操作は、tsol_lbuild_set() または tsol_lbuild_create() に渡すのに有効ではありません。これらの値はユーザー入力に基づいてラベルビルダーによって設定されるためです。この例外は、次の操作の説明にも記されています。

ModLabelData 構造体

ModLabelData 構造体には、tsol_lbuild_create() ルーチンを呼び出すことによって作成されるラベルビルダーインタフェースの状態に関する情報が含まれます。次の表に ModLabelData フィールドを示します。ウィジェットとコールバックを除くすべてのフィールドには、関連付けられている拡張操作を指定することによって、また tsol_lbuild_set() または tsol_lbuild_get() の呼び出しにおいて有効な値を指定することによってアクセスできます。拡張操作の説明は、「拡張ラベルビルダー操作」を参照してください。

表 7–1 ModLabelData 構造体

拡張操作、または摘要 

データ型 

フィールド 

コメント 

LBUILD_CHECK_AR

int

check_ar

 

LBUILD_MODE

int

mode

 

LBUILD_SHOW

Bool

show

 

LBUILD_TITLE

char

*lbuild_title

 

LBUILD_UPPER_BOUND, LBUILD_LOWER_BOUND

brange_t

range

 

LBUILD_USERFIELD

char

*userfield

 

LBUILD_VALUE_CLR

bclear_t

*clr

 

LBUILD_VALUE_SL

m_label_t

*sl

 

LBUILD_VIEW

int

view

 

LBUILD_WORK_CLR

bclear_t

*clr_work

tsol_lbuild_set() または tsol_lbuild_create() には無効

LBUILD_WORK_SL

m_label_t

*sl_work

tsol_lbuild_set() または tsol_lbuild_create() には無効

LBUILD_X

Position

x

 

LBUILD_Y

Position

y

 

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

void

(*event_handler)()

 

「Cancel」ボタン 

Widget

cancel

 

「Help」ボタン 

Widget

help

 

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

Widget

lbuild_dialog

 

「OK」ボタン 

Widget

ok

 

「Reset」ボタン 

Widget

reset

 

「Update」ボタン 

Widget

update

 

ラベルビルダーのオンラインヘルプ

「Help」ボタンと、ユーザーインタフェースに使用されるその他のウィジェットは、ModLabelData 構造体の lbl_shell フィールドを通じてアプリケーションコードから直接アクセスできます。アプリケーションにオンラインヘルプを追加するには、『共通デスクトップ環境 プログラマーズ・ガイド (ヘルプ・システム編)』の手順とガイドラインに従います。