From 87a02dbb14ef43d12c6a5b3206f1d45d17b4cb93 Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Tue, 9 Mar 2004 14:05:01 +0000 Subject: [PATCH] Support server search flag control as alias for permissive modify Recognise tree delete control - needs backend support --- servers/slapd/controls.c | 84 ++++++++++++++++++++++++++++++++++++++++ servers/slapd/slap.h | 7 ++++ 2 files changed, 91 insertions(+) diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index 1900312250..1ddc6fec3f 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -35,6 +35,8 @@ static SLAP_CTRL_PARSE_FN parsePagedResults; static SLAP_CTRL_PARSE_FN parseValuesReturnFilter; static SLAP_CTRL_PARSE_FN parsePermissiveModify; static SLAP_CTRL_PARSE_FN parseDomainScope; +static SLAP_CTRL_PARSE_FN parseTreeDelete; +static SLAP_CTRL_PARSE_FN parseSearchOptions; #ifdef LDAP_CONTROL_SUBENTRIES static SLAP_CTRL_PARSE_FN parseSubentries; @@ -102,6 +104,16 @@ static struct slap_control control_defs[] = { SLAP_CTRL_MODIFY, NULL, parsePermissiveModify, LDAP_SLIST_ENTRY_INITIALIZER(next) }, #endif +#ifdef LDAP_CONTROL_X_TREE_DELETE + { LDAP_CONTROL_X_TREE_DELETE, + SLAP_CTRL_DELETE, NULL, + parseTreeDelete, LDAP_SLIST_ENTRY_INITIALIZER(next) }, +#endif +#ifdef LDAP_CONTORL_X_SEARCH_OPTIONS + { LDAP_CONTORL_X_SEARCH_OPTIONS, + SLAP_CTRL_FRONTEND|SLAP_CTRL_SEARCH, NULL, + parseSearchOptions, LDAP_SLIST_ENTRY_INITIALIZER(next) }, +#endif #ifdef LDAP_CONTROL_SUBENTRIES { LDAP_CONTROL_SUBENTRIES, SLAP_CTRL_SEARCH, NULL, @@ -1215,6 +1227,78 @@ static int parseDomainScope ( } #endif +#ifdef LDAP_CONTROL_X_TREE_DELETE +static int parseTreeDelete ( + Operation *op, + SlapReply *rs, + LDAPControl *ctrl ) +{ + if ( op->o_tree_delete != SLAP_NO_CONTROL ) { + rs->sr_text = "treeDelete control specified multiple times"; + return LDAP_PROTOCOL_ERROR; + } + + if ( ctrl->ldctl_value.bv_len ) { + rs->sr_text = "treeDelete control value not empty"; + return LDAP_PROTOCOL_ERROR; + } + + op->o_tree_delete = ctrl->ldctl_iscritical + ? SLAP_CRITICAL_CONTROL + : SLAP_NONCRITICAL_CONTROL; + + return LDAP_SUCCESS; +} +#endif + +#ifdef LDAP_CONTORL_X_SEARCH_OPTIONS +static int parseSearchOptions ( + Operation *op, + SlapReply *rs, + LDAPControl *ctrl ) +{ + BerElement *ber; + ber_int_t search_flags; + + if ( ctrl->ldctl_value.bv_len == 0 ) { + rs->sr_text = "searchOptions control value not empty"; + return LDAP_PROTOCOL_ERROR; + } + + ber = ber_init( &ctrl->ldctl_value ); + if( ber == NULL ) { + rs->sr_text = "internal error"; + return LDAP_OTHER; + } + + if ( (tag = ber_scanf( ber, "{i}", &search_flags )) == LBER_ERROR ) { + rs->sr_text = "searchOptions control decoding error"; + return LDAP_PROTOCOL_ERROR; + } + + (void) ber_free( ber, 1 ); + + if ( search_flags & LDAP_SERVER_SEARCH_FLAG_DOMAIN_SCOPE ) { + if ( op->o_domain_scope != SLAP_NO_CONTROL ) { + rs->sr_text = "searchOptions control specified multiple times or with domainScope control"; + return LDAP_PROTOCOL_ERROR; + } + + op->o_domain_scope = ctrl->ldctl_iscritical + ? SLAP_CRITICAL_CONTROL + : SLAP_NONCRITICAL_CONTROL; + } + + if ( search_flags & ~(LDAP_SERVER_SEARCH_FLAG_DOMAIN_SCOPE) ) { + /* Other search flags not recognised so far */ + rs->sr_text = "searchOptions contained invalid flag"; + return LDAP_UNAVAILABLE_CRITICAL_EXTENSION; + } + + return LDAP_SUCCESS; +} +#endif + static int parseLDAPsync ( Operation *op, SlapReply *rs, diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 41298960d4..ab7497b968 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2037,6 +2037,13 @@ typedef struct slap_op { #define get_domainScope(op) ((int)(op)->o_domain_scope) #else #define get_domainScope(op) (0) +#endif + +#ifdef LDAP_CONTROL_X_TREE_DELETE + char o_tree_delete; +#define get_treeDelete(op) ((int)(op)->o_tree_delete) +#else +#define get_treeDelete(op) (0) #endif char o_preread; -- 2.39.5