summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/plugin_syntax.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/servers/slapd/plugin_syntax.c')
-rw-r--r--ldap/servers/slapd/plugin_syntax.c331
1 files changed, 276 insertions, 55 deletions
diff --git a/ldap/servers/slapd/plugin_syntax.c b/ldap/servers/slapd/plugin_syntax.c
index e2cc7fb1..80ce12a7 100644
--- a/ldap/servers/slapd/plugin_syntax.c
+++ b/ldap/servers/slapd/plugin_syntax.c
@@ -89,7 +89,10 @@ slapi_get_global_syntax_plugins()
char *
plugin_syntax2oid( struct slapdplugin *pi )
{
- return( pi->plg_syntax_oid );
+ LDAPDebug(LDAP_DEBUG_ANY,
+ "the function plugin_syntax2oid is deprecated - please use attr_get_syntax_oid instead\n", 0, 0, 0);
+ PR_ASSERT(0);
+ return( NULL );
}
int
@@ -98,37 +101,9 @@ plugin_call_syntax_get_compare_fn(
value_compare_fn_type *compare_fn
)
{
- struct slapdplugin *pi = vpi;
- *compare_fn = NULL;
-
- LDAPDebug( LDAP_DEBUG_TRACE,
- "=> plugin_call_syntax_get_compare_fn\n",0,0, 0 );
-
- if ( pi == NULL ) {
- LDAPDebug( LDAP_DEBUG_TRACE,
- "<= plugin_syntax no plugin for attribute type\n",
- 0, 0, 0 );
- return( LDAP_PROTOCOL_ERROR ); /* syntax unkonwn */
- }
-
- if ( (pi->plg_syntax_flags & SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING) == 0 ) {
- return( LDAP_PROTOCOL_ERROR );
- }
-
- if (pi->plg_syntax_filter_ava == NULL) {
- LDAPDebug( LDAP_DEBUG_ANY, "<= plugin_call_syntax_get_compare_fn: "
- "no filter_ava found for attribute type\n", 0, 0, 0 );
- return( LDAP_PROTOCOL_ERROR );
- }
-
- if (pi->plg_syntax_compare == NULL) {
- return( LDAP_PROTOCOL_ERROR );
- }
-
- *compare_fn = (value_compare_fn_type) pi->plg_syntax_compare;
-
- LDAPDebug( LDAP_DEBUG_TRACE,
- "<= plugin_call_syntax_get_compare_fn \n", 0, 0, 0 );
+ LDAPDebug(LDAP_DEBUG_ANY,
+ "the function plugin_call_syntax_get_compare_fn is deprecated - please use attr_get_value_cmp_fn instead\n", 0, 0, 0);
+ PR_ASSERT(0);
return( 0 );
}
@@ -153,14 +128,15 @@ plugin_call_syntax_filter_ava_sv(
{
int rc;
Slapi_PBlock pipb;
+ IFP ava_fn = NULL;
LDAPDebug( LDAP_DEBUG_FILTER,
"=> plugin_call_syntax_filter_ava %s=%s\n", ava->ava_type,
ava->ava_value.bv_val, 0 );
- if ( a->a_plugin == NULL ) {
+ if ( ( a->a_mr_eq_plugin == NULL ) && ( a->a_mr_ord_plugin == NULL ) && ( a->a_plugin == NULL ) ) {
LDAPDebug( LDAP_DEBUG_FILTER,
- "<= plugin_syntax no plugin for attr (%s)\n",
+ "<= plugin_call_syntax_filter_ava no plugin for attr (%s)\n",
a->a_type, 0, 0 );
return( LDAP_PROTOCOL_ERROR ); /* syntax unkonwn */
}
@@ -172,33 +148,58 @@ plugin_call_syntax_filter_ava_sv(
switch ( ftype ) {
case LDAP_FILTER_GE:
case LDAP_FILTER_LE:
- if ( (a->a_plugin->plg_syntax_flags &
- SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING) == 0 ) {
+ if ((a->a_mr_ord_plugin == NULL) &&
+ ((a->a_plugin->plg_syntax_flags &
+ SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING) == 0)) {
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= plugin_call_syntax_filter_ava: attr (%s) has no ordering matching rule, and syntax does not define a compare function\n",
+ a->a_type, 0, 0 );
rc = LDAP_PROTOCOL_ERROR;
break;
}
+ /* if the attribute has an ordering matching rule plugin, use that,
+ otherwise, just use the syntax plugin */
+ if (a->a_mr_ord_plugin != NULL) {
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_mr_ord_plugin );
+ ava_fn = a->a_mr_ord_plugin->plg_mr_filter_ava;
+ } else {
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_plugin );
+ ava_fn = a->a_plugin->plg_syntax_filter_ava;
+ }
/* FALL */
case LDAP_FILTER_EQUALITY:
case LDAP_FILTER_APPROX:
- if ( a->a_plugin->plg_syntax_filter_ava != NULL )
- {
+ if (NULL == ava_fn) {
+ /* if we have an equality matching rule plugin, use that,
+ otherwise, just use the syntax plugin */
+ if (a->a_mr_eq_plugin) {
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_mr_eq_plugin );
+ ava_fn = a->a_mr_eq_plugin->plg_mr_filter_ava;
+ } else {
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_plugin );
+ ava_fn = a->a_plugin->plg_syntax_filter_ava;
+ }
+ }
+
+ if ( ava_fn != NULL ) {
/* JCM - Maybe the plugin should use the attr value iterator too... */
Slapi_Value **va;
- if(useDeletedValues)
+ if(useDeletedValues) {
va= valueset_get_valuearray(&a->a_deleted_values);
- else
+ } else {
va= valueset_get_valuearray(&a->a_present_values);
- if(va!=NULL)
- {
- rc = a->a_plugin->plg_syntax_filter_ava( &pipb,
- &ava->ava_value,
- va,
- ftype, retVal );
}
+ if(va!=NULL) {
+ rc = (*ava_fn)( &pipb, &ava->ava_value, va, ftype, retVal );
+ }
+ } else {
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= plugin_call_syntax_filter_ava: attr (%s) has no ava filter function\n",
+ a->a_type, 0, 0 );
}
break;
default:
- LDAPDebug( LDAP_DEBUG_ANY, "plugin_call_syntax_filter: "
+ LDAPDebug( LDAP_DEBUG_ANY, "plugin_call_syntax_filter_ava: "
"unknown filter type %d\n", ftype, 0, 0 );
rc = LDAP_PROTOCOL_ERROR;
break;
@@ -228,20 +229,32 @@ plugin_call_syntax_filter_sub_sv(
{
Slapi_PBlock pipb;
int rc;
+ IFP sub_fn = NULL;
LDAPDebug( LDAP_DEBUG_FILTER,
- "=> plugin_call_syntax_filter_sub\n", 0, 0, 0 );
+ "=> plugin_call_syntax_filter_sub_sv\n", 0, 0, 0 );
- if ( a->a_plugin == NULL ) {
+ if ( ( a->a_mr_sub_plugin == NULL ) && ( a->a_plugin == NULL ) ) {
LDAPDebug( LDAP_DEBUG_FILTER,
- "<= plugin_call_syntax_filter no plugin\n", 0, 0, 0 );
+ "<= plugin_call_syntax_filter_sub_sv attribute (%s) has no substring matching rule or syntax plugin\n",
+ a->a_type, 0, 0 );
return( -1 ); /* syntax unkonwn - does not match */
}
- if ( a->a_plugin->plg_syntax_filter_sub != NULL )
+ pblock_init( &pipb );
+ /* use the substr matching rule plugin if available, otherwise, use
+ the syntax plugin */
+ if (a->a_mr_sub_plugin) {
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_mr_sub_plugin );
+ sub_fn = a->a_mr_sub_plugin->plg_mr_filter_sub;
+ } else {
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_plugin );
+ sub_fn = a->a_plugin->plg_syntax_filter_sub;
+ }
+
+ if ( sub_fn != NULL )
{
Slapi_Value **va= valueset_get_valuearray(&a->a_present_values);
- pblock_init( &pipb );
if (pb)
{
Operation *op = NULL;
@@ -249,9 +262,7 @@ plugin_call_syntax_filter_sub_sv(
slapi_pblock_get( pb, SLAPI_OPERATION, &op );
slapi_pblock_set( &pipb, SLAPI_OPERATION, op );
}
- slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_plugin );
- rc = a->a_plugin->plg_syntax_filter_sub( &pipb,
- fsub->sf_initial, fsub->sf_any, fsub->sf_final, va);
+ rc = (*sub_fn)( &pipb, fsub->sf_initial, fsub->sf_any, fsub->sf_final, va);
} else {
rc = -1;
}
@@ -554,6 +565,95 @@ slapi_call_syntax_values2keys_sv(
return( rc );
}
+int
+slapi_attr_values2keys_sv_pb(
+ const Slapi_Attr *sattr,
+ Slapi_Value **vals,
+ Slapi_Value ***ivals,
+ int ftype,
+ Slapi_PBlock *pb
+)
+{
+ int rc;
+ struct slapdplugin *pi = NULL;
+ IFP v2k_fn = NULL;
+
+ LDAPDebug( LDAP_DEBUG_FILTER, "=> slapi_attr_values2keys_sv\n",
+ 0, 0, 0 );
+
+ switch (ftype) {
+ case LDAP_FILTER_EQUALITY:
+ case LDAP_FILTER_APPROX:
+ if (sattr->a_mr_eq_plugin) {
+ pi = sattr->a_mr_eq_plugin;
+ v2k_fn = sattr->a_mr_eq_plugin->plg_mr_values2keys;
+ } else if (sattr->a_plugin) {
+ pi = sattr->a_plugin;
+ v2k_fn = sattr->a_plugin->plg_syntax_values2keys;
+ }
+ break;
+ case LDAP_FILTER_SUBSTRINGS:
+ if (sattr->a_mr_sub_plugin) {
+ pi = sattr->a_mr_sub_plugin;
+ v2k_fn = sattr->a_mr_sub_plugin->plg_mr_values2keys;
+ } else if (sattr->a_plugin) {
+ pi = sattr->a_plugin;
+ v2k_fn = sattr->a_plugin->plg_syntax_values2keys;
+ }
+ break;
+ default:
+ LDAPDebug( LDAP_DEBUG_ANY, "<= slapi_attr_values2keys_sv: ERROR: unsupported filter type %d\n",
+ ftype, 0, 0 );
+ rc = LDAP_PROTOCOL_ERROR;
+ goto done;
+ }
+
+ slapi_pblock_set( pb, SLAPI_PLUGIN, pi );
+
+ *ivals = NULL;
+ rc = -1; /* means no values2keys function */
+ if ( ( pi != NULL ) && ( v2k_fn != NULL ) ) {
+ rc = (*v2k_fn)( pb, vals, ivals, ftype );
+ }
+
+done:
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= slapi_call_syntax_values2keys %d\n", rc, 0, 0 );
+ return( rc );
+}
+
+int
+slapi_attr_values2keys_sv(
+ const Slapi_Attr *sattr,
+ Slapi_Value **vals,
+ Slapi_Value ***ivals,
+ int ftype
+)
+{
+ Slapi_PBlock pb;
+ pblock_init(&pb);
+ return slapi_attr_values2keys_sv_pb(sattr, vals, ivals, ftype, &pb);
+}
+
+SLAPI_DEPRECATED int
+slapi_attr_values2keys( /* JCM SLOW FUNCTION */
+ const Slapi_Attr *sattr,
+ struct berval **vals,
+ struct berval ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_Value **svin= NULL;
+ Slapi_Value **svout= NULL;
+ valuearray_init_bervalarray(vals,&svin); /* JCM SLOW FUNCTION */
+ rc= slapi_attr_values2keys_sv(sattr,svin,&svout,ftype);
+ valuearray_get_bervalarray(svout,ivals); /* JCM SLOW FUNCTION */
+ valuearray_free(&svout);
+ valuearray_free(&svin);
+ return rc;
+}
+
/*
* almost identical to slapi_call_syntax_values2keys_sv except accepting
* pblock to pass some info such as substrlen.
@@ -633,6 +733,73 @@ slapi_call_syntax_assertion2keys_ava_sv(
return( rc );
}
+int
+slapi_attr_assertion2keys_ava_sv(
+ const Slapi_Attr *sattr,
+ Slapi_Value *val,
+ Slapi_Value ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_PBlock pipb;
+ struct slapdplugin *pi = NULL;
+ IFP a2k_fn = NULL;
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "=> slapi_attr_assertion2keys_ava_sv\n", 0, 0, 0 );
+
+ switch (ftype) {
+ case LDAP_FILTER_EQUALITY:
+ case LDAP_FILTER_APPROX:
+ case LDAP_FILTER_EQUALITY_FAST:
+ if (sattr->a_mr_eq_plugin) {
+ pi = sattr->a_mr_eq_plugin;
+ a2k_fn = sattr->a_mr_eq_plugin->plg_mr_assertion2keys_ava;
+ } else if (sattr->a_plugin) {
+ pi = sattr->a_plugin;
+ a2k_fn = sattr->a_plugin->plg_syntax_assertion2keys_ava;
+ }
+ break;
+ default:
+ LDAPDebug( LDAP_DEBUG_ANY, "<= slapi_attr_assertion2keys_ava_sv: ERROR: unsupported filter type %d\n",
+ ftype, 0, 0 );
+ rc = LDAP_PROTOCOL_ERROR;
+ goto done;
+ }
+
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, pi );
+
+ rc = -1; /* means no assertion2keys function */
+ if ( a2k_fn != NULL ) {
+ rc = (*a2k_fn)( &pipb, val, ivals, ftype );
+ }
+done:
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= slapi_attr_assertion2keys_ava_sv %d\n", rc, 0, 0 );
+ return( rc );
+}
+
+SLAPI_DEPRECATED int
+slapi_attr_assertion2keys_ava( /* JCM SLOW FUNCTION */
+ const Slapi_Attr *sattr,
+ struct berval *val,
+ struct berval ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_Value svin;
+ Slapi_Value **svout= NULL;
+ slapi_value_init_berval(&svin, val);
+ rc= slapi_attr_assertion2keys_ava_sv(sattr,&svin,&svout,ftype);
+ valuearray_get_bervalarray(svout,ivals); /* JCM SLOW FUNCTION */
+ valuearray_free(&svout);
+ value_done(&svin);
+ return rc;
+}
+
SLAPI_DEPRECATED int
slapi_call_syntax_assertion2keys_sub( /* JCM SLOW FUNCTION */
void *vpi,
@@ -681,3 +848,57 @@ slapi_call_syntax_assertion2keys_sub_sv(
return( rc );
}
+int
+slapi_attr_assertion2keys_sub_sv(
+ const Slapi_Attr *sattr,
+ char *initial,
+ char **any,
+ char *final,
+ Slapi_Value ***ivals
+)
+{
+ int rc;
+ Slapi_PBlock pipb;
+ struct slapdplugin *pi = NULL;
+ IFP a2k_fn = NULL;
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "=> slapi_attr_assertion2keys_sub_sv\n", 0, 0, 0 );
+
+ if (sattr->a_mr_sub_plugin) {
+ pi = sattr->a_mr_sub_plugin;
+ a2k_fn = sattr->a_mr_sub_plugin->plg_mr_assertion2keys_sub;
+ } else if (sattr->a_plugin) {
+ pi = sattr->a_plugin;
+ a2k_fn = sattr->a_plugin->plg_syntax_assertion2keys_sub;
+ }
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, pi );
+
+ rc = -1; /* means no assertion2keys function */
+ *ivals = NULL;
+ if ( a2k_fn != NULL ) {
+ rc = (*a2k_fn)( &pipb, initial, any, final, ivals );
+ }
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= slapi_attr_assertion2keys_sub_sv %d\n", rc, 0, 0 );
+ return( rc );
+}
+
+SLAPI_DEPRECATED int
+slapi_attr_assertion2keys_sub( /* JCM SLOW FUNCTION */
+ const Slapi_Attr *sattr,
+ char *initial,
+ char **any,
+ char *final,
+ struct berval ***ivals
+)
+{
+ int rc;
+ Slapi_Value **svout= NULL;
+ rc= slapi_attr_assertion2keys_sub_sv(sattr,initial,any,final,&svout);
+ valuearray_get_bervalarray(svout,ivals); /* JCM SLOW FUNCTION */
+ valuearray_free(&svout);
+ return rc;
+}