このあとの各節では、Trusted Extensions インタフェース呼び出しを使用するコーディング例の抜粋を示します。これらの呼び出しはセキュリティー属性を処理して、ラベルを文字列に変換します。抜粋では、ウィンドウセキュリティー属性、アプリケーションプログラムでもっとも一般的に管理される属性の処理に焦点を当てます。多くの場合、クライアントは、別のアプリケーションによって作成されたオブジェクトに対して適切な特権を使用することによってセキュリティー属性を取得します。その次に、クライアントは属性をチェックして、オブジェクトに対する操作がシステムのセキュリティーポリシーによって許可されているか否かを判別します。このセキュリティーポリシーには、DAC ポリシー、および MAC の等位書き込みと下位読み取りのポリシーが含まれます。アクセスが拒否されると、アプリケーションは場合に応じてエラーを生成するか、特権を使用します。特権が必要とされる場合の説明は、「特権操作とトラステッド X ウィンドウシステム」を参照してください。
Trusted Extensions API に渡すためのオブジェクトの ID を取得する前に、オブジェクトを作成してください。
XTSOLgetResAttributes() ルーチンは、ウィンドウのセキュリティー関連属性を返します。次を指定します。
表示 ID
ウィンドウ ID
セキュリティー属性を必要とするオブジェクトがウィンドウであることを示すフラグ
返される属性を取得する XtsolResAttributes 構造体
クライアントは、そのクライアントが作成したウィンドウのセキュリティー属性を取得するので、特権は必要ありません。
このマニュアル内のプログラム例は、API の紹介を中心としていて、エラーチェックは行なっていません。実際に作成するアプリケーションでは、適切なエラーチェックを実行してください。
/* Xlib 呼び出しによって基本のウィンドウと表示 ID を取得する */ window = XtWindow(topLevel); display = XtDisplay(topLevel); /* ウィンドウセキュリティー属性を取得する */ retval = XTSOLgetResAttributes(display, window, IsWindow, &winattrs); /* ラベルを文字列に変換する */ retval = label_to_str(&winattrs.sl, &plabel, M_LABEL, LONG_NAMES); /* セキュリティー属性情報を出力する */ printf(“Workstation Owner ID = %d\nUser ID = %d\nLabel = %s\n”, winattrs.ouid, winattrs.uid, string1);
printf 文によって次のように出力されます。
Workstation Owner ID = 29378 User ID = 29378 Label = CONFIDENTIAL |
この例は、プロセス機密ラベルを取得し、フォントリストおよびピクセル幅を使用してそれを文字列に変換する方法を示します。ラベルの文字列とともに、ラベルウィジェットが作成されます。プロセス機密ラベルはウィンドウ機密ラベルと同じです。したがって、特権は必要ありません。
最後の文字列がピクセル幅に収まらない場合、文字列は切り取られて切り取りインジケータが表示されます。X ウィンドウシステムのラベル変換インタフェースは指定したピクセル数で切り取り、ラベルクリッピングインタフェースは文字数で切り取ります。
英語以外の言語で label_encodings ファイルを使用する場合、ISO 標準のコード番号 128 以上のアクセント文字では変換されないことがあります。次の例は、アジア言語の文字セットでは機能しません。
retval = getplabel(&senslabel); /* フォントリストを作成し、それを使用してラベルを変換する */ 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);
この例は、ウィンドウの機密ラベルを取得する方法を示します。プロセス機密ラベルはウィンドウ機密ラベルと同じです。したがって、特権は必要ありません。
/* ウィンドウラベルを取得する */ retval = XTSOLgetResLabel(display, window, IsWindow, &senslabel); /* ラベルを文字列に変換し、出力する */ retval = label_to_str(label, &string, M_LABEL, LONG_NAMES); printf(“Label = %s\n”, string);
printf 文によって、たとえば、次のように出力されます。
Label = PUBLIC |
この例は、ウィンドウに機密ラベルを設定する方法を示します。新しい機密ラベルは、ウィンドウおよびプロセスの機密ラベルより優位です。クライアントが優位ではないラベルを変換するには、クライアントの実効セットに sys_trans_label 特権が必要です。さらに、ウィンドウの機密ラベルを変更するには、クライアントに win_upgrade_sl 特権も必要です。
特権の使用についての詳細は、『Solaris セキュリティーサービス開発ガイド』を参照してください。
/* テキスト文字列を機密ラベルに変換する */ retval = label_to_str(string4, &label, M_LABEL, L_NO_CORRECTION, &error); /* 新しい値で機密ラベルを設定する */ retval = XTSOLsetResLabel(display, window, IsWindow, label);
この例は、ウィンドウユーザー ID を取得する方法を示します。プロセスはウィンドウリソースを所有し、同じ機密ラベルで実行されています。したがって、特権は必要ありません。
/* ウィンドウのユーザー ID を取得する */ retval = XTSOLgetResUID(display, window, IsWindow, &uid);
この例は、X ウィンドウサーバーにログインしているユーザーの ID を取得する方法を示します。プロセス機密ラベルはウィンドウ機密ラベルと同じです。したがって、特権は必要ありません。
/* ウィンドウのユーザー ID を取得する */ retval = XTSOLgetWorkstationOwner(display, &uid);