|
|
#include
<stdio.h>
|
|
#include
<string.h>
|
|
#include
"slapi-plugin.h"
|
|
|
|
/* function
prototypes */
|
|
int
test_preop_init( Slapi_PBlock *pb );
|
|
int
test_preop_search( Slapi_PBlock *pb );
|
|
|
|
/* Description of
the plug-in */
|
|
Slapi_PluginDesc
srchpdesc = { "test-search", "example.com", "0.5",
|
|
"sample
pre-operation search plugin" };
|
|
|
|
/* Initialization
function
|
|
This function
registers your plug-in function as a
|
|
pre-operation
search function in the Directory Server.
|
|
You need to
specify this initialization function in the
|
|
server
configuration file so that the server calls
|
|
this
initialization function on startup. */
|
|
#ifdef _WIN32
|
|
__declspec(dllexport)
|
|
#endif
|
|
int
|
|
test_preop_init(
Slapi_PBlock *pb )
|
|
{
|
|
/* Specify the
version of the plug-in ("01" in this release ) */
|
|
if (
slapi_pblock_set( pb, SLAPI_PLUGIN_VERSION,
|
|
SLAPI_PLUGIN_VERSION_01
) != 0 ||
|
|
/* Specify the
description of the plug-in */
|
|
slapi_pblock_set(
pb, SLAPI_PLUGIN_DESCRIPTION,
|
|
(void
*)&srchpdesc ) != 0 ||
|
|
/* Set
test_preop_search() as the function to call before
|
|
executing LDAP
search operations. */
|
|
slapi_pblock_set(
pb, SLAPI_PLUGIN_PRE_SEARCH_FN,
|
|
(void *)
test_preop_search ) !=0 ) {
|
|
/* Log an error
message and return -1 if a problem occurred */
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "test_preop_init",
|
|
"Error
registering the plug-in.\n" );
|
|
return( -1 );
|
|
}
|
|
/* If
successful, log a message and return 0 */
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "test_preop_init",
|
|
"Plug-in
successfully registered.\n" );
|
|
return( 0 );
|
|
}
|
|
|
|
/* Pre-operation
plug-in function for LDAP search operations
|
|
This function is
called by the server before processing an LDAP
|
|
search operation.
The function gets data about the search request
|
|
from the
parameter block and prints the data to the error log. */
|
|
int
|
|
test_preop_search(
Slapi_PBlock *pb )
|
|
{
|
|
char *base,
*filter_str, *attr_type, *substr_init, *substr_final;
|
|
char
**substr_any;
|
|
int scope,
deref, filter_type, i;
|
|
Slapi_Filter
*filter;
|
|
struct berval
*bval;
|
|
/* Log a message
to indicate when the plug-in function starts */
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "test_preop_search",
|
|
"***
PREOPERATION SEARCH PLUGIN ***\n");
|
|
/* Get and log
the base DN of the search criteria */
|
|
if (
slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &base ) == 0 )
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_TARGET",
|
|
"%s\n", base );
|
|
/* Get and log
the search scope */
|
|
if (
slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope ) == 0 ) {
|
|
switch( scope ) {
|
|
case
LDAP_SCOPE_BASE:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_SCOPE",
|
|
"LDAP_SCOPE_BASE\n"
);
|
|
break;
|
|
case
LDAP_SCOPE_ONELEVEL:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_SCOPE",
|
|
"LDAP_SCOPE_ONELEVEL\n"
);
|
|
break;
|
|
case
LDAP_SCOPE_SUBTREE:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_SCOPE",
|
|
"LDAP_SCOPE_SUBTREE\n"
);
|
|
break;
|
|
default:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_SCOPE",
|
|
"unknown value
specified: %d\n", scope );
|
|
break;
|
|
}
|
|
}
|
|
/* Get and log
the alias dereferencing setting */
|
|
if (
slapi_pblock_get( pb, SLAPI_SEARCH_DEREF, &deref ) == 0 ) {
|
|
switch( deref ) {
|
|
case
LDAP_DEREF_NEVER:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_DEREF",
|
|
"LDAP_DEREF_NEVER\n"
);
|
|
break;
|
|
case
LDAP_DEREF_SEARCHING:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_DEREF",
|
|
"LDAP_DEREF_SEARCHING\n"
);
|
|
break;
|
|
case
LDAP_DEREF_FINDING:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_DEREF",
|
|
"LDAP_DEREF_FINDING\n"
);
|
|
break;
|
|
case
LDAP_DEREF_ALWAYS:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_DEREF",
|
|
"LDAP_DEREF_ALWAYS\n"
);
|
|
break;
|
|
default:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_DEREF",
|
|
"unknown value
specified: %d\n", deref );
|
|
break;
|
|
}
|
|
}
|
|
/* Get and log
the search filter information */
|
|
if (
slapi_pblock_get(pb,SLAPI_SEARCH_FILTER, &filter)==0 ) {
|
|
/* Get and log
the filter type */
|
|
filter_type =
slapi_filter_get_choice( filter );
|
|
switch(
filter_type ) {
|
|
case
LDAP_FILTER_AND:
|
|
case
LDAP_FILTER_OR:
|
|
case
LDAP_FILTER_NOT:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"Complex search
filter. See value of
|
|
SLAPI_SEARCH_STRFILTER.\n"
);
|
|
break;
|
|
case
LDAP_FILTER_EQUALITY:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_EQUALITY\n"
);
|
|
break;
|
|
case
LDAP_FILTER_GE:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_GE\n"
);
|
|
break;
|
|
case
LDAP_FILTER_LE:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_LE\n"
);
|
|
break;
|
|
case
LDAP_FILTER_APPROX:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_APPROX\n"
);
|
|
break;
|
|
case
LDAP_FILTER_SUBSTRINGS:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_SUBSTRINGS\n"
);
|
|
/* For substring
filters, get and log the attribute type and
|
|
the substrings
in the filter */
|
|
slapi_filter_get_subfilt(
filter, &attr_type, &substr_init,
|
|
&substr_any,
&substr_final );
|
|
if ( attr_type
!= NULL )
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tAttribute type",
|
|
"%s\n",
attr_type );
|
|
if ( substr_init
!= NULL )
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tInitial substring",
|
|
"%s\n",
substr_init );
|
|
if ( substr_any
!= NULL ) {
|
|
for ( i = 0;
substr_any[i] != NULL; i++ ) {
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tSubstring",
|
|
"# %d: %s\n", i,
substr_any[i] );
|
|
}
|
|
}
|
|
if (
substr_final != NULL )
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tFinal substring",
|
|
"%s\n",
substr_final );
|
|
break;
|
|
case
LDAP_FILTER_PRESENT:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_PRESENT\n"
);
|
|
/* For presence
filters, get and log the attribute type */
|
|
slapi_filter_get_type(
filter, &attr_type );
|
|
if ( attr_type
!= NULL )
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tSearch for presence of attr",
|
|
"%s\n",
attr_type );
|
|
break;
|
|
case
LDAP_FILTER_EXTENDED:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"LDAP_FILTER_EXTENDED\n"
);
|
|
break;
|
|
default:
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_FILTER",
|
|
"Unknown filter
type:
|
|
slapi_filter_get_choice
returned %d\n", filter_type );
|
|
break;
|
|
}
|
|
}
|
|
/* For
comparison filters, get and log the attribute type */
|
|
if ( filter_type
== LDAP_FILTER_EQUALITY || LDAP_FILTER_GE ||
|
|
LDAP_FILTER_LE
|| LDAP_FILTER_APPROX ) {
|
|
slapi_filter_get_ava(
filter, &attr_type, &bval );
|
|
if ( ( attr_type
!= NULL ) && ( bval->bv_val != NULL ) ) {
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tAttribute type",
|
|
"%s\n",
attr_type );
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "\tAttribute value",
|
|
"%s\n",
bval->bv_val );
|
|
}
|
|
}
|
|
/* Get and log
the string representation of the filter */
|
|
if (
slapi_pblock_get(pb, SLAPI_SEARCH_STRFILTER, &filter_str) == 0 )
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "SLAPI_SEARCH_STRFILTER",
|
|
"%s\n",
filter_str );
|
|
slapi_log_error(
SLAPI_LOG_PLUGIN, "test_preop_search",
|
|
"*** DONE
***\n\n" );
|
|
return( 0 );
|
|
}
|
|