次の図は、図のあとに示すコードによって作成される GUI です。main プログラムは、1 つのボタン (display) を持つ親フォーム (form) を作成します。ボタンコールバックが、tsol_lbuild_create() ルーチンの呼び出しによって作成されるラベルビルダーのダイアログボックスを表示します。tsol_lbuild_create(3TSOL) のマニュアルページを参照してください。
親フォームの「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 |
この節の内容は次のとおりです。
ラベルビルダーの動作
ラベルビルダーのアプリケーション固有の機能
特権操作とラベルビルダー
tsol_lbuild_create() ルーチン
拡張ラベルビルダー操作
ModLabelData 構造体
ラベルビルダーのダイアログボックスは、エンドユーザーに情報の入力を求め、その入力から有効な機密ラベルを生成します。ラベルビルダーは、有効なラベルまたは認可上限が確実に作成されるようにします。ラベルおよび認可上限は、システムの label_encodings ファイルに定義されます。
ラベルビルダーは、「OK」、「Reset」、「Cancel」、「Update」ボタンに対するデフォルト動作を提供します。tsol_lbuild_create() ルーチンに渡されるコールバックは、「OK」ボタンにマップされてアプリケーション固有の動作を提供します。
「Update」ボタンは、「Update With」フィールドにユーザーが入力するテキストを受け取り、その文字列が label_encodings ファイルに定義されている有効なラベルまたは認可上限であることを検査します。
入力が有効でない場合、ラベルビルダーはユーザーにエラーを表示します。
入力が有効である場合、ラベルビルダーは「Label」フィールドのテキストを更新し、tsol_lbuild_create() ルーチンによって返される ModLabelData 変数の該当する作業ラベルフィールドにその値を格納します。「ModLabelData 構造体」を参照してください。
ユーザーが「OK」をクリックすると、「OK」ボタンのコールバック実装に従ってユーザー作成の値が処理されます。
「Label Settings」ラジオボタンオプションによって、格付けおよびコンパートメントから機密ラベルまたは認可上限を作成できます。また、このオプションでは、格付け、コンパートメント、およびマーキングから情報ラベルも作成できます。モードによっては、ボタンのいずれかがグレー表示になることがあります。この方法は、キーボード入力による方法、および前の節で説明した「Update」ボタンによる方法とは別です。
格付け、コンパートメント、およびマーキングに関する情報は、システムの label_encodings ファイルに指定します。label_encodings ファイルに指定される組み合わせおよび制約が強制されますが、無効な組み合わせはグレー表示です。ユーザーがオプションを選択すると、「Label」フィールドが更新され、tsol_lbuild_create() ルーチンによって返される ModLabelData 変数の該当する作業ラベルフィールドにその値が格納されます。ユーザーは格付け (CLASS) およびコンパートメント (COMPS) のリストにあるラジオボタンを選択することによって、機密ラベルまたは認可上限を作成できます。
ユーザーが「OK」をクリックすると、「OK」ボタンのコールバック実装に従ってユーザー作成の値が処理されます。
「Reset」ボタンは、「Label」フィールドのテキストをアプリケーションが起動したときの値に設定します。
「Cancel」ボタンは、変更内容を保存せずにアプリケーションを終了します。
ラベルビルダー GUI は、有効なラベルまたは認可上限を生成します。アプリケーション固有のコールバック、エラー処理、さらにラベルまたは認可上限に関連付けられるその他の機能も追加する必要があります。
ラベルビルダーは、ワークスペース機密ラベルが優位である格付けおよび関連コンパートメントのみをユーザーに表示します。実行可能ファイルの実効セットに sys_trans_label 特権がある場合、それ以外の格付けおよびコンパートメントも表示されることがあります。
「OK」ボタンコールバックのアプリケーション固有の実装には、特権が必要な場合があります。
ユーザーがラベルをアップグレードまたはダウングレードする承認を持っていない場合、「OK」および「Reset」ボタンはグレー表示です。ユーザー作成のラベルがユーザーの範囲外の場合も同様です。グレー表示のボタンでは、ユーザーはタスクを完了できません。この制限を無効にできる特権はありません。
tsol_lbuild_create() ルーチンは、ウィジェットのいずれも、コールバック関数、および NULL で終わる一連の名前と値のペアを受け入れます。名前が操作を表します。ルーチンは型 ModLabelData の変数を返します。
次に、tsol_lbuild_create() ルーチンによって受け入れられる情報について説明します。
ウィジェット – ラベルビルダーは、いずれのウィジェットからもダイアログボックスを作成できます。
コールバック関数 – 「OK」ボタンがクリックされると、コールバック関数が起動されます。このコールバック関数はアプリケーション固有の動作を提供します。
名前と値のペア – ペアの名前 (左) 側は拡張操作を指定し (「拡張ラベルビルダー操作」を参照)、値 (右) 側はその値を指定します。値は列挙型定数である場合があります。それ以外の場合は、値を指定します。ペアの指定順序は任意ですが、指定するすべての操作に有効な値が必要です。
戻り値は、作成したダイアログボックスに関する情報を含むデータ構造体です。情報の元は、tsol_lbuild_create() 入力パラメータおよび実行時のユーザーアクティビティーです。ラベルビルダーは、値が指定されていない一部のフィールドにデフォルト値を提供します。
プログラムによってこの名前と値のペアの情報にアクセスして変更するには、tsol_lbuild_get() ルーチンおよび tsol_lbuild_set() ルーチンを使用します。データ構造については、「ModLabelData 構造体」を参照してください。
次の例は、tsol_lbuild_create() ルーチンの呼び出しです。
data= tsol_lbuild_create(form, callback_function, LBUILD_MODE, LBUILD_MODE_SL, LBUILD_TITLE, "Building a 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);
この節では、拡張操作と、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() に渡すのに有効ではありません。これらの値はユーザー入力に基づいてラベルビルダーによって設定されるためです。この例外は、次の操作の説明にも記されています。
LBUILD_MODE – 機密ラベルまたは認可上限を作成するためのユーザーインタフェースを作成するように tsol_lbuild_create() に指示することができます。デフォルト値は LBUILD_MODE_SL です。
LBUILD_VALUE_SL – モードが LBUILD_MODE_SL のときに「Label」フィールドに表示される最初の機密ラベル。デフォルト値は ADMIN_LOW です。
LBUILD_VALUE_CLR – モードが LBUILD_MODE_CLR のときに「Label」フィールドに表示される最初の認可上限。デフォルト値は ADMIN_LOW です。
LBUILD_USERFIELD – ラベルビルダーのダイアログボックスの最上部に表示される文字列プロンプト。 デフォルト値は NULL です。
LBUILD_SHOW – ラベルビルダーのダイアログボックスを表示または非表示にします。デフォルト値は FALSE です。
TRUE – ラベルビルダーのダイアログボックスを表示します。
FALSE – ラベルビルダーのダイアログボックスを非表示にします。
LBUILD_TITLE – ラベルビルダーのダイアログボックスの最上部に表示される文字列タイトル。デフォルト値は NULL です。
LBUILD_WORK_SL – ユーザーが作成する機密ラベル。ユーザーが「Update」ボタンを選択したり、対話式にオプションを選択すると、この値はユーザーの入力に基づいて更新されます。デフォルト値は ADMIN_LOW です。tsol_lbuild_set() または tsol_lbuild_create() に対して有効な拡張操作ではありません。
LBUILD_WORK_CLR – ユーザーが作成する認可上限。ユーザーが「Update」ボタンを選択したり、対話式にオプションを選択すると、この値はユーザーの入力に基づいて更新されます。デフォルト値は ADMIN_LOW です。tsol_lbuild_set() または tsol_lbuild_create() に対して有効な拡張操作ではありません。
LBUILD_X – 画面の左上隅に対する、ラベルビルダーのダイアログボックスの左上隅からの X 軸方向のオフセット (ピクセル単位)。デフォルトでは、ラベルビルダーのダイアログボックスは画面中央に配置されます。
LBUILD_Y – 画面の左上隅に対する、ラベルビルダーのダイアログボックスの左上隅からの Y 軸方向のオフセット (ピクセル単位)。デフォルトでは、ラベルビルダーのダイアログボックスは画面中央に配置されます。
LBUILD_UPPER_BOUND – ラジオボタンとしてユーザーに使用可能な最高位格付け、および関連コンパートメントとマーキング。これらのボタンは、ラベルまたは認可上限を対話式に作成するために使用されます。指定する値はユーザーの範囲内である必要があります。値を指定しない場合、この値はユーザーのワークスペース機密ラベルになります。または、実行可能ファイルが sys_trans_label 特権を持つ場合、この値はユーザーの認可上限です。
LBUILD_LOWER_BOUND – ラジオボタンとしてユーザーに使用可能な最下位格付け、および関連コンパートメントとマーキング。これらのボタンは、ラベルまたは認可上限を対話式に作成するために使用されます。この値はユーザーの最小ラベルです。値を指定しない場合、この値はユーザーの属性によって指定されるデフォルトに基づきます。
LBUILD_CHECK_AR – ユーザー作成のラベルがユーザーの範囲内であるかを検査します。値 1 は「検査する」、値 0 は「検査しない」です。ラベルが範囲外の場合、エラーメッセージがユーザーに表示されます。デフォルト値は 1 です。
LBUILD_VIEW – 内部ラベル表現または外部ラベル表現を使用するか否かを決定します。デフォルト値は LBUILD_VIEW_EXTERNAL です。
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 |
|