]> git.sur5r.net Git - openldap/commitdiff
Updated sasl response to support returning of referrals.
authorKurt Zeilenga <kurt@openldap.org>
Wed, 15 Dec 1999 23:22:47 +0000 (23:22 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Wed, 15 Dec 1999 23:22:47 +0000 (23:22 +0000)
Updates to extended operation framework to support arbitrary
referrals and extended results without OIDs.
Updated passwd extended operation to support returning update_refs
as needed.  Needs replog support.

servers/slapd/back-ldbm/extended.c
servers/slapd/back-ldbm/external.h
servers/slapd/back-ldbm/passwd.c
servers/slapd/back-ldbm/proto-back-ldbm.h
servers/slapd/extended.c
servers/slapd/passwd.c
servers/slapd/proto-slap.h
servers/slapd/result.c
servers/slapd/slap.h
servers/slapd/starttls.c
servers/slapd/tools/mimic.c

index bc172df0d83045833137e26447cfbd422d7dab05..18aa0ac70bec721ebcc376e9ccedc9624ec845b7 100644 (file)
@@ -29,20 +29,23 @@ ldbm_back_extended(
     Backend            *be,
     Connection         *conn,
     Operation          *op,
-       char            *oid,
+       char            *reqoid,
     struct berval      *reqdata,
+       char            **rspoid,
     struct berval      **rspdata,
        LDAPControl *** rspctrls,
-       char**  text
+       char**  text,
+    struct berval *** refs 
 )
 {
        int i;
 
        for( i=0; exop_table[i].oid != NULL; i++ ) {
-               if( strcmp( exop_table[i].oid, oid ) == 0 ) {
+               if( strcmp( exop_table[i].oid, reqoid ) == 0 ) {
                        return (exop_table[i].extended)(
-                               be, conn, op, oid,
-                               reqdata, rspdata, rspctrls, text );
+                               be, conn, op,
+                               reqoid, reqdata,
+                               rspoid, rspdata, rspctrls, text, refs );
                }
        }
 
index aeac346579d5a38bac021b2013f1339986e83081..5cba7ebb3f234d5a98224799cbd2f5ec1c9abc7c 100644 (file)
@@ -26,9 +26,11 @@ extern int ldbm_back_extended LDAP_P(( BackendDB *bd,
        Connection *conn, Operation *op,
        char *reqoid,
        struct berval *reqdata,
+       char **rspoid,
        struct berval **rspdata,
        LDAPControl *** rspctrls,
-       char **text ));
+       char **text,
+       struct berval *** refs ));
 
 extern int ldbm_back_bind LDAP_P(( BackendDB *bd,
        Connection *conn, Operation *op,
index 85bbed01b4ac3ee494df4ced101fdea2fa733560..6915b59cadc6672f00af4928ca3d303cdccc48e0 100644 (file)
@@ -21,11 +21,13 @@ ldbm_back_exop_passwd(
     Backend            *be,
     Connection         *conn,
     Operation          *op,
-       char            *oid,
+       char            *reqoid,
     struct berval      *reqdata,
+       char            **rspoid,
     struct berval      **rspdata,
        LDAPControl *** rspctrls,
-       char**  text
+       char**  text,
+    struct berval      *** refs
 )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
@@ -38,8 +40,8 @@ ldbm_back_exop_passwd(
 
        char *dn;
 
-       assert( oid != NULL );
-       assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, oid ) == 0 );
+       assert( reqoid != NULL );
+       assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, reqoid ) == 0 );
 
        rc = slap_passwd_parse( reqdata,
                &id, NULL, &new, text );
