Diff for /servers/slapd/back-ldap/chain.c between versions 1.52.2.12 and 1.52.2.13

version 1.52.2.12, 2010/04/13 20:23:28 version 1.52.2.13, 2010/12/17 17:08:08
Line 1 Line 1
 /* chain.c - chain LDAP operations */  /* chain.c - chain LDAP operations */
 /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.52.2.11 2009/08/26 00:50:19 quanah Exp $ */  /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2003-2010 The OpenLDAP Foundation.   * Copyright 2003-2010 The OpenLDAP Foundation.
Line 417  ldap_chain_op( Line 417  ldap_chain_op(
         for ( ; !BER_BVISNULL( ref ); ref++ ) {          for ( ; !BER_BVISNULL( ref ); ref++ ) {
                 SlapReply       rs2 = { 0 };                  SlapReply       rs2 = { 0 };
                 LDAPURLDesc     *srv = NULL;                  LDAPURLDesc     *srv = NULL;
                   req_search_s    save_oq_search = op->oq_search,
                                   tmp_oq_search = { 0 };
                 struct berval   save_req_dn = op->o_req_dn,                  struct berval   save_req_dn = op->o_req_dn,
                                 save_req_ndn = op->o_req_ndn,                                  save_req_ndn = op->o_req_ndn,
                                 dn = BER_BVNULL,                                  dn = BER_BVNULL,
                                 pdn = BER_BVNULL,                                  pdn = BER_BVNULL,
                                 ndn = BER_BVNULL;                                  ndn = BER_BVNULL;
                   char            *filter = NULL;
                 int             temporary = 0;                  int             temporary = 0;
                   int             free_dn = 0;
                                                   
                 /* We're setting the URI of the first referral;                  /* We're setting the URI of the first referral;
                  * what if there are more?                   * what if there are more?
Line 449  Document: RFC 4511 Line 453  Document: RFC 4511
                         continue;                          continue;
                 }                  }
   
                 /* normalize DN */                  if ( op->o_tag == LDAP_REQ_SEARCH ) {
                           if ( srv->lud_scope != LDAP_SCOPE_DEFAULT ) {
                                   /* RFC 4511: if scope is present, use it */
                                   tmp_oq_search.rs_scope = srv->lud_scope;
   
                           } else {
                                   /* RFC 4511: if scope is absent, use original */
                                   tmp_oq_search.rs_scope = op->ors_scope;
                           }
                   }
   
                 rc = LDAP_SUCCESS;                  rc = LDAP_SUCCESS;
                 srv->lud_scope = LDAP_SCOPE_DEFAULT;                  srv->lud_scope = LDAP_SCOPE_DEFAULT;
                 if ( srv->lud_dn != NULL ) {                  dn.bv_val = srv->lud_dn;
                   filter = srv->lud_filter;
   
                   /* normalize DN */
                   if ( srv->lud_dn == NULL || srv->lud_dn[0] == '\0' ) {
                           if ( srv->lud_dn == NULL ) {
                                   srv->lud_dn = "";
                           }
   
                           pdn = save_req_dn;
                           ndn = save_req_ndn;
   
                   } else {
                         ber_str2bv( srv->lud_dn, 0, 0, &dn );                          ber_str2bv( srv->lud_dn, 0, 0, &dn );
                         rc = dnPrettyNormal( NULL, &dn, &pdn, &ndn, op->o_tmpmemctx );                          rc = dnPrettyNormal( NULL, &dn, &pdn, &ndn, op->o_tmpmemctx );
                         if ( rc == LDAP_SUCCESS ) {                          if ( rc == LDAP_SUCCESS ) {
Line 460  Document: RFC 4511 Line 486  Document: RFC 4511
                                  * ldap_initialize() will parse the URL                                    * ldap_initialize() will parse the URL 
                                  * as a comma-separated URL list */                                   * as a comma-separated URL list */
                                 srv->lud_dn = "";                                  srv->lud_dn = "";
                                   free_dn = 1;
                         }                          }
                   }
   
                 } else {                  /* prepare filter */
                         srv->lud_dn = "";                  if ( rc == LDAP_SUCCESS && op->o_tag == LDAP_REQ_SEARCH ) {
                           /* filter */
                           if ( srv->lud_filter != NULL
                                   && srv->lud_filter[0] != '\0'
                                   && strcasecmp( srv->lud_filter, "(objectClass=*)" ) != 0 )
                           {
                                   /* RFC 4511: if filter is present, use it;
                                    * otherwise, use original */
                                   tmp_oq_search.rs_filter = str2filter_x( op, srv->lud_filter );
                                   if ( tmp_oq_search.rs_filter != NULL ) {
                                           filter2bv_x( op, tmp_oq_search.rs_filter, &tmp_oq_search.rs_filterstr );
   
                                   } else {
                                           rc = LDAP_OTHER;
                                   }
                           }
                   }
                   srv->lud_filter = NULL;
   
                   if ( rc == LDAP_SUCCESS ) {
                           li.li_uri = ldap_url_desc2str( srv );
                 }                  }
   
                 li.li_uri = ldap_url_desc2str( srv );  
                 srv->lud_dn = dn.bv_val;                  srv->lud_dn = dn.bv_val;
                   srv->lud_filter = filter;
                 ldap_free_urldesc( srv );                  ldap_free_urldesc( srv );
   
                 if ( rc != LDAP_SUCCESS ) {                  if ( rc != LDAP_SUCCESS ) {
Line 485  Document: RFC 4511 Line 533  Document: RFC 4511
                 op->o_req_dn = pdn;                  op->o_req_dn = pdn;
                 op->o_req_ndn = ndn;                  op->o_req_ndn = ndn;
   
                   if ( op->o_tag == LDAP_REQ_SEARCH ) {
                           op->ors_scope = tmp_oq_search.rs_scope;
                           if ( tmp_oq_search.rs_filter != NULL ) {
                                   op->ors_filter = tmp_oq_search.rs_filter;
                                   op->ors_filterstr = tmp_oq_search.rs_filterstr;
                           }
                   }
   
                 ber_str2bv( li.li_uri, 0, 0, &li.li_bvuri[ 0 ] );                  ber_str2bv( li.li_uri, 0, 0, &li.li_bvuri[ 0 ] );
   
                 /* Searches for a ldapinfo in the avl tree */                  /* Searches for a ldapinfo in the avl tree */
Line 551  cleanup:; Line 607  cleanup:;
                 }                  }
   
 further_cleanup:;  further_cleanup:;
                 if ( !BER_BVISNULL( &pdn ) ) {                  if ( free_dn ) {
                         op->o_tmpfree( pdn.bv_val, op->o_tmpmemctx );                          op->o_tmpfree( pdn.bv_val, op->o_tmpmemctx );
                           op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );
                 }                  }
                 op->o_req_dn = save_req_dn;                  op->o_req_dn = save_req_dn;
                   op->o_req_ndn = save_req_ndn;
           
                   if ( op->o_tag == LDAP_REQ_SEARCH ) {   
                           if ( tmp_oq_search.rs_filter != NULL ) {
                                   filter_free_x( op, tmp_oq_search.rs_filter, 1 );
                           }
   
                 if ( !BER_BVISNULL( &ndn ) ) {                          if ( !BER_BVISNULL( &tmp_oq_search.rs_filterstr ) ) {
                         op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );                                  slap_sl_free( tmp_oq_search.rs_filterstr.bv_val, op->o_tmpmemctx );
                           }
   
                           op->oq_search = save_oq_search;
                 }                  }
                 op->o_req_ndn = save_req_ndn;  
                   
                 if ( rc == LDAP_SUCCESS && rs2.sr_err == LDAP_SUCCESS ) {                  if ( rc == LDAP_SUCCESS && rs2.sr_err == LDAP_SUCCESS ) {
                         *rs = rs2;                          *rs = rs2;
                         break;                          break;
Line 609  ldap_chain_search( Line 674  ldap_chain_search(
         (void)chaining_control_add( lc, op, &ctrls );          (void)chaining_control_add( lc, op, &ctrls );
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
   
           assert( rs->sr_type == REP_SEARCHREF );
   
         rs->sr_type = REP_SEARCH;          rs->sr_type = REP_SEARCH;
   
         op->o_callback->sc_response = ldap_chain_cb_search_response;          op->o_callback->sc_response = ldap_chain_cb_search_response;
Line 622  ldap_chain_search( Line 689  ldap_chain_search(
         for ( ; !BER_BVISNULL( &ref[0] ); ref++ ) {          for ( ; !BER_BVISNULL( &ref[0] ); ref++ ) {
                 SlapReply       rs2 = { 0 };                  SlapReply       rs2 = { 0 };
                 LDAPURLDesc     *srv;                  LDAPURLDesc     *srv;
                   req_search_s    save_oq_search = op->oq_search,
                                   tmp_oq_search = { 0 };
                 struct berval   save_req_dn = op->o_req_dn,                  struct berval   save_req_dn = op->o_req_dn,
                                 save_req_ndn = op->o_req_ndn,                                  save_req_ndn = op->o_req_ndn,
                                 dn,                                  dn,
                                 pdn = BER_BVNULL,                                  pdn = BER_BVNULL,
                                 ndn = BER_BVNULL;                                  ndn = BER_BVNULL;
                   char            *filter = NULL;
                 int             temporary = 0;                  int             temporary = 0;
                   int             free_dn = 0;
   
                 /* parse reference and use                  /* parse reference and use
                  * proto://[host][:port]/ only */                   * proto://[host][:port]/ only */
Line 638  ldap_chain_search( Line 709  ldap_chain_search(
                         continue;                          continue;
                 }                  }
   
                   if ( srv->lud_scope != LDAP_SCOPE_DEFAULT ) {
                           /* RFC 4511: if scope is present, use it */
                           tmp_oq_search.rs_scope = srv->lud_scope;
   
                   } else {
                           /* RFC 4511: if scope is absent, use original */
                           tmp_oq_search.rs_scope = op->ors_scope;
                   }
   
                   rc = LDAP_SUCCESS;
                   srv->lud_scope = LDAP_SCOPE_DEFAULT;
                   dn.bv_val = srv->lud_dn;
                   filter = srv->lud_filter;
   
                 /* normalize DN */                  /* normalize DN */
                 rc = LDAP_INVALID_SYNTAX;                  if ( srv->lud_dn == NULL || srv->lud_dn[0] == '\0' ) {
                 if ( srv->lud_dn != NULL ) {                          if ( srv->lud_dn == NULL ) {
                                   srv->lud_dn = "";
                           }
   
                           /* RFC 4511: if DN is absent, use original */
                           if ( save_entry == NULL ) {
                                   pdn = save_req_dn;
                                   ndn = save_req_ndn;
   
                           } else {
                                   /* use the "right" DN, if available */
                                   pdn = save_entry->e_name;
                                   ndn = save_entry->e_nname;
                           }
                           
                   } else {
                           /* RFC 4511: if DN is present, use it */
                         ber_str2bv( srv->lud_dn, 0, 0, &dn );                          ber_str2bv( srv->lud_dn, 0, 0, &dn );
                         rc = dnPrettyNormal( NULL, &dn, &pdn, &ndn, op->o_tmpmemctx );                          rc = dnPrettyNormal( NULL, &dn, &pdn, &ndn, op->o_tmpmemctx );
                         if ( rc == LDAP_SUCCESS ) {                          if ( rc == LDAP_SUCCESS ) {
Line 648  ldap_chain_search( Line 749  ldap_chain_search(
                                  * ldap_initialize() will parse the URL                                    * ldap_initialize() will parse the URL 
                                  * as a comma-separated URL list */                                   * as a comma-separated URL list */
                                 srv->lud_dn = "";                                  srv->lud_dn = "";
                                 srv->lud_scope = LDAP_SCOPE_DEFAULT;  
                                 li.li_uri = ldap_url_desc2str( srv );  
                                 srv->lud_dn = dn.bv_val;  
                         }                          }
                 }                  }
                 ldap_free_urldesc( srv );  
   
                 if ( rc != LDAP_SUCCESS ) {                  /* prepare filter */
                         /* try next */                  if ( rc == LDAP_SUCCESS ) {
                         rc = LDAP_OTHER;                          /* filter */
                         continue;                          if ( srv->lud_filter != NULL
                                   && srv->lud_filter[0] != '\0'
                                   && strcasecmp( srv->lud_filter, "(objectClass=*)" ) != 0 )
                           {
                                   /* RFC 4511: if filter is present, use it;
                                    * otherwise, use original */
                                   tmp_oq_search.rs_filter = str2filter_x( op, srv->lud_filter );
                                   if ( tmp_oq_search.rs_filter != NULL ) {
                                           filter2bv_x( op, tmp_oq_search.rs_filter, &tmp_oq_search.rs_filterstr );
   
                                   } else {
                                           rc = LDAP_OTHER;
                                   }
                           }
                 }                  }
                   srv->lud_filter = NULL;
   
                 if ( li.li_uri == NULL ) {                  if ( rc == LDAP_SUCCESS ) {
                           li.li_uri = ldap_url_desc2str( srv );
                   }
   
                   srv->lud_dn = dn.bv_val;
                   srv->lud_filter = filter;
                   ldap_free_urldesc( srv );
   
                   if ( rc != LDAP_SUCCESS || li.li_uri == NULL ) {
                         /* try next */                          /* try next */
                         rc = LDAP_OTHER;                          rc = LDAP_OTHER;
                         goto further_cleanup;                          goto further_cleanup;
Line 669  ldap_chain_search( Line 788  ldap_chain_search(
   
                 op->o_req_dn = pdn;                  op->o_req_dn = pdn;
                 op->o_req_ndn = ndn;                  op->o_req_ndn = ndn;
                   op->ors_scope = tmp_oq_search.rs_scope;
                   if ( tmp_oq_search.rs_filter != NULL ) {
                           op->ors_filter = tmp_oq_search.rs_filter;
                           op->ors_filterstr = tmp_oq_search.rs_filterstr;
                   }
   
                 ber_str2bv( li.li_uri, 0, 0, &li.li_bvuri[ 0 ] );                  ber_str2bv( li.li_uri, 0, 0, &li.li_bvuri[ 0 ] );
   
Line 737  cleanup:; Line 861  cleanup:;
                 }                  }
                                   
 further_cleanup:;  further_cleanup:;
                 if ( !BER_BVISNULL( &pdn ) ) {                  if ( free_dn ) {
                         op->o_tmpfree( pdn.bv_val, op->o_tmpmemctx );                          op->o_tmpfree( pdn.bv_val, op->o_tmpmemctx );
                           op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );
                 }                  }
   
                 op->o_req_dn = save_req_dn;                  op->o_req_dn = save_req_dn;
                   op->o_req_ndn = save_req_ndn;
   
                 if ( !BER_BVISNULL( &ndn ) ) {                  if ( tmp_oq_search.rs_filter != NULL ) {
                         op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );                          filter_free_x( op, tmp_oq_search.rs_filter, 1 );
                 }                  }
                 op->o_req_ndn = save_req_ndn;  
                   if ( !BER_BVISNULL( &tmp_oq_search.rs_filterstr ) ) {
                           slap_sl_free( tmp_oq_search.rs_filterstr.bv_val, op->o_tmpmemctx );
                   }
   
                   op->oq_search = save_oq_search;
                                   
                 if ( rc == LDAP_SUCCESS && rs2.sr_err == LDAP_SUCCESS ) {                  if ( rc == LDAP_SUCCESS && rs2.sr_err == LDAP_SUCCESS ) {
                         *rs = rs2;                          *rs = rs2;

Removed from v.1.52.2.12  
changed lines
  Added in v.1.52.2.13


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org