次の図は、この図の後に挙げたコードから作成される GUI を示しています。main プログラムは、1 つのプッシュボタン (display) を持つ親フォーム (form) を作成します。プッシュボタンコールバックは、tsol_lbuild_create(3) に対する呼び出しで作成されたラベルビルダーのダイアログボックスを表示します。
右側のラベルビルダーのダイアログボックスは、左側の「表示 (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) ファイルの定義どおりに有効なラベルまたは認可上限であるかを検査します。
入力が無効な場合、ラベルビルダーはエンドユーザーにエラーを表示します。
入力が有効な場合、ラベルビルダーは上側の「ラベル (Label)」フィールド内のテキストを更新して、その値を tsol_lbuild_create(3) が返す ModLabelData 変数の適切な作業ラベルフィールドに格納します。「ModLabelData 構造体」を参照してください。
エンドユーザーが「了解 (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)」プッシュボタンは、「ラベル (Label)」フィールド内のテキストを、アプリケーションの開始時の値に設定します。
「取り消し (Cancel)」プッシュボタンは、アプリケーションを終了します。
ラベルビルダーのユーザーインタフェースによって生成される有効なラベルや認可上限と併せ、アプリケーション固有のコールバックやエラー処理、その他の機能を追加するかどうかは、開発者しだいです。
ラベルビルダーがユーザーに表示するのは、ワークスペースの機密ラベルより優位でない格付け (および関連するコンパートメントとマーキング) だけです。ただし、実行可能ファイルの有効セットに sys_trans_label 特権がある場合は別です。
「了解 (OK)」プッシュボタンのコールバックに対するアプリケーション固有の実装は、特権を必要とする場合があります。
エンドユーザーにラベルの昇格または降格を行う承認がない場合や、ユーザーが構築したラベルがユーザーの認可範囲外の場合は、エンドユーザーが作業を完了できないように「了解 (OK)」ボタンと「リセット (Reset)」ボタンはグレー表示されます。これらの制限を無効にする特権はありません。
tsol_lbuild_create(3) ルーチンは、任意のウィジェット、ブール値、コールバック、NULL で終了した一連の処理とその値の組み合わせを受け入れます。返されるのは、ModLabelData 型の変数です。
ウィジェット - ラベルビルダーは、任意のウィジェットからダイアログボックスを構築できます。
コールバック関数 - コールバック関数は、「了解 (OK)」ボタンが押されるときにアクティブになります。このコールバックは、アプリケーション固有の動作を可能にします。
処理とその値の組み合わせ - ペアの処理 (左) 側は、「拡張処理」の拡張処理の 1 つを指定します。値 (右) 側は、その値を指定します。この値は、列挙型の定数のこともあれば、開発者により指定される場合もあります。ペアはどのような順にでも指定できますが、指定する処理は有効な値を必要とします。
戻り値は、作成したばかりのダイアログボックスの情報を含むデータ構造です。この情報は、tsol_lbuild_create(3) 入力パラメータと実行中のユーザーアクティビティから出力されます。値が指定されない一部のフィールドには、ラベルビルダーによってデフォルト値が提供されます。
この変数内の情報をプログラムによりアクセスして変更するには、tsol_lbuild_get(3) と tsol_lbuild_set(3) ルーチンを使用してください。データ構造の詳細は、「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 です。
TRUE - ラベルビルダーのダイアログボックスを表示する
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 です。
LBUILD_VIEW_INTERNAL - システムにおけるもっとも高いラベルともっとも低いラベルの内部名である ADMIN_HIGH と ADMIN_LOW を使用します。
LBUILD_VIEW_EXTERNAL - ADMIN_LOW ラベルを下から 2 番目に低いラベルに昇格し、ADMIN_HIGH ラベルを上から 2 番目に高いラベルに降格します。
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() に渡されるコールバック |
|