index 89aae2a4325dfd57f6de790381202c8788d52b83..c9ebbae66edb5932effe3f4f6cd329ff0672e3c6 100644 (file)
@@ -148,11 +148,13 @@ int index_change_values LDAP_P(( Backend *be,
  */
 extern int ldbm_back_exop_passwd LDAP_P(( BackendDB *bd,
        Connection *conn, Operation *op,
-       char *oid,
+       char *reqoid,
        struct berval *reqdata,
+       char **rspoid,
        struct berval **rspdata,
        LDAPControl ***rspctrls,
-       char **text ));
+       char **text,
+       struct berval *** refs ));
  
 
 /*
index d3db89e29b89bbec8ddd7c88aecda338f1d44ce9..a1c5c8a293a6cb64d6a04e97d287ac0b8485d506 100644 (file)
@@ -86,19 +86,20 @@ do_extended(
 )
 {
        int rc = LDAP_SUCCESS;
-       char* oid;
+       char* reqoid;
        struct berval *reqdata;
        ber_tag_t tag;
        ber_len_t len;
        extop_list_t *ext;
        char *text;
        struct berval **refs;
+       char *rspoid;
        struct berval *rspdata;
        LDAPControl **rspctrls;
 
        Debug( LDAP_DEBUG_TRACE, "do_extended\n", 0, 0, 0 );
 
-       oid = NULL;
+       reqoid = NULL;
        reqdata = NULL;
 
        if( op->o_protocol < LDAP_VERSION3 ) {
@@ -110,7 +111,7 @@ do_extended(
                goto done;
        }
 
-       if ( ber_scanf( op->o_ber, "{a" /*}*/, &oid ) == LBER_ERROR ) {
+       if ( ber_scanf( op->o_ber, "{a" /*}*/, &reqoid ) == LBER_ERROR ) {
                Debug( LDAP_DEBUG_ANY, "do_extended: ber_scanf failed\n", 0, 0 ,0 );
                send_ldap_disconnect( conn, op,
                        LDAP_PROTOCOL_ERROR, "decoding error" );
@@ -118,9 +119,9 @@ do_extended(
                goto done;
        }
 
-       if( !(ext = find_extop(supp_ext_list, oid)) ) {
+       if( !(ext = find_extop(supp_ext_list, reqoid)) ) {
                Debug( LDAP_DEBUG_ANY, "do_extended: unsupported operation \"%s\"\n",
-                       oid, 0 ,0 );
+                       reqoid, 0 ,0 );
                send_ldap_result( conn, op, rc = LDAP_PROTOCOL_ERROR,
                        NULL, "unsupported extended operation", NULL, NULL );
                goto done;
@@ -143,22 +144,29 @@ do_extended(
                return rc;
        } 
 
-       Debug( LDAP_DEBUG_ARGS, "do_extended: oid=%s\n", oid, 0 ,0 );
+       Debug( LDAP_DEBUG_ARGS, "do_extended: oid=%s\n", reqoid, 0 ,0 );
 
+       rspoid = NULL;
        rspdata = NULL;
        rspctrls = NULL;
        text = NULL;
+       refs = NULL;
 
        rc = (ext->ext_main)( extop_callback, conn, op,
-               oid, reqdata, &rspdata, &rspctrls, &text );
+               reqoid, reqdata,
+               &rspoid, &rspdata, &rspctrls, &text, &refs );
 
        if( rc != SLAPD_ABANDON ) {
-               refs = NULL;
-               if (rc == LDAP_REFERRAL)
+               if (rc == LDAP_REFERRAL) {
                        refs = default_referral;
+               }
+
+               send_ldap_extended( conn, op, rc, NULL, text, refs,
+                       rspoid, rspdata, rspctrls );
+       }
 
-               send_ldap_extended( conn, op, rc, NULL, text,
-                       refs, oid, rspdata, rspctrls );
+       if ( rspoid != NULL ) {
+               free( rspoid );
        }
 
        if ( rspdata != NULL )
@@ -171,8 +179,8 @@ done:
        if ( reqdata != NULL ) {
                ber_bvfree( reqdata );
        }
-       if ( oid != NULL ) {
-               free( oid );
+       if ( reqoid != NULL ) {
+               free( reqoid );
        }
 
        return rc;
index d75926d1d145bdceae20cf972977cc140b9bea94..124d674dbbd3c0e9830a54b33044027e8f3801d7 100644 (file)
 
 int passwd_extop(
        SLAP_EXTOP_CALLBACK_FN ext_callback,
-       Connection *conn, Operation *op, char *oid,
+       Connection *conn, Operation *op,
+       char *reqoid,
        struct berval *reqdata,
+       char **rspoid,
        struct berval **rspdata,
        LDAPControl ***rspctrls,
-       char **text )
+       char **text,
+       struct berval ***refs )
 {
        int rc;
 
-       assert( oid != NULL );
-       assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, oid ) == 0 );
+       assert( reqoid != NULL );
+       assert( strcmp( LDAP_EXOP_X_MODIFY_PASSWD, reqoid ) == 0 );
 
        if( op->o_dn == NULL || op->o_dn[0] == '\0' ) {
                *text = ch_strdup("only authenicated users may change passwords");
                return LDAP_STRONG_AUTH_REQUIRED;
        }
 
-       if( conn->c_authz_backend != NULL &&
-               conn->c_authz_backend->be_extended )
+       if( conn->c_authz_backend != NULL && conn->c_authz_backend->be_extended )
        {
-               rc = conn->c_authz_backend->be_extended(
-                       conn->c_authz_backend,
-                       conn, op, oid, reqdata, rspdata, rspctrls, text );
+               if( global_readonly || conn->c_authz_backend->be_readonly ) {
+                       *text = ch_strdup("authorization database is read only");
+                       rc = LDAP_UNWILLING_TO_PERFORM;
+
+               } else if( conn->c_authz_backend->be_update_ndn != NULL ) {
+                       /* we SHOULD return a referral in this case */
+                       *refs = conn->c_authz_backend->be_update_refs;
+                       rc = LDAP_REFERRAL;
+
+               } else {
+                       rc = conn->c_authz_backend->be_extended(
+                               conn->c_authz_backend, conn, op,
+                               reqoid, reqdata,
+                               rspoid, rspdata, rspctrls,
+                               text, refs );
+               }
 
        } else {
                *text = ch_strdup("operation not supported for current user");
index b786933a0e786678af7d14a61d28038c5be2e070..c56f87ba997e9ae1ec9df4900f5d71a02989125f 100644 (file)
@@ -256,11 +256,13 @@ typedef int (*SLAP_EXTOP_CALLBACK_FN) LDAP_P((
 typedef int (*SLAP_EXTOP_MAIN_FN) LDAP_P((
        SLAP_EXTOP_CALLBACK_FN,
        Connection *conn, Operation *op,
-       char * oid,
+       char * reqoid,
        struct berval * reqdata,
+       char ** rspoid,
        struct berval ** rspdata,
        LDAPControl *** rspctrls,
-       char ** text ));
+       char ** text,
+       struct berval *** refs ));
 
 typedef int (*SLAP_EXTOP_GETOID_FN) LDAP_P((
        int index, char *oid, int blen ));
@@ -377,6 +379,7 @@ LIBSLAPD_F (void) send_ldap_sasl LDAP_P((
        Connection *conn, Operation *op,
        ber_int_t err, const char *matched,
        const char *text,
+       struct berval **refs,
        LDAPControl **ctrls,
        struct berval *cred ));
 
@@ -391,6 +394,11 @@ LIBSLAPD_F (void) send_ldap_extended LDAP_P((
        char *rspoid, struct berval *rspdata,
        LDAPControl **ctrls ));
 
+LIBSLAPD_F (void) send_ldap_partial LDAP_P((
+       Connection *conn, Operation *op,
+       char *rspoid, struct berval *rspdata,
+       LDAPControl **ctrls ));
+
 LIBSLAPD_F (void) send_search_result LDAP_P((
        Connection *conn, Operation *op,
        ber_int_t err, const char *matched, const char *text,
@@ -465,11 +473,13 @@ LIBSLAPD_F (int) dscompare LDAP_P(( const char *s1, const char *s2del, char deli
 LIBSLAPD_F (int) starttls_extop LDAP_P((
        SLAP_EXTOP_CALLBACK_FN,
        Connection *conn, Operation *op,
-       char * oid,
+       char * reqoid,
        struct berval * reqdata,
+       char ** rspoid,
        struct berval ** rspdata,
        LDAPControl ***rspctrls,
-       char ** text ));
+       char ** text,
+       struct berval *** refs ));
 
 
 /*
@@ -506,11 +516,13 @@ LIBSLAPD_F (void) slap_init_user LDAP_P(( char *username, char *groupname ));
 LIBSLAPD_F (int) passwd_extop LDAP_P((
        SLAP_EXTOP_CALLBACK_FN,
        Connection *conn, Operation *op,
-       char * oid,
+       char * reqoid,
        struct berval * reqdata,
+       char ** rspoid,
        struct berval ** rspdata,
        LDAPControl *** rspctrls,
-       char ** text ));
+       char ** text,
+       struct berval *** refs ));
 
 LIBSLAPD_F (int) slap_passwd_check(
        Attribute                       *attr,
index ad3c065ddf33803a12151dd725cc0dcafc93b8c6..cd7c59e59807c5af68ff6a8a84de0e0139a776d2 100644 (file)
@@ -457,6 +457,7 @@ send_ldap_sasl(
     ber_int_t  err,
     const char *matched,
     const char *text,
+       struct berval **ref,
        LDAPControl **ctrls,
        struct berval *cred
 )
@@ -482,7 +483,7 @@ send_ldap_sasl(
 #endif
 
        send_ldap_response( conn, op, tag, msgid,
-               err, matched, text, NULL,
+               err, matched, text, ref,
                NULL, NULL, cred, ctrls  );
 }
 
index 7d0fd55dfa349aea971adbe5e727c3d8e5684c50..b0e67a32ea29c122e4cc917f74270ca0f1033d20 100644 (file)
@@ -535,11 +535,13 @@ typedef int (*SLAP_EXTENDED_FN) LDAP_P((
     Backend            *be,
     struct slap_conn           *conn,
     struct slap_op             *op,
-       char            *oid,
+       char            *reqoid,
     struct berval * reqdata,
+       char            **rspoid,
     struct berval ** rspdata,
-       LDAPControl ***rspctrls,
-       char**  text ));
+       LDAPControl *** rspctrls,
+       char ** text,
+       struct berval *** refs ));
 
 struct slap_backend_info {
        char    *bi_type;       /* type of backend */
index 35767fae392faf530c6d5bc254cd6c12e357e4fd..6228b5be696d6d00b210db83f1d63aed91568f75 100644 (file)
@@ -23,11 +23,13 @@ starttls_extop (
        SLAP_EXTOP_CALLBACK_FN cb,
        Connection *conn,
        Operation *op,
-       char * oid,
+       char * reqoid,
        struct berval * reqdata,
+       char ** rspoid,
        struct berval ** rspdata,
        LDAPControl ***rspctrls,
-       char ** text )
+       char ** text,
+       struct berval *** refs )
 {
        void *ctx;
 
index f1e1a51521e1e1879a70d1b049036684f4fe0951..03d91a25a90bf15621989a8235581e072b2ead8a 100644 (file)
@@ -62,6 +62,7 @@ send_ldap_sasl(
     ber_int_t  err,
     const char *matched,
     const char *text,
+       struct berval **refs,
        LDAPControl **ctrls,
        struct berval *cred
 )