Add whoami extended operation.

Add no-op control (needs backend implementation)
Updated modify password extended option API
Kludged control infrastructure to support frontend only controls
This commit is contained in:
Kurt Zeilenga 2002-01-28 20:25:30 +00:00
parent 97e29c023e
commit 14662be692
15 changed files with 133 additions and 47 deletions

View File

@ -662,19 +662,19 @@ main( int argc, char *argv[] )
if( user != NULL ) {
ber_printf( ber, "ts",
LDAP_TAG_EXOP_X_MODIFY_PASSWD_ID, user );
LDAP_TAG_EXOP_MODIFY_PASSWD_ID, user );
free(user);
}
if( oldpw != NULL ) {
ber_printf( ber, "ts",
LDAP_TAG_EXOP_X_MODIFY_PASSWD_OLD, oldpw );
LDAP_TAG_EXOP_MODIFY_PASSWD_OLD, oldpw );
free(oldpw);
}
if( newpw != NULL ) {
ber_printf( ber, "ts",
LDAP_TAG_EXOP_X_MODIFY_PASSWD_NEW, newpw );
LDAP_TAG_EXOP_MODIFY_PASSWD_NEW, newpw );
free(newpw);
}
@ -697,7 +697,7 @@ main( int argc, char *argv[] )
}
rc = ldap_extended_operation( ld,
LDAP_EXOP_X_MODIFY_PASSWD, bv,
LDAP_EXOP_MODIFY_PASSWD, bv,
NULL, NULL, &id );
ber_bvfree( bv );

View File

