Oracle SALT GWWSサーバーは構成に基づくプロセスで、ほとんどの基本的なWebサービス・アプリケーションではプログラミングの必要はありません。ただし、カスタム・タイプ・バッファ・データとカスタマイズした共有ライブラリを利用してGWWSサーバーを拡張するプラグイン・インタフェースを開発すると、Oracle SALTの機能を拡張できます。
プラグイン・インタフェースは、共有ライブラリによってエクスポートされた一連の機能です。共有ライブラリは、GWWSプロセスから特別な機能を実行するためにロードしたり呼び出したりできます。 Oracle SALTには、プラグイン・インタフェースを定義して実装するための共通インタフェースとして、プラグイン・フレームワークが用意されています。 プラグインを実装するには、実際の関数が含まれている共有ライブラリを使用します。 プラグイン実装ライブラリはSALTのデプロイメント・ファイルで設定し、GWWSサーバーの起動中に動的にロードします。
プラグイン・インタフェースを定義するには、次の4つのプラグイン要素が必要です。
プラグインID要素は、特定のプラグイン・インタフェース関数を識別するための文字列です。 同じような機能に同じプラグインIDを使用して、複数のプラグイン・インタフェースをグループ化できます。 プラグインIDの値は、Oracle SALTによって事前に定義されています。 任意の文字列を定義することはできません。
Oracle SALT
10gR3では、プラグインIDとしてP_CUSTOM_TYPE
およびP_CREDENMAPをサポートしています。これは、カスタム・タイプ・バッファ・データを処理するためのプラグイン・インタフェースを定義し、Oracle TuxedoユーザーIDとグループIDをHTTP基本認証が必要とするユーザー名/パスワードにマップするために使用します。
プラグイン名は、同じプラグインIDカテゴリ内のプラグイン実装を別のプラグイン実装と区別するために使用します。
プラグインIDがP_CUSTOM_TYPE
の場合、プラグイン名を使用して実際のカスタム・バッファ・タイプ名を示します。GWWSサーバーがOracle Tuxedoのカスタム・タイプ・バッファとXMLドキュメント間でデータを変換しようとするときに、プラグイン名を主な要素として、適切なプラグイン・インタフェースが検索されます。
実際のビジネス・ロジックでは、必要な関数をプラグインのvtable構造体に追加する必要があります。 必要な関数は、プラグインIDのカテゴリによって異なる場合があります。
P_CREDENMAP IDのカテゴリでは、次の1つの関数を実装する必要があります。
詳細は、「発信認証プラグインのプログラミング」を参照してください。
プラグイン登録関数は、GWWSサーバーがプラグイン実装を呼び出すことができるようにプラグイン・インタフェースで実装する必要がある、一連の共通関数(またはルール)です。 各プラグイン・インタフェースで次の3つの登録関数を実装する必要があります。
この関数は省略可能です。これを使用すると、GWWSサーバーの起動中、プラグイン共有ライブラリのロード後すぐに呼び出されます。1つのプラグイン・ライブラリに複数のインタフェースを実装する場合、この関数を実装し、ライブラリにインタフェースの数、IDおよび名前を返す必要があります。
0
が返された場合は、関数が正常に実行されたことを意味します。 0
以外の値が返された場合は、実行に失敗したことを意味します。 この関数は失敗した場合は、プラグインがロードされなくGWWSサーバーは起動しません。
int _ws_pi_get_Id_and_Names(int * count, char **ids, char **names);
ライブラリ内のcount
引数に実装のカウントの総数を返す必要があります。 IDs
およびnames
の引数には、「;」セミコロンで区切られているすべての実装されたインタフェースIDs
およびnames
を含む必要があります。
開始関数は、プラグイン共有ライブラリに実装されたすべてのインタフェースを決定した後に呼び出されます。 データ構造を初期化して、プラグインで使用できるグローバル環境を設定できます。
0
が返された場合は、開始関数が正常に実行されたことを意味します。 0
以外の値が返された場合は、プラグイン・インタフェースの開始に失敗したことを意味します。 開始に失敗すると、GWWSサーバーは起動されません。
int _ws_pi_init_@ID@_@Name@(char * params, void **priv_ptr);
@ID@
は、実際のプラグインIDの値です。 @Name@
は、実際のプラグイン名です。 たとえば、プラグインIDがP_CUSTOM_TYPE
でプラグイン名がMyType
であるプラグインの開始関数は、_ws_pi_init_P_CUSTOM_TYPE_MyType (char * params, void **priv_ptr)
です。
終了関数は、GWWSサーバーのシャットダウン中、プラグイン共有ライブラリの終了前に呼び出されます。 予約されているすべてのプラグイン・リソースを解放する必要があります。
int _ws_pi_exit_@ID@_@Name@(void * priv);
@ID@
は、実際のプラグインIDの値です。 @Name@
は、実際のプラグイン名です。 たとえば、プラグインIDがP_CUSTOM_TYPE
でプラグイン名がMyType
であるプラグインの終了関数は、_ws_pi_exit_P_CUSTOM_TYPE_MyType(void * priv)
です。
vtable
は、プラグイン・インタフェースの実際のビジネス・ロジックに必要な関数ポインタが格納されるC構造体です。 つまり、有効なプラグイン・インタフェースでは、対応するvtableで定義されているすべての関数を実装する必要があります。
int _ws_pi_set_vtbl_@ID@_@Name@(void * priv);
@ID@
は、実際のプラグインIDの値です。 @Name@
は、実際のプラグイン名です。 たとえば、プラグインIDがP_CUSTOM_TYPE
でプラグイン名がMyType
であるプラグインのvtable設定関数は、_ws_pi_set_vtbl_P_CUSTOM_TYPE_MyType(void * priv)
です。
vtable
構造体は、プラグインIDのカテゴリによって異なる場合があります。Oracle SALT 10gR3リリースでは、P_CUSTOM_TYPE
およびP_CREDENMAPが唯一の有効なプラグインIDです。
使用可能なプラグイン・インタフェースのvtable構造体をリスト6-1に示します。
struct credmap_vtable {
int (* gwws_pi_map_http_basic) (char * domain, char * realm, char * t_userid, char * t_grpid, Cred_UserPass * credential); /* used for HTTP Basic Authentication */
/* for future use */
void * unused_1;
void * unused_2;
void * unused_3;
};
struct
credmap_vtableは、P_CREDENMAPプラグイン・インタフェースに対し1つの関数を実装する必要があることを示します。詳細は、「発信認証プラグインのプログラミング」を参照してください。
関数の入力パラメータvoid * priv
は、具体的なvtableインスタンスを指しています。 vtable設定関数内の実際の関数を使用してvtable構造体を設定する必要があります。
vtable設定関数内の実際の関数を使用してvtable構造体を設定する例をリスト6-2に示します。
int _DLLEXPORT_ _ws_pi_set_vtbl_P_CREDENMAP_TEST (void * vtbl)
{
struct credmap_vtable * vtable;
if ( ! vtbl )
return -1;
vtable = (struct credmap_vtable *) vtbl;
vtable->gwws_pi_map_http_basic =Credmap_HTTP_Basic
;
return 0;
}
プラグイン・インタフェースを開発するには、次の手順に従います。
プラグイン共有ライブラリを開発するには、次の手順に従います。
GWWSサーバーがロードするプラグイン共有ライブラリを定義するには、対応するプラグイン・ライブラリのパスをSALTのデプロイメント・ファイルで設定する必要があります。詳細は、Oracle SALT管理ガイドの「Oracle SALTアプリケーションの構成」を参照してください。
Oracle SALTデプロイメント・ファイルでプラグイン情報を定義する例をリスト6-3に示します。
<?xml version="1.0" encoding="UTF-8"?>
<Deployment xmlns="http://www.bea.com/Tuxedo/SALTDEPLOY/2007">
. . . . . . .
. . . . . . .
<System>
<Plugin>
<Interface
id=”P_CREDENMAP”
name=”TEST”
library=”credmap_plugin.dll” />
</Plugin>
</System>
</Deployment>
注: | 複数のプラグイン・インタフェースを定義するには、複数の<Interface> 要素を指定する必要があります。各<Interface> 要素で1つのプラグイン・インタフェースを指定します。 |
注: | 複数のプラグイン・インタフェースを1つの共有ライブラリ・ファイルにビルドできます。 |
Oracle SALTでは、Oracle TuxedoバッファとSOAPメッセージ・ペイロード間のデータを変換するデフォルト・データ型の変換ルールの完全なセットが定義されています。ただし、デフォルト・データ型の変換ルールによって、SOAPメッセージをOracle Tuxedo型付きバッファに変換(またはその逆)するすべての要件を満たさないことがあります。特定のアプリケーション要件に対応するために、Oracle SALTでは、デフォルト・メッセージの変換を拡張するためにカスタマイズされたメッセージ・レベルの変換プラグインの開発をサポートしています。
注: | SALT 10gR3メッセージ変換プラグインは、拡張された後続のSALT 1.1カスタム・バッファ・タイプ変換プラグインです。 |
メッセージ変換プラグインは、SALTがサポートされる1つのプラグインであり、SALTプラグイン・フレームワークで定義されています。すべてのメッセージ変換プラグイン・インスタンスには、「P_CUSTOM_TYPE」と同じプラグインIDがあります。特定の各メッセージ変換プラグイン・インスタンスでは、SOAPメッセージ・ペイロードをOracle Tuxedoバッファに変換する関数およびOracle TuxedoバッファをSOAPメッセージ・ペイロードに変換する関数という2つの関数を実装できます。これらの2つの関数のプロトタイプは、リスト6-4で定義します。
/* custtype_pi_ex.h */
struct custtype_vtable {
CustomerBuffer * (* soap_in_tuxedo__CUSTBUF) (void * xercesDOMTree, CustomerBuffer * tuxbuf, CustType_Ext * extinfo)
int (* soap_out_tuxedo__CUSTBUF) (void ** xercesDOMTree, CustomerBuffer * tuxbuf, CustType_Ext * extinfo)
......
}
関数のポインタ(* soap_in_tuxedo__CUSTBUF)は、SOAPメッセージ・ペイロードをOracle Tuxedo型付きバッファに変換するカスタマイズされた関数を指しています。
関数のポインタ(* soap_out_tuxedo__CUSTBUF)は、Oracle Tuxedo型付きバッファをSOAPメッセージ・ペイロードに変換するカスタマイズされた関数を指しています。
必要に応じて、メッセージ・プラグインのvtable構造体で定義された両方の関数を実装できます。 1つの関数を実装して、他の関数をNULLポインタで設定することもできます。
着信呼出しシナリオは、外部Webサービス・プログラムを示し、Oracle SALTゲートウェイを介してOracle Tuxedoサービスを呼び出します。図6-1は、Webサービス・クライアントとOracle Tuxedoドメイン間におけるメッセージの流れを示したものです。
SOAPリクエスト・メッセージをGWWSサーバーに配信する場合、GWWSはターゲット・サービスの入力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた(*soap_in_tuxedo__CUSTBUF)関数を呼び出します。
Oracle Tuxedoレスポンス・バッファがOracle Tuxedoサービスから返された場合、GWWSはターゲット・サービスの出力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた(*soap_out_tuxedo__CUSTBUF)関数を呼び出します。
発信呼出しシナリオは、Oracle SALTゲートウェイを介して外部Webサービスを呼び出すOracle Tuxedoプログラムです。図6-2は、Oracle TuxedoドメインとWebサービス・アプリケーション間におけるメッセージの流れを示したものです。
Oracle Tuxedoリクエスト・バッファをGWWSサーバーに配信する場合、GWWSはターゲット・サービスの入力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた(*soap_out_tuxedo__CUSTBUF)関数を呼び出します。
SOAPレスポンス・メッセージが外部Webサービス・アプリケーションから返された場合、GWWSはターゲット・サービスの出力メッセージの変換に関連付けられたメッセージ変換プラグイン・インスタンスが存在しているかどうかを確認します。関連付けられたインスタンスが存在する場合、GWWSはプラグイン・インスタンスで実装したカスタマイズされた(*soap_in_tuxedo__CUSTBUF)関数を呼び出します。
表6-1には、メッセージ変換プラグインの使用例を示します。
表6-1から、次のメッセージ変換プラグインの一般的なルールが適用されます。
TPSUCCESS
かTPFAIL
で返されるかに関係なく)バッファが外部XMLスキーマに関連付けられるとき、SALTのデフォルトのバッファ・タイプに基づく変換ルールによって正しく処理できることが確実ではない場合は、手動で変換を処理するようにメッセージ変換プラグインを開発する必要があります。注: | 外部XMLスキーマ定義をOracle Tuxedoサービスの入力、出力およびエラー・バッファに関連付ける方法の詳細は、『Oracle SALT管理ガイド』のサービス・メタデータ・リポジトリを使用したTuxedoサービス規約の定義に関する項を参照してください。 |
SOAP XMLペイロードをOracle Tuxedoバッファに変換するには、次の関数を実装する必要があります。
CustomerBuffer * (* soap_in_tuxedo__CUSTBUF) (void * xercesDOM, CustomerBuffer *a, CustType_Ext * extinfo);
CustomerBuffer * myxml2buffer (void * xercesDOM, CustomerBuffer *a, CustType_Ext * extinfo);
myxml2buffer
は任意のカスタマイズした関数名です。
実装した関数では、指定されたXMLバッファを解析して、具体的なデータ項目をOracle Tuxedoカスタム・タイプ・バッファ・インスタンスに変換できる必要があります。
入力パラメータchar * xmlbuf
は、XML形式のデータ・ストリームを表すNULLで終わる文字列です。 XMLデータはカスタム・タイプ・バッファの実際のXMLペイロードであって、SOAPエンベロープ全体でもSOAP本文全体でもありません。
入力パラメータchar * type
は、カスタム・タイプ・バッファのタイプ名です。このパラメータは、GWWSサーバーに必要なカスタム・タイプ・バッファ・ハンドラが現在のプラグイン関数に一致しているかどうかを確認するために使用されます。
出力パラメータCustomerBuffer *a
は、割り当てられたカスタム・タイプ・バッファ・インスタンスを格納するために使用されます。Oracle Tuxedoカスタム・タイプ・バッファは、このプラグイン関数からATMI関数tpalloc()
を呼び出して割り当てる必要があります。割り当てられたカスタム・タイプ・バッファをプラグイン・コードで解放する必要はありません。使用されていないバッファはGWWSサーバーによって自動的に破棄されます。
この関数は、成功した場合に入力パラメータCustomerBuffer * a
のポインタ値を返す必要があります。
リスト6-5に示すように、失敗した場合、この関数はNULLを返します。
CustomerBuffer * myxml2buffer (void * xercesDOM, CustomerBuffer *a, CustType_Ext * extinfo
)
{
// casting the input void * xercesDOM to class DOMDocument object
DOMDocument * DOMTree =
// allocate custom typed buffer via tpalloc
a->buf = tpalloc("MYTYPE", "MYSUBTYPE", 1024);
a->len = 1024;
// fetch data from DOMTree and set it into custom typed buffer
DOMTree ==> a->buf;
if ( error ) {
release ( DOMTree );
tpfree(a->buf);
a->buf = NULL;
a->len = 0;
return NULL;
}
release ( DOMTree );
return a;
}
ヒント: | Oracle TuxedoにバンドルされているXercesライブラリをXML解析に使用できます。Tuxedo 8.1にはXerces 1.7がバンドルされ、Tuxedo 9.1にはXerces 2.5がバンドルされています。 |
カスタム・タイプ・バッファをSOAP XMLペイロードに変換するには、次の関数を実装する必要があります。
int (*soap_out_tuxedo__CUSTBUF)(char ** xmlbuf, CustomerBuffer * a, char * type);
int * mybuffer2xml (char ** xmlbuf, CustomerBuffer *a, char * type);
"mybuffer2xml"
は関数名で、必要に応じて有効な文字列を指定できます。
実装した関数は、指定されたカスタム・タイプ・バッファ・インスタンスをSOAPメッセージで使用するシングル・ルートのXMLドキュメントに変換します。
入力パラメータCustomerBuffer *a
は、カスタム・タイプ・バッファ・レスポンス・インスタンスを格納するために使用されます。割り当てられたカスタム・タイプ・バッファをプラグイン・コードで解放する必要はありません。使用されていないバッファはGWWSサーバーによって自動的に破棄されます。
入力パラメータchar * type
は、カスタム・タイプ・バッファのタイプ名です。このパラメータは、SALT GWWSサーバーに必要なカスタム・タイプ・バッファ・ハンドラが現在のプラグイン関数に一致しているかどうかを確認するために使用されます。
出力パラメータchar ** xmlbuf
は、新しく変換されたXMLペイロードを示すポインタです。 XMLペイロード・バッファは、この関数でmalloc ()
システムAPIを呼び出して割り当てる必要があります。 割り当てられたXMLペイロード・バッファをプラグイン・コードで解放する必要はありません。使用されていないバッファはGWWSサーバーによって自動的に破棄されます。
リスト6-6に示すように、失敗した場合、この関数は-1を返す必要があります。
int mybuffer2xml (void ** xercesDom, CustomerBuffer *a, CustType_Ext * extinfo)
{
// Use DOM implementation to create the xml payload
DOMTree = CreateDOMTree( );
if ( error )
return -1;
// fetch data from custom typed buffer instance,
// and add data to DOMTree according to the client side needed
// XML format
a->buf ==> DOMTree;
// allocate xmlbuf buffer via malloc
* xmlbuf = malloc( expected_len(DOMTree) );
if ( error ) {
release ( DOMTree );
return -1;
}
// casting the DOMDocument to void * pointer and returned
DOMTree >> (* xmlbuf);
if ( error ) {
release ( DOMTree );
free ( (* xmlbuf) );
return -1;
}
return 0;
}
警告: | プラグイン関数内に作成したDOMDocumentをGWWSフレームワークでリリースする必要はありません。 再度リリースしないようにするには、プログラマは次のXerces APIの使用に注意する必要があります。 |
警告: | DOMDocumentをXercesDOMParser::parse() API でXML文字列から作成する場合、XercesDOMParser::adoptDocument() を使用してDOMDocumentオブジェクトのポインタを取得する必要があります。DOMDocumentオブジェクトのポインタを取得するためにXercesDOMParser::getDocument() を使用しないでください。これは、DOMDocumentオブジェクトは、XercesDOMParserオブジェクトによって維持され、XercesDOMParser::getDocument() 関数によってDOMDocumentをXercesDOMParserから分離しない場合はXercesDOMParserオブジェクトを削除するときにリリースされるためです。 |
SALT 1.1カスタム・バッファ・タイプ変換プラグインには、Oracle Tuxedoカスタム・バッファ・タイプにのみに対してカスタマイズしたメッセージ変換を提供します。
表6-2では、SALTメッセージ変換プラグインとSALT 1.1カスタム・バッファ・タイプ変換プラグインを比較しています。
SALT 1.1カスタム・バッファ・タイプのプラグイン共有ライブラリはSALT 10gR3で直接使用できないことに注意してください。SALT 10gR3メッセージ変換プラグインにアップグレードするには、次の作業を実行する必要があります。
ヒント: | アップグレードされたメッセージ変換プラグインを手動にサービス・バッファに関連付ける必要はありません。 実行時に、カスタム・タイプ・バッファがメッセージの変換に含まれている場合、GWWSは、メッセージ変換プラグインのインタフェースが明示的に設定されなければ、バッファ・タイプと同じ名前のあるメッセージ変換プラグインを自動的に検索できます。 |
Oracle TuxedoクライアントがSOAP/HTTPを介してWebサービスにアクセスする場合、HTTPの基本認証を行うには、クライアントはユーザー名とパスワードをサーバーに送信する必要がある可能性があります。Oracle Tuxedoクライアントは、Oracle Tuxedoドメインに登録する時にtpinit()
を使用してユーザー名とパスワードを送信します。ただし、このユーザー名はOracle Tuxedoに使用されるもので、Webサービスに使用されるユーザー名と異なります(パスワードも異なる可能性があります)。
Oracle SALTは、ユーザー名のマッピングを可能にするため、Webサービスに送信するユーザー名とパスワードを選択できるプラグイン・インタフェース(資格証明マッピング・インタフェース)を備えています。
Oracle TuxedoクライアントがWebサービスを呼び出す際、実際に呼び出されるのは、WebサービスをOracle Tuxedoサービスとして宣言しているGWWSサーバーです。ユーザーIDおよびグループID (tpusr
およびtpgrp
の各ファイルで定義済)がGWWSに送信されます。次にGWWSでは、Webサービスに構成項目<Realm>があるかどうか確認されます。この項目がある場合、GWWSでは次のようになります。
サーバーのHTTP Realmに対してOracle TuxedoユーザーIDをユーザー名およびパスワードにマップするには、vtable gwws_pi_map_http_basic
関数の呼出しを試行します。
Oracle SALTプラグイン・インタフェースを実装するには、次の手順に従います。
_ws_pi_init_P_CREDENMAP_TEST(char * params, void ** priv_ptr);
この関数は、GWWSサーバーが起動中にプラグイン共有ライブラリをロードしようとするときに呼び出されます。
_ws_pi_exit_P_CREDENMAP_TEST(void * priv);
この関数は、GWWSサーバーがシャットダウン中にプラグイン共有ライブラリをアンロードするときに呼び出されます。
_ws_pi_set_vtbl_P_CREDENMAP_TEST(void * vtbl);
ステップ1で実装されたCredmap_HTTP_Basic()
関数を使用してvtable構造体credmap_vtable
内のgwws_pi_map_http_basic
エントリを設定します。
_ws_pi_get_Id_and_Names(int * params, char ** ids, char ** names);
この関数は、どのライブラリ・インタフェースを実装したかを決定するためにGWWSサーバーが起動中にプラグイン共有ライブラリをロードしようとするときに呼び出されます。詳細は、「プラグイン登録関数」を参照してください。
リスト 6-7に示すように、プラグイン・インタフェースを設定します。
<?xml version="1.0" encoding="UTF-8"?>
<Deployment xmlns="http://www.bea.com/Tuxedo/SALTDEPLOY/2007">
. . . . . . .
. . . . . . .
<System>
<Plugin>
<Interface
id=”P_CREDENMAP”
name=”TEST”
library=”credmap_plugin.dll” />
</Plugin>
</System>
</Deployment>
HTTP基本認証のユーザー名/パスワードを返すには、次の関数を実装する必要があります。
typedef int (* GWWS_PI_CREDMAP_PASSTEXT) (char * domain, char * realm, char * t_userid, char * t_grpid, Cred_UserPass * credential);
typedef struct Cred_UserPass_s {
char username[UP_USERNAME_LEN];
char password[UP_PASSWORD_LEN];
int gwws_pi_map_http_basic (char * domain, char * realm, char * t_uid, char * t_gid, Cred_UserPass * credential);
「gwws_pi_map_http_basic」
は関数名で、必要に応じて有効な文字列を指定できます。
実装した関数は、指定したドメインおよびレルムの指定したOracle Tuxedo uidおよびgidでユーザーを許可するために使用される認可資格証明(ユーザー名およびパスワード)を決定できます。
入力パラメータ(char * domainおよびchar * realm
)は、Webサービスが属するドメイン名およびHTTP Realmを表します。適切な資格証明を検索するためのスコープを決定するには、プラグイン・コードでこれらを使用する必要があります。
入力パラメータ(char * t_uid
およびchar * t_gid
)は、それぞれOracle TuxedoユーザーIDおよびグループIDの数値を含む文字列です。これらの2つのパラメータは、ユーザー名の検索に使用される場合があります。
出力パラメータ(Cred_UserPass * credential
)は、返されたユーザー名/パスワードを格納する事前割当て済のバッファを示すポインタです。プラグイン・コードでバッファを割り当てる必要はありません。
注: | UBBCONFIGファイルに*SECURITY をUSER_AUTH またはそれ以上として設定する場合のみ、Oracle TuxedoユーザーIDを使用できます。*SECURITY をACLまたはそれ以上として設定すると、グループIDを使用できます。デフォルト値は0です。 |
リスト6-8に示すように、この関数は、成功した場合に0を返し、失敗した場合に-1を返します。
intCredmap_HTTP_Basic
(char * domain, char * realm, char * t_uid, char * t_gid, Cred_UserPass * credential
)
{
// Use domain and realm to determine scope
credentialList = FindAllCredentialForDomainAndRealm(domain, realm);
if ( error happens )
return -1;
// find appropriate credential in the scope
foreach cred in credentialList {
if (t_uid and t_gid match) {
*credential = cred;
return 0;
}
}
if ( not found and no default credential) {
return -1;
}
*credential = default_credential;
return 0;
}
ヒント: | 資格証明はドメインとレルムをキーまたは索引としてデータベース内に格納できます。 |