Diff for /servers/slapd/overlays/dynlist.c between versions 1.5.2.11 and 1.5.2.12

version 1.5.2.11, 2007/03/22 21:31:18 version 1.5.2.12, 2007/06/04 21:14:22
Line 1 Line 1
 /* dynlist.c - dynamic list overlay */  /* dynlist.c - dynamic list overlay */
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/dynlist.c,v 1.5.2.10 2007/01/11 22:32:04 ando Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/dynlist.c,v 1.5.2.11 2007/03/22 21:31:18 ando Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2003-2007 The OpenLDAP Foundation.   * Copyright 2003-2007 The OpenLDAP Foundation.
Line 67  typedef struct dynlist_info_t { Line 67  typedef struct dynlist_info_t {
 } dynlist_info_t;  } dynlist_info_t;
   
 static dynlist_info_t *  static dynlist_info_t *
 dynlist_is_dynlist( Operation *op, SlapReply *rs )  dynlist_is_dynlist_next( Operation *op, SlapReply *rs, dynlist_info_t *old_dli )
 {  {
         slap_overinst   *on = (slap_overinst *)op->o_bd->bd_info;          slap_overinst   *on = (slap_overinst *)op->o_bd->bd_info;
         dynlist_info_t  *dli = (dynlist_info_t *)on->on_bi.bi_private;          dynlist_info_t  *dli;
   
         Attribute       *a;          Attribute       *a;
   
           if ( old_dli == NULL ) {
                   dli = (dynlist_info_t *)on->on_bi.bi_private;
   
           } else {
                   dli = old_dli->dli_next;
           }
   
         a = attrs_find( rs->sr_entry->e_attrs, slap_schema.si_ad_objectClass );          a = attrs_find( rs->sr_entry->e_attrs, slap_schema.si_ad_objectClass );
         if ( a == NULL ) {          if ( a == NULL ) {
                 /* FIXME: objectClass must be present; for non-storage                  /* FIXME: objectClass must be present; for non-storage
Line 198  dynlist_sc_update( Operation *op, SlapRe Line 205  dynlist_sc_update( Operation *op, SlapRe
   
         for ( a = rs->sr_entry->e_attrs; a != NULL; a = a->a_next ) {          for ( a = rs->sr_entry->e_attrs; a != NULL; a = a->a_next ) {
                 BerVarray       vals, nvals = NULL;                  BerVarray       vals, nvals = NULL;
                 int             i, j;                  int             i, j,
                                   is_oc = a->a_desc == slap_schema.si_ad_objectClass;
   
                 /* if attribute is not requested, skip it */                  /* if attribute is not requested, skip it */
                 if ( rs->sr_attrs == NULL ) {                  if ( rs->sr_attrs == NULL ) {
Line 247  dynlist_sc_update( Operation *op, SlapRe Line 255  dynlist_sc_update( Operation *op, SlapRe
                 }                  }
   
                 for ( i = 0, j = 0; !BER_BVISNULL( &a->a_vals[i] ); i++ ) {                  for ( i = 0, j = 0; !BER_BVISNULL( &a->a_vals[i] ); i++ ) {
                           if ( is_oc ) {
                                   ObjectClass     *soc = oc_bvfind( &a->a_vals[i] );
   
                                   if ( soc->soc_kind == LDAP_SCHEMA_STRUCTURAL ) {
                                           continue;
                                   }
                           }
   
                         if ( access_allowed( op, rs->sr_entry, a->a_desc,                          if ( access_allowed( op, rs->sr_entry, a->a_desc,
                                                 &a->a_nvals[i], ACL_READ, &acl_state ) )                                                  &a->a_nvals[i], ACL_READ, &acl_state ) )
                         {                          {
Line 297  done:; Line 313  done:;
 }  }
                   
 static int  static int
 dynlist_send_entry( Operation *op, SlapReply *rs, dynlist_info_t *dli )  dynlist_prepare_entry( Operation *op, SlapReply *rs, dynlist_info_t *dli )
 {  {
         Attribute       *a;          Attribute       *a;
         slap_callback   cb;          slap_callback   cb;
Line 316  dynlist_send_entry( Operation *op, SlapR Line 332  dynlist_send_entry( Operation *op, SlapR
                 return SLAP_CB_CONTINUE;                  return SLAP_CB_CONTINUE;
         }          }
   
         e = entry_dup( rs->sr_entry );          if ( !( rs->sr_flags & REP_ENTRY_MODIFIABLE ) ) {
                   e = entry_dup( rs->sr_entry );
           } else {
                   e = rs->sr_entry;
           }
         e_flags = rs->sr_flags | ( REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED );          e_flags = rs->sr_flags | ( REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED );
   
         dlc.dlc_e = e;          dlc.dlc_e = e;
Line 359  dynlist_send_entry( Operation *op, SlapR Line 379  dynlist_send_entry( Operation *op, SlapR
   
                 if ( lud->lud_host != NULL ) {                  if ( lud->lud_host != NULL ) {
                         /* FIXME: host not allowed; reject as illegal? */                          /* FIXME: host not allowed; reject as illegal? */
                         Debug( LDAP_DEBUG_ANY, "dynlist_send_entry(\"%s\"): "                          Debug( LDAP_DEBUG_ANY, "dynlist_prepare_entry(\"%s\"): "
                                 "illegal URI \"%s\"\n",                                  "illegal URI \"%s\"\n",
                                 e->e_name.bv_val, url->bv_val, 0 );                                  e->e_name.bv_val, url->bv_val, 0 );
                         goto cleanup;                          goto cleanup;
Line 665  dynlist_response( Operation *op, SlapRep Line 685  dynlist_response( Operation *op, SlapRep
         case LDAP_REQ_SEARCH:          case LDAP_REQ_SEARCH:
                 if ( rs->sr_type == REP_SEARCH && !get_manageDSAit( op ) )                  if ( rs->sr_type == REP_SEARCH && !get_manageDSAit( op ) )
                 {                  {
                         dli = dynlist_is_dynlist( op, rs );                          int     rc = LDAP_OTHER;
                         if ( dli != NULL ) {  
                                 return dynlist_send_entry( op, rs, dli );                          for ( dli = dynlist_is_dynlist_next( op, rs, NULL );
                                   dli;
                                   dli = dynlist_is_dynlist_next( op, rs, dli ) )
                           {
                                   rc = dynlist_prepare_entry( op, rs, dli );
                           }
   
                           if ( rc != LDAP_OTHER ) {
                                   return rc;
                         }                          }
                 }                  }
                 break;                  break;
Line 787  dynlist_db_config( Line 815  dynlist_db_config(
                 for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;                  for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;
                         *dlip; dlip = &(*dlip)->dli_next )                          *dlip; dlip = &(*dlip)->dli_next )
                 {                  {
                         /* The check on objectClass may be relaxed */                          /* The same URL attribute / member attribute pair
 #if 0                           * cannot be repeated */
                         if ( (*dlip)->dli_oc == oc ) {                          if ( (*dlip)->dli_ad == ad && (*dlip)->dli_member_ad == member_ad ) {
                                 Debug( LDAP_DEBUG_ANY, "%s: line %d: "  
                                         "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "  
                                         "objectClass \"%s\" already mapped.\n",  
                                         fname, lineno, oc->soc_cname.bv_val );  
                                 return 1;  
                         }  
 #endif  
   
                         if ( (*dlip)->dli_ad == ad ) {  
                                 Debug( LDAP_DEBUG_ANY, "%s: line %d: "                                  Debug( LDAP_DEBUG_ANY, "%s: line %d: "
                                         "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "                                          "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "
                                         "URL attributeDescription \"%s\" already mapped.\n",                                          "URL attributeDescription \"%s\" already mapped.\n",
                                         fname, lineno, ad->ad_cname.bv_val );                                          fname, lineno, ad->ad_cname.bv_val );
   #if 0
                                   /* make it a warning... */
                                 return 1;                                  return 1;
                         }  #endif
   
                         if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) {  
                                 Debug( LDAP_DEBUG_ANY, "%s: line %d: "  
                                         "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "  
                                         "member attributeDescription \"%s\" already mapped.\n",  
                                         fname, lineno, member_ad->ad_cname.bv_val );  
                                 return 1;  
                         }                          }
                 }                  }
   
Line 878  dynlist_db_config( Line 892  dynlist_db_config(
                         return 1;                          return 1;
                 }                  }
   
   
                 for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;                  for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;
                         *dlip; dlip = &(*dlip)->dli_next )                          *dlip; dlip = &(*dlip)->dli_next )
                 {                  {
 #if 0                          /* The same URL attribute / member attribute pair
                         /* The check on objectClass may be relaxed */                           * cannot be repeated */
                         if ( (*dlip)->dli_oc == oc ) {                          if ( (*dlip)->dli_ad == ad && (*dlip)->dli_member_ad == member_ad ) {
                                 Debug( LDAP_DEBUG_ANY, "%s: line %d: "  
                                         "\"dynlist-attrpair <member-ad> <URL-ad>\": "  
                                         "objectClass \"%s\" already mapped.\n",  
                                         fname, lineno, oc->soc_cname.bv_val );  
                                 return 1;  
                         }  
 #endif  
   
                         if ( (*dlip)->dli_ad == ad ) {  
                                 Debug( LDAP_DEBUG_ANY, "%s: line %d: "                                  Debug( LDAP_DEBUG_ANY, "%s: line %d: "
                                         "\"dynlist-attrpair <member-ad> <URL-ad>\": "                                          "\"dynlist-attrpair <member-ad> <URL-ad>\": "
                                         "URL attributeDescription \"%s\" already mapped.\n",                                          "URL attributeDescription \"%s\" already mapped.\n",
                                         fname, lineno, ad->ad_cname.bv_val );                                          fname, lineno, ad->ad_cname.bv_val );
   #if 0
                                   /* make it a warning... */
                                 return 1;                                  return 1;
                         }  #endif
   
                         if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) {  
                                 Debug( LDAP_DEBUG_ANY, "%s: line %d: "  
                                         "\"dynlist-attrpair <member-ad> <URL-ad>\": "  
                                         "member attributeDescription \"%s\" already mapped.\n",  
                                         fname, lineno, member_ad->ad_cname.bv_val );  
                                 return 1;  
                         }                          }
                 }                  }
   
Line 1122  dl_cfgen( ConfigArgs *c ) Line 1121  dl_cfgen( ConfigArgs *c )
                 for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;                  for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;
                         *dlip; dlip = &(*dlip)->dli_next )                          *dlip; dlip = &(*dlip)->dli_next )
                 {                  {
                         /* The check on objectClass may be relaxed */                          /* The same URL attribute / member attribute pair
 #if 0                           * cannot be repeated */
                         if ( (*dlip)->dli_oc == oc ) {                          if ( (*dlip)->dli_ad == ad && (*dlip)->dli_member_ad == member_ad ) {
                                 snprintf( c->msg, sizeof( c->msg ),  
                                         "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "  
                                         "objectClass \"%s\" already mapped.\n",  
                                         oc->soc_cname.bv_val );  
                                 Debug( LDAP_DEBUG_ANY, "%s: %s.\n",  
                                         c->log, c->msg, 0 );  
                                 return 1;  
                         }  
 #endif  
   
                         if ( (*dlip)->dli_ad == ad ) {  
                                 snprintf( c->msg, sizeof( c->msg ),                                  snprintf( c->msg, sizeof( c->msg ),
                                         "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "                                          "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "
                                         "URL attributeDescription \"%s\" already mapped.\n",                                          "URL attributeDescription \"%s\" already mapped.\n",
                                         ad->ad_cname.bv_val );                                          ad->ad_cname.bv_val );
                                 Debug( LDAP_DEBUG_ANY, "%s: %s.\n",                                  Debug( LDAP_DEBUG_ANY, "%s: %s.\n",
                                         c->log, c->msg, 0 );                                          c->log, c->msg, 0 );
   #if 0
                                   /* make it a warning... */
                                 return 1;                                  return 1;
                         }  #endif
   
                         if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) {  
                                 snprintf( c->msg, sizeof( c->msg ),  
                                         "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "  
                                         "member attributeDescription \"%s\" already mapped.\n",  
                                         member_ad->ad_cname.bv_val );  
                                 Debug( LDAP_DEBUG_ANY, "%s: %s.\n",  
                                         c->log, c->msg, 0 );  
                                 return 1;  
                         }                          }
                 }                  }
   
Line 1252  dl_cfgen( ConfigArgs *c ) Line 1233  dl_cfgen( ConfigArgs *c )
                 for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;                  for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;
                         *dlip; dlip = &(*dlip)->dli_next )                          *dlip; dlip = &(*dlip)->dli_next )
                 {                  {
                         /* The check on objectClass may be relaxed */                          /* The same URL attribute / member attribute pair
 #if 0                           * cannot be repeated */
                         if ( (*dlip)->dli_oc == oc ) {                          if ( (*dlip)->dli_ad == ad && (*dlip)->dli_member_ad == member_ad ) {
                                 snprintf( c->msg, sizeof( c->msg ),  
                                         "\"dynlist-attrpair <member-ad> <URL-ad>\": "  
                                         "objectClass \"%s\" already mapped.\n",  
                                         oc->soc_cname.bv_val );  
                                 Debug( LDAP_DEBUG_ANY, "%s: %s.\n",  
                                         c->log, c->msg, 0 );  
                                 return 1;  
                         }  
 #endif  
   
                         if ( (*dlip)->dli_ad == ad ) {  
                                 snprintf( c->msg, sizeof( c->msg ),                                  snprintf( c->msg, sizeof( c->msg ),
                                         "\"dynlist-attrpair <member-ad> <URL-ad>\": "                                          "\"dynlist-attrpair <member-ad> <URL-ad>\": "
                                         "URL attributeDescription \"%s\" already mapped.\n",                                          "URL attributeDescription \"%s\" already mapped.\n",
                                         ad->ad_cname.bv_val );                                          ad->ad_cname.bv_val );
                                 Debug( LDAP_DEBUG_ANY, "%s: %s.\n",                                  Debug( LDAP_DEBUG_ANY, "%s: %s.\n",
                                         c->log, c->msg, 0 );                                          c->log, c->msg, 0 );
   #if 0
                                   /* make it a warning... */
                                 return 1;                                  return 1;
                         }  #endif
   
                         if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) {  
                                 snprintf( c->msg, sizeof( c->msg ),  
                                         "\"dynlist-attrpair <member-ad> <URL-ad>\": "  
                                         "member attributeDescription \"%s\" already mapped.\n",  
                                         member_ad->ad_cname.bv_val );  
                                 Debug( LDAP_DEBUG_ANY, "%s: %s.\n",  
                                         c->log, c->msg, 0 );  
                                 return 1;  
                         }                          }
                 }                  }
   

Removed from v.1.5.2.11  
changed lines
  Added in v.1.5.2.12


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