@ -180,23 +180,22 @@ typedef struct ldapcontrol {
/* LDAP Controls */
#ifdef undef
#if 0
/* chase referrals client control (not yet implemented) */
#define LDAP_CONTROL_REFERRALS "1.2.840.113666.1.4.616"
#define LDAP_CHASE_SUBORDINATE_REFERRALS 0x0020U
#define LDAP_CHASE_EXTERNAL_REFERRALS 0x0040U
#endif
#define LDAP_CONTROL_SUBENTRIES "1.3.6.1.4.1.4203.666.5.1"
#define LDAP_CONTROL_MANAGEDSAIT "2.16.840.1.113730.3.4.2"
#define LDAP_CONTROL_MANAGEDSAIT "2.16.840.1.113730.3.4.2"
#define LDAP_CONTROL_SUBENTRIES "1.3.6.1.4.1.4203.666.5.1"
#define LDAP_CONTROL_NOOP "1.3.6.1.4.1.4203.666.5.2"
#define LDAP_CONTROL_DUPENT_REQUEST "2.16.840.1.113719.1.27.101.1"
#define LDAP_CONTROL_DUPENT_RESPONSE "2.16.840.1.113719.1.27.101.2"
#define LDAP_CONTROL_DUPENT_ENTRY "2.16.840.1.113719.1.27.101.3"
#define LDAP_CONTROL_DUPENT LDAP_CONTROL_DUPENT_REQUEST
/* Experimental Controls */
#define LDAP_CONTROL_SORTREQUEST "1.2.840.113556.1.4.473"
#define LDAP_CONTROL_SORTRESPONSE "1.2.840.113556.1.4.474"
#define LDAP_CONTROL_VLVREQUEST "2.16.840.1.113730.3.4.9"
@ -207,13 +206,15 @@ typedef struct ldapcontrol {
#define LDAP_NOTICE_DISCONNECT LDAP_NOTICE_OF_DISCONNECTION
/* LDAP Extended Operations */
#define LDAP_EXOP_START_TLS "1.3.6.1.4.1.1466.20037"
#define LDAP_EXOP_START_TLS "1.3.6.1.4.1.1466.20037"
#define LDAP_EXOP_X_MODIFY_PASSWD "1.3.6.1.4.1.4203.1.11.1"
#define LDAP_TAG_EXOP_X_MODIFY_PASSWD_ID ((ber_tag_t) 0x80U)
#define LDAP_TAG_EXOP_X_MODIFY_PASSWD_OLD ((ber_tag_t) 0x81U)
#define LDAP_TAG_EXOP_X_MODIFY_PASSWD_NEW ((ber_tag_t) 0x82U)
#define LDAP_TAG_EXOP_X_MODIFY_PASSWD_GEN ((ber_tag_t) 0x80U)
#define LDAP_EXOP_MODIFY_PASSWD "1.3.6.1.4.1.4203.1.11.1"
#define LDAP_TAG_EXOP_MODIFY_PASSWD_ID ((ber_tag_t) 0x80U)
#define LDAP_TAG_EXOP_MODIFY_PASSWD_OLD ((ber_tag_t) 0x81U)
#define LDAP_TAG_EXOP_MODIFY_PASSWD_NEW ((ber_tag_t) 0x82U)
#define LDAP_TAG_EXOP_MODIFY_PASSWD_GEN ((ber_tag_t) 0x80U)
#define LDAP_EXOP_X_WHO_AM_I "1.3.6.1.4.1.4203.666.6.2"
/*
* specific LDAP instantiations of BER types we know about

View File

@ -102,7 +102,6 @@ int slap_bv2ad(
AttributeDescription desc, *d2;
char *name, *options;
char *opt, *next;
char *s, *ptr;
int nlang;
int langlen;
@ -201,14 +200,15 @@ int slap_bv2ad(
int rc;
rc = strncasecmp( opt, langs[i].bv_val,
optlen < langs[i].bv_len ? optlen : langs[i].bv_len );
(unsigned) optlen < langs[i].bv_len
? optlen : langs[i].bv_len );
if( rc == 0 && optlen == langs[i].bv_len ) {
if( rc == 0 && (unsigned)optlen == langs[i].bv_len ) {
/* duplicate (ignore) */
goto done;
} else if ( rc > 0 ||
( rc == 0 && optlen > langs[i].bv_len ))
( rc == 0 && (unsigned)optlen > langs[i].bv_len ))
{
AC_MEMCPY( &langs[i+1], &langs[i],
(nlang-i)*sizeof(struct berval) );

View File

@ -64,8 +64,8 @@ bdb_add(
}
if( 0 ) {
retry: /* transaction retry */
rc = txn_abort( ltid );
retry: /* transaction retry */
rc = txn_abort( ltid );
ltid = NULL;
op->o_private = NULL;
if( rc != 0 ) {

View File

@ -122,7 +122,7 @@ struct bdb_info {
int bi_nrdns;
#endif
int bi_txn;
int bi_txn;
int bi_txn_cp;
u_int32_t bi_txn_cp_min;
u_int32_t bi_txn_cp_kbyte;

View File

@ -17,7 +17,7 @@ static struct exop {
char *oid;
BI_op_extended *extended;
} exop_table[] = {
{ LDAP_EXOP_X_MODIFY_PASSWD, bdb_exop_passwd },
{ LDAP_EXOP_MODIFY_PASSWD, bdb_exop_passwd },
{ NULL, NULL }
};

View File

@ -411,6 +411,9 @@ bdb_initialize(
static char *controls[] = {
LDAP_CONTROL_MANAGEDSAIT,
LDAP_CONTROL_SUBENTRIES,
#if 0
LDAP_CONTROL_NOOP,
#endif
NULL
};

View File

@ -41,7 +41,7 @@ bdb_exop_passwd(
struct berval *dn;
assert( reqoid != NULL );
assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, reqoid ) == 0 );
assert( strcmp( LDAP_EXOP_MODIFY_PASSWD, reqoid ) == 0 );
rc = slap_passwd_parse( reqdata,
&id, NULL, &new, text );

View File

@ -20,7 +20,7 @@ struct exop {
char *oid;
BI_op_extended *extended;
} exop_table[] = {
{ LDAP_EXOP_X_MODIFY_PASSWD, ldbm_back_exop_passwd },
{ LDAP_EXOP_MODIFY_PASSWD, ldbm_back_exop_passwd },
{ NULL, NULL }
};

View File

@ -42,7 +42,7 @@ ldbm_back_exop_passwd(
struct berval ndn;
assert( reqoid != NULL );
assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, reqoid ) == 0 );
assert( strcmp( LDAP_EXOP_MODIFY_PASSWD, reqoid ) == 0 );
rc = slap_passwd_parse( reqdata,
&id, NULL, &new, text );

View File

@ -19,15 +19,18 @@
#include "../../libraries/liblber/lber-int.h"
#define SLAP_CTRL_ABANDON 0x0001
#define SLAP_CTRL_ADD 0x2002
#define SLAP_CTRL_BIND 0x0004
#define SLAP_CTRL_COMPARE 0x1008
#define SLAP_CTRL_DELETE 0x2010
#define SLAP_CTRL_MODIFY 0x2020
#define SLAP_CTRL_RENAME 0x2040
#define SLAP_CTRL_SEARCH 0x1080
#define SLAP_CTRL_UNBIND 0x0100
#define SLAP_CTRL_FRONTEND 0x80000000U
#define SLAP_CTRL_OPFLAGS 0x0000FFFFU
#define SLAP_CTRL_ABANDON 0x00000001U
#define SLAP_CTRL_ADD 0x00002002U
#define SLAP_CTRL_BIND 0x00000004U
#define SLAP_CTRL_COMPARE 0x00001008U
#define SLAP_CTRL_DELETE 0x00002010U
#define SLAP_CTRL_MODIFY 0x00002020U
#define SLAP_CTRL_RENAME 0x00002040U
#define SLAP_CTRL_SEARCH 0x00001080U
#define SLAP_CTRL_UNBIND 0x00000100U
#define SLAP_CTRL_INTROGATE (SLAP_CTRL_COMPARE|SLAP_CTRL_SEARCH)
#define SLAP_CTRL_UPDATE \
@ -42,10 +45,11 @@ typedef int (SLAP_CTRL_PARSE_FN) LDAP_P((
static SLAP_CTRL_PARSE_FN parseManageDSAit;
static SLAP_CTRL_PARSE_FN parseSubentries;
static SLAP_CTRL_PARSE_FN parseNoOp;
static struct slap_control {
char *sc_oid;
int sc_ops_mask;
slap_mask_t sc_mask;
char **sc_extendedops;
SLAP_CTRL_PARSE_FN *sc_parse;
@ -56,6 +60,11 @@ static struct slap_control {
{ LDAP_CONTROL_SUBENTRIES,
SLAP_CTRL_SEARCH, NULL,
parseSubentries },
#ifdef LDAP_CONTROL_NOOP
{ LDAP_CONTROL_NOOP,
SLAP_CTRL_UPDATE, NULL,
parseNoOp },
#endif
{ NULL }
};
@ -248,7 +257,7 @@ int get_ctrls(
c = find_ctrl( tctrl->ldctl_oid );
if( c != NULL ) {
/* recongized control */
int tagmask = -1;
slap_mask_t tagmask;
switch( op->o_tag ) {
case LDAP_REQ_ADD:
tagmask = SLAP_CTRL_ADD;
@ -276,7 +285,7 @@ int get_ctrls(
break;
case LDAP_REQ_EXTENDED:
/* FIXME: check list of extended operations */
tagmask = -1;
tagmask = ~0U;
break;
default:
rc = LDAP_OTHER;
@ -284,7 +293,7 @@ int get_ctrls(
goto return_results;
}
if (( c->sc_ops_mask & tagmask ) == tagmask ) {
if (( c->sc_mask & tagmask ) == tagmask ) {
/* available extension */
if( !c->sc_parse ) {
@ -297,6 +306,11 @@ int get_ctrls(
if( rc != LDAP_SUCCESS ) goto return_results;
if( c->sc_mask & SLAP_CTRL_FRONTEND ) {
/* kludge to disable backend_control() check */
tctrl->ldctl_iscritical = 0;
}
} else if( tctrl->ldctl_iscritical ) {
/* unavailable CRITICAL control */
rc = LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
@ -387,3 +401,27 @@ static int parseSubentries (
return LDAP_SUCCESS;
}
static int parseNoOp (
Connection *conn,
Operation *op,
LDAPControl *ctrl,
const char **text )
{
if ( op->o_noop != SLAP_NO_CONTROL ) {
*text = "noop control specified multiple times";
return LDAP_PROTOCOL_ERROR;
}
if ( ctrl->ldctl_value.bv_len ) {
*text = "noop control value not empty";
return LDAP_PROTOCOL_ERROR;
}
op->o_noop = ctrl->ldctl_iscritical
? SLAP_CRITICAL_CONTROL
: SLAP_NONCRITICAL_CONTROL;
return LDAP_SUCCESS;
}

View File

@ -29,6 +29,7 @@
#include <stdio.h>
#include <ac/socket.h>
#include <ac/string.h>
#include "slap.h"
@ -38,6 +39,8 @@ static struct extop_list {
SLAP_EXTOP_MAIN_FN *ext_main;
} *supp_ext_list = NULL;
static SLAP_EXTOP_MAIN_FN whoami_extop;
/* this list of built-in extops is for extops that are not part
* of backends or in external modules. essentially, this is
* just a way to get built-in extops onto the extop list without
@ -50,7 +53,8 @@ static struct {
#ifdef HAVE_TLS
{ LDAP_EXOP_START_TLS, starttls_extop },
#endif
{ LDAP_EXOP_X_MODIFY_PASSWD, passwd_extop },
{ LDAP_EXOP_MODIFY_PASSWD, passwd_extop },
{ LDAP_EXOP_X_WHO_AM_I, whoami_extop },
{ NULL, NULL }
};
@ -214,8 +218,9 @@ do_extended(
free( rspoid );
}
if ( rspdata != NULL )
if ( rspdata != NULL ) {
ber_bvfree( rspdata );
}
done:
if ( reqdata != NULL ) {
@ -293,3 +298,42 @@ find_extop( struct extop_list *list, char *oid )
}
return(NULL);
}
int
whoami_extop (
Connection *conn,
Operation *op,
const char * reqoid,
struct berval * reqdata,
char ** rspoid,
struct berval ** rspdata,
LDAPControl ***rspctrls,
const char ** text,
BerVarray * refs )
{
struct berval *bv;
if ( reqdata != NULL ) {
/* no request data should be provided */
*text = "no request data expected";
return LDAP_PROTOCOL_ERROR;
}
bv = (struct berval *) ch_malloc( sizeof(struct berval) );
if( op->o_dn.bv_len ) {
bv->bv_len = op->o_dn.bv_len + sizeof("dn:")-1;
bv->bv_val = ch_malloc( bv->bv_len + 1 );
AC_MEMCPY( bv->bv_val, "dn:", sizeof("dn:")-1 );
AC_MEMCPY( &bv->bv_val[sizeof("dn:")-1], op->o_dn.bv_val,
op->o_dn.bv_len );
bv->bv_val[bv->bv_len] = '\0';
} else {
bv->bv_len = 0;
bv->bv_val = NULL;
}
*rspdata = bv;
return LDAP_SUCCESS;
}

View File

@ -31,7 +31,7 @@ int passwd_extop(
int rc;
assert( reqoid != NULL );
assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, reqoid ) == 0 );
assert( strcmp( LDAP_EXOP_MODIFY_PASSWD, reqoid ) == 0 );
if( op->o_dn.bv_len == 0 ) {
*text = "only authenticated users may change passwords";
@ -101,7 +101,7 @@ int slap_passwd_parse( struct berval *reqdata,
tag = ber_peek_tag( ber, &len );
}
if( tag == LDAP_TAG_EXOP_X_MODIFY_PASSWD_ID ) {
if( tag == LDAP_TAG_EXOP_MODIFY_PASSWD_ID ) {
if( id == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
@ -133,7 +133,7 @@ int slap_passwd_parse( struct berval *reqdata,
tag = ber_peek_tag( ber, &len);
}
if( tag == LDAP_TAG_EXOP_X_MODIFY_PASSWD_OLD ) {
if( tag == LDAP_TAG_EXOP_MODIFY_PASSWD_OLD ) {
if( oldpass == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
@ -165,7 +165,7 @@ int slap_passwd_parse( struct berval *reqdata,
tag = ber_peek_tag( ber, &len);
}
if( tag == LDAP_TAG_EXOP_X_MODIFY_PASSWD_NEW ) {
if( tag == LDAP_TAG_EXOP_MODIFY_PASSWD_NEW ) {
if( newpass == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
@ -257,7 +257,7 @@ struct berval * slap_passwd_return(
ber_init_w_nullc( ber, LBER_USE_DER );
rc = ber_printf( ber, "{tON}",
LDAP_TAG_EXOP_X_MODIFY_PASSWD_GEN, cred );
LDAP_TAG_EXOP_MODIFY_PASSWD_GEN, cred );
if( rc >= 0 ) {
(void) ber_flatten( ber, &bv );

View File

@ -704,7 +704,6 @@ int slap_sasl_bind(
rc = slap_sasl_getdn( conn, username, edn, FLAG_GETDN_FINAL );
if( rc == LDAP_SUCCESS ) {
int i;
sasl_ssf_t *ssf = NULL;
(void) sasl_getprop( ctx, SASL_SSF, (void *)&ssf );
*ssfp = ssf ? *ssf : 0;

View File

@ -1409,6 +1409,7 @@ typedef struct slap_op {
char o_managedsait;
char o_subentries;
char o_subentries_visibility;
char o_noop;
int o_abandon; /* abandon flag */
ldap_pvt_thread_mutex_t o_abandonmutex; /* protects o_abandon */