| Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド 11g リリース1 (11.1.1.7.0) B72440-01 |
|
![]() 前 |
![]() 次 |
この章では、プラグイン関数で使用するデータ型と構造体について説明します。表14-1には、使用可能なデータ構造体のリストがまとめられています。表14-2には、コールバックのリストがまとめられています。
表14-1 データ構造体に対するクイック・リファレンス
| データ構造体またはコールバック | 簡単な説明 |
|---|---|
|
|
基本エンコーディング・ルールを使用してエンコードされるバイナリ・データ |
|
|
算出属性を処理するときに使用する情報 |
|
|
LDAP操作に関連付けられたLDAP v3コントロール |
|
|
ディレクトリ・エントリ属性に対する変更セット |
|
|
ディレクトリ・エントリ属性 |
|
|
サーバー・バックエンド |
|
|
サーバーに割り当てられた識別子(内部操作に使用される) |
|
|
スレッド同期の条件変数 |
|
|
クライアント接続 |
|
|
識別名 |
|
|
ディレクトリ・エントリ |
|
|
検索フィルタ |
|
|
プラグインによって処理される一致ルール |
|
|
個々の属性に対する変更 |
|
|
ディレクトリ・エントリに対する変更セット |
|
|
スレッド同期のMutex |
|
|
保留中のLDAP操作 |
|
|
LDAP操作データを含むパラメータ・ブロック |
|
|
提供するプラグインの説明 |
|
|
相対識別名 |
|
|
個々の属性値 |
|
|
属性値セット |
|
|
仮想の可能性がある属性 |
表14-2 コールバックに対するクイック・リファレンス
| データ構造体またはコールバック | 簡単な説明 |
|---|---|
|
|
拡張可能な一致フィルタを処理する。 |
|
|
内部検索で検出される参照を処理する。 |
|
|
内部検索後に送信される結果を処理する。 |
|
|
内部検索で検出されるエントリを処理する。 |
|
|
ロールの範囲を決定する。 |
|
|
参照をクライアントに送信する前に変更する。 |
|
|
結果をクライアントに送信する前に変更する。 |
|
|
エントリをクライアントに送信する前に変更する。 |
|
|
算出属性を処理する。 |
|
|
算出属性を計算する。 |
|
|
オブジェクト拡張の作成を処理する。 |
|
|
オブジェクト拡張の破棄を処理する。 |
|
|
再帰的なプラグイン登録を処理する。 |
berval簡素化された基本エンコーディング・ルール(BER)を使用してエンコードされたバイナリ・データを表します。
JPEGまたはオーディオ・ファイルなどのバイナリ属性値を使用するときにberval構造体を使用します。
/* Defined in ldap.h, which is included by slapi-plugin.h */
#include "slapi-plugin.h"
struct berval {
unsigned long bv_len;
char * bv_val;
};
computed_attr_context計算される属性の属性タイプ、現在のBERエンコーディングされたリクエストおよびパラメータ・ブロック・コンテキストなどの情報を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct _computed_attr_context computed_attr_context;
サーバーは、クライアント・アプリケーションにエントリを送信する前に、計算される属性があるかどうかを決定します。該当する場合、サーバーはこれらの属性を生成し、エントリに含めます。
このプロセスの一部として、サーバーは、computed_attr_context構造体を作成し、属性値を生成する関数に関連情報を渡します。
LDAPControlLDAP v3で指定されているように、LDAP操作に関連付けられたクライアントまたはサーバー・コントロールを表します。
クライアントおよびサーバー・コントロールは、LDAP操作の機能を拡張するために使用されることがあります。
/* Defined in ldap.h, which is included by slapi-plugin.h */
#include "slapi-plugin.h"
typedef struct ldapcontrol {
char * ldctl_oid;
struct berval ldctl_value;
char ldctl_iscritical;
} LDAPControl, * PLDAPControl;
この構造体には、次のフィールドがあります。
表14-4 LDAPControlのフィールド
| フィールド | 説明 |
|---|---|
|
|
コントロールのオブジェクト識別子(OID)。 |
|
|
操作のコントロールによって使用される値を含む |
|
|
|
LDAPModディレクトリ・エントリの属性に対する変更を表します。
/* Defined in ldap.h, which is included by slapi-plugin.h */
#include "slapi-plugin.h"
typedef struct ldapmod {
int mod_op;
char * mod_type;
union {
char ** modv_strvals;
struct berval ** modv_bvals;
} mod_vals;
} LDAPMod;
#define mod_values mod_vals.modv_strvals
#define mod_bvalues mod_vals.modv_bvals
この構造体には、次のフィールドがあります。
表14-5 LDAPModのフィールド
| フィールド | 説明 |
|---|---|
|
|
実行する操作と属性値のデータ型。
|
|
|
変更する属性タイプ。 |
|
|
属性の文字列値の |
|
|
属性の |
例14-1では、メール・アドレスを変更するようにLDAPModを設定しています。
例14-1 エントリに対する変更の準備
#include "slapi-plugin.h"
/* Declare the appropriate structures. */
LDAPMod mod_attr; /* Attribute to modify */
LDAPMod * mods[2]; /* Array of modifications */
char * mail_vals[] = /* New mail address */
{"quentin@example.com", NULL};
/* Set up the LDAPMod structure used to modify the entry. */
mod_attr.mod_type = "mail";
mod_attr.mod_op = LDAP_MOD_REPLACE;
mod_attr.mod_values = mail_vals; /* "quentin@example.com" */
mods[0] = &mod_attr;
mods[1] = NULL;
/* Modify the entry using slapi_modify_internal_set_pb()... */
例14-2では、パラメータ・ブロックの内容に任意でさらに変更を追加しています。たとえば、このコードは、事前操作変更プラグイン関数の一部になることがあります。
例14-2 さらなる変更の追加
#include "slapi-plugin.h"
/*
* Set up an LDAPMod array, modify_mods, of additional modifications.
*/
if (modify_mods != NULL) {
LDAPMod ** mods;
Slapi_Mods smods;
int i;
slapi_pblock_get(pb, SLAPI_MODIFY_MODS, &mods);
slapi_mods_init_passin(&smods, mods);
for (i = 0; modify_mods[i] != NULL; i++) {
/* Do not copy mods. */
slapi_mods_add_ldapmod(&smods, modify_mods[i]);
}
mods = slapi_mods_get_ldapmods_passout(&smods);
slapi_pblock_set(pb, SLAPI_MODIFY_MODS, mods);
slapi_mods_done(&smods);
/* Release container only. Content is still pointed to by mods. */
slapi_ch_free((void **)&modify_mods);
}
mrFilterMatchFnフィルタ一致のコールバック関数を指定します。サーバーは、検索操作を処理するときに、拡張可能な一致検索フィルタと一致する候補ごとに1回この関数をコールします。
#include "slapi-plugin.h"
typedef int (*mrFilterMatchFn) (void* filter, Slapi_Entry* entry,
Slapi_Attr* vals);
コールバックは、次のパラメータを取ります。
表14-6 mrFilterMatchFnのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
フィルタ・ファクトリ関数によって作成されたフィルタ。 |
|
|
サーバーによってチェックされる候補エントリを表す |
|
|
エントリ内の最初の属性を表す 残りの属性に対して処理を繰り返すには、 |
サーバーは、一致ルール・プラグインを使用して拡張可能な一致フィルタを処理するときに、このフィルタ一致関数をコールします。拡張可能な一致フィルタは、一致するエントリが検出される仕組みを示した一致ルールのOIDか属性タイプのいずれか、またはその両方を指定します。たとえば、よく似た一致ルールを実装して、指定された値に類似するすべてのエントリを検出することができます。
一致ルールに対して拡張可能な一致フィルタを処理するには、このコールバックと、フィルタ構造体filterを作成するフィルタ・ファクタの両方を実装します。コールバックは、この構造体から属性タイプや値などのフィルタに関する情報を取得し、この情報を候補entry内の属性タイプや値と比較します。
コールバックは、フィルタが一致する場合は0、フィルタが一致しない場合は-1を戻す必要があります。エラー発生時は、RFC 4511『Lightweight Directory Access Protocol (v3)』の「Result Message」の項に示されているように、LDAPエラー・コードを戻すことがあります。
plugin_referral_entry_callback参照のコールバック関数を指定します。サーバーは、このコールバックをトリガーするために実装された内部検索がLDAP v3参照を検出すると、この関数をコールします。
#include "slapi-plugin.h"
typedef int (*plugin_referral_entry_callback)(char * referral,
void *callback_data);
コールバックは、次のパラメータを取ります。
これをslapi_search_internal_callback_pb()のprecパラメータとして渡します。内部検索は、参照エントリを検出するたびに、この関数をコールします。
サーバーは、コールバックの戻り値を使用しません。
plugin_result_callback検索結果のコールバック関数を指定します。サーバーは、このコールバックをトリガーするために実装された内部検索がLDAP結果を戻すと、この関数をコールします。
#include "slapi-plugin.h" typedef void (*plugin_result_callback)(int rc, void *callback_data);
コールバックは、次のパラメータを取ります。
これをslapi_search_internal_callback_pb()のprcパラメータとして渡します。サーバーは、検索が中止されなければ、検索操作ごとに1回この関数をコールします(中止された場合、関数はコールされません)。
plugin_search_entry_callbackエントリのコールバック関数を指定します。サーバーは、このコールバックをトリガーするために実装された内部検索がLDAPエントリを検出すると、この関数をコールします。
#include "slapi-plugin.h"
typedef int (*plugin_search_entry_callback)(Slapi_Entry *e,
void *callback_data);
コールバックは、次のパラメータを取ります。
これをslapi_search_internal_callback_pb()のpsecパラメータとして渡します。内部検索は、参照エントリを検出するたびに、この関数をコールします。
コールバックは、検索を続けるには0を、検索を中断するには-1を戻す必要があります。
roles_get_scope_fn_typeある範囲のロールを決定するためのコールバック関数を指定します。プラグインは、slapi_role_get_scope()を使用してこのコールバックをトリガーします。
#include "slapi-plugin.h"
typedef int (*roles_get_scope_fn_type)(Slapi_Entry *role_entry,
Slapi_DN ***scope, int *nb_scope);
コールバックは、次のパラメータを取ります。
このコールバックは、role_entryによって識別される範囲のロールを決定します。slapi_register_role_get_scope()を使用して、サーバーにコールバックを登録します。
成功した場合は0、それ以外の場合は-1を戻します。
send_ldap_referral_fn_ptr_tサーバーが結果をクライアントに送信する前にトリガーされるコールバックを指定します。
#include "slapi-plugin.h"
typedef int (*send_ldap_referral_fn_ptr_t)( Slapi_PBlock *pb,
Slapi_Entry *e, struct berval **refs, struct berval ***urls );
コールバックは、次のパラメータを取ります。
このコールバックによって、クライアントに戻される参照を変更できます。slapi_search_internal_callback_pb()を使用して、サーバーにコールバックを登録します。
成功した場合は0、そうでない場合は-1を戻します。
send_ldap_result_fn_ptr_tサーバーが結果をクライアントに送信する前にトリガーされるコールバックを指定します。
#include "slapi-plugin.h"
typedef void (*send_ldap_result_fn_ptr_t)( Slapi_PBlock *pb,
int err, char *matched, char *text, int nentries,
struct berval **urls );
コールバックは、次のパラメータを取ります。
表14-12 send_ldap_result_fn_ptr_tのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
操作の現在のパラメータ・ブロック |
|
|
結果コード。 |
|
|
|
|
|
クライアントに返信するエラー・メッセージ。(エラー・メッセージを返信しない場合は |
|
|
LDAP検索操作の結果コードを返信するときに、この引数を使用して、検出された一致エントリの数を指定する。 |
|
|
|
このコールバックによって、クライアントに戻される結果を変更できます。slapi_search_internal_callback_pb()を使用して、サーバーにコールバックを登録します。
成功した場合は0、そうでない場合は-1を戻します。
send_ldap_search_entry_fn_ptr_t検索によって戻されるエントリをサーバーがクライアントに送信する前にトリガーされるコールバックを指定します。
#include "slapi-plugin.h"
typedef int (*send_ldap_search_entry_fn_ptr_t)( Slapi_PBlock *pb,
Slapi_Entry *e, LDAPControl **ectrls, char **attrs,
int attrsonly );
コールバックは、次のパラメータを取ります。
このコールバックによって、クライアントに戻される内容を変更できます。slapi_search_internal_callback_pb()を使用して、サーバーにコールバックを登録します。
成功した場合は0、そうでない場合は-1を戻します。
Slapi_Attrディレクトリ・エントリ属性を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_attr Slapi_Attr;
Slapi_Backendサーバー・バックエンドを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct backend Slapi_Backend;
Slapi_ComponentId内部操作を処理するときに、プラグインを識別するためにサーバーによって使用されるコンポーネント識別子を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_componentid Slapi_ComponentId;
例次のコードでは、内部検索中に使用されるプラグイン・コンポーネント識別子を設定しています。
例14-3 内部操作で使用するプラグイン識別子の設定
#include "slapi-plugin.h"
/* Declare the identifier as global to the plug-in. */
static Slapi_ComponentId * postop_id;
/* Assign a value as part of plug-in initialization. */
int
testpostop_init(Slapi_PBlock * pb)
{
int rc = 0;
/* Register description, other functions, and so forth. */
rc |= slapi_pblock_set(
pb,
SLAPI_PLUGIN_START_FN,
(void *) testpostop_set_log
);
/* Assign a value to the identifier. */
rc |= slapi_pblock_get(pb, SLAPI_PLUGIN_IDENTITY, &postop_id);
return (rc);
}
/* The server uses the identifier when processing
* internal operations, such as an internal search. */
int
testpostop_set_log(Slapi_PBlock * pb)
{
Slapi_DN * confdn = NULL; /* DN for configuration entry */
Slapi_Entry * config = NULL; /* Configuration entry */
int rc = 0;
confdn = slapi_sdn_new_dn_byval("cn=config");
rc |= slapi_search_internal_get_entry(confdn, NULL, &config, postop_id);
/* Use the results of the search. */
return(rc);
}
slapi_compute_callback_t算出属性に値を指定するためにコールされる関数を決定するための関数を指定します。
typedef int (*slapi_compute_callback_t)(computed_attr_context *c,
char* type,Slapi_Entry *e,slapi_compute_output_t outputfn);
コールバックは、次のパラメータを取ります。
このコールバックは、指定のコンテキストc、エントリeのタイプtypeの属性の値を計算する関数を選択します。サーバーは、この関数をコールして、操作を要求したクライアントにエントリeを戻す前に属性値を計算するための関数を取得します。
この関数は、プラグイン初期化関数でslapi_compute_add_evaluator()を使用して、サーバーに登録されます。
この関数は、成功すると0を戻します。typeで渡された属性タイプを処理しない場合は、-1を戻します。それ以外の場合は、LDAPエラー・コードを戻します。
slapi_compute_output_t算出属性の値を決定するためのコールバック関数を指定します。
typedef int (*slapi_compute_output_t)(computed_attr_context *c,
Slapi_Attr *a , Slapi_Entry *e);
コールバックは、次のパラメータを取ります。
このコールバックは、指定のコンテキストc、エントリeの属性aの値を計算します。slapi_compute_add_evaluator()を使用して登録するslapi_compute_callback_t関数は、この関数をコールして、サーバーにエントリeを戻す前にaの値を計算します。
この関数は、成功すると0を戻します。aで渡された属性タイプを処理しない場合は、-1を戻します。それ以外の場合は、LDAPエラー・コードを戻します。
Slapi_CondVarスレッド同期を処理するためにプラグインによって使用される条件変数を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_condvar Slapi_CondVar;
Slapi_Connectionサーバーへの接続を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct conn Slapi_Connection;
Slapi_DN識別名(DN)を表す不透明な構造体です。構造体は、元のDNを保持し、slapi_sdn_get_ndn()がコールされた後に正規化されたバージョンも保持できます。
#include "slapi-plugin.h" typedef struct slapi_dn Slapi_DN;
Slapi_Entryディレクトリ・エントリを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_entry Slapi_Entry;
slapi_extension_constructor_fnptrオブジェクト拡張のコールバック関数を指定します。
#include "slapi-plugin.h"
typedef void *(*slapi_extension_constructor_fnptr)
(void *object, void *parent);
コールバックは、次のパラメータを取ります。
このコールバックは、slapi_get_object_extension()を使用して取得できるオブジェクト拡張を登録します。
オブジェクト拡張が存在しない場合、このコールバックがオブジェクト拡張のみを作成することを確認します。
コールバックは、実際のプラグイン初期化関数の一部としてslapi_register_object_extension()を使用してサーバーに登録されます。
このコールバックは、拡張へのポインタを戻します。それ以外の場合は、NULLを戻します。
slapi_extension_destructor_fnptrオブジェクト拡張に割り当てられたメモリーを解放するためのコールバック関数を指定します。
#include "slapi-plugin.h"
typedef void (*slapi_extension_destructor_fnptr)(void *extension,
void *object, void *parent);
コールバックは、次のパラメータを取ります。
このコールバックは、オブジェクト拡張に割り当てられたメモリーを解放します。関数は、プラグイン初期化関数でslapi_register_object_extension()を使用して、サーバーに登録されます。
Slapi_Filter検索フィルタを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_filter Slapi_Filter;
Slapi_MatchingRuleEntryプラグインによって処理されるLDAP v3一致ルールを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_matchingRuleEntry Slapi_MatchingRuleEntry;
Slapi_Modディレクトリ・エントリ属性の変更を表す不透明な構造体です。
パラメータ・ブロックは、Slapi_Mod構造体ではなくLDAPMod構造体を使用します。後者のタイプは、幅広く変更を処理するプラグインに便利です。
#include "slapi-plugin.h" typedef struct slapi_mod Slapi_Mod;
Slapi_Modsディレクトリ・エントリに対する一連の変更を表す不透明な構造体です。
パラメータ・ブロックは、Slapi_Mods構造体ではなくLDAPMod構造体の配列を使用します。後者のタイプは、幅広く変更を処理するプラグインに便利です。
#include "slapi-plugin.h" typedef struct slapi_mods Slapi_Mods;
Slapi_Mutexプラグインによって使用されるmutexロックを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_mutex Slapi_Mutex;
Slapi_OperationLDAPクライアントからの保留中の操作を表す不透明な構造体です。
構造体は、他のデータとの間で、要求された操作のタイプを記録します。
#include "slapi-plugin.h" typedef struct op Slapi_Operation;
Slapi_PBlockパラメータ・ブロックと呼ばれ、サーバー操作のコンテキストで更新された名前/値ペアを含む不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_pblock Slapi_PBlock;
プラグイン関数のほとんどのタイプは、サーバーによって、処理される操作に関連するデータを含むパラメータ・ブロック(Slapi_PBlock)で渡されます。slapi_pblock_get()を使用してデータにアクセスします。
プラグイン初期化関数は、slapi_pblock_set()を使用して、少なくともプラグインAPIバージョン、プラグインの説明およびその他のプラグイン関数を登録します。
Slapi_PBlock構造体で使用可能な特定のパラメータは、プラグイン関数のタイプとLDAP操作のコンテキストに依存します。プラグイン関数の特定のタイプに使用可能な名前/値ペアの詳細は、335ページの「パラメータ・ブロック・リファレンス」を参照してください。
Slapi_PBlockの使用例は、$INSTALL_DIR/examples/の下のサンプル・プラグインを参照してください。
Slapi_PluginDescプラグインを識別するために指定するプラグインの説明を表します。
プラグイン初期化関数は、この情報をサーバーに登録する必要があります。
#include "slapi-plugin.h"
typedef struct slapi_plugindesc {
char * spd_id;
char * spd_vendor;
char * spd_version;
char * spd_description;
} Slapi_PluginDesc;
この構造体には、次のフィールドがあります。
Slapi_PluginDescの使用例は、$INSTALL_DIR/examples/の下のサンプル・プラグインを参照してください。
slapi_plugin_init_fnptr他のプラグインを登録するためのコールバック関数を指定します。
#include "slapi-plugin.h" typedef int (*slapi_plugin_init_fnptr)( Slapi_PBlock *pb );
コールバックは、次のパラメータを取ります。
このコールバックは、プラグイン初期化関数を模倣し、1つのプラグインが他のプラグインを登録することを許可します。関数は、実際のプラグイン初期化関数の一部としてslapi_register_plugin()を使用してサーバーに登録されます。
このコールバックは、成功すると0を戻します。そうでない場合は、-1を戻します。
プラグイン初期化関数の例は、$INSTALL_DIR/examples/の下のサンプル・プラグインを参照してください。
Slapi_RDN同じ親を持つ他のエントリとそのエントリを差別化するDNの一部である相対識別名(RDN)を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_rdn Slapi_RDN;
Slapi_Value個々の属性値を表す不透明な構造体です。
一度に属性のすべての値を処理するときは、かわりにSlapi_ValueSetを使用します。
#include "slapi-plugin.h" typedef struct slapi_value Slapi_Value;
Slapi_ValueSet属性の値セットを表す不透明な構造体です。
個々の属性値を処理するときは、かわりにSlapi_Valueを使用します。
#include "slapi-plugin.h" typedef struct slapi_value_set Slapi_ValueSet;