mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-27 01:59:38 -05:00
Add slap_parse_ctrl() API for parsing already decoded controls; needed
for SLAPI internal operations to use controls
This commit is contained in:
parent
5eda803bc1
commit
2007c4b8b9
2 changed files with 97 additions and 82 deletions
|
|
@ -441,6 +441,96 @@ void slap_free_ctrls(
|
|||
op->o_tmpfree( ctrls, op->o_tmpmemctx );
|
||||
}
|
||||
|
||||
int slap_parse_ctrl(
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
LDAPControl *control,
|
||||
const char **text )
|
||||
{
|
||||
struct slap_control *sc;
|
||||
int rc;
|
||||
|
||||
sc = find_ctrl( control->ldctl_oid );
|
||||
if( sc != NULL ) {
|
||||
/* recognized control */
|
||||
slap_mask_t tagmask;
|
||||
switch( op->o_tag ) {
|
||||
case LDAP_REQ_ADD:
|
||||
tagmask = SLAP_CTRL_ADD;
|
||||
break;
|
||||
case LDAP_REQ_BIND:
|
||||
tagmask = SLAP_CTRL_BIND;
|
||||
break;
|
||||
case LDAP_REQ_COMPARE:
|
||||
tagmask = SLAP_CTRL_COMPARE;
|
||||
break;
|
||||
case LDAP_REQ_DELETE:
|
||||
tagmask = SLAP_CTRL_DELETE;
|
||||
break;
|
||||
case LDAP_REQ_MODIFY:
|
||||
tagmask = SLAP_CTRL_MODIFY;
|
||||
break;
|
||||
case LDAP_REQ_RENAME:
|
||||
tagmask = SLAP_CTRL_RENAME;
|
||||
break;
|
||||
case LDAP_REQ_SEARCH:
|
||||
tagmask = SLAP_CTRL_SEARCH;
|
||||
break;
|
||||
case LDAP_REQ_UNBIND:
|
||||
tagmask = SLAP_CTRL_UNBIND;
|
||||
break;
|
||||
case LDAP_REQ_ABANDON:
|
||||
tagmask = SLAP_CTRL_ABANDON;
|
||||
break;
|
||||
case LDAP_REQ_EXTENDED:
|
||||
tagmask=~0L;
|
||||
assert( op->ore_reqoid.bv_val != NULL );
|
||||
if( sc->sc_extendedops != NULL ) {
|
||||
int i;
|
||||
for( i=0; sc->sc_extendedops[i] != NULL; i++ ) {
|
||||
if( strcmp( op->ore_reqoid.bv_val,
|
||||
sc->sc_extendedops[i] ) == 0 )
|
||||
{
|
||||
tagmask=0L;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*text = "controls internal error";
|
||||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
if (( sc->sc_mask & tagmask ) == tagmask ) {
|
||||
/* available extension */
|
||||
int rc;
|
||||
|
||||
if( !sc->sc_parse ) {
|
||||
*text = "not yet implemented";
|
||||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
rc = sc->sc_parse( op, rs, control );
|
||||
if ( rc ) {
|
||||
assert( rc != LDAP_UNAVAILABLE_CRITICAL_EXTENSION );
|
||||
return rc;
|
||||
}
|
||||
|
||||
} else if( control->ldctl_iscritical ) {
|
||||
/* unavailable CRITICAL control */
|
||||
*text = "critical extension is unavailable";
|
||||
return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
|
||||
}
|
||||
} else if( control->ldctl_iscritical ) {
|
||||
/* unrecognized CRITICAL control */
|
||||
*text = "critical extension is not recognized";
|
||||
return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
|
||||
}
|
||||
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
int get_ctrls(
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
|
|
@ -451,7 +541,6 @@ int get_ctrls(
|
|||
ber_len_t len;
|
||||
char *opaque;
|
||||
BerElement *ber = op->o_ber;
|
||||
struct slap_control *sc;
|
||||
struct berval bv;
|
||||
|
||||
len = ber_pvt_ber_remaining(ber);
|
||||
|
|
@ -591,87 +680,8 @@ int get_ctrls(
|
|||
"=> get_ctrls: oid=\"%s\" (%scritical)\n",
|
||||
c->ldctl_oid, c->ldctl_iscritical ? "" : "non", 0 );
|
||||
|
||||
sc = find_ctrl( c->ldctl_oid );
|
||||
if( sc != NULL ) {
|
||||
/* recognized control */
|
||||
slap_mask_t tagmask;
|
||||
switch( op->o_tag ) {
|
||||
case LDAP_REQ_ADD:
|
||||
tagmask = SLAP_CTRL_ADD;
|
||||
break;
|
||||
case LDAP_REQ_BIND:
|
||||
tagmask = SLAP_CTRL_BIND;
|
||||
break;
|
||||
case LDAP_REQ_COMPARE:
|
||||
tagmask = SLAP_CTRL_COMPARE;
|
||||
break;
|
||||
case LDAP_REQ_DELETE:
|
||||
tagmask = SLAP_CTRL_DELETE;
|
||||
break;
|
||||
case LDAP_REQ_MODIFY:
|
||||
tagmask = SLAP_CTRL_MODIFY;
|
||||
break;
|
||||
case LDAP_REQ_RENAME:
|
||||
tagmask = SLAP_CTRL_RENAME;
|
||||
break;
|
||||
case LDAP_REQ_SEARCH:
|
||||
tagmask = SLAP_CTRL_SEARCH;
|
||||
break;
|
||||
case LDAP_REQ_UNBIND:
|
||||
tagmask = SLAP_CTRL_UNBIND;
|
||||
break;
|
||||
case LDAP_REQ_ABANDON:
|
||||
tagmask = SLAP_CTRL_ABANDON;
|
||||
break;
|
||||
case LDAP_REQ_EXTENDED:
|
||||
tagmask=~0L;
|
||||
assert( op->ore_reqoid.bv_val != NULL );
|
||||
if( sc->sc_extendedops != NULL ) {
|
||||
int i;
|
||||
for( i=0; sc->sc_extendedops[i] != NULL; i++ ) {
|
||||
if( strcmp( op->ore_reqoid.bv_val,
|
||||
sc->sc_extendedops[i] ) == 0 )
|
||||
{
|
||||
tagmask=0L;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
rs->sr_err = LDAP_OTHER;
|
||||
rs->sr_text = "controls internal error";
|
||||
goto return_results;
|
||||
}
|
||||
|
||||
if (( sc->sc_mask & tagmask ) == tagmask ) {
|
||||
/* available extension */
|
||||
int rc;
|
||||
|
||||
if( !sc->sc_parse ) {
|
||||
rs->sr_err = LDAP_OTHER;
|
||||
rs->sr_text = "not yet implemented";
|
||||
goto return_results;
|
||||
}
|
||||
|
||||
rc = sc->sc_parse( op, rs, c );
|
||||
if ( rc ) {
|
||||
assert( rc != LDAP_UNAVAILABLE_CRITICAL_EXTENSION );
|
||||
rs->sr_err = rc;
|
||||
goto return_results;
|
||||
}
|
||||
|
||||
} else if( c->ldctl_iscritical ) {
|
||||
/* unavailable CRITICAL control */
|
||||
rs->sr_err = LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
|
||||
rs->sr_text = "critical extension is unavailable";
|
||||
goto return_results;
|
||||
}
|
||||
|
||||
} else if( c->ldctl_iscritical ) {
|
||||
/* unrecognized CRITICAL control */
|
||||
rs->sr_err = LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
|
||||
rs->sr_text = "critical extension is not recognized";
|
||||
rs->sr_err = slap_parse_ctrl( op, rs, c, &rs->sr_text );
|
||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||
goto return_results;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -491,6 +491,11 @@ LDAP_SLAPD_V( struct slap_control_ids ) slap_cids;
|
|||
LDAP_SLAPD_F (void) slap_free_ctrls LDAP_P((
|
||||
Operation *op,
|
||||
LDAPControl **ctrls ));
|
||||
LDAP_SLAPD_F (int) slap_parse_ctrl LDAP_P((
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
LDAPControl *control,
|
||||
const char **text ));
|
||||
LDAP_SLAPD_F (int) get_ctrls LDAP_P((
|
||||
Operation *op,
|
||||
SlapReply *rs,
|
||||
|
|
|
|||
Loading…
Reference in a new issue